This commit is contained in:
韩鹏辉
2024-06-11 10:34:21 +08:00
parent 6bab32173f
commit 7894f47de4
2498 changed files with 442406 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
<?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">
<modelVersion>4.0.0</modelVersion> <!-- POM模型版本 -->
<groupId>com.jeequan</groupId> <!-- 组织名, 类似于包名 -->
<artifactId>jeepay-components-db</artifactId> <!-- 项目名称 -->
<packaging>jar</packaging> <!-- 项目的最终打包类型/发布形式, 可选[jar, war, pom, maven-plugin]等 -->
<version>${isys.version}</version> <!-- 项目当前版本号 -->
<description>Jeepay计全支付系统 [jeepay-service]</description> <!-- 项目描述 -->
<url>https://www.jeequan.com</url>
<parent>
<groupId>com.jeequan</groupId>
<artifactId>jeepay-components</artifactId>
<version>Final</version>
</parent>
<!-- 项目属性 -->
<properties>
<projectRootDir>${basedir}/../../</projectRootDir>
</properties>
<!-- 项目依赖声明 -->
<dependencies>
<dependency>
<groupId>com.jeequan</groupId>
<artifactId>jeepay-components-core</artifactId>
</dependency>
<!-- MySql 数据库连接包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<!-- Druid 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<!-- spring-aop : 自定义注解使用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- orm映射框架mybatis-plus, 自动引入spring-tx -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes><!-- maven可以将mapper.xml进行打包处理否则仅对java文件处理 -->
</resource>
</resources>
</build>
</project>

View File

