Commit f64ea89a authored by Administrator's avatar Administrator

创建项目

parent 815d41ac
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
#*.jar
*.rar
#*.tar
#*.zip
!.mvn/wrapper/maven-wrapper.jar
# Logs and databases #
######################
*.log
*.sqlite
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
.db
.csv
.xlsx
.xls
# Eclipse generated files #
.classpath
.project
.settings/
.tomcatplugin
.#webclasspath
target/
work/
# Idea generated files #
*.iml
*.ipr
*.iws
.idea/
.svn/
logging.dir_IS*/
project.name_IS_*/
project.name_IS_*.log
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>baa-pay</artifactId>
<groupId>cn.quant.baa.pay</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>baa-pay-api</artifactId>
<name>baa-pay-api</name>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.source}</target>
<encoding>${maven.compiler.encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
package cn.quant.baa.pay;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/24 0024.
*/
public class GoodsDetail implements Serializable{
private static final long serialVersionUID = -353037200982963915L;
/**
* 商品ID
*/
private String goodsId;
/**
* 商品名
*/
private String goodsName;
/**
* 数量
*/
private Integer quantity;
/**
* 商品单价
*/
private String price;
/**
* 优惠金额
*/
private String discounts;
/**
* 实付金额
*/
private String amount;
/**
* 附加信息
*/
private String attach;
public String getGoodsId() {
return goodsId;
}
public void setGoodsId(String goodsId) {
this.goodsId = goodsId;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getDiscounts() {
return discounts;
}
public void setDiscounts(String discounts) {
this.discounts = discounts;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getAttach() {
return attach;
}
public void setAttach(String attach) {
this.attach = attach;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("GoodsDetail{");
sb.append("goodsId='").append(goodsId).append('\'');
sb.append(", goodsName='").append(goodsName).append('\'');
sb.append(", quantity=").append(quantity);
sb.append(", price='").append(price).append('\'');
sb.append(", discounts='").append(discounts).append('\'');
sb.append(", amount='").append(amount).append('\'');
sb.append(", attach='").append(attach).append('\'');
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class MerchantAcquirer implements Serializable {
private static final long serialVersionUID = 1777009242558105988L;
private Long chanId;
private String chanCode;
private String chanType;
private String name;
private String accessCode;
private String accessType;
private String version;
private String descText;
public Long getChanId() {
return chanId;
}
public void setChanId(Long chanId) {
this.chanId = chanId;
}
public String getChanCode() {
return chanCode;
}
public void setChanCode(String chanCode) {
this.chanCode = chanCode;
}
public String getChanType() {
return chanType;
}
public void setChanType(String chanType) {
this.chanType = chanType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccessCode() {
return accessCode;
}
public void setAccessCode(String accessCode) {
this.accessCode = accessCode;
}
public String getAccessType() {
return accessType;
}
public void setAccessType(String accessType) {
this.accessType = accessType;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getDescText() {
return descText;
}
public void setDescText(String descText) {
this.descText = descText;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MerchantAcquirer{");
sb.append("chanId=").append(chanId);
sb.append(", chanCode='").append(chanCode).append('\'');
sb.append(", chanType='").append(chanType).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", accessCode='").append(accessCode).append('\'');
sb.append(", accessType='").append(accessType).append('\'');
sb.append(", version='").append(version).append('\'');
sb.append(", descText='").append(descText).append('\'');
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class MerchantAcquirerBook implements Serializable {
private static final long serialVersionUID = -7479646457077040392L;
private String code;
private String name;
private String imageUrl;
private Map<String, MerchantAcquirer> acquirers;
public MerchantAcquirerBook() {
acquirers = new HashMap<String, MerchantAcquirer>();
}
public Map<String, MerchantAcquirer> getAcquirers() {
return acquirers;
}
public void add(MerchantAcquirer acquirer) {
acquirers.put(acquirer.getAccessCode(), acquirer);
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MerchantAcquirerBook{");
sb.append("code='").append(code).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", imageUrl='").append(imageUrl).append('\'');
sb.append(", acquirers=").append(acquirers);
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class MerchantChannelRequestData implements Serializable {
private static final long serialVersionUID = 5193795607930304626L;
private String chanId;
private String mchId;
private String channel;
private String access;
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getAccess() {
return access;
}
public void setAccess(String access) {
this.access = access;
}
public String persistenceKey() {
return mchId + "$" + (channel == null || channel.trim().length() == 0 ? "*" : channel);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MerchantChannelRequestData{");
sb.append("chanId=").append(chanId);
sb.append(", mchId='").append(mchId).append('\'');
sb.append(", channel='").append(channel).append('\'');
sb.append(", access='").append(access).append('\'');
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay;
import java.io.Serializable;
import java.util.Arrays;
/**
* Created by Administrator on 2021/8/24 0024.
*/
public class PayRequestData implements Serializable{
private static final long serialVersionUID = -8274612481658761761L;
/**
* 订单标题
*/
private String subject;
/**
* 商户ID
*/
private String mchId;
/**
* 支付通道ID
*/
private String chanId;
/**
* 商户订单号
*/
private String outTradeNo;
/**
* 原订单金额
*/
private String originalAmount;
/**
*实际订单金额
*/
private String amount;
/**
* 优惠金额
*/
private String discounts;
/**
* 通知地址
*/
private String notifyUrl;
/**
*买家ID
*/
private String buyerId;
/**
* 附加信息
*/
private String attach;
/**
* 收货人名称
*/
private String goodsSigner;
/**
* 联系电话
*/
private String phoneNo;
/**
* 地址
*/
private String address;
/**
* 商品列表
*/
private GoodsDetail[] goodsDetail;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
public String getOriginalAmount() {
return originalAmount;
}
public void setOriginalAmount(String originalAmount) {
this.originalAmount = originalAmount;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getDiscounts() {
return discounts;
}
public void setDiscounts(String discounts) {
this.discounts = discounts;
}
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
public String getBuyerId() {
return buyerId;
}
public void setBuyerId(String buyerId) {
this.buyerId = buyerId;
}
public String getAttach() {
return attach;
}
public void setAttach(String attach) {
this.attach = attach;
}
public String getGoodsSigner() {
return goodsSigner;
}
public void setGoodsSigner(String goodsSigner) {
this.goodsSigner = goodsSigner;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public GoodsDetail[] getGoodsDetail() {
return goodsDetail;
}
public void setGoodsDetail(GoodsDetail[] goodsDetail) {
this.goodsDetail = goodsDetail;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayRequestData{");
sb.append("subject='").append(subject).append('\'');
sb.append(", mchId='").append(mchId).append('\'');
sb.append(", chanId='").append(chanId).append('\'');
sb.append(", outTradeNo='").append(outTradeNo).append('\'');
sb.append(", originalAmount='").append(originalAmount).append('\'');
sb.append(", amount='").append(amount).append('\'');
sb.append(", discounts='").append(discounts).append('\'');
sb.append(", notifyUrl='").append(notifyUrl).append('\'');
sb.append(", buyerId='").append(buyerId).append('\'');
sb.append(", attach='").append(attach).append('\'');
sb.append(", goodsSigner='").append(goodsSigner).append('\'');
sb.append(", phoneNo='").append(phoneNo).append('\'');
sb.append(", address='").append(address).append('\'');
sb.append(", goodsDetail=").append(goodsDetail == null ? "null" : Arrays.asList(goodsDetail).toString());
sb.append('}');
return sb.toString();
}
}
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/baa_pay_v1.0</property>
<!-- JDBC connection pool (use the built-in) -->
<!--
<property name="connection.pool_size">1</property>
-->
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping class="cn.quant.baa.pay.jpa.entity.PayAccountEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.PayAppEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.PayFeatureEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.MchChannelEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.DictionaryEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.CustomerEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.AccountEntity"/>
<!-- Drop and re-create the database schema on startup -->
<!--
<property name="hbm2ddl.auto">update</property>
-->
</session-factory>
</hibernate-configuration>
\ 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>baa-pay</artifactId>
<groupId>cn.quant.baa.pay</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>baa-pay-core</artifactId>
<name>baa-pay-core</name>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>cn.quant.baa.pay</groupId>
<artifactId>baa-pay-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--javax-->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.quant.spring</groupId>
<artifactId>quant-spring-web</artifactId>
</dependency>
<!--spring boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--database-->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!--jpa-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.apache.tomcat</groupId>-->
<!--<artifactId>tomcat-jdbc</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
<!--</dependency>-->
<dependency>
<groupId>cn.quant.spring.data</groupId>
<artifactId>quant-spring-data-jpa</artifactId>
</dependency>
<!--hibernate-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
</dependency>
<!--jackson2-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>
<!--cache-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>guava</artifactId>
</dependency>
<!--log-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>cn.quant.spring.boot</groupId>
<artifactId>quant-spring-boot-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.source}</target>
<encoding>${maven.compiler.encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
package cn.quant.baa.pay;
import cn.quant.baa.pay.dict.MessageEnum;
import org.slf4j.Logger;
/**
* @author hechao
* @description
* @date 2020/7/28 12:44
* @modify 2020/7/28 12:44 by hechao
*/
public class BusinessException extends RuntimeException {
private String errorCode;
private String errorNumer;
public BusinessException(MessageEnum messageEnum, String message) {
super(message);
this.errorCode = messageEnum.name();
this.errorNumer=messageEnum.code;
}
@Override
public String getMessage() {
return getMessage(errorCode, errorNumer, super.getMessage());
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorNumer() {
return errorNumer;
}
public void setErrorNumer(String errorNumer) {
this.errorNumer = errorNumer;
}
public String print(Logger logger) {
String msg = toString(this);
logger.error(msg, this);
this.printStackTrace();
return msg;
}
public static <T extends BusinessException> String getMessage(String code, String num, String msg) {
return code + "-" + num + ": " + msg;
}
public static <T extends BusinessException> String toString(T t) {
return getMessage(t.getErrorCode(), t.getErrorCode(), t.getMessage());
}
}
\ No newline at end of file
package cn.quant.baa.pay;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class Constant {
public final static String NAMESPACE_LOCAL_CACHE_TRANSACTION = "LOCAL_TRANSACTION";
public static final LocalDate MAX_LOCAL_DATE = LocalDate.of(9999, 1, 1);
/**
* 默认初始日期
*/
public static final LocalDate MINI_LOCAL_DATE = LocalDate.of(1970, 1, 1);
public static final Date MINI_DATE = Date.from(MINI_LOCAL_DATE.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
package cn.quant.baa.pay.annotation;
import cn.quant.baa.pay.context.TransactionSession;
import java.lang.annotation.*;
/**
* <p>创建 {@link cn.quant.baa.pay.context.TransactionSession}
* 请参看自动生成逻辑 {@link cn.quant.baa.pay.aspect.BusinessMappingAspect}</p>
* Created by Administrator on 2021/8/23 0023.
*
* @see cn.quant.baa.pay.aspect.BusinessMappingAspect
* @see TransactionSession#session()
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BusinessMapping {
/**
* 使用参数创建session对象的原数据位置,-1:不创建;0:不使用参数创建;1...n:使用位置对应的参数创建
*
* @return
*/
int session() default -1;
}
package cn.quant.baa.pay.aspect;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.baa.pay.annotation.BusinessMapping;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.spring.IllegalArgException;
import cn.quant.spring.context.ServerApplicationContext;
import cn.quant.spring.util.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* <p>通过在方法上指定 {@link cn.quant.baa.pay.annotation.BusinessMapping} 注解来自动创建 {@link cn.quant.baa.pay.context.TransactionSession},
* 获取的方法参看{@link TransactionSession#session()}。
* </p>
* Created by Administrator on 2021/8/23 0023.
*/
@Aspect
@Component
public class BusinessMappingAspect {
@Autowired
private ServerApplicationContext serverApplicationContext;
public void session(Object arg) {
if (BusinessRequest.class.isInstance(arg)) {
TransactionSession.newInstance((BusinessRequest) arg, serverApplicationContext);
}
}
@Pointcut("@annotation(cn.quant.baa.pay.annotation.BusinessMapping)")
public void pointCut() {
}
@Around("pointCut()")
public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
BusinessMapping annotation = method.getAnnotation(BusinessMapping.class);
if (annotation.session() > 0) {
Object[] args = joinPoint.getArgs();
if (args.length < annotation.session()) {
throw new IllegalArgException(StringUtils.format("Business mapping session value({}) less than arguments size({}) - {}"
, annotation.session(), args.length, method));
}
session(args[annotation.session() - 1]);
}
try {
Object object = joinPoint.proceed();
return object;
} finally {
TransactionSession.release();
}
}
}
package cn.quant.baa.pay.aspect;
import cn.quant.spring.annotation.ThreadSession;
import cn.quant.spring.context.ServerApplicationContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Aspect
@Component
public class ThreadSessionAspect {
private static final Logger logger = LoggerFactory.getLogger(ThreadSessionAspect.class);
@Pointcut("@annotation(cn.quant.spring.annotation.ThreadSession)")
public void pointCut() {
}
@Around("pointCut()")
public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
ThreadSession annotation = method.getAnnotation(ThreadSession.class);
logger.info("---->>>> Thread session aspect {}.", annotation.value());
Object object = joinPoint.proceed();
return object;
}
}
package cn.quant.baa.pay.component;
import cn.quant.spring.util.IdentitySequencer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author hechao
* @description
* @date 2020/7/24 13:45
* @modify 2020/7/24 13:45 by hechao
*/
@Component
public class Sequencer {
private final AtomicLong INDEX = new AtomicLong(1L);
@Autowired
private IdentitySequencer sequencer;
public Long nextId() {
return nextId(INDEX.addAndGet(1L));
}
public Long nextId(long flake) {
return sequencer.nextId(flake % 225L);
}
public int getPartitionKey(long id) {
return (int) ((id >> 8 << 8) ^ id);
}
public Long workerId() {
return sequencer.workerId();
}
public Long index() {
return INDEX.get();
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Sequencer{")
.append("INDEX = ").append(index())
.append(",sequencer = ").append(sequencer)
.append("}");
return sb.toString();
}
}
\ No newline at end of file
package cn.quant.baa.pay.config;
import cn.quant.baa.pay.jpa.entity.*;
import cn.quant.baa.pay.model.MerchantAcquirerProfile;
import com.google.common.base.Supplier;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;
import org.springframework.beans.BeanUtils;
import java.util.Collection;
import java.util.Map;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public class AcquirerBuilder {
private Table<Class, Object, Object> bigTable = Tables.newCustomTable(Maps.newHashMap(), new Supplier() {
public Map<Object, Object> get() {
return Maps.newLinkedHashMap();
}
});
public MerchantAcquirerBuilder build(Collection<MchChannelEntity> entities){
MerchantAcquirerBuilder builder = new MerchantAcquirerBuilder();
for (MchChannelEntity entity : entities) {
MerchantAcquirerProfile profile = build(entity);
builder.add(profile);
}
return builder;
}
public void release(){
bigTable.clear();
}
public MerchantAcquirerProfile build(MchChannelEntity entity) {
MerchantAcquirerProfile profile = new MerchantAcquirerProfile();
profile.setMchChanId(entity.getId());
profile.setPayChanCode(entity.getPayChanCode());
profile.setPayAcctId(entity.getPayAcctId());
PayAccountIds accountIds = new PayAccountIds();
accountIds.setPayAcctId(entity.getPayAcctId());
accountIds.setPayChanCode(entity.getPayChanCode());
PayAccountEntity account = (PayAccountEntity) bigTable.get(PayAccountEntity.class, accountIds);
BeanUtils.copyProperties(account, profile);
PayFeatureIds featureIds = new PayFeatureIds();
featureIds.setPayChanCode(entity.getPayChanCode());
featureIds.setAccessCode(entity.getAccessCode());
PayFeatureEntity feature = (PayFeatureEntity) bigTable.get(PayFeatureEntity.class, featureIds);
BeanUtils.copyProperties(feature, profile);
profile.setAccessCode(entity.getAccessCode());
PayAppEntity app = (PayAppEntity) bigTable.get(PayAppEntity.class, entity.getPayAppId());
BeanUtils.copyProperties(app, profile);
return profile;
}
public PayFeature accounts(Collection<PayAccountEntity> entities) {
for (PayAccountEntity entity : entities) {
bigTable.put(entity.getClass(), entity.getIds(), entity);
}
return new PayFeature();
}
public class PayFeature {
public PayApp features(Collection<PayFeatureEntity> entities) {
for (PayFeatureEntity entity : entities) {
bigTable.put(entity.getClass(), entity.getIds(), entity);
}
return new PayApp();
}
}
public class PayApp {
public AcquirerBuilder apps(Collection<PayAppEntity> entities) {
for (PayAppEntity entity : entities) {
bigTable.put(entity.getClass(), entity.getPayAppId(), entity);
}
return AcquirerBuilder.this;
}
}
}
package cn.quant.baa.pay.config;
import cn.quant.baa.pay.support.AuditorAwareHandler;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* <p><b>Enable Mybatis Annotation:</b><br/>
* <code>@org.mybatis.spring.annotation.MapperScan("cn.quant.baa.pay.mybatis.mapper")</code></p>
* <p><b>Enable JPA Annotation:</b><br/>
* <code>@EntityScan("cn.quant.baa.pay.jpa.entity")</code><br/>
* <code>@org.springframework.data.jpa.repository.config.EnableJpaRepositories("cn.quant.baa.pay.jpa.repository")</code></p>
* <p><b>Enable Auditor Aware Annotation:</b><br/>
* <code>@org.springframework.data.jpa.repository.config.EnableJpaAuditing(auditorAwareRef = "auditorAwareHandler")<br/>
* see {@link AuditorAwareHandler}</code>
* </p>
* @see cn.quant.spring.convert.LocalDateNumberConverter
* @see cn.quant.spring.convert.LocalDateTimeNumberConverter
* @see cn.quant.spring.convert.LocalTimeNumberConverter
*/
@Configuration
@EnableTransactionManagement
@EntityScan("cn.quant.baa.pay.jpa.entity")
@EnableJpaRepositories("cn.quant.baa.pay.jpa.repository")
@EnableJpaAuditing(auditorAwareRef = "auditorAwareHandler")
public class DatabaseConfiguration {
// TODO:Hibernate Jackson Support
@Bean
public Hibernate5Module hibernate5Module() {
return new Hibernate5Module();
}
}
\ No newline at end of file
package cn.quant.baa.pay.config;
import cn.quant.baa.pay.dict.DictType;
import cn.quant.baa.pay.model.DictionaryItem;
import com.google.common.base.Supplier;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;
import java.util.Map;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class DictionaryViewer {
private Table<String, String, DictionaryItem> bigTable = Tables.newCustomTable(Maps.newHashMap(), new Supplier() {
public Map<String, DictionaryItem> get() {
return Maps.newLinkedHashMap();
}
});
public void add(DictionaryItem item) {
bigTable.put(item.getType(), item.getCode(), item);
}
public DictionaryItem get(String type, String code) {
return bigTable.get(type, code);
}
}
package cn.quant.baa.pay.config;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
import static cn.quant.baa.pay.Constant.NAMESPACE_LOCAL_CACHE_TRANSACTION;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Configuration
@EnableCaching
public class LocalCacheConfiguration {
@Value("${quant.baapay.local-cache-expire.time}")
private Integer expireTime;
@Value("${quant.baapay.local-cache-expire.unit}")
private TimeUnit expireUnit;
@Value("${quant.baapay.local-cache-expire.size}")
private Integer expireSize;
@Bean
public CacheManager profileCacheManager() {
//TODO:reload cached data
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.registerCustomCache("LOCAL_PROFILE",
Caffeine.newBuilder()
.expireAfterWrite(expireTime, expireUnit)
.maximumSize(expireSize == null ? 500 : expireSize)
.build());
return cacheManager;
}
}
package cn.quant.baa.pay.config;
import cn.quant.baa.pay.model.MerchantAcquirerProfile;
import cn.quant.spring.ExistsException;
import cn.quant.spring.util.StringUtils;
import com.google.common.base.Supplier;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public class MerchantAcquirerBuilder {
private Table<String, String, Collection<MerchantAcquirerProfile>> bigTable = Tables.newCustomTable(Maps.newHashMap()
, new Supplier() {
public Map<String, Collection<MerchantAcquirerProfile>> get() {
return Maps.newLinkedHashMap();
}
});
private Map<Long, MerchantAcquirerProfile> map = new HashMap<>();
void add(MerchantAcquirerProfile profile) {
if (map.containsKey(profile.getMchChanId())) {
throw new ExistsException(StringUtils.format("Existing merchant acquirer {}.", profile.getMchChanId()));
}
map.put(profile.getMchChanId(), profile);
String appId = profile.getPayAppId();
String chanCode = profile.getPayChanCode();
Collection<MerchantAcquirerProfile> profiles = bigTable.get(appId, chanCode);
if (profiles == null) {
profiles = new LinkedList<>();
bigTable.put(appId, chanCode, profiles);
}
profiles.add(profile);
}
public Map<String, Collection<MerchantAcquirerProfile>> get(String mchId, String channel) {
Collection<MerchantAcquirerProfile> profiles = bigTable.get(mchId, channel);
return toMap(profiles);
}
public Map<String, Collection<MerchantAcquirerProfile>> get(String mchId) {
return bigTable.row(mchId);
}
public Map<String, Collection<MerchantAcquirerProfile>> toMap(Collection<MerchantAcquirerProfile> profiles) {
Map<String, Collection<MerchantAcquirerProfile>> map = new HashMap<>();
for (MerchantAcquirerProfile profile : profiles) {
Collection<MerchantAcquirerProfile> collection = map.get(profile.getPayChanCode());
if (collection == null) {
collection = new LinkedList<>();
map.put(profile.getPayChanCode(), collection);
}
collection.add(profile);
}
return map;
}
public MerchantAcquirerProfile get(Long channelId) {
return map.get(channelId);
}
};
\ No newline at end of file
package cn.quant.baa.pay.config;
import cn.quant.baa.pay.jpa.entity.*;
import cn.quant.baa.pay.jpa.repository.*;
import cn.quant.baa.pay.model.DictionaryItem;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Configuration
public class ServerConfiguration {
@Autowired
private PayAccountRepository payAccountRepository;
@Autowired
private PayAppRepository payAppRepository;
@Autowired
private PayFeatureRepository payFeatureRepository;
@Autowired
private MchChannelRepository mchChannelRepository;
@Autowired
private DictionaryRepository dictionaryRepository;
public AcquirerBuilder acquirerBuilder() {
List<PayAccountEntity> accounts = payAccountRepository.findAll();
List<PayFeatureEntity> features = payFeatureRepository.findAll();
List<PayAppEntity> apps = payAppRepository.findAll();
AcquirerBuilder builder = new AcquirerBuilder();
builder.accounts(accounts)
.features(features)
.apps(apps);
accounts.clear();
features.clear();
apps.clear();
return builder;
}
@Bean
public DictionaryViewer dictionaryViewer() {
DictionaryViewer dictionary = new DictionaryViewer();
List<DictionaryEntity> entities = dictionaryRepository.findAll();
for (DictionaryEntity entity : entities) {
DictionaryItem item = new DictionaryItem();
item.setName(entity.getName());
item.setCode(entity.getCode());
item.setType(entity.getType());
item.setImageUrl(entity.getImageUrl());
dictionary.add(item);
}
return dictionary;
}
@Bean
public MerchantAcquirerBuilder merchantAcquirerBuilder() {
AcquirerBuilder acquirerBuilder = acquirerBuilder();
List<MchChannelEntity> entities = mchChannelRepository.findAll();
MerchantAcquirerBuilder builder = acquirerBuilder.build(entities);
acquirerBuilder.release();
entities.clear();
return builder;
}
}
package cn.quant.baa.pay.context;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.spring.NullException;
import cn.quant.spring.context.BusinessSession;
import cn.quant.spring.context.ServerApplicationContext;
import cn.quant.spring.data.jpa.entity.OptimisticEntity;
import cn.quant.spring.data.jpa.repository.JapRepositoryProxy;
import cn.quant.spring.data.jpa.repository.RepositoryProxy;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Date;
/**
* <p>session 对象</p>
* Created by Administrator on 2021/8/23 0023.
*/
public class TransactionSession extends BusinessSession {
private final static ThreadLocal<TransactionSession> local = new ThreadLocal<>();
private RepositoryProxy repositoryProxy;
public TransactionSession(ServerApplicationContext context) {
super(context);
this.repositoryProxy = new JapRepositoryProxy(context.getParent());
}
/**
* 获取session
*
* @return
* @see cn.quant.baa.pay.annotation.BusinessMapping
* @see cn.quant.baa.pay.aspect.BusinessMappingAspect
*/
public static TransactionSession session() {
return local.get();
}
public static void release() {
local.remove();
}
public static TransactionSession newInstance(BusinessRequest request, ServerApplicationContext context) {
TransactionSession session = local.get();
if (session == null) {
session = new TransactionSession(context);
Date businessDate = request.getBusinessDate();
if (businessDate == null) {
session.setBusinessDate(LocalDateTime.now());
}
session.setRequestTime(request.getRequestTime());
local.set(session);
}
return session;
}
public RepositoryProxy getRepositoryProxy() {
return repositoryProxy;
}
public <T> Collection<T> getEntity(Class<T> cls) {
return (Collection<T>) repositoryProxy.get(cls).values();
}
public <T> T getEntity(Class<T> cls, Object id) {
return (T) repositoryProxy.get(cls, id);
}
public <T extends OptimisticEntity> void pushEntity(T entity) {
repositoryProxy.push(entity);
}
public <T extends OptimisticEntity> void pushEntity(Collection<T> entities) {
repositoryProxy.push(entities);
}
public <T extends OptimisticEntity> void pushEntity(T... entities) {
repositoryProxy.push(entities);
}
public void commit() {
repositoryProxy.commit();
}
public void clearEntity() {
repositoryProxy.clear();
}
public JpaRepository getRepository(Class cls, TransactionSession session) {
return repositoryProxy.getRepository(cls);
}
public <T> T findOne(Class<T> cls, Object key, TransactionSession session) {
if (session == null) {
throw new NullException("Session is null.");
}
RepositoryProxy repositoryProxy = session.getRepositoryProxy();
T t = null;
if (repositoryProxy != null) {
t = (T) repositoryProxy.get(cls, key);
}
if (t == null) {
return (T) repositoryProxy.getRepository(cls).findById(key).orElse(null);
}
return t;
}
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public enum AccessCode {
APP("应用支付"),
H5("H5页支付"),
JS("网页、小程序支付");
public final String text;
AccessCode(String text) {
this.text = text;
}
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public enum AccessType {
API("接口"),
SDK("工具库");
public final String text;
AccessType(String text) {
this.text = text;
}
}
package cn.quant.baa.pay.dict;
/**
* @author hechao
* @description
* @date 2020/4/20 11:08
* @modify 2020/4/20 11:08 by hechao
*/
public enum AcctTypeId {
RMBR("普通"),
FMLY("家庭"),
EMPS("雇员"),
VIPS("高级");
public final String text;
AcctTypeId(String txt) {
this.text = txt;
}
}
\ No newline at end of file
package cn.quant.baa.pay.dict;
/**
* @author hechao
* @description
* @date 2020/4/21 17:26
* @modify 2020/4/21 17:26 by hechao
*/
public enum CurrencyCode {
CNY("人民币"),
USD("美元"),
XOF("西非法郎");
public final String text;
CurrencyCode(String txt) {
this.text = txt;
}
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class DictType {
public final static String PAY = "PAY";
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/24 0024.
*/
public enum MessageEnum {
EMPTY_REQ_DATA("2000000"),
MCH_ID_ILLEGAL("2000000"),
CHAN_ID_ILLEGAL("2000000"),
BUYER_ID_ILLEGAL("2000000"),
INSTITUTION_ID_ILLEGAL("2000000"),
PRODUCT_ID_ILLEGAL("2000000"),
ACQUIRER_NOSUCH("2000000"),
ACQUIRER_NOMATCH("2000000"),
;
public final String code;
MessageEnum(String code) {
this.code = code;
}
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public enum PayChanType {
THRD("三方支付");
public final String text;
PayChanType(String text) {
this.text = text;
}
}
package cn.quant.baa.pay.dict;
/**
* Created by Administrator on 2021/8/25 0025.
*/
public enum StatusCode {
ACTP("待激活"),
DLQ0("逾期"),
DLQ1("逾1期"),
DLQ2("逾2期"),
DLQ3("逾3期"),
DLQ4("逾4期"),
DLQ5("逾5期"),
DLQ6("逾6期"),
DLQ7("逾7期"),
DLQ8("逾8期"),
LOCK("冻结"),
MINP("最小还款"),
NORM("正常"),
WOFF("坏销账"),
STOP("止付"),
CLOSE("注销"),
BILL("账单"),
DUED("到期日"),
RIST("零售分期"),
ERRO("异常"),
FAIL("失败"),
PEND("等待中"),
SUCC("成功"),
CPLT("完成");
public final String text;
StatusCode(String txt) {
this.text = txt;
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.AcctTypeId;
import cn.quant.baa.pay.dict.CurrencyCode;
import cn.quant.baa.pay.dict.StatusCode;
import cn.quant.spring.data.jpa.entity.DescribablePartitionEntity;
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/25 0025.
*/
@Entity
@Table(name = "account")
public class AccountEntity extends DescribablePartitionEntity implements Serializable {
private static final long serialVersionUID = 1878129316567080724L;
@EmbeddedId
private AccountIds ids;
@Column(name = "ACCOUNT_ID", nullable = false, updatable = false)
private Long accountId;
@Column(name = "PRODUCT_ID", nullable = false, length = 4)
private String productId;
@Column(name = "PROTOCOL_RULE", nullable = true, length = 4)
private String protocolRule;
@Enumerated(value = EnumType.STRING)
@Column(name = "ACCT_TYPE_ID", nullable = false, length = 4)
private AcctTypeId acctTypeId;
@Column(name = "CURRENT_CYCLE_NO", nullable = false)
private Integer currentCycleNo;
@Enumerated(EnumType.STRING)
@Column(name = "CURRENCY_CODE", nullable = false, length = 3)
private CurrencyCode currencyCode;
@Column(name = "MANUAL_STATUS", nullable = true, length = 4)
private String manualStatus;
@Column(name = "MANUAL_STATUS_DATE", nullable = true)
private LocalDate manualStatusDate;
@Enumerated(EnumType.STRING)
@Column(name = "AUTO_STATUS", nullable = false, length = 4)
private StatusCode autoStatus;
@Column(name = "AUTO_STATUS_DATE", nullable = false)
private LocalDate autoStatusDate;
@Column(name = "OPEN_DATE", nullable = false)
private LocalDate openDate;
@Type(type = "yes_no")
@Column(name = "CORPOTATE_ACCT_FLAG", nullable = false, length = 1)
private Boolean corpotateAcctFlag;
@Column(name = "EXTERNAL_ACCT_NO", nullable = true, length = 32)
private String externalAcctNo;
@Type(type = "yes_no")
@Column(name = "AUTO_PAYMENT_FLAG", nullable = false, length = 1)
private Boolean autoPaymentFlag;
@Column(name = "AUTO_PAYMENT_WARN_DATE", nullable = false)
private LocalDate autoPaymentWarnDate;
@Column(name = "TXN_NO", nullable = false)
private Integer txnNo;
@Column(name = "NEXT_TXN_NO", nullable = false)
private Integer nextTxnNo;
@Column(name = "TOTAL_CREDIT", nullable = false, precision = 2)
private BigDecimal totalCredit;
@Column(name = "TOTAL_DEBIT", nullable = false, precision = 2)
private BigDecimal totalDebit;
@Column(name = "CREDIT_TXN_COUNT", nullable = false)
private Integer creditTxnCount;
@Column(name = "DEBIT_TXT_COUNT", nullable = false)
private Integer debitTxtCount;
public AccountIds getIds() {
return ids;
}
public void setIds(AccountIds ids) {
this.ids = ids;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getProtocolRule() {
return protocolRule;
}
public void setProtocolRule(String protocolRule) {
this.protocolRule = protocolRule;
}
public AcctTypeId getAcctTypeId() {
return acctTypeId;
}
public void setAcctTypeId(AcctTypeId actTypeId) {
this.acctTypeId = actTypeId;
}
public Integer getCurrentCycleNo() {
return currentCycleNo;
}
public void setCurrentCycleNo(Integer currentCycleNo) {
this.currentCycleNo = currentCycleNo;
}
public CurrencyCode getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(CurrencyCode currencyCode) {
this.currencyCode = currencyCode;
}
public String getManualStatus() {
return manualStatus;
}
public void setManualStatus(String manualStatus) {
this.manualStatus = manualStatus;
}
public LocalDate getManualStatusDate() {
return manualStatusDate;
}
public void setManualStatusDate(LocalDate manualStatusDate) {
this.manualStatusDate = manualStatusDate;
}
public StatusCode getAutoStatus() {
return autoStatus;
}
public void setAutoStatus(StatusCode autoStatus) {
this.autoStatus = autoStatus;
}
public LocalDate getAutoStatusDate() {
return autoStatusDate;
}
public void setAutoStatusDate(LocalDate autoStatusDate) {
this.autoStatusDate = autoStatusDate;
}
public LocalDate getOpenDate() {
return openDate;
}
public void setOpenDate(LocalDate openDate) {
this.openDate = openDate;
}
public Boolean getCorpotateAcctFlag() {
return corpotateAcctFlag;
}
public void setCorpotateAcctFlag(Boolean corpotateAcctFlag) {
this.corpotateAcctFlag = corpotateAcctFlag;
}
public String getExternalAcctNo() {
return externalAcctNo;
}
public void setExternalAcctNo(String externalAcctNo) {
this.externalAcctNo = externalAcctNo;
}
public Boolean getAutoPaymentFlag() {
return autoPaymentFlag;
}
public void setAutoPaymentFlag(Boolean autoPaymentFlag) {
this.autoPaymentFlag = autoPaymentFlag;
}
public LocalDate getAutoPaymentWarnDate() {
return autoPaymentWarnDate;
}
public void setAutoPaymentWarnDate(LocalDate autoPaymentWarnDate) {
this.autoPaymentWarnDate = autoPaymentWarnDate;
}
public Integer getTxnNo() {
return txnNo;
}
public void setTxnNo(Integer txnNo) {
this.txnNo = txnNo;
}
public Integer getNextTxnNo() {
return nextTxnNo;
}
public void setNextTxnNo(Integer nextTxnNo) {
this.nextTxnNo = nextTxnNo;
}
public BigDecimal getTotalCredit() {
return totalCredit;
}
public void setTotalCredit(BigDecimal totalCredit) {
this.totalCredit = totalCredit;
}
public BigDecimal getTotalDebit() {
return totalDebit;
}
public void setTotalDebit(BigDecimal totalDebit) {
this.totalDebit = totalDebit;
}
public Integer getCreditTxnCount() {
return creditTxnCount;
}
public void setCreditTxnCount(Integer creditTxnCount) {
this.creditTxnCount = creditTxnCount;
}
public Integer getDebitTxtCount() {
return debitTxtCount;
}
public void setDebitTxtCount(Integer debitTxtCount) {
this.debitTxtCount = debitTxtCount;
}
@Override
public String persistenceKey() {
return ids.persistenceKey();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AccountEntity that = (AccountEntity) o;
return Objects.equals(ids, that.ids);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("AccountEntity{");
sb.append("ids=").append(ids);
sb.append(", accountId=").append(accountId);
sb.append(", productId='").append(productId).append('\'');
sb.append(", protocolRule='").append(protocolRule).append('\'');
sb.append(", acctTypeId=").append(acctTypeId);
sb.append(", currentCycleNo=").append(currentCycleNo);
sb.append(", currencyCode=").append(currencyCode);
sb.append(", manualStatus='").append(manualStatus).append('\'');
sb.append(", manualStatusDate=").append(manualStatusDate);
sb.append(", autoStatus=").append(autoStatus);
sb.append(", autoStatusDate=").append(autoStatusDate);
sb.append(", openDate=").append(openDate);
sb.append(", corpotateAcctFlag=").append(corpotateAcctFlag);
sb.append(", externalAcctNo='").append(externalAcctNo).append('\'');
sb.append(", autoPaymentFlag=").append(autoPaymentFlag);
sb.append(", autoPaymentWarnDate=").append(autoPaymentWarnDate);
sb.append(", txnNo=").append(txnNo);
sb.append(", nextTxnNo=").append(nextTxnNo);
sb.append(", totalCredit=").append(totalCredit);
sb.append(", totalDebit=").append(totalDebit);
sb.append(", creditTxnCount=").append(creditTxnCount);
sb.append(", debitTxtCount=").append(debitTxtCount);
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.EntityPrimaryIds;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/25 0025.
*/
@Embeddable
public class AccountIds extends EntityPrimaryIds implements Serializable {
private static final long serialVersionUID = -3364378648694932295L;
private final static String CLASS_NAME = AccountEntity.class.getSimpleName();
@Column(name = "INSTITUTION_ID", nullable = false, updatable = false, length = 4)
private String institutionId;
@Column(name = "ACCOUNT_REF_NO", nullable = false, updatable = false, length = 32)
private String accountRefNo;
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getAccountRefNo() {
return accountRefNo;
}
public void setAccountRefNo(String accountRefNo) {
this.accountRefNo = accountRefNo;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, institutionId, accountRefNo);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AccountIds that = (AccountIds) o;
return Objects.equals(institutionId, that.institutionId) &&
Objects.equals(accountRefNo, that.accountRefNo);
}
@Override
public int hashCode() {
return Objects.hash(CLASS_NAME, institutionId, accountRefNo);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("AccountIds{");
sb.append("institutionId='").append(institutionId).append('\'');
sb.append(", accountRefNo='").append(accountRefNo).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.DescriptionEntity;
import org.hibernate.envers.Audited;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Audited
public abstract class AuditedDescriptionEntity extends DescriptionEntity implements Serializable{
private static final long serialVersionUID = -5974712123235831070L;
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.OptimisticEntity;
import cn.quant.spring.data.jpa.entity.PartitionEntity;
import org.hibernate.envers.Audited;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
* <p><b>Enable Audited Annotation:</b><br/>
* <code>@org.hibernate.envers.Audited</code><br/>
* <code>@javax.persistence.EntityListeners(AuditingEntityListener.class)</code><br/>
* <code>@javax.persistence.MappedSuperclass</code><br/>
* </p>
* Created by hechao on 2020/2/13.
* @see cn.quant.baa.pay.support.AuditorAwareHandler
*/
@Audited
public abstract class AuditedOptimisticEntity extends OptimisticEntity implements Serializable {
private static final long serialVersionUID = 7857933536111031118L;
}
\ No newline at end of file
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.DescribablePartitionEntity;
import cn.quant.spring.data.jpa.entity.DescriptionEntity;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/24 0024.
*/
@Entity
@Table(name = "customer")
public class CustomerEntity extends DescribablePartitionEntity implements Serializable {
private final static String CLASS_NAME = CustomerEntity.class.getSimpleName();
@Id
@Column(name = "CUSTOMER_ID", nullable = false)
private Long customerId;
@Column(name = "INSTITUTION_ID", nullable = false, length = 4)
private String institutionId;
@Column(name = "CUSTOMER_REF_NO", nullable = false, length = 32)
private String customerRefNo;
@Column(name = "FULL_NAME", nullable = false, length = 72)
private String fullName;
@Column(name = "MOBILE_PHONE", nullable = false, length = 18)
private String mobilePhone;
@Column(name = "MEMBER_TYPE", nullable = false, length = 4)
private String memberType;
public Long getCustomerId() {
return customerId;
}
public void setCustomerId(Long customerId) {
this.customerId = customerId;
}
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getCustomerRefNo() {
return customerRefNo;
}
public void setCustomerRefNo(String customerRefNo) {
this.customerRefNo = customerRefNo;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getMobilePhone() {
return mobilePhone;
}
public void setMobilePhone(String mobilePhone) {
this.mobilePhone = mobilePhone;
}
public String getMemberType() {
return memberType;
}
public void setMemberType(String memberType) {
this.memberType = memberType;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, customerId);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CustomerEntity that = (CustomerEntity) o;
return Objects.equals(customerId, that.customerId);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("CustomerEntity{");
sb.append("customerId=").append(customerId);
sb.append(", institutionId='").append(institutionId).append('\'');
sb.append(", customerRefNo='").append(customerRefNo).append('\'');
sb.append(", fullName='").append(fullName).append('\'');
sb.append(", mobilePhone='").append(mobilePhone).append('\'');
sb.append(", memberType='").append(memberType).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.DictType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Entity
@Table(name = "dictionary")
public class DictionaryEntity extends AuditedOptimisticEntity implements Serializable {
@EmbeddedId
private DictionaryIds ids;
@Column(name = "NAME", nullable = false, length = 255)
private String name;
@Column(name = "IMAGE_URL", nullable = true, length = 500)
private String imageUrl;
public DictionaryIds getIds() {
return ids;
}
public void setIds(DictionaryIds ids) {
this.ids = ids;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
@Override
public String persistenceKey() {
return ids.persistenceKey();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DictionaryEntity that = (DictionaryEntity) o;
return Objects.equals(ids, that.ids);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("DictionaryEntity{");
sb.append("ids=").append(ids);
sb.append(", name='").append(name).append('\'');
sb.append(", imageUrl='").append(imageUrl).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
public String getType(){
return ids.getType();
}
public String getCode(){
return ids.getCode();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.DictType;
import cn.quant.spring.data.jpa.entity.EntityPrimaryIds;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Embeddable
public class DictionaryIds extends EntityPrimaryIds implements Serializable {
private static final long serialVersionUID = 7804804141804874320L;
private final static String CLASS_NAME = DictionaryEntity.class.getSimpleName();
@Column(name = "TYPE", nullable = false, updatable = false, length = 4)
private String type;
@Column(name = "CODE", nullable = false, updatable = false, length = 4)
private String code;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, type, code);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DictionaryIds that = (DictionaryIds) o;
return Objects.equals(type, that.type) &&
Objects.equals(code, that.code);
}
@Override
public int hashCode() {
return Objects.hash(CLASS_NAME, type, code);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("DictionaryIds{");
sb.append("type='").append(type).append('\'');
sb.append(", code='").append(code).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.AccessCode;
import cn.quant.spring.util.StringUtils;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Entity
@Table(name = "mch_channel")
public class MchChannelEntity extends AuditedDescriptionEntity implements Serializable {
private static final long serialVersionUID = 2948677889658286512L;
private final static String CLASS_NAME = MchChannelEntity.class.getSimpleName();
@Id
@Column(name = "ID", nullable = false, updatable = false)
private Long id;
@Column(name = "PAY_APP_ID", nullable = false, length = 32)
private String payAppId;
@Column(name = "PAY_CHAN_CODE", nullable = false, length = 4)
private String payChanCode;
@Column(name = "PAY_ACCT_ID", nullable = false, length = 64)
private String payAcctId;
@Enumerated(value = EnumType.STRING)
@Column(name = "ACCESS_CODE", nullable = false, length = 3)
private AccessCode accessCode;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPayAppId() {
return payAppId;
}
public void setPayAppId(String payAppId) {
this.payAppId = payAppId;
}
public String getPayChanCode() {
return payChanCode;
}
public void setPayChanCode(String payChanCode) {
this.payChanCode = payChanCode;
}
public String getPayAcctId() {
return payAcctId;
}
public void setPayAcctId(String payAcctId) {
this.payAcctId = payAcctId;
}
public AccessCode getAccessCode() {
return accessCode;
}
public void setAccessCode(AccessCode accessCode) {
this.accessCode = accessCode;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, id);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MchChannelEntity that = (MchChannelEntity) o;
return Objects.equals(id, that.id);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MchChannelEntity{");
sb.append("id=").append(id);
sb.append(", payAppId='").append(payAppId).append('\'');
sb.append(", payChanCode='").append(payChanCode).append('\'');
sb.append(", payAcctId='").append(payAcctId).append('\'');
sb.append(", accessCode=").append(accessCode);
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.PayChanType;
import cn.quant.spring.data.jpa.entity.OptimisticEntity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Entity
@Table(name = "pay_account")
public class PayAccountEntity extends OptimisticEntity implements Serializable {
private static final long serialVersionUID = 272268892694382599L;
@EmbeddedId
private PayAccountIds ids;
@Enumerated(value = EnumType.STRING)
@Column(name = "PAY_CHAN_TYPE", nullable = false, length = 4)
private PayChanType payChanType;
@Column(name = "DOMAIN", nullable = false, length = 255)
private String domain;
@Column(name = "NAME", nullable = false, length = 255)
private String name;
@Column(name = "ENCRYPT_KEY", nullable = false, length = 64)
private String encryptKey;
@Column(name = "ENCRYPT_TYPE", nullable = false, length = 32)
private String encryptType;
@Column(name = "PRIVATE_KEY", nullable = false, length = 255)
private String privateKey;
@Column(name = "PAY_PUBLIC_KEY", nullable = false, length = 255)
private String payPublicKey;
public PayAccountIds getIds() {
return ids;
}
public void setIds(PayAccountIds ids) {
this.ids = ids;
}
public PayChanType getPayChanType() {
return payChanType;
}
public void setPayChanType(PayChanType payChanType) {
this.payChanType = payChanType;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEncryptKey() {
return encryptKey;
}
public void setEncryptKey(String encryptKey) {
this.encryptKey = encryptKey;
}
public String getEncryptType() {
return encryptType;
}
public void setEncryptType(String encryptType) {
this.encryptType = encryptType;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getPayPublicKey() {
return payPublicKey;
}
public void setPayPublicKey(String payPublicKey) {
this.payPublicKey = payPublicKey;
}
@Override
public String persistenceKey() {
return ids.persistenceKey();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PayAccountEntity)) return false;
PayAccountEntity that = (PayAccountEntity) o;
return Objects.equals(ids, that.ids);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayAccountEntity{");
sb.append("ids=").append(ids);
sb.append(", payChanType=").append(payChanType);
sb.append(", domain='").append(domain).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", encryptKey='").append(encryptKey).append('\'');
sb.append(", encryptType='").append(encryptType).append('\'');
sb.append(", privateKey='").append(privateKey).append('\'');
sb.append(", payPublicKey='").append(payPublicKey).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.EntityPrimaryIds;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Embeddable
public class PayAccountIds extends EntityPrimaryIds implements Serializable {
private static final long serialVersionUID = 5987381896875415656L;
private static final String CLASS_NAME = PayAccountEntity.class.getSimpleName();
@Column(name = "PAY_CHAN_CODE", nullable = false, updatable = false, length = 4)
private String payChanCode;
@Column(name = "PAY_ACCT_ID", nullable = false, updatable = false, length = 64)
private String payAcctId;
public String getPayChanCode() {
return payChanCode;
}
public void setPayChanCode(String payChanCode) {
this.payChanCode = payChanCode;
}
public String getPayAcctId() {
return payAcctId;
}
public void setPayAcctId(String payAcctId) {
this.payAcctId = payAcctId;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, payChanCode, payAcctId);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PayAccountIds)) return false;
PayAccountIds that = (PayAccountIds) o;
return Objects.equals(payChanCode, that.payChanCode) &&
Objects.equals(payAcctId, that.payAcctId);
}
@Override
public int hashCode() {
return Objects.hash(CLASS_NAME, payChanCode, payAcctId);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayAccountIds{");
sb.append("payChanCode='").append(payChanCode).append('\'');
sb.append(", payAcctId='").append(payAcctId).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.util.StringUtils;
import org.hibernate.annotations.Type;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Entity
@Table(name = "pay_app")
public class PayAppEntity extends AuditedOptimisticEntity implements Serializable {
private static final long serialVersionUID = -5502377854231068271L;
private final static String CLASS_NAME = PayAppEntity.class.getSimpleName();
@Id
@Column(name = "PAY_APP_ID", nullable = false, updatable = false, length = 32)
private String payAppId;
@Column(name = "INSTITUTION_ID", nullable = false, updatable = false, length = 4)
private String institutionId;
@Column(name = "PRODUCT_ID", nullable = false, updatable = false, length = 4)
private String productId;
@Column(name = "PAY_APP_NAME", nullable = false, length = 255)
private String payAppName;
@Column(name = "SECURITY_KEY", nullable = false, length = 64)
private String securityKey;
@Column(name = "START_DATE", nullable = false)
private LocalDate startDate;
@Column(name = "END_DATE", nullable = false)
private LocalDate endDate;
@Type(type = "yes_no")
@Column(name = "ACTIVATED_FLAG", nullable = false, length = 1)
private Boolean activatedFlag;
public String getPayAppId() {
return payAppId;
}
public void setPayAppId(String payAppId) {
this.payAppId = payAppId;
}
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getPayAppName() {
return payAppName;
}
public void setPayAppName(String payAppName) {
this.payAppName = payAppName;
}
public String getSecurityKey() {
return securityKey;
}
public void setSecurityKey(String securityKey) {
this.securityKey = securityKey;
}
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
public Boolean getActivatedFlag() {
return activatedFlag;
}
public void setActivatedFlag(Boolean activatedFlag) {
this.activatedFlag = activatedFlag;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, payAppId);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PayAppEntity)) return false;
PayAppEntity that = (PayAppEntity) o;
return Objects.equals(payAppId, that.payAppId);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayAppEntity{");
sb.append("payAppId='").append(payAppId).append('\'');
sb.append(", payAppName='").append(payAppName).append('\'');
sb.append(", securityKey='").append(securityKey).append('\'');
sb.append(", startDate=").append(startDate);
sb.append(", endDate=").append(endDate);
sb.append(", activatedFlag=").append(activatedFlag);
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.AccessType;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Entity
@Table(name = "pay_feature")
public class PayFeatureEntity extends AuditedDescriptionEntity implements Serializable {
private static final long serialVersionUID = -3977191384143230391L;
@EmbeddedId
private PayFeatureIds ids;
@Enumerated(value = EnumType.STRING)
@Column(name = "ACCESS_TYPE", nullable = false, length = 3)
private AccessType accessType;
@Column(name = "VERSION", nullable = false, length = 4)
private String version;
@Column(name = "ACCESS_PATH", nullable = true, length = 255)
private String accessPath;
public PayFeatureIds getIds() {
return ids;
}
public void setIds(PayFeatureIds ids) {
this.ids = ids;
}
public AccessType getAccessType() {
return accessType;
}
public void setAccessType(AccessType accessType) {
this.accessType = accessType;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getAccessPath() {
return accessPath;
}
public void setAccessPath(String accessPath) {
this.accessPath = accessPath;
}
@Override
public String persistenceKey() {
return ids.persistenceKey();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PayFeatureEntity that = (PayFeatureEntity) o;
return Objects.equals(ids, that.ids);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayFeatureEntity{");
sb.append("ids=").append(ids);
sb.append(", accessType='").append(accessType).append('\'');
sb.append(", version='").append(version).append('\'');
sb.append(", accessPath='").append(accessPath).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.jpa.entity;
import cn.quant.baa.pay.dict.AccessCode;
import cn.quant.spring.data.jpa.entity.EntityPrimaryIds;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Embeddable
public class PayFeatureIds extends EntityPrimaryIds implements Serializable {
private static final long serialVersionUID = -8852766242045564647L;
private final static String CLASS_NAME = PayFeatureEntity.class.getSimpleName();
@Column(name = "PAY_CHAN_CODE", nullable = false, updatable = false, length = 4)
private String payChanCode;
@Enumerated(value = EnumType.STRING)
@Column(name = "ACCESS_CODE", nullable = false, updatable = false, length = 3)
private AccessCode accessCode;
public String getPayChanCode() {
return payChanCode;
}
public void setPayChanCode(String payChanCode) {
this.payChanCode = payChanCode;
}
public AccessCode getAccessCode() {
return accessCode;
}
public void setAccessCode(AccessCode accessCode) {
this.accessCode = accessCode;
}
@Override
public String persistenceKey() {
return StringUtils.toDelimitedString(CLASS_NAME, payChanCode, accessCode);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PayFeatureIds)) return false;
PayFeatureIds that = (PayFeatureIds) o;
return Objects.equals(payChanCode, that.payChanCode) &&
Objects.equals(accessCode, that.accessCode);
}
@Override
public int hashCode() {
return Objects.hash(CLASS_NAME, payChanCode, accessCode);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayFeatureIds{");
sb.append("payChanCode='").append(payChanCode).append('\'');
sb.append(", accessCode='").append(accessCode).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
}
}
/**
* jpa entity
*/
package cn.quant.baa.pay.jpa.entity;
package cn.quant.baa.pay.jpa.entity.support;
import cn.quant.spring.convert.LocalDateNumberConverter;
import javax.persistence.Converter;
/**
* <p><b>Enable Date To Number Annotation:</b><br/>
* <code>@javax.persistence.Converter(autoApply = true).</code></p>
* Created by hechao included 2020/2/28.
*/
@Converter(autoApply = true)
public class JpaLocalDateNumberConverter extends LocalDateNumberConverter {
public JpaLocalDateNumberConverter() {
}
}
package cn.quant.baa.pay.jpa.entity.support;
import cn.quant.spring.convert.LocalDateTimeNumberConverter;
import javax.persistence.Converter;
/**
* <p><b>Enable Date To Number Annotation:</b><br/>
* <code>@javax.persistence.Converter(autoApply = true).</code></p>
* Created by hechao included 2020/2/28.
*/
@Converter(autoApply = true)
public class JpaLocalDateTimeNumberConverter extends LocalDateTimeNumberConverter {
public JpaLocalDateTimeNumberConverter() {
}
}
package cn.quant.baa.pay.jpa.entity.support;
import cn.quant.spring.convert.LocalTimeNumberConverter;
import javax.persistence.Converter;
/**
* <p><b>Enable Date To Number Annotation:</b><br/>
* <code>@javax.persistence.Converter(autoApply = true).</code></p>
* Created by hechao included 2020/2/28.
*/
@Converter(autoApply = true)
public class JpaLocalTimeNumberConverter extends LocalTimeNumberConverter {
public JpaLocalTimeNumberConverter() {
}
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.AccountEntity;
import cn.quant.baa.pay.jpa.entity.AccountIds;
import cn.quant.baa.pay.jpa.entity.CustomerEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface AccountRepository extends JpaRepository<AccountEntity, AccountIds> {
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.CustomerEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface CustomerRepository extends JpaRepository<CustomerEntity, Long> {
@Query(value = "select cust from CustomerEntity cust where cust.institutionId=:institutionId and cust.customerRefNo=:customerRefNo")
CustomerEntity findOne(@Param("institutionId") String institutionId, @Param("customerRefNo") String customerRefNo);
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.DictionaryEntity;
import cn.quant.baa.pay.jpa.entity.DictionaryIds;
import cn.quant.baa.pay.jpa.entity.PayAppEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface DictionaryRepository extends JpaRepository<DictionaryEntity, DictionaryIds> {
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.MchChannelEntity;
import cn.quant.baa.pay.jpa.entity.PayAppEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface MchChannelRepository extends JpaRepository<MchChannelEntity, Long> {
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.PayAccountEntity;
import cn.quant.baa.pay.jpa.entity.PayAccountIds;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface PayAccountRepository extends JpaRepository<PayAccountEntity, PayAccountIds> {
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.PayAccountEntity;
import cn.quant.baa.pay.jpa.entity.PayAccountIds;
import cn.quant.baa.pay.jpa.entity.PayAppEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface PayAppRepository extends JpaRepository<PayAppEntity, String> {
}
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.PayAppEntity;
import cn.quant.baa.pay.jpa.entity.PayFeatureEntity;
import cn.quant.baa.pay.jpa.entity.PayFeatureIds;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface PayFeatureRepository extends JpaRepository<PayFeatureEntity, PayFeatureIds> {
}
/**
* jpa repository
*/
package cn.quant.baa.pay.jpa.repository;
package cn.quant.baa.pay.model;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class Acquirer {
private String code;
private String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package cn.quant.baa.pay.model;
import cn.quant.baa.pay.BusinessException;
import cn.quant.baa.pay.dict.MessageEnum;
import cn.quant.spring.NullException;
import cn.quant.spring.context.ContextLoader;
import cn.quant.spring.context.ServerApplicationContext;
import cn.quant.spring.util.StringUtils;
import java.util.Locale;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class AssertUtils {
public static String getMessage(MessageEnum code, Object... args){
ServerApplicationContext context = ContextLoader.getCurrentApplicationContext();
return context.getMessage(code.name(), args, Locale.SIMPLIFIED_CHINESE);
}
public static BusinessException exception(MessageEnum code, Object... args) {
return new BusinessException(code, getMessage(code, args));
}
public static void throwMessage(MessageEnum code, Object... args) throws BusinessException {
throw exception(code, args);
}
public static void throwMessage(MessageEnum code) throws BusinessException {
ServerApplicationContext context = ContextLoader.getCurrentApplicationContext();
throw new BusinessException(code, context.getMessage(code.name(), Locale.SIMPLIFIED_CHINESE));
}
public static void notEmpty(String requestId, Object val, Class cls) {
if (val == null) {
throw new NullException(StringUtils.format("{} data is null - {}", cls.getSimpleName(), requestId));
}
}
public static void notEmpty(String requestId, Number val, String msg) {
if(StringUtils.isEmpty(val)){
throw new NullException(msg);
}
}
public static void notEmpty(String requestId, String val, String msg) {
if(StringUtils.isEmpty(val)){
throw new NullException(msg);
}
}
}
package cn.quant.baa.pay.model;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.spring.http.HttpRequestData;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class BusinessRequest<E extends Serializable> extends HttpRequestData<E> {
}
package cn.quant.baa.pay.model;
import java.io.Serializable;
/**
* Created by Administrator on 2021/8/23 0023.
*/
public class DictionaryItem implements Serializable {
private static final long serialVersionUID = -1385949230287727125L;
private String type;
private String code;
private String name;
private String imageUrl;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("DictionaryItem{");
sb.append("type='").append(type).append('\'');
sb.append(", code='").append(code).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", imageUrl='").append(imageUrl).append('\'');
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.model;
import cn.quant.baa.pay.dict.AccessCode;
import cn.quant.baa.pay.dict.AccessType;
import cn.quant.baa.pay.dict.PayChanType;
import java.io.Serializable;
import java.time.LocalDate;
/**
* Created by Administrator on 2021/8/22 0022.
*/
public class MerchantAcquirerProfile implements Serializable{
private static final long serialVersionUID = -9197591972747983682L;
private Long mchChanId;
//account
private String payChanCode;
private String payAcctId;
private PayChanType payChanType;
private String domain;
private String name;
private String encryptKey;
private String encryptType;
private String privateKey;
private String payPublicKey;
//feature
private AccessCode accessCode;
private AccessType accessType;
private String version;
private String accessPath;
private String descText;
//APP
private String institutionId;
private String productId;
private String payAppId;
private String payAppName;
private String securityKey;
private LocalDate startDate;
private LocalDate endDate;
private Boolean activatedFlag;
public Long getMchChanId() {
return mchChanId;
}
public void setMchChanId(Long mchChanId) {
this.mchChanId = mchChanId;
}
public String getPayChanCode() {
return payChanCode;
}
public void setPayChanCode(String payChanCode) {
this.payChanCode = payChanCode;
}
public String getPayAcctId() {
return payAcctId;
}
public void setPayAcctId(String payAcctId) {
this.payAcctId = payAcctId;
}
public PayChanType getPayChanType() {
return payChanType;
}
public void setPayChanType(PayChanType payChanType) {
this.payChanType = payChanType;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEncryptKey() {
return encryptKey;
}
public void setEncryptKey(String encryptKey) {
this.encryptKey = encryptKey;
}
public String getEncryptType() {
return encryptType;
}
public void setEncryptType(String encryptType) {
this.encryptType = encryptType;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getPayPublicKey() {
return payPublicKey;
}
public void setPayPublicKey(String payPublicKey) {
this.payPublicKey = payPublicKey;
}
public AccessCode getAccessCode() {
return accessCode;
}
public void setAccessCode(AccessCode accessCode) {
this.accessCode = accessCode;
}
public AccessType getAccessType() {
return accessType;
}
public void setAccessType(AccessType accessType) {
this.accessType = accessType;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getAccessPath() {
return accessPath;
}
public void setAccessPath(String accessPath) {
this.accessPath = accessPath;
}
public String getDescText() {
return descText;
}
public void setDescText(String descText) {
this.descText = descText;
}
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getPayAppId() {
return payAppId;
}
public void setPayAppId(String payAppId) {
this.payAppId = payAppId;
}
public String getPayAppName() {
return payAppName;
}
public void setPayAppName(String payAppName) {
this.payAppName = payAppName;
}
public String getSecurityKey() {
return securityKey;
}
public void setSecurityKey(String securityKey) {
this.securityKey = securityKey;
}
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
public Boolean getActivatedFlag() {
return activatedFlag;
}
public void setActivatedFlag(Boolean activatedFlag) {
this.activatedFlag = activatedFlag;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MerchantAcquirerProfile{");
sb.append("mchChanId=").append(mchChanId);
sb.append(", payChanCode='").append(payChanCode).append('\'');
sb.append(", payAcctId='").append(payAcctId).append('\'');
sb.append(", payChanType=").append(payChanType);
sb.append(", domain='").append(domain).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", encryptKey='").append(encryptKey).append('\'');
sb.append(", encryptType='").append(encryptType).append('\'');
sb.append(", privateKey='").append(privateKey).append('\'');
sb.append(", payPublicKey='").append(payPublicKey).append('\'');
sb.append(", accessCode=").append(accessCode);
sb.append(", accessType=").append(accessType);
sb.append(", version='").append(version).append('\'');
sb.append(", accessPath='").append(accessPath).append('\'');
sb.append(", descText='").append(descText).append('\'');
sb.append(", institutionId='").append(institutionId).append('\'');
sb.append(", productId='").append(productId).append('\'');
sb.append(", payAppId='").append(payAppId).append('\'');
sb.append(", payAppName='").append(payAppName).append('\'');
sb.append(", securityKey='").append(securityKey).append('\'');
sb.append(", startDate=").append(startDate);
sb.append(", endDate=").append(endDate);
sb.append(", activatedFlag=").append(activatedFlag);
sb.append('}');
return sb.toString();
}
}
package cn.quant.baa.pay.model;
import cn.quant.baa.pay.MerchantAcquirer;
import cn.quant.baa.pay.MerchantAcquirerBook;
import cn.quant.baa.pay.config.DictionaryViewer;
import cn.quant.baa.pay.dict.DictType;
import cn.quant.spring.UnsupportedException;
import cn.quant.spring.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Service
public class ModelBuilder {
@Autowired
private DictionaryViewer dictionaryViewer;
public MerchantAcquirer toModel(MerchantAcquirerProfile profile) {
MerchantAcquirer response = new MerchantAcquirer();
response.setAccessCode(profile.getAccessCode().name());
response.setAccessType(profile.getAccessType().name());
response.setChanCode(profile.getPayChanCode());
response.setChanId(profile.getMchChanId());
response.setChanType(profile.getPayChanType().name());
response.setName(profile.getName());
response.setVersion(profile.getVersion());
response.setDescText(profile.getDescText());
return response;
}
public Collection<MerchantAcquirer> toModel(Collection<MerchantAcquirerProfile> profiles) {
LinkedList<MerchantAcquirer> list = new LinkedList<>();
for (MerchantAcquirerProfile profile : profiles) {
list.add(toModel(profile));
}
return list;
}
public Map<String, MerchantAcquirerBook> toModel(Map<String, Collection<MerchantAcquirerProfile>> profiles) {
Map<String, MerchantAcquirerBook> models = new HashMap<>();
for (String code : profiles.keySet()) {
DictionaryItem item = dictionaryViewer.get(DictType.PAY, code);
if (item == null) {
throw new UnsupportedException(StringUtils.format("Dictionary item is null({}, {}).", DictType.PAY, code));
}
Collection<MerchantAcquirerProfile> collection = profiles.get(code);
MerchantAcquirerBook book = new MerchantAcquirerBook();
book.setCode(code);
book.setName(item.getName());
book.setImageUrl(item.getImageUrl());
for (MerchantAcquirerProfile profile : collection) {
book.add(toModel(profile));
}
models.put(book.getCode(), book);
}
return models;
}
}
package cn.quant.baa.pay.service;
import cn.quant.baa.pay.component.Sequencer;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.dict.AcctTypeId;
import cn.quant.baa.pay.dict.CurrencyCode;
import cn.quant.baa.pay.dict.StatusCode;
import cn.quant.baa.pay.jpa.entity.AccountEntity;
import cn.quant.baa.pay.jpa.entity.AccountIds;
import cn.quant.baa.pay.model.AssertUtils;
import cn.quant.spring.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.time.LocalDate;
import static cn.quant.baa.pay.Constant.MINI_LOCAL_DATE;
import static cn.quant.baa.pay.dict.MessageEnum.*;
/**
* Created by Administrator on 2021/8/25 0025.
*/
public abstract class BusinessService {
private static final Logger logger = LoggerFactory.getLogger(BusinessService.class);
@Autowired
private Sequencer sequencer;
public void prepare(String institutionId, String productId, String buyerId, TransactionSession session) {
if (StringUtils.isEmpty(institutionId)) {
AssertUtils.throwMessage(INSTITUTION_ID_ILLEGAL);
}
if (StringUtils.isEmpty(productId)) {
AssertUtils.throwMessage(PRODUCT_ID_ILLEGAL);
}
if (StringUtils.isEmpty(buyerId)) {
AssertUtils.throwMessage(BUYER_ID_ILLEGAL);
}
AccountIds ids = new AccountIds();
ids.setInstitutionId(institutionId);
ids.setAccountRefNo(buyerId);
AccountEntity account = session.findOne(AccountEntity.class, ids, session);
if (account == null) {
Long id = sequencer.nextId(buyerId.hashCode());
LocalDate now = LocalDate.now();
account = new AccountEntity();
account.setIds(ids);
account.setAccountId(id);
account.setAcctTypeId(AcctTypeId.EMPS);
account.setAutoPaymentFlag(false);
account.setAutoPaymentWarnDate(MINI_LOCAL_DATE);
account.setAutoStatus(StatusCode.NORM);
account.setAutoStatusDate(now);
account.setCorpotateAcctFlag(false);
account.setCreditTxnCount(0);
account.setCurrencyCode(CurrencyCode.CNY);
account.setCurrentCycleNo(1);
account.setDebitTxtCount(0);
account.setExternalAcctNo(buyerId);
account.setManualStatus(null);
account.setManualStatusDate(null);
account.setNextTxnNo(1);
account.setOpenDate(now);
account.setProductId(productId);
account.setProtocolRule(null);
account.setTotalCredit(BigDecimal.ZERO);
account.setTotalDebit(BigDecimal.ZERO);
account.setTxnNo(0);
account.setPartitionKey(sequencer.getPartitionKey(id));
session.pushEntity(account);
}
}
}
package cn.quant.baa.pay.service;
import cn.quant.baa.pay.MerchantChannelRequestData;
import cn.quant.baa.pay.config.MerchantAcquirerBuilder;
import cn.quant.baa.pay.MerchantAcquirer;
import cn.quant.baa.pay.MerchantAcquirerBook;
import cn.quant.baa.pay.model.MerchantAcquirerProfile;
import cn.quant.baa.pay.model.ModelBuilder;
import cn.quant.spring.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Map;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@Service
public class MerchantService {
@Autowired
private MerchantAcquirerBuilder merchantAcquirerBuilder;
@Autowired
private ModelBuilder modelBuilder;
@Cacheable(cacheManager = "profileCacheManager"
, cacheNames = "LOCAL_PROFILE"
, key = "#requestData.persistenceKey()")
public Map<String, MerchantAcquirerBook> getChannels(MerchantChannelRequestData requestData) {
String mchId = requestData.getMchId();
String channel = requestData.getChannel();
Map<String, Collection<MerchantAcquirerProfile>> profiles;
if (StringUtils.isEmpty(channel)) {
profiles = merchantAcquirerBuilder.get(mchId);
} else {
profiles = merchantAcquirerBuilder.get(mchId, channel);
}
Map<String, MerchantAcquirerBook> response = modelBuilder.toModel(profiles);
return response;
}
public MerchantAcquirer getChannel(MerchantChannelRequestData requestData) {
return getChannel(Long.parseLong(requestData.getChanId()));
}
@Cacheable(cacheManager = "profileCacheManager"
, cacheNames = "LOCAL_PROFILE"
, key = "#id")
public MerchantAcquirer getChannel(Long id) {
MerchantAcquirerProfile profile = merchantAcquirerBuilder.get(id);
return modelBuilder.toModel(profile);
}
}
package cn.quant.baa.pay.service;
import cn.quant.baa.pay.PayRequestData;
import cn.quant.baa.pay.config.MerchantAcquirerBuilder;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.model.AssertUtils;
import cn.quant.baa.pay.model.MerchantAcquirerProfile;
import cn.quant.spring.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import static cn.quant.baa.pay.dict.MessageEnum.*;
/**
* Created by Administrator on 2021/8/24 0024.
*/
@Service
public class TransactionService extends BusinessService {
private static final Logger logger = LoggerFactory.getLogger(TransactionService.class);
@Autowired
private MerchantAcquirerBuilder merchantAcquirerBuilder;
public void pay(PayRequestData data, TransactionSession session) {
if (data == null) {
AssertUtils.throwMessage(EMPTY_REQ_DATA);
}
String chanId = data.getChanId();
if (StringUtils.isEmpty(chanId)) {
AssertUtils.throwMessage(CHAN_ID_ILLEGAL);
}
String mchId = data.getMchId();
if (StringUtils.isEmpty(mchId)) {
AssertUtils.throwMessage(MCH_ID_ILLEGAL);
}
MerchantAcquirerProfile profile = merchantAcquirerBuilder.get(Long.valueOf(chanId));
if (profile == null) {
AssertUtils.throwMessage(ACQUIRER_NOSUCH);
}
if (!mchId.equals(profile.getPayAppId())) {
AssertUtils.throwMessage(ACQUIRER_NOMATCH);
}
prepare(profile.getInstitutionId(), profile.getProductId(), StringUtils.trimAllWhitespace(data.getBuyerId()), session);
System.currentTimeMillis();
}
}
package cn.quant.baa.pay.support;
import org.springframework.data.domain.AuditorAware;
import org.springframework.stereotype.Component;
import java.util.Optional;
/**
* <p><b>Enable Auditor Aware:</b><br/>
* <code>@org.springframework.stereotype.Component("auditorAwareHandler")</code></p>
* Created by hechao included 2017/9/15.
* @see cn.quant.baa.pay.jpa.entity
*/
@Component("auditorAwareHandler")
public class AuditorAwareHandler implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("SYS");
}
}
\ No newline at end of file
package cn.quant.baa.pay.support;
import cn.quant.spring.ExceptionEnum;
import cn.quant.spring.ServerRuntimeException;
import cn.quant.spring.context.ContextLoader;
import cn.quant.spring.context.ServerApplicationContext;
import cn.quant.spring.http.HttpResponseData;
import cn.quant.spring.web.annotation.JsonpMapping;
import cn.quant.spring.web.support.JsonpResponseAdvice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* <p><b>Enable Exception Advice Annotation:</b><br/>
* <code>@org.springframework.web.bind.annotation.RestControllerAdvice</code>
* </p>
* @date 2018-04-09 11:01
**/
@RestControllerAdvice
public class ExceptionAdvice {
private static final Logger log = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public HttpResponseData handlerException(HttpServletRequest request, Exception e) {
log.error("Exception url:{}, error:{}", request.getRequestURI(), e);
String message = e.getMessage();
HttpResponseData responseData = new HttpResponseData(e);
if ((message == null) && ServerRuntimeException.class.isInstance(e)) {
ServerRuntimeException exception = (ServerRuntimeException) e;
ExceptionEnum type = exception.getType();
if (type != null) {
ServerApplicationContext applicationContext = ContextLoader.getCurrentApplicationContext();
message = applicationContext.getMessage(type.MESSAGE_CODE);
responseData.setMessage(message);
responseData.setStatus(type.ERROR_CODE);
}
}
return responseData;
}
}
\ No newline at end of file
package cn.quant.baa.pay.support;
import cn.quant.spring.web.annotation.JsonpMapping;
import cn.quant.spring.web.support.JsonpResponseAdvice;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* <p><b>Enable Jsonp Annotation:</b><br/>
* <code>@org.springframework.web.bind.annotation.RestControllerAdvice</code></p>
*
* Created by hechao included 2018/7/26.
* @see JsonpMapping
* @see RestControllerAdvice
* @see JsonpResponseAdvice
*/
//@RestControllerAdvice
public class HttpJsonpResponseAdvice extends JsonpResponseAdvice {
}
\ No newline at end of file
/**
* <p>Convert Entity Attribute:<br/>
* <code>annotation {@link javax.persistence.Converter}, interface {@link javax.persistence.AttributeConverter}.</code></P>
* <p>Inject Auditor Aware:<br/>
* <code>annotation {@link org.springframework.stereotype.Component}, interface {@link org.springframework.data.domain.AuditorAware}.</code></P>
*
*/
package cn.quant.baa.pay.support;
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>cn.quant.baa.pay</groupId>
<artifactId>baa-pay</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>baa-pay-server</artifactId>
<name>baa-pay-server</name>
<packaging>jar</packaging>
<profiles>
<profile>
<id>dev</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>cn.quant.baa.pay</groupId>
<artifactId>baa-pay-core</artifactId>
<version>1.0.0</version>
</dependency>
<!--quant-->
<dependency>
<groupId>cn.quant.spring.boot</groupId>
<artifactId>quant-spring-boot-starter-web</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
</exclusion>
<exclusion>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.package.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/classes</targetPath>
<includes>
<include>**/*.yml</include>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.txt</include>
</includes>
</resource>
<resource>
<directory>src/main/bin</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/bin</targetPath>
<includes>
<include>**/*.sh</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.source}</target>
<encoding>${maven.compiler.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>cn.quant.baa.pay.ServerApplication</mainClass>
<layout>ZIP</layout>
</configuration>
</plugin>
<!--<plugin>-->
<!--<artifactId>maven-assembly-plugin</artifactId>-->
<!--<configuration>-->
<!--<appendAssemblyId>false</appendAssemblyId>-->
<!--<descriptors>-->
<!--<descriptor>src/assembly/assembly.xml</descriptor>-->
<!--</descriptors>-->
<!--</configuration>-->
<!--<executions>-->
<!--<execution>-->
<!--<id>make-assembly</id>-->
<!--<phase>package</phase>-->
<!--<goals>-->
<!--<goal>single</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<!--</plugin>-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!--TODO:mybatis-->
<!--
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<configuration>
<configurationFile>src/main/resources/mybatis.cfg.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>cn.quant.mybatis.generator</groupId>
<artifactId>quant-mybatis-generator</artifactId>
<version>1.3.6</version>
</dependency>
</dependencies>
</plugin>
-->
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>servers</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>target/bin</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<files>
<file>
<source>target/${project.package.name}.jar</source>
<outputDirectory>/</outputDirectory>
<destName>${project.package.name}.jar</destName>
</file>
<file>
<source>target/config/application-${spring.profiles.active}.properties</source>
<outputDirectory>/config</outputDirectory>
<destName>application.properties</destName>
</file>
<file>
<source>target/config/logback-spring.xml</source>
<outputDirectory>/config</outputDirectory>
<destName>logback-spring.xml</destName>
</file>
</files>
</assembly>
\ No newline at end of file
#!/bin/sh
JAVA="$JAVA_HOME/bin/java"
JAVAPS="$JAVA_HOME/bin/jps"
if $cygwin
then
KILL=/bin/kill
else
KILL=kill
fi
if readlink -f "$0" > /dev/null 2>&1
then
APP_BIN=$(readlink -f $0)
else
APP_BIN=$(pwd -P)
fi
#APP_HOME=${APP_BIN%'/bin'*}
APP_HOME=${APP_BIN%'/'*}
echo "[INFO]Terminate the server; home=$APP_HOME"
CPS=$(ps -e -opid,cmd | grep -i "^[0-9]* .*/java .*-Dapplication.home.dir=$APP_HOME .*${project.name}.*\.jar" | grep -v "grep" | head -n 1 | awk '{print $1}')
if [ -z "$CPS" ]; then
echo "[INFO]server is not running"
exit 1
else
PSID=${CPS%%" /"*}
if [ $PSID -eq 0 ]; then
echo "[ERROR]Not found PID"
exit 1
else
$KILL -15 $PSID
echo "[INFO]Stopped server; home=$APP_HOME; PID=$PSID"
exit 0
fi
fi
\ No newline at end of file
#!/bin/sh
if [ "$JAVA_HOME" != "" ]; then
JAVA="$JAVA_HOME/bin/java"
else
JAVA=java
fi
echo "JAVA: "$JAVA
if readlink -f "$0" > /dev/null 2>&1
then
BIN_PATH=$(readlink -f $0)
else
BIN_PATH=$(pwd -P)
fi
#APP_HOME=${BIN_PATH%"/bin"*}
APP_HOME=${BIN_PATH%"/"*}
echo "APP_HOME: "$APP_HOME
APP_JAR=$(find "$APP_HOME" -maxdepth 1 -name "${project.name}*\.jar" | head -n 1)
if [ -z "$APP_JAR" ]; then
echo "[ERROR]Not found main jar file"
exit 1
fi
echo "APP_JAR: "$APP_JAR
echo "[INFO]Start the server; home=$APP_HOME"
CPS=$(ps -e -opid,cmd | grep -i "^[0-9]* .*/java .*-Dapplication.home.dir=$APP_HOME .*${project.name}.*\.jar" | grep -v "grep" | head -n 1 | awk '{print $1}')
if [ -n "$CRACKPS" ]; then
echo "[ERROR]Server is running;"
exit 1
else
JAVAOPTS="-Xms512m -Xmx1024m -Xmn256m -Xss1024k"
APPOPTS="-Dfile.encoding=UTF-8 -Dapplication.home.dir=$APP_HOME -Dlogging.config=$APP_HOME/config/logback-spring.xml"
echo "[INFO]Application options: $APPOPTS"
$JAVA $JAVAOPTS $APPOPTS "-jar" $APP_JAR "--spring.config.file=$APP_HOME/config/application.properties" 2>&1 >/dev/null &
#echo $JAVA $JAVAOPTS "-jar" $APP_JAR
exit 0
fi
\ No newline at end of file
CREATE TABLE `optimistic` (
`DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述',
`CREATED_BY` varchar(72) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(72) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table optimistic add `DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述';
alter table optimistic add `CREATED_BY` varchar(72) NOT NULL COMMENT '创建用户';
alter table optimistic add `CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间';
alter table optimistic add `MODIFIED_BY` varchar(72) NOT NULL COMMENT '更新用户';
alter table optimistic add `MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间';
alter table optimistic add `MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数';
alter table optimistic add `PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键';
alter table optimistic add `EXTENDED_FIELD1` varchar(4) DEFAULT NULL;
alter table optimistic add `EXTENDED_FIELD2` varchar(4) DEFAULT NUL;
alter table optimistic add `EXTENDED_FIELD3` varchar(4) DEFAULT NULL;
\ No newline at end of file
package cn.quant.baa.pay;
import cn.quant.spring.util.IdentitySequencer;
import cn.quant.spring.util.ServerUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* <p><b>Application VM Option:</b><br/>
* <code>--spring.config.file=${project.build.directory}/target/config/application-dev.properties </code><br/>
* <code>-Dlogging.config=${project.build.directory}/target/config/logback-spring.xml</code></p>
* <p><b>Enable Dubbo Annotation: </b><br/>
* <code>@org.springframework.context.annotation.ImportResource(locations = {"classpath:application-dubbo.xml"})</code></p>
*/
@ComponentScan
@SpringBootApplication
@EnableAutoConfiguration
@PropertySource(value = {"classpath:config/bootstrap.yml"
, "classpath:config/application.yml"})
public class ServerApplication {
@Inject
private ApplicationContext context;
@PostConstruct
private void init() throws Exception {
Environment environment = context.getEnvironment();
IdentitySequencer sequencer = context.getBean(IdentitySequencer.class);
Logger logger = LoggerFactory.getLogger(ServerApplication.class);
logger.info("\n---------------------------------------------------------------------\n" +
"\tWorker Id : {}\n" +
"\tServer IP : {}\n" +
"\tConfig File : {}\n" +
"\tSpring Profiles : {}\n" +
"\tRuntime : {}\n" +
"\n---------------------------------------------------------------------\n"
, sequencer.workerId()
, ServerUtils.getHostAddress()
, environment.getProperty("spring.config.file")
, environment.getActiveProfiles()
, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ServerApplication.class);
ConfigurableApplicationContext context = application.run(args);
}
}
\ No newline at end of file
package cn.quant.baa.pay;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* Created by hechao included 2020/1/22.
*/
public class ServerServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ServerApplication.class);
}
}
\ No newline at end of file
package cn.quant.baa.pay.config;
import cn.quant.spring.boot.config.WebMessageConfigurer;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
/**
* Created by hechao on 2018/6/28.
*/
@Configuration
public class WebMvcConfiguration extends WebMessageConfigurer {
@Bean
public MappingJackson2HttpMessageConverter httpMessageConverter() {
MappingJackson2HttpMessageConverter converter = super.httpMessageConverter();
ObjectMapper objectMapper = converter.getObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return converter;
}
}
/**
* application configuration
*/
package cn.quant.baa.pay.config;
/**
* application controller dto
*/
package cn.quant.baa.pay.http;
package cn.quant.baa.pay.rest;
import cn.quant.baa.pay.MerchantAcquirer;
import cn.quant.baa.pay.MerchantAcquirerBook;
import cn.quant.baa.pay.MerchantChannelRequestData;
import cn.quant.baa.pay.annotation.BusinessMapping;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.model.AssertUtils;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.baa.pay.service.MerchantService;
import cn.quant.spring.http.HttpResponseData;
import cn.quant.spring.rest.AbstractController;
import cn.quant.spring.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import static cn.quant.baa.pay.dict.MessageEnum.*;
/**
* Created by Administrator on 2021/8/23 0023.
*/
@RestController
@RequestMapping("/merchant/channel")
public class MerchantController extends AbstractController {
@Autowired
private MerchantService merchantService;
@Autowired
private CacheManager cacheManager;
@ResponseBody
@BusinessMapping(session = 1)
@PostMapping("/list")
public ResponseEntity list(@RequestBody BusinessRequest<MerchantChannelRequestData> request) {
TransactionSession session = TransactionSession.session();
String requestId = session.getRequestId();
MerchantChannelRequestData data = request.getData();
if (data == null) {
AssertUtils.throwMessage(EMPTY_REQ_DATA);
}
String mchId = data.getMchId();
if (StringUtils.isEmpty(mchId)) {
AssertUtils.throwMessage(MCH_ID_ILLEGAL);
}
Map<String, MerchantAcquirerBook> channels = merchantService.getChannels(data);
ResponseEntity<HttpResponseData> entity = succeed(session.getRequestId(), channels);
return entity;
}
@ResponseBody
@BusinessMapping(session = 1)
@PostMapping("/one")
public ResponseEntity one(@RequestBody BusinessRequest<MerchantChannelRequestData> request) {
TransactionSession session = TransactionSession.session();
String requestId = session.getRequestId();
MerchantChannelRequestData data = request.getData();
if (data == null) {
AssertUtils.throwMessage(EMPTY_REQ_DATA);
}
String id = data.getChanId();
if (StringUtils.isEmpty(id)) {
AssertUtils.throwMessage(CHAN_ID_ILLEGAL);
}
MerchantAcquirer channel = merchantService.getChannel(data);
ResponseEntity<HttpResponseData> entity = succeed(session.getRequestId(), channel);
return entity;
}
}
package cn.quant.baa.pay.rest;
import cn.quant.baa.pay.PayRequestData;
import cn.quant.baa.pay.annotation.BusinessMapping;
import cn.quant.baa.pay.config.MerchantAcquirerBuilder;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.model.AssertUtils;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.baa.pay.model.MerchantAcquirerProfile;
import cn.quant.baa.pay.service.TransactionService;
import cn.quant.spring.rest.AbstractController;
import cn.quant.spring.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import static cn.quant.baa.pay.dict.MessageEnum.*;
/**
* Created by Administrator on 2021/8/24 0024.
*/
@RestController
@RequestMapping("/transaction")
public class TransactionController extends AbstractController {
@Autowired
private TransactionService transactionService;
@ResponseBody
@BusinessMapping(session = 1)
@PostMapping("/pay")
public void pay(@RequestBody BusinessRequest<PayRequestData> request) {
TransactionSession session = TransactionSession.session();
String requestId = session.getRequestId();
PayRequestData data = request.getData();
transactionService.pay(data, session);
System.currentTimeMillis();
}
}
/**
* application controller
*/
package cn.quant.baa.pay.rest;
/**
* application service
*/
package cn.quant.baa.pay.service;
___ _ _ _
/ _ \(_) __ _ _ __ | |__ __ _ ___ / \ _ __ _ __
| | | | |/ _` | '_ \| '_ \ / _` |/ _ \ _____ / _ \ | '_ \| '_ \
| |_| | | (_| | | | | |_) | (_| | (_) |_____/ ___ \| |_) | |_) |
\__\_\_|\__,_|_| |_|_.__/ \__,_|\___/ /_/ \_\ .__/| .__/
|_| |_|
v${project.version}
\ No newline at end of file
debug=true
#Spring
spring.profiles.active=dev
spring.application.name=Application
#Devtool
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#Server
server.port=8080
server.servlet.context-path=/
#quant
quant.server.number=1
quant.server.sequencer.operator=TWEPOCH_PLUS
quant.server.sequencer.sequence-bits=8
#Database
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/baa_pay_v1.0?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=3
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
#JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database=MYSQL
quant.baapay.local-cache-expire.time=6000
quant.baapay.local-cache-expire.unit=SECONDS
quant.baapay.local-cache-expire.size=1000
\ No newline at end of file
debug=true
#Spring
spring.profiles.active=pre
spring.application.name=Application
#Devtool
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#Server
server.port=8080
server.servlet.context-path=/
#quant
quant.server.number=1
quant.server.sequencer.operator=TWEPOCH_PLUS
quant.server.sequencer.sequence-bits=8
#Database
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/employees?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=3
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
#JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database=MYSQL
#Dubbo
dubbo.application.name=Application
dubbo.registry.address=zookeeper://172.17.15.101:3180?backup=172.17.15.102:3180,172.17.15.103:3180
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
TestDubboServiceFacade.version=1.0.0
TestDubboServiceFacade.timeout=30000
#Mybatis
#mybatis.mapper-locations=classpath:mapping/*.xml
#mybatis.type-aliases-package=cn.quant.baa.pay.mybatis
\ No newline at end of file
debug=true
#Spring
spring.profiles.active=pro
spring.application.name=Application
#Devtool
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#Server
server.port=8080
server.servlet.context-path=/
#quant
quant.server.number=1
quant.server.sequencer.operator=TWEPOCH_PLUS
quant.server.sequencer.sequence-bits=8
#Database
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/employees?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=3
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
#JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database=MYSQL
#Dubbo
dubbo.application.name=Application
dubbo.registry.address=zookeeper://172.17.15.101:3180?backup=172.17.15.102:3180,172.17.15.103:3180
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
TestDubboServiceFacade.version=1.0.0
TestDubboServiceFacade.timeout=30000
#Mybatis
#mybatis.mapper-locations=classpath:mapping/*.xml
#mybatis.type-aliases-package=cn.quant.baa.pay.mybatis
\ No newline at end of file
debug=true
#Spring
spring.profiles.active=test
spring.application.name=Application
#Devtool
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#Server
server.port=8080
server.servlet.context-path=/
#quant
quant.server.number=1
quant.server.sequencer.operator=TWEPOCH_PLUS
quant.server.sequencer.sequence-bits=8
#Database
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/employees?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.maximum-pool-size=3
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
#JPA
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database=MYSQL
#Dubbo
dubbo.application.name=Application
dubbo.registry.address=zookeeper://172.17.15.101:3180?backup=172.17.15.102:3180,172.17.15.103:3180
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
TestDubboServiceFacade.version=1.0.0
TestDubboServiceFacade.timeout=30000
#Mybatis
#mybatis.mapper-locations=classpath:mapping/*.xml
#mybatis.type-aliases-package=cn.quant.baa.pay.mybatis
\ No newline at end of file
# ===================================================================
# Spring Boot configuration.
#
# This configuration will be overriden by the Spring profile you use,
# for example application-dev.yml if you use the "dev" profile.
# ===================================================================
# ===================================================================
# Standard Spring Boot properties.
# Full reference is available at:
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
# ==================================================================
server:
max-http-header-size: 3145728
servlet:
session:
cookie:
http-only: true
tomcat:
max-threads: 2500
accept-count: 500
min-spare-threads: 500
max-connections: 3500
uri-encoding: UTF-8
spring:
jackson:
property-naming-strategy: SNAKE_CASE
serialization:
write_dates_as_timestamps: false
indent_output: true
datasource:
hikari:
minimum-idle: 1
maximum-pool-size: 3
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate.cache.use_query_cache: false
hibernate.cache.use_second_level_cache: false
hibernate.cache.generate_statistics: false
dubbo:
scan: cn.quant.baa.pay.dubbo
thymeleaf:
cache: false
mode: HTML5
prefix: classpath:/templates/
suffix: .html
encoding: UTF-8
servlet:
content-type: text/html
resources:
add-mappings: true
static-locations: classpath:/static/
favicon:
enabled: false
mvc:
throw-exception-if-no-handler-found: true
view:
prefix: classpath:/view/
suffix: .jsp
static-path-pattern: /**
\ No newline at end of file
# ===================================================================
# Spring Boot configuration.
#
# This configuration will be overriden by the Spring profile you use,
# for example application-dev.yml if you use the "dev" profile.
# ===================================================================
# ===================================================================
# Standard Spring Boot properties.
# Full reference is available at:
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
# ==================================================================
spring:
quartz:
jdbc:
initialize-schema: never
flyway:
enabled: false
batch:
initialize-schema: never
cloud:
task:
initialize:
enable: false
messages:
basename: i18n/messages
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.dir}/${project.name}/${project.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logging.dir}/${project.name}/${project.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<maxHistory>90</maxHistory>
<maxFileSize>512MB</maxFileSize>
<totalSizeCap>10GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<charset>utf-8</charset>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t|%logger{1.}|%M|%X{ctime}] - %msg %ex{full}%n</Pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %ex{full}%n</pattern>
</encoder>
</appender>
<logger name="cn.quant.baa.pay" level="ERROR"/>
<logger name="javax.activation" level="ERROR"/>
<logger name="org.quartz.core" level="ERROR"/>
<logger name="org.quartz.simpl" level="ERROR"/>
<logger name="com.zaxxer.hikari.pool" level="ERROR"/>
<logger name="com.alibaba.dubbo.common.extension" level="ERROR"/>
<logger name="org.apache.zookeeper" level="ERROR"/>
<logger name="org.apache.curator" level="ERROR"/>
<logger name="org.apache.catalina.loader" level="ERROR"/>
<logger name="org.apache.catalina.util" level="ERROR"/>
<logger name="org.apache.catalina.core" level="ERROR"/>
<logger name="org.hibernate.hql" level="ERROR"/>
<logger name="org.hibernate.loader" level="ERROR"/>
<logger name="org.hibernate.type" level="ERROR"/>
<logger name="org.hibernate.persister" level="ERROR"/>
<logger name="org.hibernate.cfg" level="ERROR"/>
<logger name="org.hibernate.mapping" level="ERROR"/>
<logger name="org.hibernate.jpa.event" level="ERROR"/>
<logger name="org.hibernate.validator.internal" level="ERROR"/>
<logger name="org.hibernate.engine.internal" level="ERROR"/>
<logger name="org.hibernate.boot.model" level="ERROR"/>
<logger name="org.hibernate.boot.internal" level="ERROR"/>
<logger name="org.apache.tomcat.util" level="ERROR"/>
<logger name="org.springframework.orm" level="ERROR"/>
<logger name="org.springframework.jmx" level="ERROR"/>
<logger name="org.springframework.jndi" level="ERROR"/>
<logger name="org.springframework.aop" level="ERROR"/>
<logger name="org.springframework.web" level="ERROR"/>
<logger name="org.springframework.context" level="ERROR"/>
<logger name="org.springframework.core" level="ERROR"/>
<logger name="org.springframework.beans" level="ERROR"/>
<logger name="org.springframework.boot.web" level="ERROR"/>
<logger name="org.springframework.boot.actuate" level="ERROR"/>
<logger name="org.springframework.boot.context" level="ERROR"/>
<logger name="org.springframework.boot.autoconfigure.logging" level="ERROR"/>
<!--<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>-->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="ERROR"/>
<logger name="org.hibernate.engine.QueryParameters" level="ERROR"/>
<logger name="org.hibernate.SQL" level="ERROR" />
<root level="${logging.level}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLINGFILE"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.quant.baa.pay.mybatis.mapper.DepartmentsMapper">
<resultMap id="BaseResultMap" type="cn.quant.baa.pay.mybatis.entity.DepartmentsEntity">
<id column="dept_no" jdbcType="CHAR" property="deptNo" />
<result column="dept_name" jdbcType="VARCHAR" property="deptName" />
</resultMap>
<sql id="Base_Column_List">
dept_no, dept_name
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from departments
where dept_no = #{deptNo,jdbcType=CHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from departments
where dept_no = #{deptNo,jdbcType=CHAR}
</delete>
<insert id="insert" parameterType="cn.quant.baa.pay.mybatis.entity.DepartmentsEntity">
insert into departments (dept_no, dept_name)
values (#{deptNo,jdbcType=CHAR}, #{deptName,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="cn.quant.baa.pay.mybatis.entity.DepartmentsEntity">
insert into departments
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="deptNo != null">
dept_no,
</if>
<if test="deptName != null">
dept_name,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="deptNo != null">
#{deptNo,jdbcType=CHAR},
</if>
<if test="deptName != null">
#{deptName,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="cn.quant.baa.pay.mybatis.entity.DepartmentsEntity">
update departments
<set>
<if test="deptName != null">
dept_name = #{deptName,jdbcType=VARCHAR},
</if>
</set>
where dept_no = #{deptNo,jdbcType=CHAR}
</update>
<update id="updateByPrimaryKey" parameterType="cn.quant.baa.pay.mybatis.entity.DepartmentsEntity">
update departments
set dept_name = #{deptName,jdbcType=VARCHAR}
where dept_no = #{deptNo,jdbcType=CHAR}
</update>
</mapper>
\ No newline at end of file
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name/>
<param-value/>
</context-param>
</web-app>
the template files.
\ No newline at end of file
the template files.
\ No newline at end of file
package cn.quant.baa.pay;
import cn.quant.spring.util.IdentitySequencer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
* <p><b>JUnit VM Option:</b><br/>
* <code>-Dspring.config.file=${project.build.directory}/target/config/application-dev.properties </code><br/>
* </p>
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ServerApplication.class})
@TestPropertySource("classpath:application.properties")
public class TestApplication {
@Autowired
private IdentitySequencer identitySequencer;
@Test
public void idWorker() {
System.out.println(identitySequencer.nextId());
System.out.println(identitySequencer.nextId());
System.out.println(identitySequencer.nextId());
System.out.println(identitySequencer.nextId());
System.currentTimeMillis();
return;
}
}
This diff is collapsed.
This diff is collapsed.
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