@@ -0,0 +1,35 @@
package com.jeequan.jeepay.converter;
import com.jeequan.jeepay.core.entity.IsvInfo;
import com.jeequan.jeepay.core.entity.SysUser;
import com.jeequan.jeepay.core.model.applyment.ApplymentSignInfo;
import com.jeequan.jeepay.core.model.applyment.PaywayFee;
import com.jeequan.jeepay.db.entity.IsvInfoEntity;
import com.jeequan.jeepay.db.entity.SysUserEntity;
import org.mapstruct.*;
import java.util.Map;
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface BaseConverter {
@BeanMapping(builder = @Builder(disableBuilder = true))
SysUser toModel(SysUserEntity sysUserEntity);
@BeanMapping(builder = @Builder(disableBuilder = true))
SysUserEntity toDbEntity(SysUser model);
@BeanMapping(builder = @Builder(disableBuilder = true))
IsvInfo toModel(IsvInfoEntity entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
IsvInfoEntity toDbEntity(IsvInfo model);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(ApplymentSignInfo src, @MappingTarget ApplymentSignInfo dist);
@BeanMapping(builder = @Builder(disableBuilder = true))
PaywayFee cp(PaywayFee paywayFee);
@BeanMapping(builder = @Builder(disableBuilder = true))
Map<String, PaywayFee> newPaywayFeeMap(Map<String, PaywayFee> paywayFee);
}

View File

@@ -0,0 +1,155 @@
package com.jeequan.jeepay.converter;
import cn.hutool.core.util.DesensitizedUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.entity.MchApplyment;
import com.jeequan.jeepay.core.entity.MchStore;
import com.jeequan.jeepay.core.entity.*;
import com.jeequan.jeepay.core.model.applyment.MchModifyApplymentModel;
import com.jeequan.jeepay.core.model.applyment.PaywayFee;
import com.jeequan.jeepay.db.entity.*;
import com.jeequan.jeepay.model.RateConfigSimple;
import org.mapstruct.*;
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface MchInfoConverter {
@BeanMapping(builder = @Builder(disableBuilder = true))
MchAppEntity toDbEntity(MchApp mchApp);
@BeanMapping(builder = @Builder(disableBuilder = true))
com.jeequan.jeepay.db.entity.MchStore toDbEntity(MchStore mchStore);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchApp toModel(MchAppEntity entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchApplyment toModel(com.jeequan.jeepay.db.entity.MchApplyment entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
com.jeequan.jeepay.db.entity.MchApplyment toDbEntity(MchApplyment entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchModifyApplyment toModel(MchModifyApplymentEntity entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchStore toModel(com.jeequan.jeepay.db.entity.MchStore entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "unionSearchId", ignore = true)
@Mapping(target = "modifyModel", ignore = true)
@Mapping(target = "merchantType", ignore = true)
@Mapping(target = "mchFullName", ignore = true)
@Mapping(target = "lastDate", ignore = true)
@Mapping(target = "firstDate", ignore = true)
@Mapping(target = "epUserId", ignore = true)
@Mapping(target = "agentNo", ignore = true)
MchModifyApplymentEntity toDbEntity(MchModifyApplyment entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(SettleInfo entity, @MappingTarget SettleInfo target);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(com.jeequan.jeepay.core.entity.MchApplyment srcData, @MappingTarget com.jeequan.jeepay.db.entity.MchApplyment target);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(com.jeequan.jeepay.db.entity.MchApplyment srcData, @MappingTarget com.jeequan.jeepay.core.entity.MchApplyment target);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchSubInfoEntity toDbEntity(MchSubInfo entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchSubInfo toModel(MchSubInfoEntity entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
MchSubInfo clone(MchSubInfo entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "altId", ignore = true)
@Mapping(target = "id", ignore = true)
PayInterfaceConfig toConfig(MchPayInterfaceConfig alternative);
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "sort", ignore = true)
@Mapping(target = "alias", ignore = true)
@Mapping(target = "inUseFlag", ignore = true)
@Mapping(target = "id", ignore = true)
MchPayInterfaceConfig toMchConfig(PayInterfaceConfig config);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(RedPacketRule entity, @MappingTarget RedPacketRule target);
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "areaCode", ignore = true)
@Mapping(target = "alipayShopCreateId", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "remark", ignore = true)
void cp(com.jeequan.jeepay.db.entity.MchApplyment entity, @MappingTarget MchStore target);
@Mapping(target = "alipayShopStatus", ignore = true)
@Mapping(target = "alipayShopId", ignore = true)
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "areaCode", ignore = true)
@Mapping(target = "alipayShopCreateId", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "remark", ignore = true)
void cp(MchApplyment entity, @MappingTarget MchStore target);
@Mapping(target = "ext", ignore = true)
@Mapping(target = "dateRange", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "range", ignore = true)
@Mapping(target = "paywayFeeDetail", ignore = true)
@Mapping(target = "mccCode", ignore = true)
@Mapping(target = "isvNo", ignore = true)
@Mapping(target = "infoType", ignore = true)
@Mapping(target = "infoId", ignore = true)
@Mapping(target = "ifCode", ignore = true)
@Mapping(target = "createdAt", ignore = true)
@BeanMapping(builder = @Builder(disableBuilder = true))
RateConfig toRateConfig(PaywayFee paywayFee);
@BeanMapping(builder = @Builder(disableBuilder = true))
@Mapping(target = "infoId", ignore = true)
void cp(RateConfigSimple rateConfigSimple, @MappingTarget RateConfig rateConfig);
default void desensitized(MchModifyApplyment applyment) {
if (applyment == null) {
return;
}
/* 解析进件JSON信息 对关键信息进行脱敏 */
JSONObject applymentJson = JSON.parseObject(applyment.getApplyDetailInfo());
/* 公共进件参数 */
MchModifyApplymentModel model = applymentJson.toJavaObject(MchModifyApplymentModel.class);
applymentJson.put("settAccountNo", DesensitizedUtil.bankCard(model.getSettAccountNo()));
applymentJson.put("settAccountName", DesensitizedUtil.chineseName(model.getSettAccountName()));
applymentJson.put("settAccountIdcardNo", DesensitizedUtil.idCardNum(model.getSettAccountIdcardNo(),3, 4));
applyment.setApplyDetailInfo(applymentJson.toJSONString());
}
default void desensitized(MchModifyApplymentEntity applyment) {
if (applyment == null) {
return;
}
/* 解析进件JSON信息 对关键信息进行脱敏 */
JSONObject applymentJson = JSON.parseObject(applyment.getApplyDetailInfo());
/* 公共进件参数 */
MchModifyApplymentModel model = applymentJson.toJavaObject(MchModifyApplymentModel.class);
applymentJson.put("settAccountNo", DesensitizedUtil.bankCard(model.getSettAccountNo()));
applymentJson.put("settAccountName", DesensitizedUtil.chineseName(model.getSettAccountName()));
applymentJson.put("settAccountIdcardNo", DesensitizedUtil.idCardNum(model.getSettAccountIdcardNo(),3, 4));
applyment.setApplyDetailInfo(applymentJson.toJSONString());
}
}

View File

@@ -0,0 +1,61 @@
package com.jeequan.jeepay.converter;
import cn.hutool.core.util.DesensitizedUtil;
import com.jeequan.jeepay.core.entity.TransferOrder;
import com.jeequan.jeepay.core.entity.TransferWallet;
import com.jeequan.jeepay.core.model.openapi.biz.transfer.TransferResp;
import com.jeequan.jeepay.db.entity.TransferOrderEntity;
import com.jeequan.jeepay.db.entity.TransferWalletEntity;
import org.mapstruct.*;
/**
* 代付相关实体类转换器
*
* @author deng
* @since 2024/5/9
*/
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface TransferConverter {
@BeanMapping(builder = @Builder(disableBuilder = true))
TransferOrder toModel(TransferOrderEntity entity);
@Mapping(target = "ext", ignore = true)
@Mapping(target = "dateRange", ignore = true)
@BeanMapping(builder = @Builder(disableBuilder = true))
TransferOrderEntity toDbEntity(TransferOrder model);
@BeanMapping(builder = @Builder(disableBuilder = true))
TransferWallet toModel(TransferWalletEntity entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
TransferWalletEntity toDbEntity(TransferWallet entity);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(TransferOrder transferOrder, @MappingTarget TransferResp target);
@BeanMapping(builder = @Builder(disableBuilder = true))
void cp(TransferOrderEntity transferOrder, @MappingTarget TransferResp target);
default void desensitized(TransferResp transferResp) {
if (transferResp == null) {
return;
}
if (transferResp.getOriginAccountNo() != null) {
transferResp.setOriginAccountNo(DesensitizedUtil.bankCard(transferResp.getOriginAccountNo()));
}
if (transferResp.getOriginAccountName() != null) {
transferResp.setOriginAccountName(DesensitizedUtil.chineseName(transferResp.getOriginAccountName()));
}
if (transferResp.getAccountNo() != null) {
transferResp.setAccountNo(DesensitizedUtil.bankCard(transferResp.getAccountNo()));
}
if (transferResp.getAccountName() != null) {
transferResp.setAccountName(DesensitizedUtil.chineseName(transferResp.getAccountName()));
}
}
}

View File

@@ -0,0 +1,102 @@
package com.jeequan.jeepay.db.config.dynamic;
import cn.hutool.crypto.symmetric.AES;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.exception.BizException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/***
* DB配置信息对象
* 全部属性来自 DruidDataSource Extends因初始化导致启动失败
* @author terrfly
* @date 2022/3/8 10:37
*/
@Data
@Slf4j
public class DBProp {
/**
* 加密对象
**/
private static final AES aes = new AES(CS.DB_PASSWD_DECRYPT_KEY.getBytes());
/**
* 是否加密账号
**/
private Boolean encryptAccount;
private String url;
private String username;
private String password;
private String driverClassName;
private String dbType;
private Integer initialSize;
private Integer minIdle;
private Integer maxActive;
private Integer maxWait;
private Boolean testWhileIdle;
private Boolean testOnBorrow;
private Boolean testOnReturn;
private Integer timeBetweenEvictionRunsMillis;
private Integer minEvictableIdleTimeMillis;
private String validationQuery;
private Boolean poolPreparedStatements;
private Integer maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
public String getUsername() {
// 需要解密
if (encryptAccount != null && encryptAccount) {
try {
return aes.decryptStr(username);
} catch (Exception e) {
log.error("数据库[账号]解密失败,请检查加密数据或加密因子是否正确!", e);
throw new BizException("数据库[账号]解密失败,请检查加密数据或加密因子是否正确!");
}
}
return username;
}
public String getPassword() {
// 需要解密
if (encryptAccount != null && encryptAccount) {
try {
return aes.decryptStr(password);
} catch (Exception e) {
log.error("数据库[密码]解密失败,请检查加密数据或加密因子是否正确!", e);
throw new BizException("数据库[密码]解密失败,请检查加密数据或加密因子是否正确!");
}
}
return password;
}
public static void main(String[] args) {
String text = "root";
try {
System.out.println("加密结果: " + text + " ==> " + aes.encryptHex(text));
} catch (Exception e) {
System.out.println("加密结果: " + text + " ==> 失败");
}
String entryText = "1fc401e3949581c60fef3f62d539b434";
try {
System.out.println("解密结果: " + entryText + " ==> " + aes.decryptStr(entryText));
} catch (Exception e) {
System.out.println("解密结果: " + entryText + " ==> 失败");
}
}
}

View File

@@ -0,0 +1,54 @@
package com.jeequan.jeepay.db.config.dynamic;
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.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 数据源切面
*
* @author terrfly
* @date 2022/3/8 11:35
*/
@Component
@Aspect
@Order(0)
public class DataSourceAspectj {
/**
* 切入点
*/
@Pointcut("@annotation(com.jeequan.jeepay.db.config.dynamic.DataSourceSwitch)")
public void dsPointCut() {
}
/**
* 围绕事件
*/
@Around("dsPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
//获取方法注解
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataSourceSwitch dataSource = method.getAnnotation(DataSourceSwitch.class);
if (dataSource != null) {
DynamicDataSource.setDataSource(dataSource.value());
}
try {
return point.proceed(); //处理函数
} finally {
// 销毁数据源 在执行方法之后
DynamicDataSource.clear();
}
}
}

View File

@@ -0,0 +1,84 @@
package com.jeequan.jeepay.db.config.dynamic;
import cn.hutool.core.util.ObjUtil;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
*
* DB spring bean 配置信息
* @author terrfly
* @date 2022/3/8 9:39
*/
@Configuration
public class DataSourceSpringConfig {
/** 获取 主 从的配置信息 **/
@ConfigurationProperties(prefix = "db-config.master")
@Bean(name = "masterDBProp")
public DBProp masterDBProp() { return new DBProp(); }
@ConfigurationProperties(prefix = "db-config.slave")
@Bean(name = "slaveDBProp")
public DBProp slaveDBProp() { return new DBProp(); }
@Autowired
@Qualifier("masterDBProp")
private DBProp masterDBProp;
@Autowired
@Qualifier("slaveDBProp")
private DBProp slaveDBProp;
@Bean(name = "dataSource")
public DynamicDataSource dynamicDataSource() throws SQLException {
DynamicDataSource result = new DynamicDataSource();
// 全部db连接池
Map<Object, Object> dbMap = new HashMap<>();
dbMap.put(DynamicDataSource.MASTER, fillDS(masterDBProp));
dbMap.put(DynamicDataSource.SLAVE, fillDS(slaveDBProp));
// 默认master
result.setDefaultTargetDataSource(dbMap.get(DynamicDataSource.MASTER));
result.setTargetDataSources(dbMap);
return result;
}
/** 填充 datasoruce */
private DruidDataSource fillDS(DBProp thisProp) throws SQLException {
DruidDataSource result = new DruidDataSource();
result.setDbType(ObjUtil.defaultIfNull(thisProp.getDbType(), masterDBProp.getDbType()));
result.setDriverClassName(ObjUtil.defaultIfNull(thisProp.getDriverClassName(), masterDBProp.getDriverClassName()));
result.setUrl(ObjUtil.defaultIfNull(thisProp.getUrl(), masterDBProp.getUrl()));
result.setUsername(ObjUtil.defaultIfNull(thisProp.getUsername(), masterDBProp.getUsername()));
result.setPassword(ObjUtil.defaultIfNull(thisProp.getPassword(), masterDBProp.getPassword()));
result.setInitialSize(ObjUtil.defaultIfNull(thisProp.getInitialSize(), masterDBProp.getInitialSize()));
result.setMinIdle(ObjUtil.defaultIfNull(thisProp.getMinIdle(), masterDBProp.getMinIdle()));
result.setMaxActive(ObjUtil.defaultIfNull(thisProp.getMaxActive(), masterDBProp.getMaxActive()));
result.setMaxWait(ObjUtil.defaultIfNull(thisProp.getMaxWait(), masterDBProp.getMaxWait()));
result.setTestWhileIdle(ObjUtil.defaultIfNull(thisProp.getTestWhileIdle(), masterDBProp.getTestWhileIdle()));
result.setTestOnBorrow(ObjUtil.defaultIfNull(thisProp.getTestOnBorrow(), masterDBProp.getTestOnBorrow()));
result.setTestOnReturn(ObjUtil.defaultIfNull(thisProp.getTestOnReturn(), masterDBProp.getTestOnReturn()));
result.setTimeBetweenEvictionRunsMillis(ObjUtil.defaultIfNull(thisProp.getTimeBetweenEvictionRunsMillis(), masterDBProp.getTimeBetweenEvictionRunsMillis()));
result.setMinEvictableIdleTimeMillis(ObjUtil.defaultIfNull(thisProp.getMinEvictableIdleTimeMillis(), masterDBProp.getMinEvictableIdleTimeMillis()));
result.setValidationQuery(ObjUtil.defaultIfNull(thisProp.getValidationQuery(), masterDBProp.getValidationQuery()));
result.setPoolPreparedStatements(ObjUtil.defaultIfNull(thisProp.getPoolPreparedStatements(), masterDBProp.getPoolPreparedStatements()));
result.setMaxPoolPreparedStatementPerConnectionSize(ObjUtil.defaultIfNull(thisProp.getMaxPoolPreparedStatementPerConnectionSize(), masterDBProp.getMaxPoolPreparedStatementPerConnectionSize()));
result.setFilters(ObjUtil.defaultIfNull(thisProp.getFilters(), masterDBProp.getFilters()));
result.setConnectionProperties(ObjUtil.defaultIfNull(thisProp.getConnectionProperties(), masterDBProp.getConnectionProperties()));
return result;
}
}

View File

@@ -0,0 +1,18 @@
package com.jeequan.jeepay.db.config.dynamic;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 切换数据源 注解
* 在方法层面上添加 @DataSourceSwitch(DynamicDataSource.MASTER) 即可切换数据源
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceSwitch {
/** 默认使用Master */
DynamicDataSource.DataSourceTypeEnum value() default DynamicDataSource.DataSourceTypeEnum.MASTER;
}

View File

@@ -0,0 +1,51 @@
package com.jeequan.jeepay.db.config.dynamic;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 动态数据源 和 管理类
*
* @author terrfly
* @date 2022/3/8 9:29
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/** 数据源枚举值 主 / 从 */
public enum DataSourceTypeEnum { MASTER, SLAVE }
public static final DataSourceTypeEnum MASTER = DataSourceTypeEnum.MASTER;
public static final DataSourceTypeEnum SLAVE = DataSourceTypeEnum.SLAVE;
//当前线程 用于存放使用中的数据源
private static final ThreadLocal<DataSourceTypeEnum> CURRENT_DATA_SOURCE = new ThreadLocal<>();
/**
* 设置使用数据源
* @param dataSource
*/
public static void setDataSource(DataSourceTypeEnum dataSource){
CURRENT_DATA_SOURCE.set(dataSource);
}
/**
* 获取当前数据源
* @return DataSourceTypeEnum
*/
public static DataSourceTypeEnum getCurrentDataSource(){
return CURRENT_DATA_SOURCE.get();
}
/**
* 清空使用数据源, 使用默认数据源
*/
public static void clear(){
CURRENT_DATA_SOURCE.remove();
}
/** 覆写 determineCurrentLookupKey 函数 **/
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSource.getCurrentDataSource();
}
}

View File

@@ -0,0 +1,153 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.entity.AccountOperate;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 账户变动明细
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-11
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_account_change_info")
@NoArgsConstructor
@AllArgsConstructor
public class AccountChangeInfo extends BaseModel {
private static final long serialVersionUID=1L;
public static final LambdaQueryWrapper<AccountChangeInfo> gw(AccountChangeInfo accountInfo){
return new LambdaQueryWrapper<>(accountInfo);
}
public static final LambdaQueryWrapper<AccountChangeInfo> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 流水号
*/
@TableId(type = IdType.INPUT)
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String flowNo;
/**
* 账户编号
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String accountNo;
/**
* 用户号
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String mchNo;
/**
* 账户类型 0退款账户 1营销账户 2虚拟银行 3钱包 4 手续费账户
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte accountType;
/**
* 变动类型 0充值 1提现 2转账 3退款 4扣除
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte changeType;
/**
* 变动方式 0扫码充值 1对公转账 2账户提现 3:平台户退款 -1:提现驳回 4直付通
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte changeMethod;
/**
* 变动前余额
*/
private Long beforeAmt;
/**
* 变动金额
*/
private Long changeAmt;
/**
* 变动后的金额
*/
private Long afterAmt;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
private String remark;
@TableField(exist = false)
private String accountTypeDesc;
@TableField(exist = false)
private String changeTypeDesc;
@TableField(exist = false)
private String changeMethodDesc;
public AccountChangeInfo(AccountOperate operate,AccountInfo account) {
this.flowNo = operate.getOrderId();
this.accountNo = account.getAccountNo();
this.mchNo = account.getInfoId();
this.accountType = account.getType();
this.changeType = operate.getChangeType();
this.beforeAmt = account.getBalacne();
this.changeAmt = operate.getChangeAmt();
this.afterAmt = BigDecimal.valueOf(account.getBalacne()).add(BigDecimal.valueOf(operate.getChangeAmt())).longValue();
this.remark = operate.getRemark();
this.changeMethod = operate.getChangeMethod();
}
public String getAccountTypeDesc() {
if(this.getAccountType() == null){
return "";
}
return AccountInfo.Type.getVal(this.getAccountType()).getDesc();
}
public String getChangeTypeDesc() {
if(this.getChangeType() == null){
return "";
}
return AccountFundInfo.ChangeType.getVal(this.getChangeType()).getDesc();
}
public String getChangeMethodDesc() {
if(this.getChangeMethod() == null){
return "";
}
return AccountFundInfo.ChangeMethod.getVal(this.getChangeMethod()).getDesc();
}
}

View File

@@ -0,0 +1,357 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.entity.AccountOperate;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.*;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
*
* </p>
* 账户资金明细
* @author [mybatis plus generator]
* @since 2024-03-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_account_fund_info",autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
public class AccountFundInfo extends BaseModel {
/**
* 打款类型 手动
*/
public static final byte MANUAL = 0;
/**
* 打款类型 灵工
*/
public static final byte FLEXIBLE = 1;
private static final long serialVersionUID=1L;
public static LambdaQueryWrapper<AccountFundInfo> gw(AccountFundInfo info) {
return new LambdaQueryWrapper<>(info);
}
public static LambdaQueryWrapper<AccountFundInfo> gw() {
return new LambdaQueryWrapper<>();
}
/**
* 状态 0订单生成 -1失败 1审核中 2打款中 3成功
*/
public static final byte INIT = 0;
public static final byte FAIL = -1;
public static final byte AUDIT = 1;
public static final byte PAYMENT = 2;
public static final byte SUCCESS = 3;
/**
* 付款方式 WECHAT微信 ALIPAY支付宝 BANK 银行卡
*/
public static final String WECHAT = "WECHAT";
public static final String ALIPAY = "ALIPAY";
public static final String BANK = "BANK";
/**
* 订单号
*/
@TableId(type = IdType.INPUT)
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String orderId;
/**
* 账户编号
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String accountNo;
/**
* 渠道流水号
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String channelOrderId;
/**
* 用户号
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String mchNo;
/**
* 账户类型 0退款账户 1营销账户 2虚拟银行 3钱包 取值 ACCOUNT_INFO 的枚举类
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte accountType;
/**
* 变动类型 0充值 1提现 2转账 3退款
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte changeType;
/**
* 变动方式 0扫码充值 1对公转账 2账户提现 3:平台户退款 -1:提现驳回
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte changeMethod;
/**
* 金额
*/
private Long amount;
/**
* 实际金额
*/
private Long finalAmount;
/**
* 手续费
*/
private Long fee;
/**
* 状态 0订单生成 -1失败 1审核中 2打款中 3成功
*/
@TableField(whereStrategy = FieldStrategy.NOT_NULL)
private Byte state;
/**
* 渠道
*/
@TableField(whereStrategy = FieldStrategy.NOT_EMPTY)
private String ifCode;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 扩展参数
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject extra;
/**
* 渠道返回参数
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject channelExtra;
/**
* 付款方式 WECHAT微信 ALIPAY支付宝 BANK 银行卡
*/
private String payMethod;
/**
* 收款商户号
*/
private String mchExtNo;
/**
* 变动金额
*/
@TableField(exist = false)
private Long changeAmt;
/**
* 0:手动打款 1灵工打款
*/
@TableField(exist = false)
private Byte mark;
@TableField(exist = false)
private String accountTypeDesc;
@TableField(exist = false)
private String changeTypeDesc;
@TableField(exist = false)
private String changeMethodDesc;
@TableField(exist = false)
private String stateDesc;
@Getter
@AllArgsConstructor
public enum ChangeType{
RECHARGE((byte)0,"充值"),
CASH((byte)1,"提现"),
TRANSFER((byte)2,"转账"),
REFUND((byte)3,"退款"),
DEDUCT((byte)4,"抵扣")
;
private final Byte value;
private final String desc;
public static ChangeType getVal(byte value){
ChangeType[] values = values();
for (ChangeType val:values) {
if(val.getValue() == value){
return val;
}
}
throw new BizException("充值类型非法");
}
}
@Getter
@AllArgsConstructor
public enum ChangeMethod{
FAIL((byte)-1,"失败"),
SCAN((byte)0,"扫码充值"),
PUBIC((byte)1,"对公转账"),
ACCOUNT_CASH((byte)2,"账户提现"),
YBH_REFUND((byte)3,"一般户退款"),
ZFT((byte)4,"直付通"),
DF((byte)5,"代发");
private final Byte value;
private final String desc;
public static ChangeMethod getVal(byte value){
ChangeMethod[] values = values();
for (ChangeMethod val:values) {
if(val.getValue() == value){
return val;
}
}
throw new BizException("变动类型非法");
}
}
/**
* 构建账户资金明细
* @param operate
*/
public AccountFundInfo(AccountOperate operate,AccountInfo account,String payMethod) {
this.orderId = operate.getOrderId();
this.accountNo = operate.getAccountNo();
this.mchNo = account.getInfoId();
this.accountType = account.getType();
this.changeType = operate.getChangeType();
this.changeMethod = operate.getChangeMethod();
this.amount = operate.getAmount();
this.finalAmount = operate.getFinalAmt();
this.fee = BigDecimal.valueOf(operate.getAmount()).subtract(BigDecimal.valueOf(operate.getFinalAmt())).longValue();
if(operate.getState() != null){
this.state = operate.getState();
}else{
if(operate.getIsUpdateAccount()){
this.state = SUCCESS;
}else{
this.state = INIT;
}
}
this.ifCode = operate.getIfCode();
this.remark = operate.getRemark();
this.mchExtNo = operate.getMchExtNo();
this.payMethod = payMethod;
this.changeAmt = operate.getChangeAmt();
this.extra = operate.getExtra();
}
public AccountFundInfo(AccountOperate operate,AccountInfo account) {
this(operate,account,BANK);
}
public String getAccountTypeDesc() {
if(this.getAccountType() == null){
return "";
}
return AccountInfo.Type.getVal(this.getAccountType()).getDesc();
}
public String getChangeTypeDesc() {
if(this.getChangeType() == null){
return "";
}
return ChangeType.getVal(this.getChangeType()).getDesc();
}
public String getChangeMethodDesc() {
if(this.getChangeMethod() == null){
return "";
}
return ChangeMethod.getVal(this.getChangeMethod()).getDesc();
}
/**
* 0待处理 -1失败 1审核中 2打款中 3成功
* @return
*/
public String getStateDesc() {
if(this.getState() == null){
return "";
}
if(this.getState() == FAIL){
return "失败";
}
if(this.getState() == 0){
return "初始化";
}
if(this.getState() == AUDIT){
return "审核中";
}
if(this.getState() == PAYMENT){
return "打款中";
}
if(this.getState() == SUCCESS){
return "成功";
}
return "未知";
}
}

View File

@@ -0,0 +1,279 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.entity.AccountCashInfo;
import com.jeequan.jeepay.core.entity.AccountRuleExt;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* <p>
* 账户表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-11
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_account_info",autoResultMap = true)
public class AccountInfo extends BaseModel {
public static final LambdaQueryWrapper<AccountInfo> gw(AccountInfo accountInfo){
return new LambdaQueryWrapper<>(accountInfo);
}
public static final LambdaQueryWrapper<AccountInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 开启
*/
public static final Byte REMIND_OPNE = 1;
/**
* 关闭
*/
public static final Byte REMIND_CLOSE = 0;
/**
* 账户编号
*/
@TableId
private String accountNo;
/**
* 账户所属id
*/
private String infoId;
/**
* 账户所属类型
*/
private String infoType;
/**
* 账户类型 0退款账户 1营销账户 2虚拟银行 3钱包 4:手续费账户
*/
private Byte type;
/**
* 余额
*/
private Long balacne;
/**
* 不可用余额
*/
private Long freeze;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@Getter
@AllArgsConstructor
public enum Type{
REFUND((byte)0,"退款账户"),
MARKET((byte)1,"营销账户"),
VIRTUALLY((byte)2,"虚拟银行账户"),
WALLET((byte)3,"钱包账户"),
SERVICE_CHARGE((byte)4,"手续费账户");
private final Byte type;
private final String desc;
public static Type getVal(byte value){
Type[] values = values();
for (Type val:values) {
if(val.getType() == value){
return val;
}
}
throw new BizException("账户类型非法");
}
}
@TableField(exist = false)
private String typeNameDesc;
public String getTypeNameDesc() {
if(type == null){
return "";
}
Type val = Type.getVal(this.getType());
return val.getDesc();
}
@TableField(exist = false)
private String realName;
@TableField(exist = false)
private String phone;
/**
* 充值金额
*/
@TableField(exist = false)
private Long rechargeAmt;
/**
* 是否开通提醒
*/
private Byte remindState;
/**
* 提醒规则
*/
@TableField(value = "remind_rule_ext",typeHandler = FastjsonTypeHandler.class)
private JSONObject remindRuleExt;
/**
* 最后通知时间
*/
private Date lastNoticeTime;
@TableField(exist = false)
private AccountRuleExt ruleExt;
/**
* 提现信息
*/
@TableField(exist = false)
private AccountCashInfo cashInfo;
public void preRuleCheck() {
if(this.getAccountNo() == null){
throw new BizException("账户编号不能为空");
}
if(this.getRemindState() == null){
throw new BizException("提醒状态不能为空");
}
if(REMIND_OPNE.equals(this.getRemindState())){
if(this.getRuleExt() == null){
throw new BizException("开启预警提醒时,请设置预警规则");
}
}
if(this.getRuleExt() != null){
BigDecimal amount = this.getRuleExt().getAmount();
if(amount == null){
throw new BizException("预警规则临界金额不能为空");
}
List<String> typeList = this.getRuleExt().getTypeList();
if(typeList == null || typeList.isEmpty()){
throw new BizException("预警规则提醒方式至少需要勾选一项");
}
Integer interval = this.getRuleExt().getInterval();
if(interval == null){
throw new BizException("预警规则提醒频率不能为空");
}
List<JSONObject> receiveList = this.getRuleExt().getReceiveList();
if(receiveList == null || receiveList.isEmpty()){
throw new BizException("预警规则接收信息人不能为空");
}
if(receiveList.size() > 5){
throw new BizException("接收人设置超出上限");
}
boolean email = typeList.contains(AccountRuleExt.EMAIL);
boolean phone = typeList.contains(AccountRuleExt.PHONE);
boolean emailCheck = true;
boolean phoneCheck = true;
for (JSONObject receive:receiveList) {
if(email){
String receEmail = receive.getString(AccountRuleExt.EMAIL);
if(StringUtils.isEmpty(receEmail)){
emailCheck = false;
}
}
if(phone){
String recePhone = receive.getString(AccountRuleExt.PHONE);
if(StringUtils.isEmpty(recePhone)){
phoneCheck = false;
}
}
}
if(email && !emailCheck){
throw new BizException("预警规则提醒方式包含了[邮箱方式],接收人信息中请填写邮箱");
}
if(phone && !phoneCheck){
throw new BizException("预警规则提醒方式包含了[短信方式],接收人信息中请填写手机号");
}
this.remindRuleExt = (JSONObject) JSON.toJSON(this.getRuleExt());
}
}
public void preCashCheck() {
if(this.getAccountNo() == null){
throw new BizException("账户编号不能为空");
}
AccountCashInfo cashInfo = this.getCashInfo();
if(cashInfo == null){
throw new BizException("提现信息为空");
}
Long cashAmt = cashInfo.getCashAmt();
if(cashAmt == null || cashAmt <= 0){
throw new BizException("提现金额不能为空或提现金额必须要大于0");
}
String settleName = cashInfo.getSettleName();
if(StringUtils.isEmpty(settleName)){
throw new BizException("结算人名称不能为空");
}
String settleNo = cashInfo.getSettleNo();
if(StringUtils.isEmpty(settleNo)){
throw new BizException("结算人银行卡号不能为空");
}
String bankCardAreaCode = cashInfo.getBankCardAreaCode();
if(StringUtils.isEmpty(bankCardAreaCode)){
throw new BizException("结算人银行卡开户省市区编码不能为空");
}
String bankCardAreaName = cashInfo.getBankCardAreaName();
if(StringUtils.isEmpty(bankCardAreaName)){
throw new BizException("结算人银行卡开户省市区不能为空");
}
String bankName = cashInfo.getBankName();
if(StringUtils.isEmpty(bankName)){
throw new BizException("结算人银行卡开户行不能为空");
}
String settleCard = cashInfo.getSettleCard();
if(StringUtils.isEmpty(settleCard)){
throw new BizException("结算人身份证号不能为空");
}
String bankMobile = cashInfo.getBankMobile();
if(StringUtils.isEmpty(bankMobile)){
throw new BizException("开户行手机号不能为空");
}
}
}

View File

@@ -0,0 +1,100 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 商户配置表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-03-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_agent_config")
public class AgentConfig extends BaseModel {
private static final long serialVersionUID=1L;
/** 当前服务商进件配置管理方式: configVal: DEF-平台全局默认配置 , CUSTOM-自定义 **/
public static final String KEY_APPLYMENT_AUDIT_MODE = "applymentAuditMode";
public static final String KEY_APPLYMENT_AUDIT_MODE_DEF = "DEF";
public static final String KEY_APPLYMENT_AUDIT_MODE_CUSTOM = "CUSTOM";
/** 当前服务商进件是否需要运营平台预审核 **/
public static final String KEY_AGENT_APPLYMENT_PRE_AUDIT_CONFIG = "agentApplymentPreAuditConfig";
/** 服务商发起进件时间限制: configVal:
* [开始时间, 结束时间], // 若为空表示不限制。
* **/
public static final String KEY_AGENT_APPLY_TIME_LIMIT_CONFIG = "agentApplyTimeLimitConfig";
/** 同步对象的类型 allCurrentAndSubAgent-当前及所有下级**/
public static final String IF_ALL_CURRENT_AND_SUB_AGENT = "allCurrentAndSubAgent";
/** 服务商进件配置group_key **/
public static final String GROUP_KEY_APPLYMENT_CONFIG = "applymentConfig";
/**
* 服务商子商户配置微信参数权限
**/
public static final String CONFIG_KEY_WX_CONFIG_IS_USABLE_CONFIG = "subMchWxConfigIsUsable";
/**
* 服务商子商户配置支付接口权限
**/
public static final String CONFIG_KEY_MCH_PAY_INTERFACE_IS_USABLE_CONFIG = "subMchPayInterfaceConfigIsUsable";
public static final LambdaQueryWrapper<AgentConfig> gw(){
return new LambdaQueryWrapper<>();
}
public AgentConfig(){}
public AgentConfig(String agentNo, String configKey, String configVal, String groupKey){
this.agentNo = agentNo;
this.configKey = configKey;
this.configVal = configVal;
this.groupKey = groupKey;
}
/**
* 服务商号
*/
private String agentNo;
/**
* 配置KEY
*/
private String configKey;
/**
* 配置内容项
*/
private String configVal;
/**
* 配置分组
*/
private String groupKey;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,256 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.util.Date;
/**
* <p>
* 服务商信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_agent_info")
public class AgentInfo extends BaseModel {
public static LambdaQueryWrapper<AgentInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 待审核 **/
public static final byte AUDIT_STATE_ING = 2;
/** 审核驳回 **/
public static final byte AUDIT_STATE_FALSE = 3;
/** 未认证 **/
public static final byte AUDIT_STATE_UN_AUTH = 4;
/**
* 服务商账号
*/
@TableId
private String agentNo;
/**
* 服务商名称
*/
private String agentName;
/**
* 服务商简称
*/
private String agentShortName;
/**
* 服务商号
*/
private String isvNo;
/**
* 上级服务商号, 空串表示顶级服务商
*/
private String pid;
private String pidArr;
/**
* 上级服务商简称
*/
private String pname;
/**
* 联系人姓名
*/
private String contactName;
/**
* 联系人手机号
*/
private String contactTel;
/**
* 联系人邮箱
*/
private String contactEmail;
/**
* 服务商状态: 0-停用, 1-正常, 2-待审核, 3-审核驳回, 4-未认证
*/
private Byte state;
/**
* 服务商等级
*/
private Integer level;
/**
* 是否允许发展子代理: 0-不允许, 1-允许
*/
private Byte addAgentFlag;
/**
* 是否允许发展子商户: 0-不允许, 1-允许
*/
private Byte addMchFlag;
/**
* 服务商备注
*/
private String remark;
/**
* 审核备注
*/
private String auditRemark;
/**
* 手续费计算公式类型: 1-使用系统默认配置, 2-自定义
*/
private Byte cashoutFeeRuleType;
/**
* 手续费计算公式
*/
private String cashoutFeeRule;
/**
* 结算账户类型: WX_CASH-微信零钱; ALIPAY_CASH-支付宝转账; BANK_CARD-银行卡; BANK_PUBLIC-对公; BANK_PRIVATE-对私
*/
private String settAccountType;
/**
* 结算账户账号
*/
private String settAccountNo;
/**
* 结算账户姓名
*/
private String settAccountName;
/**
* 结算账户开户行名称
*/
private String settAccountBank;
/**
* 开户行支行名称
*/
private String settAccountSubBank;
/**
* 结算账户联系人手机号(一般为服务商手机号)
*/
private String settAccountTelphone;
/**
* 营业执照图片
*/
private String licenseImg;
/**
* 身份证人像面照片
*/
private String idcard1Img;
/**
* 身份证国徽面照片
*/
private String idcard2Img;
/**
* 手持身份证图片
*/
private String idcardInHandImg;
/**
* 银行卡图片
*/
private String bankCardImg;
/**
* 许可证照片
*/
private String permitImg;
/**
* 服务商类型: 1-个人, 2-企业
*/
private Byte agentType;
/**
* 是否为贴牌1-是0-否
*/
private Byte oemType;
/**
* 初始用户ID创建服务商时允许服务商登录的用户
*/
private Long initUserId;
/**
* 登录用户名
*/
private String loginUsername;
/**
* 支付密码(敏感信息密码Sensitive information password)
*/
private String sipw;
/**
* 钱包冻结金额, 单位分
*/
private Long freezeAmount;
/**
* 冻结原因
*/
private String freezeDesc;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 邀请码
*/
@TableField(exist = false)
private String inviteCode;
}

View File

@@ -0,0 +1,49 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 支行信息表
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_bank_branch")
public class BankBranch extends BaseModel {
private Integer id;
/**
* 支行联行号
*/
private String branchNo;
/**
* 支行名称
*/
private String branchName;
/**
* 银行code
*/
private String bankCode;
/**
* 斗拱银行编码
*/
private String bankCodeDg;
private String bankName;
private String provinceCode;
private String provinceName;
private String cityCode;
private String cityName;
}

View File

@@ -0,0 +1,66 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 支付宝支行信息
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_bank_branch_alipay")
public class BankBranchAlipay implements Serializable {
private static final long serialVersionUID=1L;
/**
* 联行号
*/
@TableId(type = IdType.INPUT)
private String branchNo;
/**
* 支行名称
*/
private String branchName;
/**
* 银行名称
*/
private String bankName;
/**
* 省
*/
private String provinceName;
/**
* 市
*/
private String cityName;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,36 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("t_bank_branch_lkl")
public class BankBranchLkl extends BaseModel {
@TableId("contact_line")
private String contactLine;
@TableField("branch_name")
private String branchName;
@TableField("bank_type")
private String bankType;
@TableField("bank_name")
private String bankName;
@TableField("city_code")
private String cityCode;
@TableField("clear_no")
private String clearNo;
}

View File

@@ -0,0 +1,26 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 直付通支行数据
* @author deng
* @since 2024/4/7
*/
@TableName("t_bank_branch_zft")
@Data
public class BankBranchZft {
private String branchNo;
private String branchName;
private String bankName;
private String bankAbbr;
private String province;
private String city;
}

View File

@@ -0,0 +1,74 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.utils.SeqKit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* tk缓存表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-02-02
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_cache_tk")
@NoArgsConstructor
public class CacheTk implements Serializable {
private static final long serialVersionUID=1L;
@TableId(type = IdType.INPUT)
private String tk;
// 二维码扫码类型: 1 - 统一下单的聚合二维码, 2 - 码牌二维码 3 - 设备二维码 4:路由二维码
private Byte type;
/**
* 原id 对应设备编号 二维码编号
*/
private String sourceId;
/**
* 金额
*/
private Long amount;
/**
* 创建时间
*/
private Date createdAt;
public CacheTk(Byte type, String sourceId, Long amount) {
this.tk = SeqKit.genTk();
this.type = type;
this.sourceId = sourceId;
this.amount = amount;
}
public CacheTk(Byte type, String sourceId) {
this(type,sourceId,null);
}
public CacheTk(String tk, byte type, String sourceId,Long amount) {
this.tk = tk;
this.type = type;
this.sourceId = sourceId;
this.amount = amount;
}
public CacheTk(String tk, byte type, String sourceId) {
this(tk,type,sourceId,null);
}
}

View File

@@ -0,0 +1,199 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 提现结算记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_cashout_record")
public class CashoutRecord extends com.jeequan.jeepay.core.entity.CashoutRecord {
public static final LambdaQueryWrapper<CashoutRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 提现类型 佣金提现 **/
public static final byte SETT_TYPE_COMM = 1;
/** 提现状态 结算状态: 1-审核中, 2-审核失败, 3-结算中, 4-结算成功, 5-结算失败 **/
public static final byte CASHOUT_STATE_AUDIT_ING = 1;
public static final byte CASHOUT_STATE_AUDIT_FAIL = 2;
public static final byte CASHOUT_STATE_SETT_ING = 3;
public static final byte CASHOUT_STATE_SETT_SUCCESS = 4;
public static final byte CASHOUT_STATE_SETT_FAIL = 5;
/**
* 提现记录ID
*/
@TableId(value = "rid", type = IdType.AUTO)
private Long rid;
/**
* 服务商号等
*/
private String infoId;
/**
* 系统类型: 参考SYS_ROLE_TYPE
*/
private String infoType;
/**
* 名称快照
*/
private String infoName;
/**
* 申请金额,单位分
*/
private Long applyAmount;
/**
* 手续费金额,单位分
*/
private Long settFeeAmount;
/**
* 手续费计算公式(快照)
*/
private String settFeeRule;
/**
* 最终结算金额 (申请-手续费), 单位分
*/
private Long settAmount;
/**
* 结算账户类型: WX_CASH-微信零钱; ALIPAY_CASH-支付宝转账; BANK_CARD-银行卡
*/
private String settAccountType;
/**
* 结算账户账号
*/
private String settAccountNo;
/**
* 结算账户姓名
*/
private String settAccountName;
/**
* 结算账户开户行名称
*/
private String settAccountBank;
/**
* 开户行支行名称
*/
private String settAccountSubBank;
/**
* 结算账户联系人手机号(一般为服务商手机号)
*/
private String settAccountTelphone;
/**
* 联系人姓名
*/
private String contactName;
/**
* 用户提现备注
*/
private String applyRemark;
/**
* 结算备注[系统生成]
*/
private String settInfo;
/**
* 结算状态: 1-审核中, 2-审核失败, 3-结算中, 4-结算成功, 5-结算失败
*/
private Byte state;
/**
* 结算凭证图片
*/
private String settCertImg;
/**
* 打款凭证(运营平台)
*/
private String transferCertImg;
/**
* 提现类型: 1-佣金提现
*/
private Byte settType;
/**
* 发起转账的自营应用ID
*/
private String transferMchAppId;
/**
* 转账系统订单号
*/
private String transferOrderId;
/**
* 转账接口类型
*/
private String transferIfCode;
/**
* 自营商户费率费用
*/
private Long transferPlatformMchfeeAmount;
/**
* 平台真实成本费用( 来自转账订单数据 = 自营商户费率费用 - 平台利润
*/
private Long transferPlatformCostAmount;
/**
* 审核时间
*/
private Date auditTime;
/**
* 审核备注
*/
private String auditRemark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@TableField(exist = false)
private String idCard;
}

View File

@@ -0,0 +1,152 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 提现结算记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-11-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_channel_account_cashout_record")
public class ChannelAccountCashoutRecord extends com.jeequan.jeepay.core.entity.ChannelAccountCashoutRecord {
public static final LambdaQueryWrapper<ChannelAccountCashoutRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 提现状态 结算状态: 0-提现单创建, 1-提现中, 2-提现成功, 3-提现失败 **/
public static final byte CASHOUT_STATE_CREATE = 0;
public static final byte CASHOUT_STATE_ING = 1;
public static final byte CASHOUT_STATE_SUCCESS = 2;
public static final byte CASHOUT_STATE_FAIL = 3;
/** 提现来源 task-定时任务 order-订单 **/
public static final String CASHOUT_FROM_TASK = "task";
public static final String CASHOUT_FROM_ORDER = "order";
/**
* 提现记录ID
*/
@TableId
private String rid;
/**
* 应用ID
*/
private String appId;
/**
* 商户号
*/
private String mchNo;
/**
* 商户名称
*/
private String mchName;
/**
* 服务商号
*/
private String isvNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 渠道子商户号
*/
private String channelSubMchId;
/**
* 支付订单号
*/
private String payOrderId;
/**
* 当前查询余额,单位分 (不准确,可能此时账户余额有变动)
*/
private Long currentBalance;
/**
* 申请提现金额,单位分
*/
private Long cashoutAmount;
/**
* 提现状态: 0-提现单创建, 1-提现中, 2-提现成功, 3-提现失败
*/
private Byte state;
/**
* 渠道提现单ID
*/
private String channelRid;
/**
* 失败原因
*/
private String failInfo;
/**
* 提现成功时间
*/
private Date successTime;
/**
* 提现银行名称
*/
private String bankName;
/**
* 提现账户
*/
private String bankAccount;
/**
* 提现账户名称
*/
private String bankAccountName;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建人名称
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 商户号
*/
private String mchExtNo;
}

View File

@@ -0,0 +1,144 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 对账批次表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-09-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_check_batch")
public class CheckBatch extends com.jeequan.jeepay.core.entity.CheckBatch {
private static final long serialVersionUID=1L;
public static final LambdaQueryWrapper<CheckBatch> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 对账批次号支付接口代码ifCode_渠道商户号_对账日期
*/
@TableId
private String batchNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 渠道商户号
*/
private String channelMchNo;
/**
* 对账日期
*/
private Date billDate;
/**
* 对账批次处理状态0-未处理,1-已处理
*/
private Byte state;
/**
* 所有差错总单数
*/
private Integer diffCount;
/**
* 待处理的差错总单数
*/
private Integer unHandleDiffCount;
/**
* 平台总交易单数
*/
private Integer totalCount;
/**
* 渠道总交易单数
*/
private Integer channelTotalCount;
/**
* 平台交易总金额
*/
private Long totalAmount;
/**
* 渠道交易总金额
*/
private Long channelTotalAmount;
/**
* 平台退款总单数
*/
private Integer totalRefundCount;
/**
* 渠道退款总单数
*/
private Integer channelTotalRefundCount;
/**
* 平台退款总金额
*/
private Long totalRefundAmount;
/**
* 渠道退款总金额
*/
private Long channelTotalRefundAmount;
/**
* 平台总手续费
*/
private Long totalFee;
/**
* 渠道总手续费
*/
private Long channelTotalFee;
/**
* 原始对账文件存放地址
*/
private String orgBillFilePath;
/**
* 下载/解析状态:0-失败,1-成功
*/
private Byte releaseState;
/**
* 下载/解析失败的描述信息
*/
private String releaseErrMsg;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,129 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 渠道对账单表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-09-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_check_channel_bill")
public class CheckChannelBill extends BaseModel {
private static final long serialVersionUID=1L;
public static final LambdaQueryWrapper<CheckChannelBill> gw(){
return new LambdaQueryWrapper<>();
}
public static String BILL_TYPE_PAY = "pay"; // 支付账单
public static String BILL_TYPE_REFUND = "refund"; // 退款账单
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 对账批次号支付接口代码ifCode_渠道商户号_对账日期
*/
private String batchNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 渠道商户号
*/
private String channelMchNo;
/**
* 对账日期
*/
private Date billDate;
/**
* 账单类型pay支付, refund退款
*/
private String billType;
/**
* 三位货币代码,人民币:cny
*/
private String currency;
/**
* 平台订单号
*/
private String orderId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 交易金额 单位:分
*/
private Long channelAmount;
/**
* 渠道手续费 单位:分
*/
private Long channelFeeAmount;
/**
* 渠道交易成功时间
*/
private Date channelSuccessAt;
/**
* 渠道用户标识,如微信openId,支付宝账号
*/
private String channelUser;
/**
* 渠道订单状态0-订单生成, 1-支付中, 2-支付成功, 3-支付失败, 4-已撤销, 5-已退款, 6-订单关闭
*/
private Byte channelState;
/**
* 退款原支付订单号
*/
private String orgPayOrderId;
/**
* 退款金额
*/
private String channelRefundAmount;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,195 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 对账差异表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-09-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_check_diff")
public class CheckDiff extends BaseModel {
private static final long serialVersionUID=1L;
public static final LambdaQueryWrapper<CheckDiff> gw(){
return new LambdaQueryWrapper<>();
}
public static String DIFF_TYPE_LOCAL = "local"; // 长款
public static String DIFF_TYPE_CHANNEL = "channel"; // 短款
public static String DIFF_TYPE_ORDER = "order"; // 订单差异
public static byte HANDLE_STATE_WAITING = 0;
public static byte HANDLE_STATE_HANG_UP = 1;
public static byte HANDLE_STATE_SUCCESS = 2;
public static byte HANDLE_STATE_IGNORE = 3;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 对账批次号支付接口代码ifCode_渠道商户号_对账日期
*/
private String batchNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 渠道商户号
*/
private String channelMchNo;
/**
* 对账日期
*/
private Date billDate;
/**
* 账单类型pay支付, refund退款
*/
private String billType;
/**
* 平台订单ID
*/
private String orderId;
/**
* 商户号
*/
private String mchNo;
/**
* 商户名称
*/
private String mchName;
/**
* 商户应用AppId
*/
private String mchAppId;
/**
* 商户订单号
*/
private String mchOrderNo;
/**
* 平台交易金额,单位分
*/
private Long amount;
/**
* 平台手续费,单位分
*/
private Long feeAmount;
/**
* 平台退款金额
*/
private Long refundAmount;
/**
* 平台订单状态0-订单 生成, 1-支付中, 2-支付成功, 3-支付失败, 4-已撤销, 5-已退款, 6-订单关闭
*/
private Byte orderState;
/**
* 平台交易成功时间
*/
private Date orderSuccessAt;
/**
* 平台下单时间
*/
private Date orderCreateAt;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 渠道订单状态0-订单生成, 1-支付中, 2-支付成功, 3-支付失败, 4-已撤销, 5-已退款, 6-订单关闭
*/
private Byte channelState;
/**
* 渠道交易金额,单位分
*/
private Long channelAmount;
/**
* 渠道退款金额
*/
private Long channelRefundAmount;
/**
* 渠道手续费
*/
private Long channelFeeAmount;
/**
* 渠道交易成功时间
*/
private Date channelSuccessAt;
/**
* 差异类型local-长款 channel-短款 order-订单差异(金额差异等)
*/
private String diffType;
/**
* 类型0-未处理1-挂账2-已处理3-已忽略
*/
private Byte handleState;
/**
* 处理备注
*/
private String handleRemark;
/**
* 差异处理者ID
*/
private Long handleUid;
/**
* 差异处理者姓名
*/
private String handleBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,88 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 设备厂商配置表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_device_provide_config")
public class DeviceProvideConfig extends BaseModel {
private static final long serialVersionUID=1L;
//gw
public static final LambdaQueryWrapper<DeviceProvideConfig> gw(){
return new LambdaQueryWrapper<>();
}
public final static byte DEVICE_TYPE_SPEAKER = 1;
public final static byte DEVICE_TYPE_PRINTER = 2;
public final static byte DEVICE_TYPE_POS = 3;
public final static byte DEVICE_TYPE_AUTO_POS = 4;
public final static byte DEVICE_TYPE_PLUGIN = 5;
/**
* 厂商配置ID
*/
@TableId(value = "config_id", type = IdType.AUTO)
private Long configId;
/**
* 厂商配置备注信息, 会在商户侧进行回显
*/
private String configDesc;
/**
* 设备类型: 1-云喇叭, 2-云打印, 3-扫码pos, 4-智能pos, 5-收银插件
*/
private Byte deviceType;
/**
* 设备厂商: zgwl-智谷物联, bsj-博实结, fe-飞鹅, ps-品生, clj-财来聚, wsy-微收银, xjl-小精灵
*/
private String provider;
/**
* 厂商配置参数appId扫码POS定义唯一appId
*/
private String appId;
/**
* 厂商配置参数json字符串
*/
private String providerParams;
/**
* 状态: 0-停用1-启用
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,69 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 分账任务对象关联表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-05-16
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_division_conn")
public class DivisionConn extends BaseModel {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 分账任务id
*/
private String taskId;
/**
* 分账分出方对象编号
*/
private String divisionNo;
/**
* 分账分出方对象编号
*/
private String receiveNo;
/**
* 分账值
*/
private BigDecimal divisionValue;
/**
* 是否收取手续费
*/
private Byte isCharge;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,205 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.entity.DivisionSettleInfo;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.utils.SeqKit;
import com.jeequan.jeepay.db.typehandler.EncryptTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2024-04-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_division_subject")
@NoArgsConstructor
public class DivisionSubject extends BaseModel {
public static final LambdaQueryWrapper<DivisionSubject> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
*接收方类型
*/
public static final byte RECEIVE_TYPE = 0;
/**
*分出方类型
*/
public static final byte EXPEND_TYPE = 1;
/**
*接收方类型 个人
*/
public static final byte USER_TYPE_PERSONAL = 0;
/**
*分出方类型 商户
*/
public static final byte USER_TYPE_MERCHANT = 1;
private static final String BANK = "BANK";
private static final String ZFB = "ZFB";
private static final String WX = "WX";
/**
*
*/
@TableId(value = "division_no", type = IdType.INPUT)
private String divisionNo;
/**
* 用户号
*/
private String mchNo;
/**
* 类型 0接收方 1分出方
*/
private Byte type;
/**
* 所属通道
*/
private String ifCode;
/**
* 所属渠道
*/
private String isvNo;
/**
* 用户类型 0个人 1商户
*/
private Byte userType;
/**
* 个人名称或者商户名称
*/
private String name;
/**
* 平渠道分账账户号
*/
private String channelDivisionNo;
/**
* 结算类型 BANK到银行卡 ZFB到支付宝 WX:微信
*/
private String settleType;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 扩展参数
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String extData;
/**
* 备注
*/
private String remark;
/**
* 状态
*/
private Byte state;
/**
* 所属通道
*/
@TableField(exist = false)
private String ifName;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvName;
/**
* 是否收取手续费 0否 1
*/
@TableField(exist = false)
private Byte isCharge;
/**
* 分账值
*/
@TableField(exist = false)
private BigDecimal divisionValue;
@TableField(exist = false)
private String taskId;
@TableField(exist = false)
private DivisionSettleInfo info;
/**
* 分账分出方参数校验
*/
public void preCheck(){
// Assert.notNull(this.getType(),"类型不能为空");
Assert.notNull(this.getUserType(),"用户类型不能为空");
Assert.notNull(this.getName(),"别名不能为空");
if(USER_TYPE_MERCHANT == this.getUserType()){
Assert.notNull(this.getDivisionNo(),"分账账号不能为空");
}else{
this.setDivisionNo(SeqKit.getDivisionNo());
}
Assert.notNull(this.getIfCode(),"所属通道不能为空");
Assert.notNull(this.getIsvNo(),"所属渠道不能为空");
Assert.notNull(this.getSettleType(),"结算到类型不能为空");
}
public void preDivCheck() {
//分账方只能是商户
this.setUserType(USER_TYPE_MERCHANT);
preCheck();
Assert.isTrue(USER_TYPE_MERCHANT == this.getUserType(),"分账分出方只能选择商户");
}
public void preRecCheck() {
preCheck();
Assert.notNull(this.getType(),"分账账号类型不能为空");
Assert.notNull(this.getInfo(),"分账结算信息不能为空");
this.getInfo().preCheck(this.getSettleType());
this.extData = JSON.toJSONString(this.getInfo());
}
}

View File

@@ -0,0 +1,243 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.utils.SeqKit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 分账任务表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-04-02
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_division_task",autoResultMap = true)
public class DivisionTask extends BaseModel {
public static final LambdaQueryWrapper<DivisionTask> gw(DivisionTask entity){
return new LambdaQueryWrapper<>(entity);
}
public static final LambdaQueryWrapper<DivisionTask> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 默认最大分账比例
*/
public static final BigDecimal DEFAULT_MAX_RATIO = BigDecimal.valueOf(0.3);
/**
* 比例
*/
public static final byte DIV_MODE_RATIO = 0;
/**
* 金额
*/
public static final byte DIV_MODE_AMOUNT = 1;
/**
* 实时分账
*/
public static final byte DIV_TYPE_SS = 0;
/**
* 延时分账
*/
public static final byte DIV_TYPE_YS = 1;
/**
* 秒到分账
*/
public static final byte DIV_TYPE_MD = 2;
/**
* 任务ID
*/
@TableId(value = "task_id", type = IdType.INPUT)
private String taskId;
/**
* 任务名称
*/
private String name;
/**
* 用户号
*/
private String mchNo;
/**
* 所属通道
*/
private String ifCode;
//
// /**
// * 所属渠道
// */
// private String isvNo;
/**
* 分账模式 0比例分账 1金额分账
*/
private Byte divisionMode;
/**
* 分账类型 0实时分账 1延时分账 2秒到分账
*/
private Byte divisionType;
/**
* 分账值 分账比例为 比例值 分账金额为分账金额值
*/
private BigDecimal divisionValue;
/**
* 最小金额 当交易金额大于当前值的时候会触发后台的分账模板的分账
*/
private Long minAmount;
/**
* 状态 0禁用 1启用
*/
private Byte state;
/**
* 是否自动分账 0否 1
*/
private Byte isAuto;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 分账说明函
*/
private String url;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private String isvName;
/**
* 分账分出方
*/
@TableField(exist = false)
private List<String> divisionList;
/**
* 分账接收方
*/
@TableField(exist = false)
private List<DivisionSubject> receiveList;
/**
* 参数校验
*/
public void preCheck() {
if(StringUtils.isEmpty(this.getTaskId())){
this.setTaskId(SeqKit.genFlowNo("TA"));
}
Assert.hasLength(this.getName(),"分账任务名称不能为空");
// Assert.hasLength(this.getIsvNo(),"所属通道不能空");
// Assert.hasLength(this.getMchNo(),"所属用户不能为空");
Assert.hasLength(this.getIfCode(),"所属通道不能为空");
Assert.notNull(this.getDivisionMode(),"分账模式不能为空");
Assert.notNull(this.getDivisionType(),"分账类型不能为空");
Assert.hasLength(this.getUrl(),"分账场景说明函不能为空");
Assert.notNull(this.getIsAuto(),"是否自动分账不能为空");
Assert.notNull(this.getDivisionList(),"分账分出方不能为空");
Assert.notNull(this.getReceiveList(),"分账接收方不能为空");
if(this.getReceiveList().size() > 9){
throw new BizException("分账接收方不允许超过9个");
}
this.getReceiveList().forEach(item -> {
if(item.getDivisionValue() == null){
throw new BizException("分账接收方详情中分账属性值不能为空");
}
if(item.getIsCharge() == null){
throw new BizException("分账接收方详情中是否收取手续费不能为空");
}
if(item.getDivisionNo() == null){
throw new BizException("分账接收方详情中分账收款方账户号不能为空");
}
});
}
/**
* 校验配置信息
*/
public void preSubjectCheck() {
Assert.notNull(this.getTaskId(),"分账任务id不能为空");
Assert.notEmpty(this.getReceiveList(),"分账接收方不能为空");
this.getReceiveList().forEach(item -> {
if(StringUtils.isEmpty(item.getDivisionNo())){
throw new BizException("分账接收方数据分账账户号为空的数据");
}
});
}
/**
* 校验分账比例
*/
public void checkDivisionRationValue(DivisionTask ext) {
BigDecimal totalRatio = BigDecimal.ZERO;
for (DivisionSubject templateConfig:this.getReceiveList()) {
totalRatio = totalRatio.add(templateConfig.getDivisionValue());
}
if(totalRatio.compareTo(DEFAULT_MAX_RATIO) > 0){
throw new BizException("分账接收方分账比例之和不能超过30%");
}
}
/**
* 校验分账金额
* @param ext
*/
public void checkDivisionAmountValue(DivisionTask ext) {
BigDecimal totalAmt = BigDecimal.ZERO;
for (DivisionSubject subject:this.getReceiveList()) {
totalAmt = totalAmt.add(subject.getDivisionValue());
}
totalAmt = totalAmt.multiply(BigDecimal.valueOf(100));
if(totalAmt.longValue() > ext.getDivisionValue().longValue()){
throw new BizException("分账接收方所有分账金额之后不能超过所设置的分账金额");
}
}
}

View File

@@ -0,0 +1,69 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 钱包表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_info_account")
public class InfoAccount extends BaseModel {
// gw
public static final LambdaQueryWrapper<InfoAccount> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 运营平台标识/服务商号
*/
private String infoId;
/**
* 系统类型: 参考SYS_TYPE
*/
private String infoType;
/**
* 钱包余额 单位:分,(已入账金额, 提现中不动账)
*/
private Long balanceAmount;
/**
* 钱包账户不可用金额 单位:分(比如提现中的金额)
*/
private Long unAmount;
/**
* 在途结算(审核中)余额 单位:分,(待结算的金额, 未到结算周期)
*/
private Long auditProfitAmount;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,131 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 钱包流水表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_info_account_history")
public class InfoAccountHistory extends BaseModel {
public static final LambdaQueryWrapper<InfoAccountHistory> gw(){
return new LambdaQueryWrapper<>();
}
/** 变更账户类型: 1-钱包账户, 2-在途账户 **/
public static final byte OP_ACCOUNT_TYPE_BALANCE = 1;
public static final byte OP_ACCOUNT_TYPE_AUDIT_PROFIT = 2;
/**
* 关联订单类型: 1-支付订单号, 2-退款订单号, 3-提现单号, 4-转账单号
**/
public static final byte ORDER_TYPE_PAY = 1;
public static final byte ORDER_TYPE_REFUND = 2;
public static final byte ORDER_TYPE_CASHOUT = 3;
public static final byte ORDER_TYPE_TRANSFER = 4;
/** 业务类型: 1-订单佣金计算, 2-退款轧差, 3-佣金提现, 4-人工调账 **/
public static final byte BIZ_TYPE_PAY = 1;
public static final byte BIZ_TYPE_REFUND = 2;
public static final byte BIZ_TYPE_CASHOUT = 3;
public static final byte BIZ_TYPE_PLATFORM_CHANGE = 4;
private static final long serialVersionUID=1L;
/**
* 记录ID
*/
@TableId(value = "hid", type = IdType.AUTO)
private Long hid;
/**
* 运营平台标识/服务商号
*/
private String infoId;
/**
* 系统类型: 参考SYS_TYPE
*/
private String infoType;
/**
* 名称快照
*/
private String infoName;
/**
* 变更账户类型: 1-钱包账户, 2-在途账户
*/
private Byte opAccountType;
/**
* 变动前账户余额, 单位:分
*/
private Long opBeforeAmount;
/**
* 变动金额, 单位:分
*/
private Long opAmount;
/**
* 变动后账户余额, 单位:分
*/
private Long opAfterAmount;
/**
* 业务类型: 1-订单佣金计算, 2-退款轧差, 3-佣金提现
*/
private Byte bizType;
/**
* 关联订单类型: 1-支付订单号, 2-退款订单号, 3-提现单号, 4-转账单号
*/
private Byte relaBizOrderType;
/**
* 关联订单号
*/
private String relaBizOrderId;
/**
* 关联结算记录ID
*/
private Long settId;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,100 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.model.ip.IpAddressResult;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* ip关联地区缓存表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-03-21
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_ip_location")
@NoArgsConstructor
public class IpLocation extends BaseModel {
private static final long serialVersionUID=1L;
/**
* ip
*/
@TableId(type = IdType.INPUT)
private String ip;
/**
* 省份名称
*/
private String provinceName;
/**
* 省份编码
*/
private String provinceCode;
/**
* 城市名称
*/
private String cityName;
/**
* 城市编码
*/
private String cityCode;
/**
* 地区名称
*/
private String areaName;
/**
* 区域编码
*/
private String areaCode;
/**
* 地址
*/
private String address;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
@TableField(exist = false)
private Byte state;
public IpLocation(IpAddressResult addressResult) {
this.ip = addressResult.getIp();
this.provinceName = addressResult.getPro();
this.provinceCode = addressResult.getProCode();
this.cityName = addressResult.getCity();
this.cityCode = addressResult.getCityCode();
this.areaName = addressResult.getRegion();
this.areaCode = addressResult.getRegionCode();
this.address = addressResult.getAddr();
this.remark = addressResult.getErr();
this.state = addressResult.getState();
}
}

View File

@@ -0,0 +1,114 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.entity.IsvInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 服务商信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_isv_info")
public class IsvInfoEntity extends IsvInfo {
//gw
public static final LambdaQueryWrapper<IsvInfoEntity> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 服务商号
*/
@TableId(value = "isv_no", type = IdType.INPUT)
private String isvNo;
/**
* 服务商名称
*/
private String isvName;
/**
* 1一级渠道
* 2二级渠道
*/
private Integer isvLevel;
/**
* 服务商简称
*/
private String isvShortName;
/**
* 联系人姓名
*/
private String contactName;
/**
* 联系人手机号
*/
private String contactTel;
/**
* 联系人邮箱
*/
private String contactEmail;
/**
* 状态: 0-停用, 1-正常
*/
private Byte state;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 渠道持有者类型
* @see com.jeequan.jeepay.core.constants.CS.SYS_ROLE_TYPE
*/
private String ownerType;
/**
* 渠道持有者ID
* 若是代理这是代理编号;
* 若是商户则是商户编号;
*/
private String ownerNo;
}

View File

@@ -0,0 +1,31 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* 通道禁止关联标记表
*
* @author deng
* @since 2024/4/24
*/
@Data
@TableName("t_isv_user_conn_disabled")
public class IsvUserConnDisabledEntity {
@TableId
private Long id;
private String isvNo;
private String ifCode;
private String infoType;
private String infoId;
private Date createTime;
}

View File

@@ -0,0 +1,90 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.jeequan.jeepay.core.constants.CS;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.Date;
@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_isv_user_conn")
public class IsvUserConnEntity {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField("isv_no")
private String isvNo;
/**
* @since 2024.04.03
* 冗余商户与服务商的关联关系,方便后续操作
*/
@TableField("agent_no")
private String agentNo;
@TableField("info_type")
private String infoType;
@TableField("info_id")
private String infoId;
private int sort;
/**
* 是否可使用,主要针对商户入网
* <p>
* @since 2024-01-06
* 当该参数为0时该渠道关联关系即为无效
* <ol>
* <li>当前关联用户类型为普通用户,那么他无法再使用该渠道配置参数进行商户入网</li>
* <li>当前关联用户类型为服务商(原服务商),那么他无法给他的下级服务商(原服务商)、普通用户修改配置信息</li>
* </ol>
* 当该参数为1时候以上限制全无
*/
private Integer status;
/**
* 是否可配置
* <p>
* @since 2024-01-06
* <br/>
* 当该参数为0时候他的下级代理不会自动继承该渠道关联
* <br/>
* 当改参数为1时候他的下级代理商户等会自动继承该关联信息
* </p>
*/
private int configStatus;
private String remark;
@TableField("created_uid")
private Long createdUid;
@TableField("created_by")
private String createdBy;
@TableField(fill = FieldFill.INSERT)
private Date createdAt;
public static final Integer STATUS_ENABLED = (int) CS.YES;
public static final Integer STATUS_DISABLED = (int )CS.NO;
public static IsvUserConnEntity create(String infoType, String infoId, String isvNo, int configStatus, int status) {
return IsvUserConnEntity.builder()
.infoType(infoType)
.infoId(infoId)
.isvNo(isvNo)
.configStatus(configStatus)
.status(status)
.build();
}
}

View File

@@ -0,0 +1,32 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("t_location_cache")
public class LocationCache extends BaseModel {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String address;
/**
* 经度
*/
private String longitude;
private String latitude;
@TableField(value = "createTime", fill = FieldFill.INSERT)
private Date createTime;
@TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

View File

@@ -0,0 +1,75 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 应用与进件数据的关联表
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_app_applyment")
public class MchAppApplyment extends BaseModel {
public static final LambdaQueryWrapper<MchAppApplyment> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 商户号
*/
private String mchNo;
/**
* 应用号
*/
private String mchAppId;
/**
* 商户入网申请单号
*/
private String mchApplyId;
/**
* 微信支付交易权重
*/
private Integer wxWeight;
/**
* 支付宝支付交易权重
*/
private Integer aliWeight;
/**
*银联支付交易权重
*/
private Integer ysfWeight;
/**
*状态。0未生效1已生效
*/
private Integer status;
/**
*备注信息
*/
private String remark;
/**
*创建时间
*/
private Date createdAt;
/**
*更新时间
*/
private Date updatedAt;
/**
* 应用名称
*/
@TableField(exist = false)
private String appName;
/**
* 商户简称
*/
@TableField(exist = false)
private String mchShortName;
}

View File

@@ -0,0 +1,201 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.model.MchExtInfo;
import com.jeequan.jeepay.db.typehandler.EncryptTypeHandler;
import com.jeequan.jeepay.db.typehandler.MchExtInfoListHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 商户应用表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-06-15
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_mch_app", autoResultMap = true)
public class MchAppEntity extends BaseModel {
public static final Byte DISABLE = 0;
public static final Byte NORMAL = 1;
public static final Byte AUDIT = 2;
public static final Byte REJECT = -1;
private static final long serialVersionUID=1L;
/**
* 线下
*/
public static final byte OFFLINE = 0;
/**
* 线上
*/
public static final byte ONLINE = 1;
public static final LambdaQueryWrapper<MchAppEntity> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 应用ID
*/
@TableId(value = "app_id", type = IdType.INPUT)
private String appId;
/**
* 应用私钥(MD5)
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String appSecret;
/**
* 应用名称
*/
private String appName;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 顶级服务商号
*/
private String topAgentNo;
/**
* 是否默认: 0-否、 1-是api接口未显式指定应用则使用默认应用
*/
private Byte defaultFlag;
/**
* 应用状态: 0-停用, 1-正常 2:审核中 -1审核驳回
*/
private Byte state;
/**
* 审核意见
*/
private String stateDesc;
/**
* 轮询绑定状态。0 - 未开通1 - 已开通自动绑定2 - 不开通自动绑定
*/
private int pollingBindState;
/**
* 支持的加签方式: MD5、 RSA2若使用系统测试或者app必须支持MD5
*/
private String appSignType;
/**
* 应用公钥RSA2
*/
private String appRsa2PublicKey;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 0: 线下,
* 1: 线上
*/
@TableField("`range`")
private Integer range;
/**
* 是否支持API,
* 0: 不支持
* 1: 支持
*/
private Integer apiFlag;
/**
* 应用信息
*/
@TableField(typeHandler = MchExtInfoListHandler.class)
private List<MchExtInfo> information;
private String mccCode;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<JSONObject> qualificationList;
/*预开通的方案id多个用英文逗号隔开*/
private String predicOpenPackage;
/*预开通的产品id多个用英文逗号隔开*/
private String predicOpenProduct;
@TableField(exist = false)
List<String> subAgentNoList;
@TableField(exist = false)
List<String> finalMchNoList;
/**
* 服务商号
*/
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String unionSearchId;
@TableField(exist = false)
private Integer mchType;
}

View File

@@ -0,0 +1,71 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 商户app推送设备表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-02-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_app_push_info")
public class MchAppPushInfo implements Serializable {
private static final long serialVersionUID=1L;
// 设备cid类型app端app_plus小程序端mp_weixin
public static String PUSH_CID_TYPE_APP = "app_plus";
public static String PUSH_CID_TYPE_WX = "mp_weixin";
// uniPush版本1-1.0版本2-2.0版本
public static byte UNI_PUSH_VERSION_1 = 1;
public static byte UNI_PUSH_VERSION_2 = 2;
// gw
public static final LambdaQueryWrapper<MchAppPushInfo> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 设备号CID
*/
private String cid;
/**
* 设备cid类型app端app_plus小程序端mp_weixin
*/
private String cidType;
/**
* uniPush版本1-1.0版本2-2.0版本
*/
private Byte uniPushVersion;
/**
* 商户号
*/
private String mchNo;
/**
* 系统用户ID
*/
private Long sysUserId;
/**
* 设备信息
*/
private String deviceInfo;
}

View File

@@ -0,0 +1,430 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.db.typehandler.EncryptTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 特约商户进件信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "t_mch_applyment", autoResultMap = true)
public class MchApplyment extends BaseModel {
/**
* 状态: 0-未发起(草稿)、 1-审核中、 2-进件成功、 3-驳回待修改、 4-待验证、 5-待签约、6-签约完成/审核成功,等待其他操作、 7-等待系统预审核、 8-预审核拒绝 , 11-图片待提交
*/
public static final byte STATE_SAVE = 0;
public static final byte STATE_AUDITING = 1;
public static final byte STATE_SUCCESS = 2;
public static final byte STATE_REJECT_WAIT_MODIFY = 3;
public static final byte STATE_WAIT_VERIFY = 4;
public static final byte STATE_WAIT_SIGN = 5;
public static final byte STATE_FINISH_SIGN = 6;
public static final byte STATE_WAIT_PRE_AUDITING = 7;
public static final byte STATE_WAIT_PRE_AUDIT_REJECT = 8;
/**
* 任务等待中, 后根据提交的剩余步骤去执行相关的商户入网操作
*/
public static final byte STATE_AUDITING_WAIT = 100;
/**
* 通道人工审核
*/
public static final byte STATE_UPSTREAM_MANUAL_REVIEW = 11;
/**
* 待复审
*/
public static final byte STATE_SUCCESS_NEED_SECOND_VERIFY = 12;
/**
* 风控
*/
public static final byte STATE_WAIT_RISK = 20;
/**
* 冻结
*/
public static final byte STATE_WAIT_FREEZE = 21;
/**
* 注销
*/
public static final byte STATE_WAIT_LOGOUT = 22;
/** 1-个人, 2-个体工商户, 3-企业, 4-党政、机关及事业单位, 5-其他组织, 6-个人卖家 **/
// public static final byte MERCHANT_TYPE_PERSONAL = 1;
// public static final byte MERCHANT_TYPE_INDIVIDUAL = 2;
// public static final byte MERCHANT_TYPE_ENTERPRISE = 3;
// public static final byte MERCHANT_TYPE_GOV = 4;
// public static final byte MERCHANT_TYPE_OTHER = 5;
// public static final byte MERCHANT_TYPE_PERSONAL_SELLER= 6; // 收付通新增个人卖家指无营业执照已持续从事电子商务经营活动满6个月且期间经营收入累计超过20万元的个人商家。
/**
* B-对公, C-对私
**/
public static final String SETT_ACCOUNT_TYPE_CORPORATE = "B";
public static final String SETT_ACCOUNT_TYPE_PERSONAL = "C";
/**
* 默认 收款商户
*/
public static final String REFUND_WAY_PAYMENT = "payment";
/**
* 平台户
*/
public static final String REFUND_WAY_PLATFORM = "platform";
private static final long serialVersionUID = 1L;
/**
* 回调通知链接
*/
private String notifyUrl;
/**
* 下游系统申请单号
*/
private String subApplyId;
/**
* 渠道申请单号
*/
private String channelApplyNo;
/**
* 渠道要求的自定义商户号建议采用mchNo_时间戳10位的形式
*/
private String channelDiyMchNo;
/**
* 收单机构编号
*/
private String channelMchNo;
/**
* 商户号
*/
private String mchNo;
/**
* 渠道商号
*/
private String isvNo;
/**
* 渠道商号
*/
private String agentNo;
/**
* 顶级服务商号
*/
private String topAgentNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 接口名称
*/
private String ifName;
/**
* 商户全称
*/
private String mchFullName;
/**
* 商户简称
*/
private String mchShortName;
/**
* 商户类型: 1-个人, 2-个体工商户, 3-企业, 4-党政、机关及事业单位, 5-其他组织
*/
private Byte merchantType;
/**
* 联系人(不一定的法人)姓名
*/
private String contactName;
/**
* 省市县编码 (非必填, 放在外层用作搜索方便)
*/
private String areaCode;
/**
* 省市县名称描述
*/
private String areaInfo;
/**
* 详细地址
*/
private String address;
/**
* 状态: 0-未发起(草稿)、 1-审核中、 2-进件成功、 3-驳回待修改、 4-待验证、 5-待签约、6-签约完成/审核成功,等待其他操作、 7-等待系统预审核、 8-预审核拒绝
*/
private Byte state;
/**
* 备注信息
*/
private String remark;
/**
* 运营端的备注信息
*/
@TableField("IF(JSON_VALID(remark), JSON_UNQUOTE(JSON_EXTRACT(remark, '$.mgr')), remark)")
private String mgrRemark;
/**
* 服务商端备注
*/
@TableField("IF(JSON_VALID(remark), JSON_UNQUOTE(JSON_EXTRACT(remark, '$.agt')), remark)")
private String agtRemark;
/**
* 商户端备注
*/
@TableField("IF(JSON_VALID(remark), JSON_UNQUOTE(JSON_EXTRACT(remark, '$.mch')), remark)")
private String mchRemark;
/**
* 入网操作剩余步骤,总共有几步主要看通道
*/
private Byte remainStep;
/**
* 进件成功接口返回参数, 用于配置到商户侧的参数信息
*/
private String succResParameter;
/**
* 渠道拓展参数1
*/
private String channelVar1;
/**
* 渠道拓展参数2
*/
private String channelVar2;
/**
* 门店入驻成功接口返回参数
*/
private String storeSuccResParameter;
/**
* 响应提示信息(一般进件异常或提示信息)
*/
private String applyErrorInfo;
/**
* 商户所属拓展员ID
*/
private Long epUserId;
/**
* 进件来源
*/
private String applyPageType;
/**
* 默认结算方式
* 部分通道可以根据传参发起多种结算方式的订单
*/
private String settlementType;
/**
* 自动配置的应用ID不为空自动进行关联等一系列配置
*/
private String autoConfigMchAppId;
/**
* 自动配置结果信息
*/
private String autoConfigResultInfo;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 最后一次请求上游时间
*/
private Date lastApplyAt;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 支付配置参数ID关联t_pay_interface_config_alternative的ID
*/
private Long payInterfaceId;
/**
* 退款类型 payment:收款商户 platform 平台账户
*/
private String refundWay;
/**
* 反扫权限开关。102未指定根据业务判断是否开关
* 为空同2
*/
private Integer scanPayPerm;
// gw
public static LambdaQueryWrapper<MchApplyment> gw() {
return new LambdaQueryWrapper<>();
}
/**
* 系统申请单号
*/
@TableId
private String applyId;
/**
* 联系人电话
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String contactPhone;
/**
* 商户进件详细消息JSON类型
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String applyDetailInfo;
@TableField(exist = false)
private List<MchSubInfoEntity> mchSubInfoEntity;
@TableField(exist = false)
private Integer authenticationState;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
private String unionSearchId;
@TableField(exist = false)
private Integer wxAuthenticationState;
@TableField(exist = false)
private Integer zfbAuthenticationState;
@TableField(exist = false)
private String isvName;
@TableField(exist = false)
private String agentNoName;
@TableField(exist = false)
private String agentPhone;
@TableField(exist = false)
private String isvShortName;
@TableField(exist = false)
private String appName;
/**
* 应用的范围 0, 线下1线上
*/
@TableField(exist = false)
private Integer range;
/**
* 应用的范围 mccCode
*/
@TableField(exist = false)
private String mccCode;
@TableField(exist = false)
private Integer storeNumber;
/**
* 用户名称
*/
@TableField(exist = false)
private String mchUserName;
/**
* 用户电话
*/
@TableField(exist = false)
private String mchUserPhone;
@TableField(exist = false)
private String mchServiceName;
@TableField(exist = false)
private String mchServicePhone;
/**
* 商户名称
*/
@TableField(exist = false)
private String mchApplyName;
@TableField(exist = false)
List<String> subAgentNoList;
/**
* 是否支持分账查询
*/
@TableField(exist = false)
private Byte isDivision;
/**
* 商户状态是否可以支付
*
* @return
*/
@JSONField(serialize = false)
public boolean isPay() {
return STATE_SUCCESS == this.getState() || STATE_SUCCESS_NEED_SECOND_VERIFY == this.getState();
}
}

View File

@@ -0,0 +1,287 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.*;
/**
* <p>
* 商户配置表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-02-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_config")
public class MchConfig implements Serializable {
public static final String AREA_LOCAK_OPEN = "1";
public static final String AREA_LOCAK_CLOSE = "0";
@Data
@AllArgsConstructor
public static final class Option {
private String configKey;
private String configName;
private String groupKey;
private String type;
private String defVal;
public static Option APP_VOICE = new Option("appVoice", "是否启用app订单语音播报", "orderConfig", "radio", "1");
public static Option QRC_ESCAPING = new Option("qrcEscaping", "是否启用码牌防逃单功能","orderConfig", "radio", "1");
public static Option SELF_CASHIER_STATE = new Option("selfCashierState", "便捷收银台开关", "selfCashier", "radio", "0");
public static Option WEB_CASHIER_STATE = new Option("webCashierState", "WEB收银台开关", "webCashier", "radio", "0");
public static Option MEMBER_MODEL_STATE = new Option("memberModelState", "会员模块状态开关", "memberConfig", "radio", "1");
public static Option MEMBER_PAY_STATE = new Option("memberPayState", "会员支付开关", "memberConfig", "radio", "0");
public static Option MEMBER_CUSTOM_AMOUNT_STATE = new Option("memberCustomAmountState", "充值自定义金额", "memberConfig", "radio", "1");
public static Option APPLYMENT_DEF_ISV_NO = new Option("applymentDefIsvNo", "入网时默认的渠道号", "applymentConfig", "radio", null);
// 线下电子围栏默认值
public static Option REGION_LOCK_OFFLINE = new Option("regionLock", "电子围栏标识", "applymentConfig", "radio", "1");
// 线上电子围栏默认值
public static Option REGION_LOCK_ONLINE = new Option("regionLock", "电子围栏标识", "applymentConfig", "radio", "0");
public static List<Option> optionList = new ArrayList<>();
static {
optionList.add(APP_VOICE);
optionList.add(QRC_ESCAPING);
optionList.add(SELF_CASHIER_STATE);
optionList.add(WEB_CASHIER_STATE);
optionList.add(MEMBER_MODEL_STATE);
optionList.add(MEMBER_PAY_STATE);
optionList.add(MEMBER_CUSTOM_AMOUNT_STATE);
optionList.add(APPLYMENT_DEF_ISV_NO);
optionList.add(REGION_LOCK_OFFLINE);
optionList.add(REGION_LOCK_ONLINE);
}
public static Option getFirstByConfigKey(String configKey) {
for (Option option : optionList) {
if (configKey.equals(option.configKey)) {
return option;
}
}
return null;
}
}
public static String getDefIsvKey(String ifCode) {
return ifCode + "_DEF_ISV";
}
private static final long serialVersionUID=1L;
// gw
public static final LambdaQueryWrapper<MchConfig> gw(){
return new LambdaQueryWrapper<>();
}
public static final String YES = "1";
public static final String NO = "0";
/** 是否启用app订单语音播报 **/
public static final String APP_VOICE = "appVoice";
/** 是否启用码牌防逃单功能 **/
public static final String QRC_ESCAPING = "qrcEscaping";
/** 便捷收银台LOGO及底部显示配置 **/
public static final String SELF_CASHIER_SITEINFO_TYPE_DEFAULT = "DEFAULT"; // 默认
public static final String SELF_CASHIER_SITEINFO_TYPE_NONE = "NONE"; // 为空
public static final String SELF_CASHIER_SITEINFO_TYPE_CUSTOM = "CUSTOM"; // 自定义
/** group key */
public static final String SELF_CASHIER_GROUP_KEY = "selfCashier";
public static final String WEB_CASHIER_GROUP_KEY = "webCashier";
/** 便捷收银台 / web收银台 配置 **/
public static final String SELF_CASHIER_STATE = "selfCashierState";
public static final String SELF_CASHIER_SITEINFO_TYPE = "selfCashierSiteInfoType";
public static final String SELF_CASHIER_WXH5_CONFIG = "selfCashierWxH5Config";
public static final String SELF_CASHIER_ALIWAP_CONFIG = "selfCashierAliWapConfig";
public static final String WEB_CASHIER_STATE = "webCashierState";
public static final String WEB_CASHIER_SITEINFO_TYPE = "webCashierSiteInfoType";
public static final String WEB_CASHIER_WXH5_CONFIG = "webCashierWxH5Config";
public static final String WEB_CASHIER_ALIWAP_CONFIG = "webCashierAliWapConfig";
/** 商户会员配置 **/
public static final String SELF_MEMBER_MODEL_STATE = "memberModelState";
public static final String SELF_MEMBER_PAY_STATE = "memberPayState";
public static final String SELF_MEMBER_CUSTOM_AMOUNT_STATE = "memberCustomAmountState";
public static final String SELF_MEMBER_MAX_BALANCE = "mbrMaxBalance";
// app订单语音播报配置
public static Map<String, String> appVoiceMap = new HashMap<>();
static {
appVoiceMap.put("configKey", "appVoice");
appVoiceMap.put("configName", "是否启用app订单语音播报");
appVoiceMap.put("configVal", "1");
appVoiceMap.put("groupKey", "orderConfig");
appVoiceMap.put("type", "radio");
}
// 码牌防逃单功能配置
public static Map<String, String> qrcEscapingMap = new HashMap<>();
static {
qrcEscapingMap.put("configKey", "qrcEscaping");
qrcEscapingMap.put("configName", "是否启用码牌防逃单功能");
qrcEscapingMap.put("configVal", "1");
qrcEscapingMap.put("groupKey", "orderConfig");
qrcEscapingMap.put("type", "radio");
}
// 便捷收银台功能配置
public static Map<String, String> selfCashierStateMap = new HashMap<>();
static {
selfCashierStateMap.put("configKey", "selfCashierState");
selfCashierStateMap.put("configName", "便捷收银台开关");
selfCashierStateMap.put("configVal", "0");
selfCashierStateMap.put("groupKey", "selfCashier");
selfCashierStateMap.put("type", "radio");
}
// WEB收银台功能配置
public static Map<String, String> webCashierStateMap = new HashMap<>();
static {
webCashierStateMap.put("configKey", "webCashierState");
webCashierStateMap.put("configName", "WEB收银台开关");
webCashierStateMap.put("configVal", "0");
webCashierStateMap.put("groupKey", "webCashier");
webCashierStateMap.put("type", "radio");
}
// 商户会员功能开关
public static Map<String, String> mchMemberModelMap = new HashMap<>();
static {
mchMemberModelMap.put("configKey", "memberModelState");
mchMemberModelMap.put("configName", "会员模块状态开关");
mchMemberModelMap.put("configVal", "1");
mchMemberModelMap.put("groupKey", "memberConfig");
mchMemberModelMap.put("type", "radio");
}
// 商户会员支付功能开关
public static Map<String, String> mchMemberPayMap = new HashMap<>();
static {
mchMemberPayMap.put("configKey", "memberPayState");
mchMemberPayMap.put("configName", "会员支付开关");
mchMemberPayMap.put("configVal", "0");
mchMemberPayMap.put("groupKey", "memberConfig");
mchMemberPayMap.put("type", "radio");
}
// 商户会员自定义金额充值
public static Map<String, String> mchMemberCustomAmountMap = new HashMap<>();
static {
mchMemberCustomAmountMap.put("configKey", "memberCustomAmountState");
mchMemberCustomAmountMap.put("configName", "充值自定义金额");
mchMemberCustomAmountMap.put("configVal", "1");
mchMemberCustomAmountMap.put("groupKey", "memberConfig");
mchMemberCustomAmountMap.put("type", "radio");
}
/**
* 此处只做标记,不做默认存储
*/
public static Map<String, String> mchApplymentDefSet = new HashMap<>();
static {
mchApplymentDefSet.put("configKey", "applymentDefIsvNo");
mchApplymentDefSet.put("configName", "入网时默认的渠道号");
mchApplymentDefSet.put("configVal", "");
mchApplymentDefSet.put("groupKey", "applymentConfig");
mchApplymentDefSet.put("type", "radio");
}
/**
* 以下为默认配置参数
*/
public static final List<Map<String, String>> configList = new LinkedList<>();
static {
configList.add(appVoiceMap);
configList.add(qrcEscapingMap);
configList.add(selfCashierStateMap);
configList.add(webCashierStateMap);
/** 会员配置 **/
configList.add(mchMemberModelMap);
configList.add(mchMemberPayMap);
configList.add(mchMemberCustomAmountMap);
}
/** 不支持商户自行修改的配置项 **/
public static final List<String> NOT_ALLOW_MCH_EDIT = new ArrayList<>();
static {
NOT_ALLOW_MCH_EDIT.add(SELF_MEMBER_MODEL_STATE);
NOT_ALLOW_MCH_EDIT.add(SELF_MEMBER_MAX_BALANCE);
}
/**
* 商户号
*/
private String mchNo;
/**
* @since 2024-03-21
* 商户应用ID若配置是以商户号为维度则该值为空
*/
private String mchAppId;
/**
* @since 2024-03-21
* 商户进件号,若配置是以商户号或应用为维度,则该值为空
*/
private String mchApplyId;
/**
* 配置KEY
*/
private String configKey;
/**
* 配置名称
*/
private String configName;
/**
* 配置内容项
*/
private String configVal;
/**
* 配置分组
*/
private String groupKey;
/**
* 类型: text-输入框, textarea-多行文本, uploadImg-上传图片, switch-开关, radio-单选框
*/
private String type;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,57 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 商户分账接收者账号绑定关系表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-08-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_division_receiver")
public class MchDivisionReceiver extends com.jeequan.jeepay.core.entity.MchDivisionReceiver {
private static final long serialVersionUID=1L;
//gw
public static final LambdaQueryWrapper<MchDivisionReceiver> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 分账接收者ID
*/
@TableId(value = "receiver_id", type = IdType.AUTO)
private Long receiverId;
/**
* 是否按照扩展分账金额分账
*/
@TableField(exist = false)
private Boolean isExtDivAmt;
public Boolean getExtDivAmt() {
if(this.isExtDivAmt == null){
return false;
}
return isExtDivAmt;
}
}

View File

@@ -0,0 +1,78 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 分账账号组
* </p>
*
* @author [mybatis plus generator]
* @since 2021-08-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_division_receiver_group")
public class MchDivisionReceiverGroup extends BaseModel {
//gw
public static final LambdaQueryWrapper<MchDivisionReceiverGroup> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 组ID
*/
@TableId(value = "receiver_group_id", type = IdType.AUTO)
private Long receiverGroupId;
/**
* 组名称
*/
private String receiverGroupName;
/**
* 商户号
*/
private String mchNo;
/**
* 自动分账组(当订单分账模式为自动分账,改组将完成分账逻辑) 0-否 1-是
*/
private Byte autoDivisionFlag;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,90 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.Objects;
/**
* <p>
* 商户信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_mch_info", autoResultMap = true)
public class MchInfo extends com.jeequan.jeepay.core.entity.MchInfo {
//gw
public static final LambdaQueryWrapper<MchInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
public static final byte TYPE_NORMAL = 1; //商户类型: 1-普通商户
public static final byte TYPE_ISVSUB = 2; //商户类型: 2-特约商户
public static final String REFUND_MODEL_PLAT = "plat"; // 支持的退款方式 平台
public static final String REFUND_MODEL_API = "api"; // 支持的退款方式 接口
public static final String MCH_LEVEL_M0 = "M0"; // 商户级别:简单
public static final String MCH_LEVEL_M1 = "M1"; // 商户级别:高级
public static final byte STATE_NO = 0; // 商户状态: 0-停用
public static final byte STATE_YES = 1; // 商户状态: 1-正常
public static final byte STATE_NO_MGR = 2; // 商户状态: 2-由运营平台停用
/**
* 商户号
*/
@TableId(value = "mch_no", type = IdType.INPUT)
private String mchNo;
/**
* 支持的退款方式 ["plat", "api"]
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray refundMode;
@TableField(exist = false)
private String mchServiceName;
@TableField(exist = false)
private String mchServicePhone;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
public static boolean isIsv(MchInfo mchInfo) {
if (mchInfo == null) {
return false;
}
return Objects.equals(TYPE_ISVSUB, mchInfo.getType());
}
public static boolean isNotIsv(MchInfo mchInfo) {
if (mchInfo == null) {
return true;
}
return !Objects.equals(TYPE_ISVSUB, mchInfo.getType());
}
}

View File

@@ -0,0 +1,160 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.model.applyment.MchModifyApplymentModel;
import com.jeequan.jeepay.db.typehandler.EncryptTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.util.Date;
import java.util.List;
/**
* <p>
* 特约商户进件信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-05
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(value = "t_mch_modify_applyment", autoResultMap = true)
public class MchModifyApplymentEntity extends BaseModel {
/**
* 商户变更系统申请单号
*/
@TableId
private String modifyApplyId;
/**
* 系统申请单号/进件商户号
*/
private String applyId;
/**
* 渠道申请单号
*/
private String channelApplyNo;
/**
* 通道商户号,收单机构编号
*/
private String channelMchNo;
/**
* 商户号
*/
private String mchNo;
/**
* 支付接口代码, 字段冗余
*/
private String ifCode;
/**
* 接口名称, 字段冗余方便检索
*/
private String ifName;
/**
* 商户本次变更前的数据JSON类型
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String originDetailInfo;
/**
* 商户变更详细信息JSON类型
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String applyDetailInfo;
/**
* 1、基本资料变更; 2、结算信息变更; 3、费率信息变更; 4、身份信息补充; 5、通用变更(待定)
*/
private Byte modifyApplyType;
private Byte state;
private String remark;
private String remainStep;
/**
* 上游接口返回参数
*/
private String channelVar1;
private String applyErrorInfo;
private String applyPageType;
private Long createdUid;
private String createdBy;
/**
* 变更类型1: 本地变更; 2: 变更并同步到上游通道;有值则代表是运营端或者服务商端代变更的数据
*/
private String otherOperationType;
private Date createdAt;
private Date updatedAt;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
private String unionSearchId;
@TableField(exist = false)
private String mchFullName;
@TableField(exist = false)
private String mchUserName;
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String agentNo;
@TableField(exist = false)
private Byte merchantType;
@TableField(exist = false)
private Long epUserId;
@TableField(exist = false)
private MchModifyApplymentModel modifyModel;
@TableField(exist = false)
private String mchShortName;
@TableField(exist = false)
private List<String> mchInfoList;
public static LambdaQueryWrapper<MchModifyApplymentEntity> gw(MchModifyApplymentEntity modifyApplyment) {
return new LambdaQueryWrapper<>(modifyApplyment);
}
public static LambdaQueryWrapper<MchModifyApplymentEntity> gw() {
return new LambdaQueryWrapper<>();
}
}

View File

@@ -0,0 +1,137 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 商户通知记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_notify_record")
public class MchNotifyRecord extends BaseModel implements Serializable {
//订单类型:1-支付,2-退款, 3-转账 4-分账
public static final byte TYPE_PAY_ORDER = 1;
public static final byte TYPE_REFUND_ORDER = 2;
public static final byte TYPE_TRANSFER_ORDER = 3;
public static final byte TYPE_DIVISION_ORDER = 4;
// 进件
public static final byte TYPE_AUDIT = 11;
//通知状态
public static final byte STATE_ING = 1;
public static final byte STATE_SUCCESS = 2;
public static final byte STATE_FAIL = 3;
//gw
public static final LambdaQueryWrapper<MchNotifyRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 商户通知记录ID
*/
@TableId(value = "notify_id", type = IdType.AUTO)
private Long notifyId;
/**
* 订单ID
*/
private String orderId;
/**
* 订单类型:1-支付,2-退款 3-转账 4分账 ,11-进件
*/
private Byte orderType;
/**
* 商户订单号
*/
private String mchOrderNo;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 应用ID
*/
private String appId;
/**
* 通知地址
*/
private String notifyUrl;
/**
* 通知内容
*/
private String notifyBody;
/**
* 发送商户通知的方式POST_QUERYSTRING, POST_BODY, POST_JSON
*/
private String notifyPostType;
/**
* 通知响应结果
*/
private String resResult;
/**
* 通知次数
*/
private Integer notifyCount;
/**
* 最大通知次数, 默认6次
*/
private Integer notifyCountLimit;
/**
* 通知状态,1-通知中,2-通知成功,3-通知失败
*/
private Byte state;
/**
* 最后一次通知时间
*/
private Date lastNotifyTime;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,142 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 商户进件渠道商参数缓存表
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_pay_interface_config")
public class MchPayInterfaceConfig extends BaseModel implements Serializable {
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 排序字段
*/
private Long sort;
/**
* 实例别名
*/
private String alias;
/**
* 账号类型: 参考: SYS_ROLE_TYPE
*/
private String infoType;
/**
* 服务商号/商户号/应用ID
*/
private String infoId;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 接口配置参数,json字符串
*/
private String ifParams;
/**
* 状态: 0-停用, 1-启用
*/
private Byte state;
/**
* 是否开启进件: 0-关闭, 1-开启
*/
private Byte isOpenApplyment;
/**
* 是否开启对账: 0-关闭, 1-开启
*/
private Byte isCheckBill;
/**
* 对账过滤子商户号
*/
private String ignoreCheckBillMchNos;
/**
* 提现配置JSON字符串
*/
private String cashoutParams;
/**
* 进件特殊参数JSON字符串
*/
private String applymentExtParams;
/**
* oauth2的选择 空表示使用默认配置条目
*/
private String oauth2InfoId;
/**
* 佣金结算周期(仅服务商配置, 用于服务商的佣金提现周期)
*/
private Integer settHoldDay;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新者用户ID
*/
private Long updatedUid;
/**
* 更新者姓名
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 1, 正在使用中
*/
@TableField(exist = false)
private Integer inUseFlag;
}

View File

@@ -0,0 +1,81 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 商户支付通道表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_pay_passage")
public class MchPayPassage extends BaseModel implements Serializable {
public static final LambdaQueryWrapper<MchPayPassage> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 商户号
*/
private String mchNo;
/**
* 应用ID
*/
private String appId;
/**
* 支付接口
*/
private String ifCode;
/**
* 支付方式
*/
private String wayCode;
/**
* 风控数据
*/
private String riskConfig;
/**
* 状态: 0-停用, 1-启用
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,43 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 商户码牌、设备关联表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-05-26
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_qrc_device_rela")
public class MchQrcDeviceRela implements Serializable {
// gw
public static final LambdaQueryWrapper<MchQrcDeviceRela> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 码牌ID
*/
private Long qrcId;
/**
* 设备ID
*/
private Long deviceId;
}

View File

@@ -0,0 +1,91 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 码牌模板表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-01-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_qrc_shell")
public class MchQrcShell extends BaseModel {
public static final LambdaQueryWrapper<MchQrcShell> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 模板ID
*/
@TableId(value = "sid", type = IdType.AUTO)
private Long sid;
/**
* 模板别名
*/
private String shellAlias;
/**
* 所属系统: MGR-运营平台, MCH-商户中心
*/
private String sysType;
/**
* 所属商户ID / 0(平台)
*/
private String belongInfoId;
/**
* 模板样式编码: shellA, shellB, shellC ...
*/
private String styleCode;
/**
* 配置信息
*/
private String configInfo;
/**
* 模板图片地址(示例)
*/
private String shellImgViewUrl;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 是否默认 0:否 1
*/
private Byte isDefault;
}

View File

@@ -0,0 +1,268 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 商户码牌表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_qrcode_card")
public class MchQrcodeCard extends BaseModel {
/** 码牌所属类型: 1-商户自制码牌, 2-运营平台下发码牌 **/
public static final byte QRC_BELONG_TYPE_MCH = 1;
public static final byte QRC_BELONG_TYPE_ISV_PRE = 2;
/**
* qrc_type 0电子马牌 1实体马牌 2实体立牌 3:云音响码牌
*/
public static final byte QRC_TYPE_DZ = 0;
public static final byte QRC_TYPE_MP = 1;
public static final byte QRC_TYPE_LP = 2;
public static final byte QRC_TYPE_YX = 3;
/**
* GET_TYPE 1分账获取码牌数据
*/
public static final byte GET_TYPE = 1;
// gw
public static final LambdaQueryWrapper<MchQrcodeCard> gw(){
return new LambdaQueryWrapper<>();
}
public static final LambdaQueryWrapper<MchQrcodeCard> gw(MchQrcodeCard mchQrcodeCard){
return new LambdaQueryWrapper<>(mchQrcodeCard);
}
private static final long serialVersionUID=1L;
/**
* 码牌ID
*/
@TableId(value = "qrc_id", type = IdType.INPUT)
private Long qrcId;
/**
* 批次号
*/
private String batchId;
/**
* 码牌别名
*/
private String qrcAlias;
/**
* 服务商号
*/
private String agentNo;
/**
* 绑定的商户号, 默认为空串
*/
private String mchNo;
/**
* 绑定的应用ID 默认为空串
*/
private String appId;
/**
* 绑定的商户门店ID 0-表示空
*/
private String storeId;
/**
* 码牌绑定状态: 0-未绑定, 1-已绑定一定存在mchNo、appId 和 storeId
*/
private Byte bindState;
/**
* 码牌类型:0-电子码牌1-实体码牌2-实体立牌 3云音响码牌
*/
private Byte qrcType;
/**
* 入口页面呈现方式: default-默认(未指定,取决于二维码是否绑定到微信侧), h5-仅H5网页, lite-仅小程序
*/
private String entryPage;
/**
* URL自定义占位符一般仅绑定多个小程序时需要
*/
private String urlPlaceholder;
/**
* 是否固定支付金额: 1-是, 0-否
*/
private Byte fixedFlag;
/**
* 固定支付金额,单位分
*/
private Long fixedPayAmount;
/**
* 指定支付宝的支付方式, 比如wap支付则为 ALI_WAP
*/
private String alipayWayCode;
/**
* 码牌状态: 0-停用, 1-正常
*/
private Byte qrcState;
/**
* 码牌所属类型: 1-商户自制码牌, 2-运营平台下发码牌
*/
private Byte qrcBelongType;
/**
* 码牌模板ID, 0-表示仅二维码
*/
private Long qrcShellId;
/**
* 商户名称
*/
private String mchApplyName;
/**
* 扩展商户号 现在的申请单编号 也是商户号
*/
private String mchApplyId;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 是否强制配置
*/
private Byte isForceReamrk;
/**
* 绑定的应用名称
*/
@TableField(exist = false)
private String appName;
/**
* 绑定的门店名称
*/
@TableField(exist = false)
private String storeName;
/**
* 服务商名称
*/
@TableField(exist = false)
private String agentName;
/**
* 服务商名称简称
*/
@TableField(exist = false)
private String agentShortName;
/**
* 商户名称
*/
@TableField(exist = false)
private String mchName;
/**
* 商户简称
*/
@TableField(exist = false)
private String mchShortName;
/**
* 区分是正常获取码牌数据还是其它途径为null则为正常获取页面码牌管理列表
*/
@TableField(exist = false)
private Byte getType;
/**
* 用户名称
*/
@TableField(exist = false)
private String mchUserName;
/**
* 用户电话
*/
@TableField(exist = false)
private String mchUserPhone;
@TableField(exist = false)
private String mchServiceName;
@TableField(exist = false)
private String mchServicePhone;
@TableField(exist = false)
private String bindAppIdName;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
List<String> subAgentNoList;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private String ifCode;
@TableField(exist = false)
List<String> storeIdList;
@TableField(exist = false)
private String isvName;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvShortName;
@TableField(exist = false)
private String isvNo;
}

View File

@@ -0,0 +1,237 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 商户门店表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_mch_store", autoResultMap = true)
public class MchStore extends com.jeequan.jeepay.core.entity.MchStore {
//gw
public static LambdaQueryWrapper<MchStore> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
// 蚂蚁店铺创建状态(与支付宝一致): 0-未创建; 99-已完结; -1-失败; 031-已提交审核
public final static String ALIPAY_SHOP_STATUS_NOT_EXISTS = "0";
public final static String ALIPAY_SHOP_STATUS_SUCCESS = "99";
public final static String ALIPAY_SHOP_STATUS_FAIL = "-1";
public final static String ALIPAY_SHOP_STATUS_AUDITING = "031";
/**
* 门店ID
*/
@TableId(value = "store_id")
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 绑定应用ID
*/
private String bindAppId;
/**
* 商户号(原进件单号)
*/
private String mchApplyId;
/**
* 顶级服务商号
*/
private String topAgentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 是否默认: 0-否、 1-是api接口未显式指定门店则使用默认门店下单
*/
private Byte defaultFlag;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 门头照
*/
private String storeOuterImg;
/**
* 内景照
*/
private String storeInnerImg;
/**
* 门店Logo
*/
private String storeLogo;
/**
* 省市县编码 (非必填, 放在外层用作搜索方便)
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray areaCode;
/**
* 联系人手机号
*/
private String contactPhone;
/**
* 所在地址
*/
private String address;
/**
* 蚂蚁店铺ID
*/
private String alipayShopId;
/**
* 蚂蚁店铺申请单ID
*/
private String alipayShopCreateId;
/**
* 蚂蚁店铺创建状态(与支付宝一致): 0-未创建; 99-已完结; -1-失败; 031-已提交审核
*/
private String alipayShopStatus;
/**
* 会员充值规则id对应t_member_recharge_rule表
*/
private String ruleId;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvShortName;
/**
* 商户名称
*/
@TableField(exist = false)
private String mchApplyName;
/**
* 绑定应用ID名称
*/
@TableField(exist = false)
private String bindAppIdName;
/**
* 绑定设备数量
*/
@TableField(exist = false)
private Integer deviceNumber;
/**
* 用户名称
*/
@TableField(exist = false)
private String mchUserName;
/**
* 用户电话
*/
@TableField(exist = false)
private String mchUserPhone;
@TableField(exist = false)
private String mchServiceName;
@TableField(exist = false)
private String mchServicePhone;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
List<String> storeIdList;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private String ifCode;
@TableField(exist = false)
private String isvName;
@TableField(exist = false)
List<String> subAgentNoList;
/**
* 结算类型
*/
@TableField(exist = false)
private String settleType;
@TableField(exist = false)
private Byte isBind;
}

View File

@@ -0,0 +1,427 @@
package com.jeequan.jeepay.db.entity;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.exception.BizException;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 商户门店设备配置表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_mch_store_device",autoResultMap = true)
public class MchStoreDevice extends com.jeequan.jeepay.core.entity.MchStoreDevice {
//gw
public static final LambdaQueryWrapper<MchStoreDevice> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
public static final byte DEVICE_TYPE_SPEAKER = 1; // 云喇叭
public static final byte DEVICE_TYPE_PRINTER = 2; // 打印机
public static final byte DEVICE_TYPE_POS = 3; // 扫码POS
public static final byte DEVICE_TYPE_AUTO_POS = 4; // 智能POS
public static final byte DEVICE_TYPE_PLUGIN = 5; // 收银插件
public static final byte DEVICE_TYPE_FACE_APP = 6; // 刷脸设备
public static final byte DEVICE_TYPE_RUYI = 7; // 如意Lite
// 绑定类型
public static final byte DEVICE_BIND_TYPE_STORE = 0; // 门店
public static final byte DEVICE_BIND_TYPE_QRC = 1; // 码牌
public static final byte NO_BIND = 0;
public static final byte YES_BIND = 1;
// 设备表类型 和 订单表类型转换关系
public static Object covertDeviceType(Object deviceType) {
if (deviceType instanceof Byte) {
switch ((Byte) deviceType) {
case DEVICE_TYPE_POS: return PayOrder.DEVICE_TYPE_SCAN_POS;
case DEVICE_TYPE_AUTO_POS: return PayOrder.DEVICE_TYPE_AUTO_POS;
case DEVICE_TYPE_PLUGIN: return PayOrder.DEVICE_TYPE_CASH_PLUGIN;
case DEVICE_TYPE_FACE_APP: return PayOrder.DEVICE_TYPE_FACE_APP;
case DEVICE_TYPE_RUYI: return PayOrder.DEVICE_TYPE_ALIPAY_RUYI_LITE;
case DEVICE_TYPE_PRINTER: return PayOrder.DEVICE_TYPE_PRINTER;
}
}else {
switch ((String) deviceType) {
case PayOrder.DEVICE_TYPE_SCAN_POS: return DEVICE_TYPE_POS;
case PayOrder.DEVICE_TYPE_AUTO_POS: return DEVICE_TYPE_AUTO_POS;
case PayOrder.DEVICE_TYPE_CASH_PLUGIN: return DEVICE_TYPE_PLUGIN;
case PayOrder.DEVICE_TYPE_FACE_APP: return DEVICE_TYPE_FACE_APP;
case PayOrder.DEVICE_TYPE_ALIPAY_RUYI_LITE: return DEVICE_TYPE_RUYI;
case PayOrder.DEVICE_TYPE_PRINTER: return DEVICE_TYPE_PRINTER;
}
}
return null;
}
// 支付宝如意设备型号
public static final Map<String, String> ALIPAY_IOT_DEVICE_MAP = new HashMap<>();
static {
ALIPAY_IOT_DEVICE_MAP.put("alipayRuYi", "201901111100635561");
ALIPAY_IOT_DEVICE_MAP.put("alipayRuYiPro", "202109071403204809");
ALIPAY_IOT_DEVICE_MAP.put("alipayRuYi2", "202008061702346558");
}
/**
* 设备ID
*/
@TableId(value = "device_id", type = IdType.AUTO)
private Long deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 批次号
*/
private String batchId;
/**
* 关联厂商配置ID
*/
private Long configId;
/**
* 设备类型: 1-云喇叭, 2-云打印
*/
private Byte deviceType;
/**
* 设备厂商:参考配置表
*/
private String provider;
/**
* 设备号
*/
private String deviceNo;
/**
* 设备参数json字符串
*/
private String deviceParams;
/**
* 业务配置参数json字符串
*/
private String bizConfigParams;
/**
* 业务配置参数json对象
*/
@TableField(exist = false)
private JSONObject jsonBizConfigParams;
/**
* 打印机模式 1仅打印 2仅播报 3打印并播报
*/
@TableField(exist = false)
private Integer printMode;
/**
* 绑定码牌ID批量添加云喇叭设备时绑定的码牌ID与云喇叭设备一对一关系
*/
private Long bindQrcId;
/**
* 门店ID
*/
private String storeId;
/**
* 商户号
*/
private String mchNo;
/**
* 应用appId
*/
private String appId;
/**
* 服务商号
*/
private String agentNo;
/**
* 状态: 0-停用1-启用
*/
private Byte state;
/**
* 商户绑定状态: 0-未绑定1-已绑定
*/
private Byte bindState;
/**
* 绑定类型: 0-门店1-码牌
*/
private Byte bindType;
/**
* 绑定时间
*/
private Date bindTime;
/**
* 解绑时间
*/
private Date unbindTime;
/**
* 蚂蚁店铺Iot设备绑定状态 0-未绑定1-已绑定
*/
private Byte alipayBindState;
/**
* 蚂蚁店铺ID
*/
private String alipayShopId;
/**
* 是否固定支付金额: 1-是, 0-否
*/
private Byte fixedFlag;
/**
* 固定支付金额,单位分
*/
private Long fixedPayAmount;
/**
* 商户名称
*/
private String MchApplyName;
/**
* 扩展商户号 现在的申请单编号 也是商户号
*/
private String MchApplyId;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject marqueeInfo;
/**
* 轮播图
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<JSONObject> carouselPicInfo;
/**
* 付款区域背景图
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject payPicInfo;
/**
* 绑定的应用名称
*/
@TableField(exist = false)
private String appName;
/**
* 绑定的门店名称
*/
@TableField(exist = false)
private String storeName;
@TableField(exist = false)
private List<Long> qrcIdList;
/**
* 马牌名称
*/
@TableField(exist = false)
private String bindQrcName;
/**
* 用户名称
*/
@TableField(exist = false)
private String mchUserName;
/**
* 用户电话
*/
@TableField(exist = false)
private String mchUserPhone;
@TableField(exist = false)
private String isvName;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvShortName;
@TableField(exist = false)
private String isvNo;
@TableField(exist = false)
private String mchServiceName;
@TableField(exist = false)
private String mchServicePhone;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
List<String> subAgentNoList;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private String ifCode;
@TableField(exist = false)
List<String> storeIdList;
@TableField(exist = false)
private String appSearchData;
public void preCheckMarket() {
if(StringUtils.isEmpty(this.getDeviceNo())){
throw new BizException("设备号不能为空");
}
}
/**
* 校验设备跑马灯参数
*/
public void preCheckMarqueeInfo() {
preCheckMarket();
JSONObject marqueeInfo = this.getMarqueeInfo() == null ? this.getExt() : this.getMarqueeInfo();
if(marqueeInfo == null){
throw new BizException("跑马灯广告信息为空");
}
String inputText = marqueeInfo.getString("inputText");
if(StringUtils.isEmpty(inputText)){
throw new BizException("跑马灯文字内容不能为空");
}
String fontColor = marqueeInfo.getString("fontColor");
if(StringUtils.isEmpty(fontColor)){
throw new BizException("跑马灯内字体颜色不能为空");
}
String bgColor = marqueeInfo.getString("bgColor");
if(StringUtils.isEmpty(bgColor)){
throw new BizException("跑马灯背景颜色不能为空");
}
//文字大小写死
marqueeInfo.put("fontSize",20);
//跑马灯显示的X轴位置 写死
marqueeInfo.put("displayAreX",0);
//跑马灯显示的Y轴位置 写死
marqueeInfo.put("displayAreY",300);
//尺寸(分辨率)宽 写死
marqueeInfo.put("picWidth",840);
//尺寸(分辨率)高 写死
marqueeInfo.put("picHeight",40);
this.setMarqueeInfo(marqueeInfo);
}
public void preCheckMarketPic() {
preCheckMarket();
List<JSONObject> carouselPicInfo = this.getCarouselPicInfo();
if(carouselPicInfo == null || carouselPicInfo.isEmpty()){
throw new BizException("营销区轮播图片不能为空");
}
if(carouselPicInfo.size() > 5){
throw new BizException("最多只能设置5张图片");
}
for (JSONObject item:carouselPicInfo) {
Integer displayTime = item.getInteger("displayTime") == null ? 3 : item.getInteger("displayTime");
item.put("displayTime",displayTime);
item.put("enable",1);
String url = item.getString("picName");
byte[] bytes = HttpUtil.downloadBytes(url);
BufferedImage bufferedImage = ImgUtil.toImage(bytes);
// 获取图片的位深度
int bitDepth = bufferedImage.getColorModel().getPixelSize();
//只支持图片位深度为24的图片
if(bitDepth != 24){
throw new BizException("当前图片格式不支持");
}
if(bufferedImage.getWidth() != 800){
}
item.put("picWidth",bufferedImage.getWidth());
item.put("picHeight",bufferedImage.getHeight());
item.put("picBitDepth",bitDepth);
item.put("picSize",bytes.length);
}
}
public void preCheckPayCode() {
preCheckMarket();
JSONObject payPicInfo = this.getPayPicInfo();
if(payPicInfo == null){
throw new BizException("付款区域的图片信息不能为空");
}
String picUrl = payPicInfo.getString("picName");
if(StringUtils.isEmpty(picUrl)){
throw new BizException("付款区域的图片地址参数不能为空");
}
payPicInfo.put("displayTime",-1);
payPicInfo.put("enable",1);
payPicInfo.put("showQrCode",1);
byte[] bytes = HttpUtil.downloadBytes(picUrl);
BufferedImage bufferedImage = ImgUtil.toImage(bytes);
// 获取图片的位深度
int bitDepth = bufferedImage.getColorModel().getPixelSize();
//只支持图片位深度为24的图片
if(bitDepth != 24){
throw new BizException("当前图片格式不支持");
}
payPicInfo.put("picWidth",bufferedImage.getWidth());
payPicInfo.put("picHeight",bufferedImage.getHeight());
payPicInfo.put("picBitDepth",bitDepth);
payPicInfo.put("picSize",bytes.length);
}
}

View File

@@ -0,0 +1,68 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>
* 商户辅助终端信息报备表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-04-26
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_mch_store_terminal", autoResultMap = true)
public class MchStoreTerminal extends com.jeequan.jeepay.core.entity.MchStoreTerminal {
private static final long serialVersionUID=1L;
// gw
public static final LambdaQueryWrapper<MchStoreTerminal> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 表ID
*/
@TableId(value = "trm_id", type = IdType.AUTO)
private Long trmId;
/**
* 渠道绑定管理 { ifCode:{ ifCode:"", ifCodeName: "", state: 1, errInfo: ""} }
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject channelBindInfo;
@TableField(exist = false)
private List<String> subAgentNoList;
@TableField(exist = false)
private String appName;
@TableField(exist = false)
private String contactTel;
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String unionSearchId;
}

View File

@@ -0,0 +1,91 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@TableName("t_mch_sub_info")
public class MchSubInfoEntity extends BaseModel {
// gw
public static LambdaQueryWrapper<MchSubInfoEntity> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 商户号(原进件申请单号)
*/
private String mchApplyId;
/**
* 渠道商户号
*/
private String channelMchNo;
/**
* 渠道号
*/
private String channelId;
/**
* 渠道子商户号
*/
private String subMchId;
/**
* 渠道类型
* WX
* ZFB
*/
private String subMchType;
/**
* 渠道来源,银联网联等
*/
private String subMchWay;
/**
* 子商户备注信息
*/
private String remark;
/**
* 子商户状态
*/
private String status;
/**
* 是否主要使用1是
* 若是主要使用,则将该记录的认证状态作为商户的实名认证状态
*/
private Integer mainUse;
/**
* 子商户认证状态
*/
private Integer authStatus;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,172 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.exception.BizException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_third_config")
public class MchThirdConfig implements Serializable {
private static final long serialVersionUID=1L;
public static final LambdaQueryWrapper<MchThirdConfig> gw(){
return new LambdaQueryWrapper<>();
}
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 通道商户编号
*/
private String channelMerchantId;
/**
* 类型 取值范围wx zfb
*/
private String thirdType;
/**
* 配置类型取值范围00 支付Appid 01 jsapi授权目录
*/
private String type;
/**
* 子商户号 对应微信或支付宝的子商户号 后期可能涉及银联子商户号
*/
private String subMchNo;
/**
* 支付Appid类型枚举值. 取值范围00 公众号; 01 小程序
*/
private String appidType;
/**
* appid
*/
private String subAppid;
/**
* jsapi授权目录长度256位
*/
private String jsapiPath;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@Getter
@AllArgsConstructor
public enum ThirdType{
WX,
ZFB;
}
@Getter
@AllArgsConstructor
public enum Type{
APPID("00"),
PATH("01");
private final String code;
public static Type getVal(String code){
Type[] values = values();
for (Type val:values) {
if(val.getCode().equals(code)){
return val;
}
}
throw new BizException("非法[type]参数类型");
}
}
@Getter
@AllArgsConstructor
public enum AppidType{
PUBLIC("00","公众号"),
APPLET("01","小程序");
private final String code;
private final String desc;
public static AppidType getVal(String code){
AppidType[] values = values();
for (AppidType val:values) {
if(val.getCode().equals(code)){
return val;
}
}
throw new BizException("非法[appidType]参数类型");
}
}
@TableField(exist = false)
private String mchNo;
public void preCheck() {
if(StringUtils.isEmpty(this.getMchNo())){
throw new BizException("缺失商户号参数");
}
if(StringUtils.isEmpty(this.getType())){
throw new BizException("缺失[type]参数");
}
Type val = Type.getVal(this.getType());
switch (val){
case PATH:
if(StringUtils.isEmpty(this.getJsapiPath())){
throw new BizException("支付授权目录配置时,[jsapiPath]参数不能为空");
}
if(!this.getJsapiPath().endsWith("/")){
throw new BizException("支付授权目录配置时,[jsapiPath]必须要以/结尾");
}
break;
case APPID:
if(StringUtils.isEmpty(this.getAppidType())){
throw new BizException("缺失APPID类型[appidType]参数");
}
if(StringUtils.isEmpty(this.getSubAppid())){
throw new BizException("缺失[subAppid]参数");
}
}
}
}

View File

@@ -0,0 +1,76 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* CREATE TABLE `t_mch_video_auth` (
* `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
* `mch_no` varchar(32) NOT NULL COMMENT '商户号',
* `task_id` varchar(40) DEFAULT NULL COMMENT '任务ID',
* `user_id` varchar(64) NOT NULL COMMENT '用户ID',
* `unique_id` varchar(64) DEFAULT NULL COMMENT '视频号ID',
* `name` varchar(64) DEFAULT NULL COMMENT '视频号昵称',
* `extra` longtext COMMENT '额外信息',
* `last_auth_time` datetime DEFAULT NULL COMMENT '最后一次授权时间',
* `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
* PRIMARY KEY (`id`) USING BTREE,
* UNIQUE KEY `mch_no` (`mch_no`,`user_id`)
* ) ENGINE=InnoDB AUTO_INCREMENT=1774618404736720899 DEFAULT CHARSET=utf8mb4;
*/
@Data
@TableName("t_mch_video_auth")
public class MchVideoAuthEntity {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商户号
*/
@TableField("mch_no")
private String mchNo;
/**
* 任务号
*/
@TableField("task_id")
private String taskId;
/**
* 视频号用户ID
*/
@TableField("user_id")
private String userId;
@TableField("unique_id")
private String uniqueId;
/**
* 视频号用户昵称
*/
@TableField("name")
private String name;
/**
* 存储额外字段json格式
*/
@TableField("extra")
private String extra;
/**
* 最后一次授权时间
*/
@TableField("last_auth_time")
private Date lastAuthTime;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,71 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* CREATE TABLE `t_mch_video_cache` (
* `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
* `mch_no` varchar(32) NOT NULL COMMENT '商户号',
* `task_id` varchar(40) DEFAULT NULL COMMENT '任务ID',
* `user_id` varchar(64) NOT NULL COMMENT '用户ID',
* `unique_id` varchar(64) DEFAULT NULL COMMENT '视频号ID',
* `name` varchar(64) DEFAULT NULL COMMENT '视频号用户昵称',
* `object_id` varchar(100) DEFAULT NULL,
* `export_id` varchar(100) DEFAULT NULL,
* `extra` longtext COMMENT '额外信息',
* `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
* PRIMARY KEY (`id`) USING BTREE,
* KEY `mch_no` (`mch_no`,`user_id`)
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
*/
@Data
@TableName("t_mch_video_cache")
public class MchVideoCacheEntity {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商户号
*/
private String mchNo;
/**
* 任务号
*/
private String taskId;
/**
* 视频号用户ID
*/
private String userId;
private String uniqueId;
/**
* 视频号用户昵称
*/
private String name;
/**
* 存储额外字段json格式
*/
private String extra;
private String objectId;
private String exportId;
private Date createTime;
/**
* 1, 选中; 0, 未选中
*/
private Integer choiceFlag;
}

View File

@@ -0,0 +1,84 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 商户公众号消息接收用户列表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_mch_wxmp_user")
public class MchWxmpUser extends com.jeequan.jeepay.core.entity.MchWxmpUser {
public static final LambdaQueryWrapper<MchWxmpUser> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
public static final byte SEND_STATE_CLOSE = 0;
public static final byte SEND_STATE_OPEN = 1;
public static final byte SEND_STATE_ERROR = 2;
/**
* 用户编号
*/
@TableId(value = "user_id", type = IdType.AUTO)
private Long userId;
/**
* 系统用户ID
*/
private Long sysUserId;
/**
* 微信昵称
*/
private String nickname;
/**
* 微信openId
*/
private String wxOpenId;
/**
* 微信 appId
*/
private String wxAppId;
/**
* 商户号
*/
private String mchNo;
/**
* 消息推送状态0-未开启1-开启 2推送失败已自动关闭
*/
private Byte sendStatus;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,118 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 会员账户流水表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-04-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_member_account_history")
public class MemberAccountHistory extends BaseModel {
public static final LambdaQueryWrapper<MemberAccountHistory> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
// 业务类型1-支付充值, 2-现金充值, 3-消费, 4-消费退款, 5-人工调账
public static final byte BIZ_RECHARGE_PAY = 1;
public static final byte BIZ_RECHARGE_CASH = 2;
public static final byte BIZ_CONSUME = 3;
public static final byte BIZ_CONSUME_REFUND = 4;
public static final byte BIZ_MANUAL = 5;
/**
* 记录ID
*/
@TableId(value = "hid", type = IdType.AUTO)
private Long hid;
/**
* 会员ID
*/
private String mbrId;
/**
* 会员名称快照
*/
private String mbrName;
/**
* 会员手机号 快照
*/
private String mbrTel;
/**
* 所属商户
*/
private String mchNo;
/**
* 门店ID快照
*/
private String storeId;
/**
* 码牌ID快照
*/
private Long qrcId;
/**
* 变动前账户余额, 单位:分
*/
private Long beforeAmount;
/**
* 变动金额, 单位:分
*/
private Long changeAmount;
/**
* 变动后账户余额, 单位:分
*/
private Long afterAmount;
/**
* 业务类型1-支付充值, 2-现金充值, 3-消费, 4-消费退款, 5-人工调账
*/
private Byte bizType;
/**
* 关联订单号
*/
private String relaBizOrderId;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,111 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 会员信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-04-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_member_info")
public class MemberInfo extends BaseModel {
public static final LambdaQueryWrapper<MemberInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 会员ID
*/
@TableId(value = "mbr_id", type = IdType.INPUT)
private String mbrId;
/**
* 会员名称
*/
private String mbrName;
/**
* 会员手机号
*/
private String mbrTel;
/**
* 微信公众号用户标识open_id
*/
private String wxMpOpenId;
/**
* 微信小程序用户标识open_id
*/
private String wxLiteOpenId;
/**
* 支付宝用户标识user_id
*/
private String aliUserId;
/**
* 云闪付用户标识user_id
*/
private String ysfUserId;
/**
* 所属商户
*/
private String mchNo;
/**
* 账户余额 单位:分
*/
private Long balance;
/**
* 数据安全保护秘钥
*/
private String safeKey;
/**
* 状态: 0-停用, 1-正常
*/
private Byte state;
/**
* 头像地址
*/
private String avatarUrl;
/**
* 会员备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,147 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 会员充值记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-04-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_member_recharge_record")
public class MemberRechargeRecord extends BaseModel {
public static final LambdaQueryWrapper<MemberRechargeRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
// 充值状态0-初始化, 1-充值中, 2-充值成功, 3-充值失败
public static final byte STATE_INIT = 0;
public static final byte STATE_ING = 1;
public static final byte STATE_SUCCESS = 2;
public static final byte STATE_FAIL = 3;
/**
* 充值记录ID
*/
@TableId(value = "recharge_record_id", type = IdType.INPUT)
private String rechargeRecordId;
/**
* 会员ID
*/
private String mbrId;
/**
* 会员名称 快照
*/
private String mbrName;
/**
* 会员手机号 快照
*/
private String mbrTel;
/**
* 所属商户
*/
private String mchNo;
/**
* 支付金额, 单位:分
*/
private Long payAmount;
/**
* 赠送金额, 单位:分
*/
private Long giveAmount;
/**
* 会员入账金额, 单位:分
*/
private Long entryAmount;
/**
* 会员余额, 单位:分
*/
private Long afterBalance;
/**
* 支付方式代码
*/
private String wayCode;
/**
* 支付方式代码分类
*/
private String wayCodeType;
/**
* 充值状态0-初始化, 1-充值中, 2-充值成功, 3-充值失败
*/
private Byte state;
/**
* 支付订单号
*/
private String payOrderId;
/**
* 订单支付成功时间
*/
private Date successTime;
/**
* 同步跳转地址
*/
private String returnUrl;
/**
* 异步通知地址
*/
private String notifyUrl;
/**
* 支付错误码
*/
private String errCode;
/**
* 支付错误描述
*/
private String errMsg;
/**
* 充值备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,96 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 会员充值规则表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-04-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_member_recharge_rule")
public class MemberRechargeRule extends BaseModel {
public static final LambdaQueryWrapper<MemberRechargeRule> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 规则ID
*/
@TableId(value = "rule_id")
private String ruleId;
/**
* 所属商户
*/
private String mchNo;
/**
* 充值金额
*/
private Long rechargeAmount;
/**
* 赠送金额
*/
private Long giveAmount;
/**
* 状态0-停用 1-启用
*/
private Byte state;
/**
* 排序字段, 规则:正序
*/
private Integer sort;
/**
* 门店id
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@TableField(exist = false)
private Integer isAllStore;
}

View File

@@ -0,0 +1,133 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 订单分润结算记录
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-22
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_order_profit_sett_record", autoResultMap = true)
public class OrderProfitSettRecord extends BaseModel {
/**
* 计算类型: 1-支付订单入账, 2-退款退佣金, 3-转账业务佣金入账
**/
public static final byte CAL_TYPE_PAY_ORDER = 1;
public static final byte CAL_TYPE_REFUND_ORDER = 2;
public static final byte CAL_TYPE_TRANS_ORDER = 3;
/**
* 垫资佣金入账
*/
public static final byte CAL_TYPE_DZ_ORDER = 4;
public static final LambdaQueryWrapper<OrderProfitSettRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 结算记录ID
*/
@TableId(value = "rid", type = IdType.AUTO)
private Long rid;
/**
* 运营平台标识/服务商号
*/
private String infoId;
/**
* 系统类型: 参考SYS_TYPE
*/
private String infoType;
/**
* 名称快照
*/
private String infoName;
/**
* 费率配置快照 (参考: ApplymentBasicInfo.paywayFeeList)
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject infoPaywayFeeDetail;
/**
* 支付订单号与t_pay_order对应
*/
private String payOrderId;
/**
* 退款订单号 (默认空串: 作用为使得唯一索引生效)
*/
private String refundOrderId;
/**
* 计算类型: 1-支付订单入账, 2-退款退佣金, 3-转账业务佣金入账
*/
private Byte calType;
/**
* 计算基数金额, 单位分 订单支付金额、 退款金额
*/
private Long calBaseAmount;
/**
* 利润结算金额, 单位:分
*/
private Long calProfitAmount;
/**
* 费用金额, 单位:分
*/
private Long calFeeAmount;
/**
* 入账状态: 0-未入账, 1-已入账
*/
private Byte entryState;
/**
* 预计入账日期(比如在途转钱包)
*/
private Date entryTime;
/**
* 结算任务执行时间
*/
private Date taskTime;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,272 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 方案表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_package_info")
public class PackageInfo extends BaseModel {
public static final LambdaQueryWrapper<PackageInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 待上架 **/
public static final Integer PACKAGE_STATE_NOT = 0;
/** 已上架 **/
public static final Integer PACKAGE_STATE_ON = 1;
/** 需要绑定应用 **/
public static final Integer PACKAGE_STATE_BINDING = 1;
/** 不需要绑定应用 **/
public static final Integer PACKAGE_STATE_ON_BINDING = 0;
/** 收费 **/
public static final Integer PACKAGE_STATE_CHARGE = 1;
/** 不收费 **/
public static final Integer PACKAGE_STATE_ON_CHARGE = 0;
public static final String JSON_STR= "[{\"versionName\": \"免费版本\",\"validTime\": -1,\"sellingPrice\": 0.00,\"lineationPrice\": 0.00}]";
/** 需要审核 **/
public static final Integer PACKAGE_STATE_AUDIT = 1;
/** 不需要审核 **/
public static final Integer PACKAGE_STATE_AUTO_AUDIT = 0;
public static final String API_CODE_FIRST= "API_";
public static final String API_CODE_LAST= "_FA_PAY";
/**
* 方案ID
*/
@TableId
private String packageId;
/**
* 名称
*/
@TableField("`name`")
private String name;
/**
* 描述
*/
@TableField("`desc`")
private String desc;
/**
* 定义的唯一标识,方便支付那边取值
*/
private String apiCode;
/**
* 方案价格
*/
private Long price;
/**
* 方案付费信息
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray packageText;
/**
* 排序
*/
private Integer packageSort;
/**
* 方案内容
*/
private String packageContent;
/**
* 开发文档地址
*/
private String packageUrl;
/**
* 方案分类
*/
private Integer packageType;
/**
* 产品类型 0-服务型 1-接口型
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray packageSpecs;
/**
* 方案状态 0-待上架 1-已上架
*/
private Integer packageState;
/**
* 关联产品的ids多个逗号隔开
*/
private String productIds;
/**
* 关联方案的id多个逗号隔开
*/
private String packageIds;
/**
* 关联通道的code多个逗号隔开
*/
private String payInterfaceCodes;
/**
* 固定功能代码
*/
private String funcCode;
/**
* 固定功能配置
*/
private String extv;
/**
* 是否需要审核0:否1:是
*/
private Integer audit;
/**
* 是否收费0:否1:是
*/
private Integer charge;
/**
* 是否需要绑定应用0:否1:是
*/
private Integer bindingApp;
/**
* 产品特殊资质信息
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray specialCertificationText;
/**
* 是否需要资质0:否1:是
*/
private Integer certification;
/**
* 产品logo地址
*/
private String packageLogoUrl;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建人
*/
private String createdBy;
@TableField(exist = false)
private String[] ids;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String id;
@TableField(exist = false)
private String typeName;
@TableField(exist = false)
private Integer state;
@TableField(exist = false)
private List<ProductInfo> productInfoList;
@TableField(exist = false)
private String stateDesc;
@TableField(exist = false)
private Integer checkState;
@TableField(exist = false)
private List<ProductInfo> productInfoRelevancyList;
@TableField(exist = false)
private List<PackageInfo> packageInfoRelevancyList;
@TableField(exist = false)
private List<PayInterfaceDefine> payInterRelevancyList;
@TableField(exist = false)
private Integer applyCount;
@TableField(exist = false)
private List<String> bindingAppList;
@TableField(exist = false)
private String productIdsName;
@TableField(exist = false)
private String packageIdsName;
@TableField(exist = false)
private String payInterfaceCodesName;
//申请数量
@TableField(exist = false)
private Integer applyForCount;
//定订购数量
@TableField(exist = false)
private Integer orderCount;
@TableField(exist = false)
private List<PackageOrder> packageOrderList;
/**
* 剩余总时间
*/
@TableField(exist = false)
private Long allRemainingDays;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
}

View File

@@ -0,0 +1,171 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* <p>
* 服务商信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_package_order")
public class PackageOrder extends BaseModel {
/** 审核中 */
public static final Integer STATE_AUDITING = 1;
/** 驳回 */
public static final Integer STATE_REJECT = 2;
/** 通过 */
public static final Integer STATE_SUCCESS = 3;
/** 已取消 */
public static final Integer STATE_CANCEL = 4;
private static final long serialVersionUID=1L;
/**
* id
*/
@TableId
private String id;
private String packageId;
/**
* 产品ID
*/
private String productId;
private String mchNo;
private String stateDesc;
private String appId;
/**
* 状态 1-审核中 2-审核失败 3-已开通 4-已取消
*/
private Integer state;
/**
* 费用规则json字符串
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray costRule;
/**
* 联系人姓名
*/
private String contactsName;
/**
* 联系人电话
*/
private String contactsTel;
/**
* 划线总价,元
*/
private BigDecimal price;
/**
* 订单金额 元
*/
private BigDecimal actualPrice;
/**
* 实付总价默认是0
*/
private BigDecimal pracPrice;
/**
* 支付凭证图片地址
*/
private String payImg;
/**
* 备注
*/
private String remark;
/**
* 产品或方案0:产品1:方案
*/
private Integer packageOrProduct;
/**
* 特殊资质信息json字符串
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray specialCertificationText;
/**
* 创建时间
*/
private Date createdAt;
/**
* 创建人
*/
private Long createdUid;
/**
* 更新时间
*/
private Date updatedAt;
@TableField(exist = false)
private List<ProductInfo> productInfo;
@TableField(exist = false)
private String name;
@TableField(exist = false)
private String productOrPackageName;
@TableField(exist = false)
private String productName;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String appName;
@TableField(exist = false)
private Long remainingDays;
@TableField(exist = false)
private List<String> mchInfoList;
@TableField(exist = false)
private Long mchUserContactsTel;
@TableField(exist = false)
private String apiCode;
}

View File

@@ -0,0 +1,59 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 方案订单关联产品缓存表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_package_order_detail")
public class PackageOrderDetail extends BaseModel {
private static final long serialVersionUID=1L;
/**
* 订单号t_package_order的id
*/
@TableId
private Long orderId;
/**
* 方案ID
*/
private String packageId;
/**
* 产品ID
*/
private Long productId;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建人
*/
private String createdBy;
}

View File

@@ -0,0 +1,62 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 方案-产品关联表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_package_product")
public class PackageProduct extends BaseModel {
private static final long serialVersionUID=1L;
@TableId
private Long id;
/**
* 1、产品关联产品2、产品关联方案3、方案关联方案
*/
private String type;
/**
* type=1、2时为产品ID
*/
private String attachFromId;
/**
* type=1时为产品ID
*/
private String attachToId;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建人
*/
private String createdBy;
}

View File

@@ -0,0 +1,58 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 方案分类表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_package_type")
public class PackageType extends BaseModel {
private static final long serialVersionUID=1L;
/**
* 分类ID
*/
@TableId(value = "type_id", type = IdType.AUTO)
private Long typeId;
/**
* 分类名称
*/
private String typeName;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建人
*/
private String createdBy;
}

View File

@@ -0,0 +1,156 @@
package com.jeequan.jeepay.db.entity;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
/**
* <p>
* 直付通二级商户结算记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-12-06
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_alizft_sett_record")
public class PayAlizftSettRecord extends BaseModel {
public static final LambdaQueryWrapper<PayAlizftSettRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 直付通结算方式 0-自动结算 1-手动结算 **/
public static Byte ZFT_SETT_TYPE_AUTO = 0;
public static Byte ZFT_SETT_TYPE_MANUAL = 1;
/** 结算状态 1-待结算 2-结算中 3-结算成功 4-结算失败 5-限流待重试 **/
public final static byte ZFT_SETT_STATUS_NOT = 1;
public final static byte ZFT_SETT_STATUS_ING = 2;
public final static byte ZFT_SETT_STATUS_SUCCESS = 3;
public final static byte ZFT_SETT_STATUS_FAIL = 4;
public final static byte ZFT_SETT_STATUS_WAIT_RETRY = 5;
/**
* 结算编号
*/
@TableId(type = IdType.INPUT)
private String settleNo;
/**
* 支付订单号
*/
private String payOrderId;
/**
* 应用ID
*/
private String appId;
/**
* 商户号
*/
private String mchNo;
/**
* 商户名称
*/
private String mchName;
/**
* 服务商号
*/
private String agentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 支付金额,单位分
*/
private Long payOrderAmount;
/**
* 商品标题
*/
private String payOrderSubject;
/**
* 渠道订单号 如果为空有可能是补单任务
*/
private String channelOrderNo;
/**
* 二级商户ID
*/
private String subMchId;
/**
* 结算状态,1-待结算 2-结算中 3-结算成功 4-结算失败 5-限流待重试
*/
private Byte state;
/**
* 结算时间
*/
private Date settTime;
/**
* 重试次数
*/
private Integer retryCount;
/**
* 调起接口信息
*/
private String applyInfo;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/** 拼接申请数据 **/
public void appendApplyInfo(String oldVal, String applyResult) {
JSONArray array = new JSONArray();
if(StringUtils.isNotEmpty(oldVal)){
array = JSONArray.parseArray(oldVal);
}
if(applyResult == null){
return ;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("applyTime", DateUtil.now());
jsonObject.put("applyResult", applyResult);
array.add(jsonObject);
this.applyInfo = array.toJSONString();
}
}

View File

@@ -0,0 +1,163 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.model.params.IsvParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 支付接口配置参数表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_interface_config")
public class PayInterfaceConfig extends BaseModel implements Serializable {
public static LambdaQueryWrapper<PayInterfaceConfig> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 关联支付配置表中的id, 即t_pay_interface_config_alternative表的id
*/
private Long altId;
/**
* 账号类型: 参考: SYS_ROLE_TYPE
*/
private String infoType;
/**
* 服务商号/商户号/应用ID
*/
private String infoId;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 接口配置参数,json字符串
*/
private String ifParams;
/**
* 状态: 0-停用, 1-启用
*/
private Byte state;
/**
* 是否开启进件: 0-关闭, 1-开启
* @Deprecated 当前字段暂不使用。
*/
private Byte isOpenApplyment;
/**
* 是否开启对账: 0-关闭, 1-开启
*/
private Byte isCheckBill;
/**
* 对账过滤子商户号
*/
private String ignoreCheckBillMchNos;
/**
* 提现配置JSON字符串
*/
private String cashoutParams;
/**
* 进件特殊参数JSON字符串
*/
private String applymentExtParams;
/**
* oauth2的选择 空表示使用默认配置条目
*/
private String oauth2InfoId;
/**
* 佣金结算周期(仅服务商配置, 用于服务商的佣金提现周期)
*/
private Integer settHoldDay;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新者用户ID
*/
private Long updatedUid;
/**
* 更新者姓名
*/
private String updatedBy;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 通道类型:多个用英文逗号隔开 0专属通道1线下通道2线上通道
*/
private String channelTypes;
/**
* 是否支持分账 0:否 1
*/
private Byte isDivision;
/**
* 判断渠道是否支持分账
*/
public void preCheckDivision() {
if(this.getIsDivision() == null || CS.NO == this.getIsDivision()){
throw new BizException("当前渠道不支持分账,无法创建分账方");
}
}
}

View File

@@ -0,0 +1,161 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 支付接口定义表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_pay_interface_define", autoResultMap = true)
public class PayInterfaceDefine extends BaseModel implements Serializable {
public static final LambdaQueryWrapper<PayInterfaceDefine> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 接口代码 全小写 wxpay alipay
*/
@TableId
private String ifCode;
/**
* 接口名称
*/
private String ifName;
/**
* 是否支持普通商户模式: 0-不支持, 1-支持
*/
private Byte isMchMode;
/**
* 是否支持服务商子商户模式: 0-不支持, 1-支持
*/
private Byte isIsvMode;
/**
* 是否支持服务商的进件接口: 0-不支持, 1-支持
*/
private Byte isSupportApplyment;
/**
* 是否开启进件功能: 0-关闭, 1-开启
*/
private Byte isOpenApplyment;
/**
* 是否支持对账: 0-不支持, 1-支持
*/
private Byte isSupportCheckBill;
/**
* 是否开启对账: 0-关闭, 1-开启
*/
private Byte isOpenCheckBill;
/**
* 是否支持提现: 0-不支持, 1-支持
*/
private Byte isSupportCashout;
/**
* 是否开启提现: 0-关闭, 1-开启
*/
private Byte isOpenCashout;
/**
* 支付参数配置页面类型:1-JSON渲染,2-自定义
*/
private Byte configPageType;
/**
* ISV接口配置定义描述,json字符串
*/
private String isvParams;
/**
* 特约商户接口配置定义描述,json字符串
*/
private String isvsubMchParams;
/**
* 普通商户接口配置定义描述,json字符串
*/
private String normalMchParams;
/**
* 支持的支付方式 ["wxpay_jsapi", "wxpay_bar"]
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray wayCodes;
/**
* 通道类型:多个用英文逗号隔开 0专属通道1线下通道2线上通道
*/
private String channelTypes;
/**
* 渠道手续费计算方式, 包括: 手续费模式等
*/
private String channelFeeCalModel;
/**
* 页面展示:卡片-图标
*/
private String icon;
/**
* 页面展示:卡片-背景色
*/
private String bgColor;
/**
* 状态: 0-停用, 1-启用
*/
private Byte state;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
*
*/
@TableField(exist = false)
private JSONArray jsonChannelTypes;
}

View File

@@ -0,0 +1,509 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 支付订单表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_order")
public class PayOrder extends com.jeequan.jeepay.core.entity.PayOrder {
public static final LambdaQueryWrapper<PayOrder> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
public static final byte STATE_INIT = 0; //订单生成
public static final byte STATE_ING = 1; //支付中
public static final byte STATE_SUCCESS = 2; //支付成功
public static final byte STATE_FAIL = 3; //支付失败
public static final byte STATE_CANCEL = 4; //已撤销
public static final byte STATE_REFUND = 5; //已退款
public static final byte STATE_CLOSED = 6; //订单关闭
public static final byte STATE_REFUNDING = 22; //退款中
public static final byte REFUND_STATE_NONE = 0; //未发生实际退款
public static final byte REFUND_STATE_SUB = 1; //部分退款
public static final byte REFUND_STATE_ALL = 2; //全额退款
public static final byte DIVISION_MODE_FORBID = 0; //该笔订单不允许分账
public static final byte DIVISION_MODE_AUTO = 1; //支付成功按配置自动完成分账
public static final byte DIVISION_MODE_MANUAL = 2; //商户手动分账(解冻商户金额)
public static final byte MAKET_RED_PACKET_MANUAL = 3; //营销红包分账
public static final byte DIVISION_STATE_UNHAPPEN = 0; //未发生分账
public static final byte DIVISION_STATE_WAIT_TASK = 1; //等待分账任务处理
public static final byte DIVISION_STATE_ING = 2; //分账处理中
public static final byte DIVISION_STATE_FINISH = 3; //分账任务已结束(不体现状态)
// 设备类型
public static final String DEVICE_TYPE_QR_CODE = "qr_code"; // 码牌
public static final String DEVICE_TYPE_SCAN_POS = "scan_pos"; // 扫码POS
public static final String DEVICE_TYPE_QR_BOX_KXP = "qr_box_kxp"; // 客显屏音箱
public static final String DEVICE_TYPE_AUTO_POS = "auto_pos"; // 智能POS
public static final String DEVICE_TYPE_CASH_PLUGIN = "cash_plugin"; // 收银插件
public static final String DEVICE_TYPE_FACE_APP = "face_app"; // 刷脸设备
public static final String DEVICE_TYPE_ALIPAY_RUYI_LITE = "ruyi_lite"; // 如意Lite
public static final String DEVICE_TYPE_PRINTER = "printer"; // 云打印
public static final Map<String, String> DEVICE_TYPE_MAP = new HashMap<>();
static {
DEVICE_TYPE_MAP.put(DEVICE_TYPE_QR_CODE, "码牌");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_SCAN_POS, "扫码POS");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_AUTO_POS, "智能POS");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_CASH_PLUGIN, "收银插件");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_FACE_APP, "刷脸设备");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_ALIPAY_RUYI_LITE, "支付宝如意Lite");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_PRINTER, "云打印");
DEVICE_TYPE_MAP.put(DEVICE_TYPE_QR_BOX_KXP, "客显屏音箱");
}
/**
* 支付订单号
*/
@TableId
private String payOrderId;
/**
* 扩展商户号 现在的申请单编号 改版后的商户号
*/
private String mchExtNo;
/**
* 用户号 原先的商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 顶级服务商号
*/
private String topAgentNo;
/**
* 应用ID
*/
private String appId;
/**
* 商户名称
*/
private String mchName;
/**
* 类型: 1-普通商户, 2-特约商户(服务商模式)
*/
private Byte mchType;
/**
* 商户门店ID
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 所在地址
*/
private String address;
/**
* 设备类型qr_code-码牌scan_pos-扫码POSauto_pos-智能POS
*/
private String deviceType;
/**
* 设备号
*/
private String deviceNo;
/**
* 设备厂商
*/
private String deviceProvider;
/**
* 码牌ID
*/
private Long qrcId;
/**
* 商户订单号
*/
private String mchOrderNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 支付方式代码
*/
private String wayCode;
/**
* 支付方式代码分类
*/
private String wayCodeType;
/**
* 支付金额,单位分
*/
private Long amount;
/**
* 商户手续费费率快照
*/
private String mchFeeRate;
/**
* 商户实际手续费,单位分 ( 订单手续费 - 手续费退还金额 )
*/
private Long mchFeeAmount;
/**
* 商户收单手续费,单位分 (订单快照)
*/
private Long mchOrderFeeAmount;
/**
* 三位货币代码,人民币:cny
*/
private String currency;
/**
* 支付状态: 0-订单生成, 1-支付中, 2-支付成功, 3-支付失败, 4-已撤销, 5-已退款, 6-订单关闭 7,退款中
*/
private Byte state;
/**
* 向下游回调状态, 0-未发送, 1-已发送
*/
private Byte notifyState;
/**
* 客户端IP
*/
private String clientIp;
/**
* 商品标题
*/
private String subject;
/**
* 商品描述信息
*/
private String body;
/**
* 渠道服务商机构号
*/
private String channelIsvNo;
/**
* 渠道子商户号
*/
private String channelMchNo;
/**
* 特定渠道发起额外参数
*/
private String channelExtra;
/**
* 渠道用户标识,如微信openId,支付宝账号
*/
private String channelUser;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 支付凭证上交易单号(微信、支付宝等交易单号)
*/
private String platformOrderNo;
/**
* 支付凭证上商户单号(微信、支付宝等商户单号)
*/
private String platformMchOrderNo;
/**
* 渠道特殊业务数据,各渠道业务自处理数据
*/
private String channelBizData;
/**
* 支付凭证上商户单号(微信、支付宝等商户单号)
*/
private Byte refundState;
/**
* 退款次数
*/
private Integer refundTimes;
/**
* 退款总金额,单位分
*/
private Long refundAmount;
/**
* 订单分账模式0-该笔订单不允许分账, 1-支付成功按配置自动完成分账, 2-商户手动分账(解冻商户金额) 3:红包营销分账
*/
private Byte divisionMode;
/**
* 订单分账状态0-未发生分账, 1-等待分账任务处理, 2-分账处理中, 3-分账任务已结束(不体现状态)
*/
private Byte divisionState;
/**
* 最新分账时间
*/
private Date divisionLastTime;
/**
* 渠道支付错误码
*/
private String errCode;
/**
* 渠道支付错误描述
*/
private String errMsg;
/**
* 商户扩展参数
*/
private String extParam;
/**
* 异步通知地址
*/
private String notifyUrl;
/**
* 页面跳转地址
*/
private String returnUrl;
/**
* 买家备注
*/
private String buyerRemark;
/**
* 卖家备注
*/
private String sellerRemark;
/**
* 商户拓展员ID
*/
private Long epUserId;
/**
* 门店收银员ID
*/
private Long storeUserId;
/**
* 会员ID
*/
private String mbrId;
/**
* 会员手机号
*/
private String mbrTel;
/**
* 订单失效时间
*/
private Date expiredTime;
/**
* 订单支付成功时间
*/
private Date successTime;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 交易卡类型 00借记卡 01贷记卡 02零钱/余额 03花呗 04数字货币 99其他
*/
private String drType;
/**
* 结算类型 D0 D1 T1 DS 定时结算
*/
private String settleType;
/**
* 优惠金额
*/
private Long discountAmt;
/**
* 优惠折扣
*/
private BigDecimal discountScale;
/**
* 实付金额
*/
private Long findAmt;
/**
* 扩展分账金额
*/
private Long extDivAmt;
/**
* 营销活动补贴金额
*/
private Long marketAmt;
/**
* 提现费率
*/
private BigDecimal cashRate;
/**
* 提现费率
*/
private Long cashFee;
private String payData;
private String routeId;
@TableField(exist = false)
private String mchFeeRateNum;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private String appName;
@TableField(exist = false)
private String isvName;
@TableField(exist = false)
private String wayName;
@TableField(exist = false)
private Integer number;
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String mchUserName;
/**
* 用户电话
*/
@TableField(exist = false)
private String mchUserPhone;
@TableField(exist = false)
private String agentContactTel;
@TableField(exist = false)
private String storeInfo;
/**
* 三合一订单
*/
@TableField(exist = false)
private String unionOrderId;
// 二合一商户/代理号
@TableField(exist = false)
private String unionInfoNo;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
// 多状态查询
@TableField(exist = false)
private List<String> unionOrderState;
// 多状态查询
@TableField(exist = false)
private List<String> unionWayCodeType;
@TableField(exist = false)
List<String> subAgentNoList;
@TableField(exist = false)
List<String> storeIdList;
@TableField(exist = false)
private String tk;
}

View File

@@ -0,0 +1,44 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 分账记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-08-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_order_division_record")
public class PayOrderDivisionRecord extends com.jeequan.jeepay.core.entity.PayOrderDivisionRecord {
public static final byte STATE_WAIT = 0; // 待分账
public static final byte STATE_SUCCESS = 1; // 分账成功(明确成功)
public static final byte STATE_FAIL = 2; // 分账失败(明确失败)
public static final byte STATE_ING = 3; // 分账处理中(一般为渠道侧或定时任务)
public static final byte STATE_ACCEPT = 4; // 分账已受理(上游受理)
private static final long serialVersionUID = 1L;
public static final LambdaQueryWrapper<PayOrderDivisionRecord> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 分账记录ID
*/
@TableId(value = "record_id", type = IdType.AUTO)
private Long recordId;
}

View File

@@ -0,0 +1,45 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 支付订单分账退款记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-06-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_order_division_refund_record")
public class PayOrderDivisionRefundRecord extends com.jeequan.jeepay.core.entity.PayOrderDivisionRefundRecord {
public static final byte STATE_ING = 0; // 退款中
public static final byte STATE_SUCCESS = 1; // 成功
public static final byte STATE_FAIL = 2; // 失败
public static final LambdaQueryWrapper<PayOrderDivisionRefundRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 分账退款订单号(支付系统生成订单号)
*/
@TableId
private String divisionRefundId;
}

View File

@@ -0,0 +1,74 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_user")
@NoArgsConstructor
public class PayUser extends BaseModel {
private static final long serialVersionUID=1L;
/**
* 支付用户id
*/
@TableId(type = IdType.INPUT)
private String payUserId;
/**
* 所属用户号
*/
private String mchNo;
/**
* 初次关联的订单号
*/
private String fastFlowNo;
/**
* 来源WECHAT 微信 ALIPAY 支付宝 YSFPAY 云闪付 UNIONPAY 银联 OTHER 其他
*/
private String type;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
public PayUser(PayOrder payOrder) {
this.payUserId = payOrder.getChannelUser();
this.mchNo = payOrder.getMchNo();
this.type = payOrder.getWayCodeType();
this.fastFlowNo = payOrder.getPayOrderId();
}
}

View File

@@ -0,0 +1,66 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 支付方式表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_pay_way")
public class PayWay extends BaseModel implements Serializable {
public static final LambdaQueryWrapper<PayWay> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 支付方式代码 例如: wxpay_jsapi
*/
@TableId
private String wayCode;
/**
* 支付方式名称
*/
private String wayName;
/**
* 支付方式分类WECHAT-微信, ALIPAY-支付宝, YSFPAY-云闪付, UNIONPAY-银联, OTHER-其他
*/
private String wayType;
/**
* 产品类型PAY-支付产品, TRANSFER-转账产品
*/
private String productType;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,75 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 商户应用产品关联表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-11-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_product_app_conn")
public class ProductAppConn implements Serializable {
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 产品ID
*/
private Long productId;
/**
* appID
*/
private String appId;
/**
* 商户号
*/
private String mchNo;
/**
* 状态 0: 未绑定1已绑定
*/
private Integer state;
/**
* 审核原因
*/
private String stateDesc;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建人
*/
private String createdBy;
}

View File

@@ -0,0 +1,255 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
/**
* <p>
* 服务商信息表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_product_info",autoResultMap = true)
public class ProductInfo extends BaseModel {
public static final LambdaQueryWrapper<ProductInfo> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 待上架 **/
public static final Integer PRODUCT_STATE_NOT = 0;
/** 已上架 **/
public static final Integer PRODUCT_STATE_ON = 1;
/** 需要审核 **/
public static final Integer PRODUCT_STATE_AUDIT = 1;
/** 不需要审核 **/
public static final Integer PRODUCT_STATE_AUTO_AUDIT = 0;
/** 需要绑定应用 **/
public static final Integer PRODUCT_STATE_BINDING = 1;
/** 不需要绑定应用 **/
public static final Integer PRODUCT_STATE_ON_BINDING = 0;
/** 收费 **/
public static final Integer PRODUCT_STATE_CHARGE = 1;
/** 不收费 **/
public static final Integer PRODUCT_STATE_ON_CHARGE = 0;
public static final String JSON_STR= "[{\"versionName\": \"免费版本\",\"validTime\": 365,\"sellingPrice\": 0.00,\"lineationPrice\": 0.00}]";
public static final String API_CODE_FIRST= "API_";
public static final String API_CODE_LAST= "_CP_PAY";
/**
* 产品ID
*/
@TableId
private String productId;
/**
* 产品名称
*/
private String productName;
/**
* 产品简介
*/
private String productDesc;
/**
* 产品付费信息
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray productText;
/**
* 排序
*/
private Integer productSort;
/**
* 产品内容
*/
private String productContent;
/**
* 开发文档地址
*/
private String productUrl;
/**
* 产品状态 0-待上架 1-已上架
*/
private Integer productState;
/**
* 产品分类
*/
private Integer productType;
/**
* 产品logo地址
*/
private String productLogoUrl;
/**
* 产品类型 0-服务型 1-接口型 数组[]
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray productSpecs;
/**
* 关联产品的ids多个逗号隔开
*/
private String productIds;
/**
* 关联方案的id多个逗号隔开
*/
private String packageIds;
/**
* 关联通道的code多个逗号隔开
*/
private String payInterfaceCodes;
/**
* 定义的唯一标识,方便支付那边取值
*/
private String apiCode;
/**
* 产品价格
*/
private Long price;
/**
* 是否需要审核0:否1:是
*/
private Integer audit;
/**
* 是否收费0:否1:是
*/
private Integer charge;
/**
* 是否需要绑定应用0:否1:是
*/
private Integer bindingApp;
/**
* 产品特殊资质信息
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray specialCertificationText;
/**
* 是否需要资质0:否1:是
*/
private Integer certification;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建者
*/
private String createdBy;
@TableField(exist = false)
private Integer state;
@TableField(exist = false)
private String typeName;
@TableField(exist = false)
private String stateDesc;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String id;
@TableField(exist = false)
private Integer checkState;
@TableField(exist = false)
private List<ProductInfo> productInfoRelevancyList;
@TableField(exist = false)
private List<PackageInfo> packageInfoRelevancyList;
@TableField(exist = false)
private List<PayInterfaceDefine> payInterRelevancyList;
@TableField(exist = false)
private Integer applyCount;
//申请数量
@TableField(exist = false)
private Integer applyForCount;
//定订购数量
@TableField(exist = false)
private Integer orderCount;
@TableField(exist = false)
private Date firstDate;
@TableField(exist = false)
private Date lastDate;
@TableField(exist = false)
private List<String> bindingAppList;
@TableField(exist = false)
private String productIdsName;
@TableField(exist = false)
private String packageIdsName;
@TableField(exist = false)
private String payInterfaceCodesName;
@TableField(exist = false)
private List<PackageOrder> packageOrderList;
/**
* 剩余总时间
*/
@TableField(exist = false)
private Long allRemainingDays;
}

View File

@@ -0,0 +1,60 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 产品分类表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_product_type")
public class ProductType extends BaseModel {
public static final LambdaQueryWrapper<ProductType> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 分类ID
*/
@TableId(value = "type_id", type = IdType.AUTO)
private String typeId;
/**
* 分类名称
*/
private String typeName;
/**
* 创建者
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,38 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.SqlCondition;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
import java.util.List;
@Data
@TableName(value = "t_qualification_define", autoResultMap = true)
public class QualificationDefineEntity {
public static final String API_CODE_FIRST= "API_";
public static final String API_CODE_LAST= "_ZZMB";
@TableId
private String code;
@TableField(condition = SqlCondition.LIKE)
private String name;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<Item> params;
@Data
public static class Item {
private String name;
private String inputType;
private String propertyName;
private List<String> optionList;
}
}

View File

@@ -0,0 +1,243 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 费率配置表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-03-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@SuperBuilder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "t_rate_config", autoResultMap = true)
public class RateConfig extends BaseModel {
public static LambdaQueryWrapper<RateConfig> gw(){
return new LambdaQueryWrapper<>();
}
/** infoId 的后缀 ( 也是 map的分类key ) **/
public static final String AGENTRATE = "AGENTRATE";
public static final String MCHRATE = "MCHRATE";
/**
* 渠道商底价
*/
public static final String ISVCOST = "ISVCOST";
/**
* 下级服务商默认费率
*/
public static final String AGENTDEF = "AGENTDEF";
/**
* 下级服务商最大费率
*/
public static final String AGENTMAX = "AGENTMAX";
/**
* 下级商户默认费率
*/
public static final String MCHAPPLYDEF = "MCHAPPLYDEF";
/**
* 下级商户最大费率
*/
public static final String MCHAPPLYMAX = "MCHAPPLYMAX";
public static String buildInfoId(String infoId, String suffix){
return infoId + "_" + suffix;
}
// 以下两个用于页面显示使用。 DB不会用到
public static final String READONLYISVCOST = "READONLYISVCOST";
public static final String READONLYPARENTAGENT = "READONLYPARENTAGENT";
public static final String READONLYPARENTDEFRATE = "READONLYPARENTDEFRATE"; // 读取上级配置的默认费率
// public static final String READONLYMCHMAX = "READONLYMCHMAX"; // 当前服务商的商户最大费率
public static final String READONLYPARENTMCHMAX = "READONLYPARENTMCHMAX"; // 读取上级配置的商户最大费率
public static final String READONLYPARENTSUBAGENTMAX = "READONLYPARENTSUBAGENTMAX"; // 读取上级的可开下级的最大费率
public static String getRealInfoId(String infoId){
return infoId.replace( "_" + AGENTRATE, "")
.replace("_" + MCHRATE, "")
.replace("_" + ISVCOST, "")
.replace("_" + AGENTDEF, "")
.replace("_" + MCHAPPLYDEF, "")
.replace("_" + MCHAPPLYMAX, "")
.replace("_" + AGENTMAX, "");
}
public static String appendInfoByAgent(String agentNo){
return agentNo + "_" + AGENTRATE;
}
public static String appendInfoByMchApp(String mchAppId){
return mchAppId + "_" + MCHRATE;
}
public static String appendInfoByIsvCost(String isvNo){
return isvNo + "_" + ISVCOST;
}
public static String appendInfoByAgentDef(String infoId){
return infoId + "_" + AGENTDEF;
}
public static String appendInfoByMchDef(String infoId){
return infoId + "_" + MCHAPPLYDEF;
}
public static String appendInfoByMchMax(String infoId){
return infoId + "_" + MCHAPPLYMAX;
}
/**
*
* ( mgrIsv ) 运营平台对服务商的配置: 查询【服务商所有支持的支付方式】
* 支付产品 、 [配置]渠道商底价、 [配置]服务商默认费率、 [配置]商户默认费率。
*
* ( mgrAgent ) 运营平台对服务商的费率配置: 查询: 【代理的所属服务商 、 所属上级服务商的所有开通的支付产品】
* 支付产品、 [显示]渠道商底价, [显示]上级服务商费率、 [配置]服务商的费率、 [配置]下级服务商的默认费率、 [配置]商户默认费率。
*
* ( mgrMch ) 运营平台对商户: 查询【商户的所属服务商 、 所属上级服务商的所有开通的支付产品】
* 支付产品、 [显示]渠道商底价, [显示]上级服务商费率、 [配置]商户的费率。
*
* ( agentSelf ) 服务商 对自己: 查询【当前服务商已经开通的产品】
* 支付产品、 [显示]当前服务商的费率、 [配置]下级服务商的默认费率、 [配置]商户默认费率。
*
* ( agentSubagent ) 服务商对下级服务商: 查询【当前服务商已经开通的产品】
* 支付产品、 [显示]当前服务商的费率、 [配置]下级服务商的费率
*
* ( agentMch ) 服务商对商户: 查询【当前服务商已经开通的产品】
* 支付产品、 [显示]上级服务商费率、 [配置]商户的费率。
*
*
* * ( mchSelfApp1 ) 商户: 配置自己应用的配置 (普通商户)
*
* * ( mchSelfApp2 ) 商户: 配置自己应用的配置 (特约商户)
*
*/
public static final String CONFIG_MODE_MGRISV = "mgrIsv";
public static final String CONFIG_MODE_MGRAGENT = "mgrAgent";
public static final String CONFIG_MODE_MGRMCH = "mgrMch";
public static final String CONFIG_MODE_AGENTSELF = "agentSelf";
public static final String CONFIG_MODE_AGENTSUBAGENT = "agentSubagent";
public static final String CONFIG_MODE_AGENTEMCH = "agentMch";
public static final String CONFIG_MODE_MGRAPPLYMENT = "mgrApplyment";
public static final String CONFIG_MODE_AGENTAPPLYMENT = "agentApplyment";
public static final String CONFIG_MODE_MCHAPPLYMENT = "mchApplyment";
public static final String CONFIG_MODE_MCHSELFAPP1 = "mchSelfApp1"; // 普通
public static final String CONFIG_MODE_MCHSELFAPP2 = "mchSelfApp2"; //特约
private static final long serialVersionUID=1L;
/**
* 服务商/服务商/商户应用ID
* @since 2024-01-15
* 应用不再配置费率<br/>
* 渠道商/服务商/用户ID
*/
private String infoId;
/**
* 系统类型: 参考SYS_TYPE
* @since 2024-01-15
* ISV / AGENT / MCH
*/
private String infoType;
/**
* 费率关联渠道号
*/
private String isvNo;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 支付方式代码
*/
private String wayCode;
/**
* 进件是否显示(仅服务商配置)
*/
private Byte applymentSupport;
/**
* 是否可编辑1-可编辑0-不可编辑
* <p>
* 若可编辑。<br/>
* 那么设置一级代理,或者下级代理该费率时可以修改。
* </p>
* <p>
* 若不可编辑,<br/>
* 那么一级代理,此项费率值与渠道设置的模板费率保持一致;
* 代理的费率与上级设置的模板费率保持一致
* </p>
*/
private Byte editable;
/**
* 冗余字段: 费率方式: SINGLE LEVEL
*/
private String feeType;
/**
* 冗余字段:单笔费率
*/
private BigDecimal feeRate;
/**
* 费率配置 (参考: ApplymentBasicInfo.paywayFeeList)
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject paywayFeeDetail;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 0: 线下,
* 1: 线上
*/
@TableField("`range`")
private Integer range;
/**
* 业务类型编码
*/
private String mccCode;
}

View File

@@ -0,0 +1,122 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.core.utils.SeqKit;
import com.jeequan.jeepay.model.RedPacketAccountOperate;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_red_packet_account")
@NoArgsConstructor
public class RedPacketAccount extends BaseModel {
private static final long serialVersionUID=1L;
/**
* 红包账户id
*/
@TableId(type = IdType.INPUT)
private String accountId;
/**
* 所属付款用户id
*/
private String payUserId;
/**
* 所属用户
*/
private String mchNo;
/**
* 所属门店
*/
private String storeId;
/**
* 所属门店名称
*/
private String storeName;
/**
* 头像
*/
private String headImg;
/**
* 昵称
*/
private String nickName;
/**
* 手机号
*/
private String phone;
/**
* 余额
*/
private Long balance;
/**
* 最后一次消费时间
*/
private Date lastTransTime;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 创建时间
*/
private Date createdAt;
/**
* 来源WECHAT 微信 ALIPAY 支付宝 YSFPAY 云闪付 UNIONPAY 银联 OTHER 其他
*/
private String type;
/**
* 初次关联的订单号
*/
private String fastFlowNo;
public RedPacketAccount(RedPacketAccountOperate operate, Long balance) {
this.accountId = SeqKit.genAccountNo();
this.payUserId = operate.getPayUserId();
this.mchNo = operate.getMchNo();
this.storeId = operate.getStoreId();
this.storeName = operate.getStoreName();
this.balance = balance;
this.fastFlowNo = operate.getFlowNo();
this.type = operate.getPayType();
}
public static LambdaQueryWrapper<RedPacketAccount> gw(RedPacketAccount info) {
return new LambdaQueryWrapper<>(info);
}
}

View File

@@ -0,0 +1,118 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.model.RedPacketAccountOperate;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 账户变动明细表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-18
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_red_packet_account_detail")
@NoArgsConstructor
public class RedPacketAccountDetail extends BaseModel {
private static final long serialVersionUID=1L;
public final static byte PAYMENT = 1;
public final static byte REFUND = 2;
public final static byte DEDUCT = 3;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 用户号
*/
private String mchNo;
/**
* 关联流水号
*/
private String flowNo;
/**
* 门店id
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 所属付款用户id
*/
private String payUserId;
/**
* 类型1下单奖励 2消费退款 3红包抵扣
*/
private Byte type;
/**
* 变动前余额
*/
private Long beforeAmt;
/**
* 变动金额
*/
private Long changeAmt;
/**
* 变动后余额
*/
private Long afterAmt;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
public RedPacketAccountDetail(RedPacketAccount packetAccount, RedPacketAccountOperate operate,Long beforeAmt,Long changeAmt) {
this.mchNo = packetAccount.getMchNo();
this.payUserId = packetAccount.getPayUserId();
this.storeId = packetAccount.getStoreId();
this.storeName = packetAccount.getStoreName();
this.flowNo = operate.getFlowNo();
this.beforeAmt = beforeAmt;
this.changeAmt = changeAmt;
this.afterAmt = BigDecimal.valueOf(beforeAmt).add(BigDecimal.valueOf(changeAmt)).longValue();
this.type = operate.getType();
}
public static LambdaQueryWrapper<RedPacketAccountDetail> gw(RedPacketAccountDetail info) {
return new LambdaQueryWrapper<>(info);
}
}

View File

@@ -0,0 +1,161 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.model.RedPacketAccountOperate;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 红包记录
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-18
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_red_packet_info")
@NoArgsConstructor
public class RedPacketInfo extends BaseModel {
private static final long serialVersionUID=1L;
public static final byte NO_USE = 1;
public static final byte IN_USE = 2;
public static final byte YES_USE = 3;
public static final byte EXPIRE = 4;
public static final byte REFUND = 5;
/**
* 关联流水号
*/
@TableId(type = IdType.INPUT)
private String flowNo;
/**
* 付款用户ID
*/
private String payUserId;
/**
* 用户号
*/
private String mchNo;
/**
* 门店ID
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 交易金额
*/
private Long transAmt;
/**
* 实付金额
*/
private Long findAmt;
/**
* 红包折扣
*/
private BigDecimal discountScale;
/**
* 红包奖励金额
*/
private Long rewardAmt;
/**
* 实际差额
*/
private Long actualAmt;
/**
* 已使用红包金额
*/
private Long useAmt;
/**
* 交易时间
*/
private Date transTime;
/**
* 来源 WECHAT微信 ALIPAY支付宝
*/
private String type;
/**
* 红包有效期
*/
private Date expireTime;
/**
* 创建时间
*/
private Date createdAt;
/**
* 状态1未使用 2使用中 3已使用 4已过期 5已退款
*/
private Byte state;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 备注
*/
private String remark;
public RedPacketInfo(RedPacketAccount packetAccount, RedPacketAccountOperate operate, Long findAmt, Long rewardAmt, BigDecimal marketScale, Date expireTime) {
this.flowNo = operate.getFlowNo();
this.payUserId = packetAccount.getPayUserId();
this.mchNo = packetAccount.getMchNo();
this.storeId = packetAccount.getStoreId();
this.storeName = packetAccount.getStoreName();
this.transAmt = operate.getOrderAmt();
this.findAmt = findAmt;
this.rewardAmt = rewardAmt;
this.discountScale = marketScale;
this.expireTime = expireTime;
this.type = operate.getPayType();
if(operate.getTransTime() == null){
this.transTime = new Date();
}else{
this.transTime = operate.getTransTime();
}
}
public static LambdaQueryWrapper<RedPacketInfo> gw() {
return new LambdaQueryWrapper<>();
}
}

View File

@@ -0,0 +1,158 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* <p>
* 红包规则表
* </p>
*
* @author [mybatis plus generator]
* @since 2024-01-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_red_packet_rule")
public class RedPacketRule extends BaseModel {
/**
* 指定门店
*/
public final static int APPOINT = 2;
/**
* 全部门店
*/
public final static int ALL = 1;
private static final long serialVersionUID=1L;
/**
* 规则id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户号
*/
private String mchNo;
/**
* 红包类型 1门店专享 2平台通用
*/
private Byte packetType;
/**
* 营销折扣比例 0.8 8折 0.95 表示95折 以此类推
*/
private BigDecimal marketScale;
/**
* 平台补贴
*/
private BigDecimal platScale;
/**
* 用户补贴红包比例 0.1 表示10% 0.2 表示 20%
*/
private BigDecimal userPerkScale;
/**
* 红包有效天数
*/
private Integer expireNumber;
/**
* 状态1启用 0禁用
*/
private Byte state;
/**
* 门店ID
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 门店集合
*/
@TableField(exist = false)
private List<String> storeIdList;
/**
* 配置类型 1配置所有门店 2指定门店
*/
@TableField(exist = false)
private Integer configType;
public static LambdaQueryWrapper<RedPacketRule> gw() {
return new LambdaQueryWrapper<>();
}
public static LambdaQueryWrapper<RedPacketRule> gw(RedPacketRule info) {
return new LambdaQueryWrapper<>(info);
}
public void check(){
if(this.getPacketType() == null){
throw new BizException("红包类型不能为空");
}
if(this.getMarketScale() == null){
throw new BizException("营销折扣比例不能为空");
}
if(this.getPlatScale() == null){
throw new BizException("平台补贴比例不能为空");
}
if(this.getPlatScale() == null){
throw new BizException("顾客获得红包比例不能为空");
}
if(this.getExpireNumber() == null){
throw new BizException("有效期不能为空");
}
}
public void preCheck() {
check();
if(this.getConfigType() == null){
throw new BizException("配置规则类型不能为空");
}
if(StringUtils.isEmpty(this.getMchNo())){
throw new BizException("所属商户不能为空");
}
//如果为指定门店的时候
if(this.getConfigType() == APPOINT){
if(this.getStoreIdList() == null || this.getStoreIdList().isEmpty()){
throw new BizException("配置规则类型为指定门店的时候,请选择支持的门店");
}
}
}
}

View File

@@ -0,0 +1,298 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.model.openapi.biz.RefundResultResp;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
/**
* <p>
* 退款订单表
* </p>
*
* @author [mybatis plus generator]
* @since 2021-04-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_refund_order")
public class RefundOrder extends com.jeequan.jeepay.core.entity.RefundOrder {
public static final byte STATE_INIT = 0; //订单生成
public static final byte STATE_ING = 1; //退款中
public static final byte STATE_SUCCESS = 2; //退款成功
public static final byte STATE_FAIL = 3; //退款失败
public static final byte STATE_CLOSED = 4; //退款任务关闭
public static final LambdaQueryWrapper<RefundOrder> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* 退款订单号(支付系统生成订单号)
*/
@TableId
private String refundOrderId;
/**
* 支付订单号与t_pay_order对应
*/
private String payOrderId;
/**
* 渠道支付单号与t_pay_order channel_order_no对应
*/
private String channelPayOrderNo;
/**
* 商户号(更改为用户号)
*/
private String mchNo;
/**
* 商户号,也就是现在的申请单编号
*/
private String mchExtNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 顶级服务商号
*/
private String topAgentNo;
/**
* 商户门店ID
*/
private String storeId;
/**
* 门店名称
*/
private String storeName;
/**
* 应用ID
*/
private String appId;
/**
* 商户名称
*/
private String mchName;
/**
* 类型: 1-普通商户, 2-特约商户(服务商模式)
*/
private Byte mchType;
/**
* 设备类型qr_code-码牌scan_pos-扫码POSauto_pos-智能POSother-其他
*/
private String deviceType;
/**
* 设备号
*/
private String deviceNo;
/**
* 设备厂商,参考商户门店设备表
*/
private String deviceProvider;
/**
* 商户退款单号(商户系统的订单号)
*/
private String mchRefundNo;
/**
* 支付方式代码
*/
private String wayCode;
/**
* 支付方式类型
*/
private String wayCodeType;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 支付金额,单位分
*/
private Long payAmount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 手续费退还金额, 单位:分
*/
private Long refundFeeAmount;
/**
* 三位货币代码,人民币:cny
*/
private String currency;
/**
* 退款状态:0-订单生成,1-退款中,2-退款成功,3-退款失败,4-退款任务关闭
*/
private Byte state;
/**
* 客户端IP
*/
private String clientIp;
/**
* 退款原因
*/
private String refundReason;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 渠道特殊业务数据,各渠道业务自处理数据
*/
private String channelBizData;
/**
* 渠道错误码
*/
private String errCode;
/**
* 渠道错误描述
*/
private String errMsg;
/**
* 特定渠道发起时额外参数
*/
private String channelExtra;
/**
* 通知地址
*/
private String notifyUrl;
/**
* 扩展参数 暂时扩展为退款模式 “1”收款商户号退款,"2"平台一般户退款
*/
private String extParam;
/**
* 门店收银员ID
*/
private Long storeUserId;
/**
* 订单退款成功时间
*/
private Date successTime;
/**
* 退款失效时间(失效后系统更改为退款任务关闭状态)
*/
private Date expiredTime;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 退款类型 1全额退款 2部分退款
*/
private Byte refundType;
/**
* 绑定的应用名称
*/
@TableField(exist = false)
private String appName;
/**
* 渠道名称
*/
@TableField(exist = false)
private String isvName;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvShortName;
/**
* 服务商名称
*/
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String agentContactTel;
@TableField(exist = false)
private String mchUserName;
@TableField(exist = false)
private String mchUserPhone;
public RefundResultResp bulidResult() {
RefundResultResp resp = new RefundResultResp();
resp.setRefundOrderId(this.getRefundOrderId());
resp.setRefundReason(this.getRefundReason());
resp.setMchRefundNo(this.getMchRefundNo());
resp.setRefundAmt(this.getRefundAmount());
resp.setIfCode(this.getIfCode());
resp.setOriPayOrderId(this.getPayOrderId());
resp.setMercNo(this.getMchExtNo());
CS.OpenRefundState val = CS.OpenRefundState.getVal(this.getState());
resp.setState(val.getCode());
String note = StringUtils.isNotEmpty(this.getErrMsg()) ? this.getErrMsg() : val.getDesc();
resp.setNote(note);
resp.setOriAmount(this.getPayAmount());
resp.setMercNo(this.getMchExtNo());
resp.setRefundType(this.getRefundType());
resp.setPayType(this.getWayCodeType());
resp.setRefundTime(this.getSuccessTime());
resp.setExtParam(this.getExtParam());
// resp.setOriMchOrderNo(mchOrderNo);
return resp;
}
}

View File

@@ -0,0 +1,44 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2024-03-06
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_region_code_pay_ryx")
public class RegionCodePayRyx implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String provinceCode;
private String provinceName;
private String cityCode;
private String cityName;
private String areaCode;
private String areaName;
}

View File

@@ -0,0 +1,172 @@
package com.jeequan.jeepay.db.entity;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.model.RuleStrategy;
import com.jeequan.jeepay.model.SeniorStrategy;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
/**
* <p>
* 商户支付路由
* </p>
*
* @author [mybatis plus generator]
* @since 2024-04-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_route",autoResultMap = true)
public class Route extends BaseModel {
private static final long serialVersionUID=1L;
public static final byte DEFAULT = 0;
public static final byte LITE = 1;
/**
* id
*/
@TableId(value = "route_id", type = IdType.INPUT)
private String routeId;
/**
* 路由名称
*/
private String name;
/**
* 所属商户
*/
private String mchNo;
@TableField(typeHandler = FastjsonTypeHandler.class)
private RuleStrategy ruleStrategy;
/**
* 高级策略
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private SeniorStrategy seniorStrategy;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 运行次数
*/
private Integer num;
/**
* 成功交易金额
*/
private Long succAmount;
/**
* 总交易金额
*/
private Long totalAmount;
/**
* 成功交易笔数
*/
private Integer succNum;
/**
* 总交易笔数
*/
private Integer totalNum;
/**
* 状态 1正常 0禁用
*/
private Byte state;
/**
* 页面支付方式 0默认 1小程序
*/
private Byte payMethod;
/**
* 是否默认
*/
private Byte isDefault;
/**
* 所属商户
*/
@TableField(exist = false)
private String mchName;
/**
* 成功率
*/
@TableField(exist = false)
private BigDecimal succRate;
/**
* 门店数量
*/
@TableField(exist = false)
private Long storeNum;
/**
* 参数 校验
*/
public void preCheck() {
Assert.notEmpty(this.getName(),"路由名称不能为空");
Assert.notNull(this.getRuleStrategy(),"路由策略规则不能为空");
Assert.notNull(this.getIsDefault(),"是否是默认的路由策略不能为空");
this.getRuleStrategy().preCheck();
if(this.getSeniorStrategy() != null){
this.getSeniorStrategy().preCheck();
}else{
SeniorStrategy seniorStrategy = new SeniorStrategy();
this.setSeniorStrategy(seniorStrategy);
}
}
/**
* 重写成功率
* @return
*/
public BigDecimal getSuccRate() {
if(this.getTotalNum() == null || this.getTotalNum() == BigDecimal.ZERO.intValue()){
return BigDecimal.ZERO;
}
return new BigDecimal(this.getSuccNum()).divide(new BigDecimal(this.getTotalNum()),4, RoundingMode.HALF_EVEN).multiply(BigDecimal.valueOf(100));
}
}

View File

@@ -0,0 +1,229 @@
package com.jeequan.jeepay.db.entity;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
/**
* <p>
* 路由管理
* </p>
*
* @author [mybatis plus generator]
* @since 2024-04-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_route_manage",autoResultMap = true)
public class RouteManage extends BaseModel {
public static final LambdaQueryWrapper<RouteManage> gw(){
return new LambdaQueryWrapper<>();
}
/**
* 门店id
*/
@TableId(type = IdType.INPUT)
private String storeId;
private String applyId;
/**
* 所属用户
*/
private String mchNo;
/**
* 所属应用
*/
private String appid;
private String ifCode;
private String isvNo;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<String> payType;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<String> amtRange;
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<String> timeRange;
/**
* 成功交易笔数
*/
private Integer succNum;
/**
* 成功交易金额
*/
private Long succAmount;
/**
* 总交易数量
*/
private Integer totalNum;
/**
* 总交易金额
*/
private Long totalAmount;
/**
* 路由id
*/
private String routeId;
/**
* 结算类型
*/
private String settleType;
/**
* 状态 0禁用 1启用
*/
private Byte state;
/**
* 路由状态 0不路由 1正常
*/
private Byte routeState;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 门店名称
*/
@TableField(exist = false)
private String storeName;
/**
* 所属通道名称
*/
@TableField(exist = false)
private String ifName;
/**
* 商户名称
*/
@TableField(exist = false)
private String mchShortName;
/**
* 路由策略名称
*/
@TableField(exist = false)
private String routeName;
/**
* 路由策略名称
*/
@TableField(exist = false)
private String appName;
/**
* 路由策略名称
*/
@TableField(exist = false)
private String isvName;
/**
* 门店id集合
*/
@TableField(exist = false)
private List<String> storeIdList;
/**
* 订单号
*/
@TableField(exist = false)
private String payOrderId;
@TableField(exist = false)
private String opType;
@TableField(exist = false)
private Boolean isSend = false;
@TableField(exist = false)
private String sendVal;
@TableField(exist = false)
private RouteRecord routeRecord;
@TableField(exist = false)
private Route route;
/**
* 成功率限制
*/
@TableField(exist = false)
private BigDecimal succRate;
/**
* 参数校验
*/
public void preCheck() {
Assert.notEmpty(this.getStoreIdList(),"请选择门店信息不能为空");
Assert.notEmpty(this.getRouteId(),"路由策略不能为空");
}
/**
* 重写成功率
* @return
*/
public BigDecimal getSuccRate() {
if(this.getTotalNum() == null || this.getTotalNum() == BigDecimal.ZERO.intValue()){
return BigDecimal.ZERO;
}
return new BigDecimal(this.getSuccNum()).divide(new BigDecimal(this.getTotalNum()),4, RoundingMode.HALF_EVEN).multiply(BigDecimal.valueOf(100));
}
}

View File

@@ -0,0 +1,132 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.model.Condition;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* <p>
* 策略运行结果
* </p>
*
* @author [mybatis plus generator]
* @since 2024-05-09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_route_record")
@NoArgsConstructor
public class RouteRecord extends BaseModel {
private static final long serialVersionUID=1L;
/**
* 订单号
*/
@TableId(type = IdType.INPUT)
private String orderId;
/**
* 用户号
*/
private String mchNo;
/**
* 路由ID
*/
private String routeId;
/**
* 路由名称
*/
private String routeName;
/**
* 门店信息
*/
private String storeId;
/**
* 商户号
*/
private String applyId;
/**
* 执行目标对象
*/
private String target;
/**
* 触发条件
*/
@TableField(value = "`condition`")
private String condition;
/**
* 执行结果
*/
private String result;
/**
* 备注
*/
private String remark;
/**
* 创建者用户ID
*/
private Long createdUid;
/**
* 创建者姓名
*/
private String createdBy;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 商户名称
*/
@TableField(exist = false)
private String mchShortName;
/**
* 门店名称
*/
@TableField(exist = false)
private String storeName;
/**
*
* @param routeManage
*/
public RouteRecord(RouteManage routeManage,String routeName, String condition,String resultMsg) {
this.mchNo = routeManage.getMchNo();
this.routeName = routeName;
this.routeId = routeManage.getRouteId();
this.target = routeManage.getStoreName() + "["+routeManage.getStoreId()+"]";
this.condition = condition;
this.result = resultMsg;
this.remark = routeManage.getRemark();
}
}

View File

@@ -0,0 +1,40 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class SettleBatchExcel {
@ExcelProperty("账户类型 B:对公、企业 C:对私、个人")
private String accountType;
@ExcelProperty("账户所属渠道 支付宝: ZFB、微信: WX、银行账户: BANK")
private String entryType;
@ExcelProperty("姓名(或营业执照名称)")
private String accountName;
@ExcelProperty("账号(支付宝账号或银行卡)")
private String accountNo;
@ExcelProperty("省(对公必填)")
private String instProvince;
@ExcelProperty("市(对公必填)")
private String instCity;
@ExcelProperty("银行卡名称(对公必填)")
private String instName;
@ExcelProperty("银行卡支行名称(对公必填)")
private String instBranchName;
@ExcelProperty("金额(元)")
private String transAmount;
@ExcelProperty("转账备注")
private String transferDesc;
}

View File

@@ -0,0 +1,319 @@
package com.jeequan.jeepay.db.entity;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.model.BaseModel;
import com.jeequan.jeepay.db.typehandler.EncryptTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Locale;
/**
* <p>
*
* </p>
*
* @author [mybatis plus generator]
* @since 2023-12-06
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_settle_info",autoResultMap = true)
@NoArgsConstructor
public class SettleInfo extends BaseModel {
private static final long serialVersionUID=1L;
public static final String TRANS_SCOPE_DATE_SPLIT = "~";
/**
* 结算状态 -1付款失败 0待付款 1付款中 2付款成功3暂缓 4冻结 5退票 98:待查看(针对部分通道没有结算记录的情况下,使用该状态让客户核实银行卡的到账流水) 99其他
*/
public static final byte FAIL = -1;
public static final byte WAIT = 0;
public static final byte PROGRESS = 1;
public static final byte SUCCESS = 2;
public static final byte SUSPEND = 3;
public static final byte FREEZE = 4;
public static final byte TICKET = 5;
public static final byte CONFIRM = 98;
public static final byte OTHER = 99;
public static final LambdaQueryWrapper<SettleInfo> gw(SettleInfo settleInfo){
return new LambdaQueryWrapper<>(settleInfo);
}
public static final LambdaQueryWrapper<SettleInfo> gw(){
return new LambdaQueryWrapper<>();
}
public static String SETTLE_NO_PRIFEX = "ST";
/**
* 结算编号
*/
@TableId
private String settleNo;
/**
* 通道结算账单号
*/
private String billNo;
/**
* 应用ID
*/
private String appid;
/**
* 用户号(原先的商户号)
*/
private String mchNo;
/**
* 商户号 也就是申请单编号 现在改成商户号了
*/
private String mchExtNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 商户名称
*/
private String mchName;
/**
* 通道商户编号
*/
private String channelMchNo;
/**
* D0 D1 T1
*/
private String settleType;
/**
* 预付金额 单位分
*/
private Long planAmt;
/**
* 结算金额 单位分
*/
private Long settleAmt;
/**
* 手续费 分
*/
private Long fee;
/**
* 结算状态 -1付款失败 0待付款 1付款中 2付款成功3暂缓 4冻结 5退票 98:待查看(针对部分通道没有结算记录的情况下,使用该状态让客户核实银行卡的到账流水) 99其他
*/
private Byte state;
/**
* 结算账户号
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String accountNo;
/**
* 结算账户名
*/
@TableField(typeHandler = EncryptTypeHandler.class)
private String accountName;
/**
* 结算日期
*/
private String settleDate;
/**
* 扩展流水号
*/
private String extFlowNo;
/**
* 通道错误码
*/
private String channelCode;
/**
* 备注 一般用于存储通道相关的返回信息
*/
private String remark;
/**
* 扩展json参数
*/
private String extra;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 通道类型
*/
private String ifCode;
private String bankName;
/**
* 交易金额(订单表里的实付金额)
*/
private Long transactionAmount;
/**
* 交易数量
*/
private Integer transactionNumber;
/**
* 通道返回的结算状态
*/
private String channelState;
@TableField(exist = false)
private String ifName;
@TableField(exist = false)
private Date settleTime;
/**
* 渠道简称
*/
@TableField(exist = false)
private String isvShortName;
@TableField(exist = false)
private String isvName;
@TableField(exist = false)
private String appName;
@TableField(exist = false)
private String nameAndNo;
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String agentContactTel;
@TableField(exist = false)
private String mchUserName;
@TableField(exist = false)
private String mchUserPhone;
private Long cashFee;
/**
* 交易日期范围
*/
private String transDateScope;
/**
* 结算数据构造方法
* @param order
* @param totalRefundAmount
* @param stateTransDate
* @param endTransDate
*/
public SettleInfo(PayOrder order,Long totalRefundAmount,Date stateTransDate,Date endTransDate) {
//生成一个系统结算单号
this.settleNo = SETTLE_NO_PRIFEX + DateUtil.format(new DateTime(), DatePattern.PURE_DATETIME_MS_FORMAT) + RandomUtil.randomString(RandomUtil.BASE_CHAR,1).toUpperCase(Locale.ROOT);
this.mchNo = order.getMchNo();
this.mchExtNo = order.getMchExtNo();
this.isvNo = order.getIsvNo();
this.agentNo = order.getAgentNo();
this.mchName = order.getMchName();
this.channelMchNo = order.getChannelMchNo();
this.settleType = order.getSettleType();
this.planAmt = order.getFindAmt() - totalRefundAmount - order.getMchFeeAmount() - order.getCashFee();
this.ifCode = order.getIfCode();
this.settleDate = DateUtil.formatDate(new DateTime());
this.appid = order.getAppId();
this.cashFee = order.getCashFee();
this.extFlowNo = order.getPayOrderId();
this.remark = "数据初始化";
this.transactionNumber = order.getNumber();
this.transactionAmount = order.getFindAmt() - totalRefundAmount;
this.transDateScope = DateUtil.format(stateTransDate,DatePattern.NORM_DATE_PATTERN) + TRANS_SCOPE_DATE_SPLIT + DateUtil.format(endTransDate,DatePattern.NORM_DATE_PATTERN);
this.fee = order.getMchFeeAmount();
//TODO 如果是拉卡拉 除了支付宝和微信 金额小与10元 则D1结算
if(CS.IF_CODE.LKLSPAY.equals(order.getIfCode())){
if(!CS.PAY_WAY_CODE_TYPE.WECHAT.equals(order.getWayCodeType()) && !CS.PAY_WAY_CODE_TYPE.ALIPAY.equals(order.getWayCodeType())){
this.settleType = CS.SETTLEMENT_TYPE.D1;
this.setRemark(this.remark + "(拉卡拉通道银联云闪付交易或单笔超限交易均转为D1次日到账)");
}
if(order.getFindAmt().longValue() <= 100){
this.settleType = CS.SETTLEMENT_TYPE.D1;
this.setRemark(this.remark + "(拉卡拉通道单笔结算金额低于10元将会转为次日到账)");
}
}
//如果是D0 则设置结算金额 DO 交易 直接变成待确认
if(CS.SETTLEMENT_TYPE.D0.equals(this.getSettleType())){
this.settleAmt = BigDecimal.valueOf(order.getFindAmt()).subtract(BigDecimal.valueOf(order.getMchFeeAmount())).subtract(BigDecimal.valueOf(order.getCashFee())).longValue();
this.state = CONFIRM;
this.remark = "请登录对应的银行app核实银行卡的到账流水";
}
}
public String getAccountNo() {
if(StringUtils.isEmpty(this.accountNo)){
return null;
}
if(this.accountNo.contains("*")){
return this.accountNo;
}
return DesensitizedUtil.bankCard(this.accountNo);
}
public String getAccountName() {
if(StringUtils.isEmpty(this.accountName)){
return null;
}
if(this.accountName.contains("*")){
return this.accountName;
}
return DesensitizedUtil.chineseName(this.accountName);
}
}

View File

@@ -0,0 +1,43 @@
package com.jeequan.jeepay.db.entity;
import com.jeequan.jeepay.core.entity.TransferOrder;
import lombok.Data;
import java.util.List;
@Data
public class SettlementDataModel {
/**
* 取值范围 WX ZFB BANK
*/
private String entryType;
/**
* B:对公 C:对私
*/
private String accountType;
private String infoId;
private String infoType;
/**
* 转账发起方
*/
private String transferSubjectIdFq;
private String taskId;
private List<TransferOrder> transferOrders;
//1:单笔 2批量
private Integer type;
/**
* 转账描述
*/
private String transferDesc;
private String isvNo;
}

View File

@@ -0,0 +1,139 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 通道数据统计表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-12-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_channel")
public class StatsChannel implements Serializable {
public static final LambdaQueryWrapper<StatsChannel> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 统计日期
*/
private Date statsDate;
/**
* 支付接口代码
*/
private String ifCode;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 订单总笔数
*/
private Long totalCount;
/**
* 订单总金额,单位分
*/
private Long totalAmount;
/**
* 成交订单笔数,含退款
*/
private Long successCount;
/**
* 成交订单金额,单位分,含退款金额和手续费
*/
private Long successAmount;
/**
* 商户手续费,单位分
*/
private Long fee;
/**
* 商户手续费回退,单位分,退款时退还的手续费
*/
private Long refundFee;
/**
* 实收金额,单位分,成交订单金额减去手续费
*/
private Long realAmount;
/**
* 退款总笔数,一笔订单多次退款,则计多次
*/
private Long refundCount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 交易成功率,成交订单笔数/订单总笔数
*/
private String successRate;
/**
* 状态1-完成 0-异常
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 实付金额
*/
private Long finalAmt;
/**
* 垫资手续费
*/
private Long cashFee;
}

View File

@@ -0,0 +1,151 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 设备数据统计表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-12-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_device")
public class StatsDevice implements Serializable {
public static final LambdaQueryWrapper<StatsDevice> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 统计日期
*/
private Date statsDate;
/**
* 设备类型参考t_pay_order
*/
private String deviceType;
/**
* 设备号
*/
private String deviceNo;
/**
* 设备厂商:参考配置表
*/
private String provider;
/**
* 门店ID
*/
private String storeId;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 订单总笔数
*/
private Long totalCount;
/**
* 订单总金额,单位分
*/
private Long totalAmount;
/**
* 成交订单笔数,含退款
*/
private Long successCount;
/**
* 成交订单金额,单位分,含退款金额和手续费
*/
private Long successAmount;
/**
* 商户手续费,单位分
*/
private Long fee;
/**
* 实收金额,单位分,成交订单金额减去手续费
*/
private Long realAmount;
/**
* 退款总笔数,一笔订单多次退款,则计多次
*/
private Long refundCount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 交易成功率,成交订单笔数/订单总笔数
*/
private String successRate;
/**
* 状态1-完成 0-异常
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 实付金额
*/
private Long finalAmt;
/**
* 垫资手续费
*/
private Long cashFee;
}

View File

@@ -0,0 +1,144 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 支付方式数据统计表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-12-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_pay_way")
public class StatsPayWay implements Serializable {
public static final LambdaQueryWrapper<StatsPayWay> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 统计日期
*/
private Date statsDate;
/**
* 支付接口代码
*/
private String wayCode;
/**
* 支付接口代码类型
*/
private String wayCodeType;
/**
* 门店ID
*/
private String storeId;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 订单总笔数
*/
private Long totalCount;
/**
* 订单总金额,单位分
*/
private Long totalAmount;
/**
* 成交订单笔数,含退款
*/
private Long successCount;
/**
* 成交订单金额,单位分,含退款金额和手续费
*/
private Long successAmount;
/**
* 商户手续费,单位分
*/
private Long fee;
/**
* 实收金额,单位分,成交订单金额减去手续费
*/
private Long realAmount;
/**
* 退款总笔数,一笔订单多次退款,则计多次
*/
private Long refundCount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 交易成功率,成交订单笔数/订单总笔数
*/
private String successRate;
/**
* 状态1-完成 0-异常
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 实付金额
*/
private Long finalAmt;
/**
* 垫资手续费
*/
private Long cashFee;
}

View File

@@ -0,0 +1,95 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 数据统计任务记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-02-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_task_record")
public class StatsTaskRecord implements Serializable {
public static final LambdaQueryWrapper<StatsTaskRecord> gw(){
return new LambdaQueryWrapper<>();
}
// 任务类型: 1-统计定时任务 2-平台数据修复
public static Byte TASK_TYPE_CRON = 1;
public static Byte TASK_TYPE_REPAIR = 2;
// 状态 0-任务进行中 1-任务完成 2-任务失败
public static Byte TASK_STATE_ING = 0;
public static Byte TASK_STATE_SUCCESS = 1;
public static Byte TASK_STATE_FAIL = 2;
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 任务类型: 1-统计定时任务 2-平台数据修复
*/
private Byte taskType;
/**
* 任务开始时间
*/
private Date beginTime;
/**
* 任务结束时间
*/
private Date endTime;
/**
* 统计开始日期
*/
private String statsBeginDate;
/**
* 统计结束日期
*/
private String statsEndDate;
/**
* 状态0-任务进行中 1-任务完成 2-任务失败
*/
private Byte state;
/**
* 任务成功/失败描述
*/
private String errMsg;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

View File

@@ -0,0 +1,160 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 交易数据统计表
* </p>
*
* @author [mybatis plus generator]
* @since 2022-12-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_trade")
public class StatsTrade implements Serializable {
public static final LambdaQueryWrapper<StatsTrade> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 统计日期
*/
private Date statsDate;
/**
* 门店ID
*/
private String storeId;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 服务商号
*/
private String isvNo;
/**
* 订单总笔数
*/
private Long totalCount;
/**
* 订单总金额,单位分
*/
private Long totalAmount;
/**
* 成交订单笔数,含退款
*/
private Long successCount;
/**
* 成交订单金额,单位分,含退款金额和手续费
*/
private Long successAmount;
/**
* 商户手续费,单位分
*/
private Long fee;
/**
* 商户手续费回退,单位分,退款时退换的手续费
*/
private Long refundFee;
/**
* 实收金额,单位分,成交订单金额减去手续费
*/
private Long realAmount;
/**
* 退款总笔数,一笔订单多次退款,则计多次
*/
private Long refundCount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 服务商佣金,单位分
*/
private Long agentProfit;
/**
* 交易成功率,成交订单笔数/订单总笔数
*/
private String successRate;
/**
* 状态1-完成 0-异常
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 优惠金额
*/
private Long discountAmt;
/**
* 补贴金额
*/
private Long marketAmt;
/**
* 实收金额
*/
private Long findAmt;
/**
* 扩展分账金额
*/
private Long extDivAmt;
/**
* 垫资手续费
*/
private Long cashFee;
}

View File

@@ -0,0 +1,141 @@
package com.jeequan.jeepay.db.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 代付数据统计
*
* @author [mybatis plus generator]
* @since 2024-05-22
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_stats_transfer")
public class StatsTransferEntity extends BaseModel implements Serializable {
private static final long serialVersionUID=1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 统计日期
*/
@JSONField(format = "yyyy-MM-dd")
private Date statsDate;
/**
* 转账发起方ID
*/
private String subjectId;
/**
* 通道编码
*/
private String ifCode;
/**
* 商户号
*/
private String mchNo;
/**
* 服务商号
*/
private String agentNo;
/**
* 渠道号
*/
private String isvNo;
/**
* 订单总笔数
*/
private Long totalCount;
/**
* 订单总金额,单位分
*/
private Long totalAmount;
private Long wxTotalCount;
private Long zfbTotalCount;
private Long bankTotalCount;
private Long wxTotalAmount;
private Long zfbTotalAmount;
private Long bankTotalAmount;
/**
* 充值订单总笔数
*/
private Long totalChargeCount;
/**
* 充值订单总金额
*/
private Long totalChargeAmount;
/**
* 商户手续费,单位分
*/
private Long fee;
/**
* 实收金额,单位分
*/
private Long realAmount;
/**
* 代理商佣金,单位分
*/
private Long agentProfit;
/**
* 状态1-完成 0-异常
*/
private Byte state;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
@TableField(exist = false)
private String ifCodeName;
@TableField(exist = false)
private String mchName;
@TableField(exist = false)
private String agentName;
@TableField(exist = false)
private String isvName;
@TableField(exist = false)
private String subjectName;
@TableField(exist = false)
private String transChannelMchNo;
}

View File

@@ -0,0 +1,124 @@
package com.jeequan.jeepay.db.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeequan.jeepay.core.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* <p>
* 商户员工交接班记录表
* </p>
*
* @author [mybatis plus generator]
* @since 2023-01-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_store_user_work_record")
public class StoreUserWorkRecord extends BaseModel {
public static final LambdaQueryWrapper<StoreUserWorkRecord> gw(){
return new LambdaQueryWrapper<>();
}
private static final long serialVersionUID=1L;
/** 员工交接班状态 1-上班 2-下班 **/
public static final byte WORK_STATE_START =1;
public static final byte WORK_STATE_END =2;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 用户ID
*/
private Long sysUserId;
/**
* 登录用户名
*/
private String loginUsername;
/**
* 真实姓名
*/
private String realname;
/**
* 员工编号
*/
private String userNo;
/**
* 门店ID
*/
private String storeId;
/**
* 商户编号
*/
private String mchNo;
/**
* 成交订单笔数,含退款
*/
private Long successCount;
/**
* 成交订单金额,单位分,含退款金额和手续费
*/
private Long successAmount;
/**
* 退款总笔数,一笔订单多次退款,则计多次
*/
private Long refundCount;
/**
* 退款金额,单位分
*/
private Long refundAmount;
/**
* 登录时间
*/
private Date workStartTime;
/**
* 登录方式, 参考JWTPayload
*/
private String loginPageType;
/**
* 退出时间
*/
private Date workEndTime;
/**
* 登出方式, 参考JWTPayload
*/
private String logoutPageType;
/**
* 创建时间
*/
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}

Some files were not shown because too many files have changed in this diff Show More