提交 f80a66c8 作者: 余乾开

Merge branch 'release/0.0.529-1540'

name: Build and Push to ACR
on:
push:
branches: [ "develop" ]
env:
REGION_ID: cn-shenzhen
REGISTRY: mmc-registry.cn-shenzhen.cr.aliyuncs.com
NAMESPACE: sharefly-dev
IMAGE: payment
TAG: ${{ github.sha }}
ACR_EE_REGISTRY: mmc-registry.cn-shenzhen.cr.aliyuncs.com
ACR_EE_INSTANCE_ID: cri-yhk5zgfc2v1sia6l
ACR_EE_NAMESPACE: sharefly-dev
ACR_EE_IMAGE: payment
ACR_EE_TAG: ${{ github.sha }}
JAVA_VERSION: '8'
GITLAB_URL: https://oauth2:MjVJKxB7m4tCy7symBzn@git.mmcuav.cn/iuav/payment.git
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
environment: dev
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: ${{env.JAVA_VERSION}}
- name: Login to ACR EE with the AccessKey pair
uses: aliyun/acr-login@v1
with:
login-server: "https://${{ env.ACR_EE_REGISTRY }}"
region-id: "${{ env.REGION_ID }}"
username: "QD--KeBiTeHangKong@1354706964800968"
password: "MMC@2023&ACR"
instance-id: "${{ env.ACR_EE_INSTANCE_ID }}"
- name: Build and push image to ACR EE
run: |
mvn clean package
docker build -t "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG" .
docker push "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG"
- name: Kustomize Set Image
run: |-
cd kustomization/overlays/dev
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash /dev/stdin 3.8.6
./kustomize edit set image REGISTRY/NAMESPACE/IMAGE:TAG=$REGISTRY/$NAMESPACE/$IMAGE:$TAG
- name: Commit and Push
run: |
git config user.name "Chuck"
git config user.email "Chuck@users.noreply.github.com"
git remote set-url origin "$GITLAB_URL"
git commit -am "Generated Image New Tag"
git push origin develop
\ No newline at end of file
name: Build and Push to ACR
on:
push:
branches: [ "master" ]
env:
REGION_ID: cn-shenzhen
REGISTRY: mmc-registry.cn-shenzhen.cr.aliyuncs.com
NAMESPACE: sharefly
IMAGE: payment
TAG: ${{ github.sha }}
ACR_EE_REGISTRY: mmc-registry.cn-shenzhen.cr.aliyuncs.com
ACR_EE_INSTANCE_ID: cri-yhk5zgfc2v1sia6l
ACR_EE_NAMESPACE: sharefly
ACR_EE_IMAGE: payment
ACR_EE_TAG: ${{ github.sha }}
JAVA_VERSION: '8'
GITLAB_URL: https://oauth2:MjVJKxB7m4tCy7symBzn@git.mmcuav.cn/iuav/payment.git
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
environment: prod
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 8
uses: actions/setup-java@v1
with:
java-version: ${{env.JAVA_VERSION}}
- name: Login to ACR EE with the AccessKey pair
uses: aliyun/acr-login@v1
with:
login-server: "https://${{ env.ACR_EE_REGISTRY }}"
region-id: "${{ env.REGION_ID }}"
username: "QD--KeBiTeHangKong@1354706964800968"
password: "MMC@2023&ACR"
instance-id: "${{ env.ACR_EE_INSTANCE_ID }}"
- name: Build and push image to ACR EE
run: |
mvn clean package
docker build -t "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG" .
docker push "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG"
- name: Kustomize Set Image
run: |-
cd kustomization/overlays/prod
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash /dev/stdin 3.8.6
./kustomize edit set image REGISTRY/NAMESPACE/IMAGE:TAG=$REGISTRY/$NAMESPACE/$IMAGE:$TAG
- name: Commit and Push
run: |
git config user.name "Chuck"
git config user.email "Chuck@users.noreply.github.com"
git remote set-url origin "$GITLAB_URL"
git commit -am "Generated Image New Tag"
git push origin master
\ No newline at end of file
FROM openjdk:8-jdk-alpine
ARG JAVA_OPTS
ENV JAVA_OPTS=$JAVA_OPTS
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/payment-0.0.1-SNAPSHOT.jar payment.jar
EXPOSE 8088
# For Spring-Boot project, use the entrypoint below to reduce Tomcat startup time.
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar payment.jar
apiVersion: v1
kind: ConfigMap
metadata:
name: payment-map
namespace: default
data:
SPRING_PROFILES_ACTIVE: default
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: payment
template:
metadata:
labels:
app: payment
spec:
containers:
- name: payment
image: REGISTRY/NAMESPACE/IMAGE:TAG
resources:
limits:
memory: 1024Mi
cpu: 100m
ports:
- containerPort: 8088
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: payment-map
key: SPRING_PROFILES_ACTIVE
\ No newline at end of file
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
app: payment
resources:
- ./deployment.yaml
- ./service.yaml
- ./configMap.yaml
\ No newline at end of file
apiVersion: v1
kind: Service
metadata:
name: payment-svc
namespace: default
spec:
selector:
app: payment
ports:
- protocol: TCP
port: 8088
\ No newline at end of file
apiVersion: v1
kind: ConfigMap
metadata:
name: payment-map
data:
SPRING_PROFILES_ACTIVE: dev
\ No newline at end of file
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
#namePrefix: dev-
namespace: dev
commonLabels:
variant: dev
commonAnnotations:
note: This is dev!
patches:
- path: ./configMap.yaml
\ No newline at end of file
apiVersion: v1
kind: ConfigMap
metadata:
name: payment-map
data:
SPRING_PROFILES_ACTIVE: prod
\ No newline at end of file
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-deployment
spec:
replicas: 1
\ No newline at end of file
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: prod
#namePrefix: prod-
commonLabels:
variant: prod
commonAnnotations:
note: This is prod!
patches:
- path: increase_replicas.yaml
- path: configMap.yaml
\ No newline at end of file
...@@ -14,19 +14,69 @@ ...@@ -14,19 +14,69 @@
<name>payment</name> <name>payment</name>
<description>Demo project for Spring Boot</description> <description>Demo project for Spring Boot</description>
<properties> <properties>
<java.version>17</java.version> <java.version>1.8</java.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
</dependency> </dependency>
<!--swagger-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<scope>test</scope> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.0.0</version>
<!--<scope>compile</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.mmc.payment.common;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/24 10:15
* @Version 1.0
*/
public class AmtUtil {
private static final BigDecimal minCashCost = BigDecimal.valueOf(-99999999.99);// -9999万9999元.99
private static final BigDecimal maxCashCost = BigDecimal.valueOf(99999999.99);// 9999万9999元.99
private static final BigDecimal minRepeatCost = BigDecimal.ZERO;// 0
private static final BigDecimal maxRepeatCost = BigDecimal.valueOf(99999999.99);// 9999万9999元.99
public static final BigDecimal REBATE_RATE = (BigDecimal.valueOf(0.01).setScale(2, BigDecimal.ROUND_DOWN));// 返利的百分比
/**
* 变更-金额范围
*
* @param amtPaid
* @return
*/
public static boolean vertifyAmt(BigDecimal amtPaid) {
return (amtPaid != null && (amtPaid.compareTo(minCashCost) >= 0) && (amtPaid.compareTo(maxCashCost) <= 0));
}
/**
* 还款-金额范围
*
* @param amtPaid
* @return
*/
public static boolean vertifyRepeatAmt(BigDecimal amtPaid) {
return (amtPaid != null && (amtPaid.compareTo(minRepeatCost) > 0) && (amtPaid.compareTo(maxRepeatCost) <= 0));
}
public static boolean vertifyRepoAmt(BigDecimal amtPaid) {
return (amtPaid != null && (amtPaid.compareTo(BigDecimal.ZERO) > 0) && (amtPaid.compareTo(maxCashCost) <= 0));
}
}
package com.mmc.payment.common;
import com.alibaba.fastjson.JSONObject;
import com.mmc.payment.config.AuthHandler;
import com.mmc.payment.exception.BizException;
import com.mmc.payment.jwt.JwtConstant;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.dto.CurrentUserDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.servlet.http.HttpServletRequest;
/**
* @Author small
* @Date 2023/5/24 9:54
* @Version 1.0
*/
public abstract class BaseController {
@Autowired
private AuthHandler authHandler;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 获取当前用户
*
* @param request
* @return
*/
public CurrentUserDTO getCurrentUser(HttpServletRequest request) {
// 登录未做好-统一通过此方法获取当前用户信息
Integer id = Integer.parseInt(request.getHeader(JwtConstant.USERIDKEY).toString());
Integer roleId = Integer.parseInt(request.getHeader(JwtConstant.ROLEIDKEY).toString());
return CurrentUserDTO.builder().id(id).roleId(roleId).build();
}
/**
* 获取当前登录账号信息
*/
public BaseAccountDTO getCurrentAccount(HttpServletRequest request) {
String token = request.getHeader("token");
String json = stringRedisTemplate.opsForValue().get(token);
if (StringUtils.isBlank(json)){
throw new BizException(ResultEnum.LOGIN_ACCOUNT_STATUS_ERROR);
}
BaseAccountDTO baseAccountDTO= JSONObject.parseObject(json, BaseAccountDTO.class);
return baseAccountDTO;
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/23 18:42
* @Version 1.0
*/
public interface BaseErrorInfoInterface {
/**
* 错误码
*
* @return
*/
String getResultCode();
/**
* 错误描述
*
* @return
*/
String getResultMsg();
}
package com.mmc.payment.common;
import java.util.Random;
/**
* @Author small
* @Date 2023/5/23 19:33
* @Version 1.0
*/
public class CodeUtil {
private static Random random = new Random();
// 数据生成有位数字或字母的随机数
public static String randomCode(int num) {
// 0-61 9 9+26=35 35+26 =61 65-90 97-122
StringBuffer sb = new StringBuffer();
for (int i = 0; i < num; i++) {
int y = random.nextInt(62);
if (y <= 9) {
// 数值
sb.append(y);
} else {
if (y <= 35) {
// 大写字母
y += 55;
} else {
// 小写字母
y += 61;
}
sb.append((char) y);
}
}
return sb.toString();
}
/**
* 生成随机数字
*
* @param length[生成随机数的长度]
* @return
*/
public static String getRandomNum(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(String.valueOf(random.nextInt(10)));
}
return sb.toString();
}
/**
* 生成用户uid
*
* @return
*/
public static String createUserUID() {
return "UID" + CodeUtil.getRandomNum(7);
}
/**
* 生成-现金流水账目no
*/
public static String createPayCashNO() {
StringBuffer sb = new StringBuffer();
sb.append("T");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成-信用流水账目no
*/
public static String createPayCreditNo() {
StringBuffer sb = new StringBuffer();
sb.append("T");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成-飞手工资流水账目no
*/
public static String createPayWagNo() {
StringBuffer sb = new StringBuffer();
sb.append("T");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成订单no
*/
public static String createOrderTaskNO() {
StringBuffer sb = new StringBuffer();
sb.append("D");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成-信用返利账目no
*/
public static String createPayRebateNo() {
StringBuffer sb = new StringBuffer();
sb.append("T");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成行业no
*/
public static String createIndustryNO() {
StringBuffer sb = new StringBuffer();
sb.append("HY");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成服务no
*/
public static String createInspectionNO() {
StringBuffer sb = new StringBuffer();
sb.append("FW");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成服务no
*/
public static String createRoleNo() {
StringBuffer sb = new StringBuffer();
sb.append("JS");
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成商品编号
*
* @return
*/
public static String createWareID() {
return "ID" + CodeUtil.getRandomNum(10);
}
/**
* 生成云仓订单编号
*/
public static String createRepoOrderNo() {
StringBuffer sb = new StringBuffer();
sb.append("R");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 云仓现金流水
*/
public static String createRepoCashNo() {
StringBuffer sb = new StringBuffer();
sb.append("J");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 生成商品编号
*
* @return
*/
public static String createDeviceCode() {
return "DC" + CodeUtil.getRandomNum(6);
}
/**
* 云仓现金流水
*/
public static String createOrderRefund() {
StringBuffer sb = new StringBuffer();
sb.append("RD");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 返祖订单号
*/
public static String createShareOrderNo() {
StringBuffer sb = new StringBuffer();
sb.append("GX");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmm"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 型号编号
*/
public static String createDeviceModelNo() {
return "DM" + CodeUtil.getRandomNum(8);
}
/**
* 仓库编号
*/
public static String createRepoNo() {
return "RN" + CodeUtil.getRandomNum(8);
}
public static String uavOrderCode(Long id) {
StringBuffer sb = new StringBuffer();
sb.append("UD");
sb.append(TDateUtil.getCurrentDateByType("yyyyMMddHHmmss"));
sb.append(CodeUtil.getRandomNum(4));
return sb.toString();
}
/**
* 活动编号
*/
public static String generateActivityNo() {
return "AC" + CodeUtil.getRandomNum(5);
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/24 10:05
* @Version 1.0
*/
public interface Create {
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/23 19:18
* @Version 1.0
*/
public interface Freeze {
}
package com.mmc.payment.common;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.io.*;
import java.util.List;
/**
* @Author small
* @Date 2023/5/23 19:31
* @Version 1.0
*/
public class JsonUtil {
public static void main(String[] args) {
String array = "[1,24,23]";
List<Integer> list = JSONArray.parseArray(array, Integer.class);
System.out.println(list.get(2));
}
/**
* 把Java对象转换成json字符串
*
* @param object 待转化为JSON字符串的Java对象
* @return json 串 or null
*/
public static String parseObjToJson(Object object) {
String string = null;
try {
string = JSONObject.toJSONString(object);
} catch (Exception e) {
// LOGGER.error(e.getMessage());
}
return string;
}
/**
* 将Json字符串信息转换成对应的Java对象
*
* @param json json字符串对象
* @param c 对应的类型
*/
public static <T> T parseJsonToObj(String json, Class<T> c) {
try {
JSONObject jsonObject = JSON.parseObject(json);
return JSON.toJavaObject(jsonObject, c);
} catch (Exception e) {
// LOGGER.error(e.getMessage());
}
return null;
}
/**
* 读取json文件
*
* @param fileName
* @return
*/
public static String readJsonFile(String fileName) {
String jsonStr = "";
try {
File jsonFile = new File(fileName);
FileReader fileReader = new FileReader(jsonFile);
Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonStr = sb.toString();
return jsonStr;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 将JSON数据格式化并保存到文件中
*
* @param jsonData 需要输出的json数
* @param filePath 输出的文件地址
* @return
*/
public static boolean createJsonFile(Object jsonData, String filePath) {
String content = JSON.toJSONString(jsonData, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteDateUseDateFormat);
// 标记文件生成是否成功
boolean flag = true;
// 生成json格式文件
try {
// 保证创建一个新文件
File file = new File(filePath);
if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
file.getParentFile().mkdirs();
}
if (file.exists()) { // 如果已存在,删除旧文件
file.delete();
}
file.createNewFile();
// 将格式化后的字符串写入文件
Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
write.write(content);
write.flush();
write.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/23 19:14
* @Version 1.0
*/
public interface Page {
}
package com.mmc.payment.common;
import com.mmc.payment.model.qo.BaseInfoQO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/23 19:17
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> implements Serializable {
private static final long serialVersionUID = -2848996493573325801L;
private int pageNo;// 分页起始页
private int pageSize;// 每页记录数
private T list;// 返回的记录集合
private long totalCount;// 总记录条数
private long totalPage;// 总页数
public static PageResult buildPage(int pageNo, int pageSize, int totalCount) {
PageResult page = new PageResult();
page.pageNo = pageNo;
page.pageSize = pageSize;
page.totalCount = totalCount;
page.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
return page;
}
public static <T> PageResult buildPage(int pageNo, int pageSize, int totalCount, T list) {
PageResult page = PageResult.buildPage(pageNo, pageSize, totalCount);
page.setList(list);
return page;
}
public static PageResult buildPage(BaseInfoQO qo, int totalCount) {
PageResult page = new PageResult();
page.pageNo = qo.getPageNo();
Integer pageSize = qo.getPageSize();
page.pageSize = pageSize;
page.totalCount = totalCount;
page.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
return page;
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/23 19:30
* @Version 1.0
*/
public class RedisConstant {
/**
* 验证码-key
*/
public final static String VERIFYCODEKEY = "verifyCode";
/**
* 电话号码-key
*/
public final static String PHONENUMKEY = "phoneNum";
/**
* 当天用户量统计-key
*/
public final static String ACTIVE_USER_TOTAL_COUNT_TODAY = "active_user_total_count_today";
/**
* 后台-当天用户量统计-key
*/
public final static String ADMIN_ACTIVE_COUNT_TODAY = "admin_active_count_today";
/**
* 云享飞-当天用户量统计-key
*/
public final static String YXF_ACTIVE_COUNT_TODAY = "yxf_active_count_today";
/**
* 云飞手-当天用户量统计-key
*/
public final static String YFS_ACTIVE_COUNT_TODAY = "yfs_active_count_today";
/**
* 云仓-当天用户量统计-key
*/
public final static String YC_ACTIVE_COUNT_TODAY = "yc_active_count_today";
/**
* 登录信息token前缀
*/
public final static String LOGING_TOKEN_BEFORE = "CLOUD-SHARED-FLIGHT-USERID@";
/**
* token黑名单-key
*
* @param userId
* @return
*/
/**
* 实名认证 redis 的键
*/
public final static String REALNAMEREDISKEY = "realName";
/**
* token失效
*/
public final static String DISABLE_TOKEN = "DISABLE-TOKEN";
/**
* 分片上传的key
*
* @param userId
* @return
*/
public final static String PART_UPLOAD = "UPLOAD_PART_";
/**
* 飞手端-假数据-分页信息-可以
*/
public final static String FLYER_DUMMY_DATA_PAGE = "FLYER_DUMMY_DATA_PAGE";
/**
* token失效列表的key
*/
public final static String DISABLE_TOKEN_LIST = "DISABLE_TOKEN_LIST";
/**
* 无人机城的订单状态
*/
public final static String UAV_MALL_ORDER_STATUS = "UAV_MALL_ORDER_STATUS";
/**
* 无人机城的快递公司编码
*/
public final static String UAV_MALL_EXP_COM = "UAV_MALL_EXP_COM";
/**
* 无人机城的快递状态码
*/
public final static String UAV_MALL_EXP_STATUS = "UAV_MALL_EXP_STATUS";
/**
* 微信access_token
*
* @param userId
* @return
*/
public final static String WX_ACCESS_TOKEN_BEFORE = "WX_ACCESS_TOKEN_";
public final static String REPO_SEND_PAY_MESSAGE = "REPO_ORDER_REMIND_PAY_";
public final static String FLYER_PUBLIC_DEFAULT_NAME = "FLYER_PUBLIC_DEFAULT_NAME";
public final static String EVALUATION = "EVALUATION";
public final static String FLYER_DUMMY_DATA="FLYER_DUMMY_DATA_KEY";
public final static String UAV_DUMMY_DATA="UAV_DUMMY_DATA_KEY";
/**
* tagInfoAllot表的缓存key
*/
public final static String TAGINFOALLOT_QUESTALL = "csf-service-system:tagInfoAllot:questAll";
public static String getDisableTokenKey(String accountId, String roleId, String tokenType) {
StringBuffer key = new StringBuffer();
key.append(RedisConstant.DISABLE_TOKEN);
key.append("_ROLE_");
key.append(roleId);
key.append("_");
key.append(accountId);
return key.toString();
}
/**
* 生成唯一的分片上传key
*
* @param uploadId
* @return
*/
public static String createPartUploadKey(String uploadId) {
StringBuffer key = new StringBuffer();
key.append(uploadId);
return key.toString();
}
/**
* 生成微信api的access_token的key
*/
public static String createWxToken(String wxAppid) {
StringBuffer key = new StringBuffer();
key.append(RedisConstant.WX_ACCESS_TOKEN_BEFORE);
key.append(wxAppid);
return key.toString();
}
/**
* 表单重复提交key
*/
public static String createRepeatKey(String token, String url, String params) {
StringBuffer key = new StringBuffer();
key.append(token);
key.append(url);
key.append(params);
return key.toString();
}
public static String createRepeatKey(String token, String url) {
return RedisConstant.createRepeatKey(token, url, "");
}
/**
* 登录缓存信息
*/
public static String createLoginCacheKey(String tokenType, Integer id) {
StringBuffer key = new StringBuffer();
key.append(tokenType);
key.append("_");
key.append(id);
return key.toString();
}
/**
* 每位账号的的token的key的前缀
*/
public static String tokenPreFix(String tokenType, String roleId) {
StringBuffer key = new StringBuffer();
key.append(tokenType);
key.append("_ROLE_");
key.append(roleId);
key.append("_");
return key.toString();
}
/**
* 每位账号的token保存的key
*/
public static String createLoginTokenKey(String tokenType, String roleId, String accountId) {
StringBuffer key = new StringBuffer();
key.append(RedisConstant.tokenPreFix(tokenType, roleId));
key.append(accountId);
return key.toString();
}
public static String createRepoOrderOver(Integer orderInfoId) {
StringBuffer key = new StringBuffer();
key.append(RedisConstant.REPO_SEND_PAY_MESSAGE);
key.append(orderInfoId);
return key.toString();
}
public static String getLockKey(String userId, String tokenType, String path) {
StringBuffer sb = new StringBuffer();
sb.append(userId);
sb.append("_");
sb.append(tokenType);
sb.append("_");
sb.append(path);
return sb.toString();
}
public static String createInspection(Integer id) {
StringBuffer key = new StringBuffer();
key.append(RedisConstant.EVALUATION);
key.append(id);
return key.toString();
}
public static String accessTokenKey(String clientId, Integer roleId, String grantType) {
StringBuilder key = new StringBuilder();
key.append("OAUTH_");
key.append(clientId);
key.append("_");
key.append(roleId);
key.append("_");
key.append(grantType);
return key.toString();
}
public static String getCompanyChildKey(Integer companyId){
StringBuilder key = new StringBuilder();
key.append("company_cache:");
key.append(companyId);
return key.toString();
}
public static String getXEAccessTokenKey(){
StringBuilder key = new StringBuilder();
key.append("XE_ACCESS_TOKEN");
return key.toString();
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/24 10:05
* @Version 1.0
*/
public interface Refund {
}
package com.mmc.payment.common;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/23 19:19
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.result.ResultBody", description = "请求响应体")
public class ResultBody<T> implements Serializable {
private static final long serialVersionUID = 6341937455634693363L;
/**
* 响应代码
*/
@ApiModelProperty(value = "响应代码")
private String code;
/**
* 响应消息
*/
@ApiModelProperty(value = "响应消息")
private String message;
/**
* 响应结果
*/
@ApiModelProperty(value = "响应结果")
private T result;
public ResultBody(BaseErrorInfoInterface errorInfo) {
this.code = errorInfo.getResultCode();
this.message = errorInfo.getResultMsg();
}
/**
* 成功
*
* @return
*/
public static ResultBody success() {
return success(null);
}
/**
* 成功
*
* @param data
* @return
*/
public static <T> ResultBody success(T data) {
ResultBody rb = new ResultBody();
rb.setCode(ResultEnum.SUCCESS.getResultCode());
rb.setMessage(ResultEnum.SUCCESS.getResultMsg());
rb.setResult(data);
return rb;
}
/**
* 成功
*
* **/
public static ResultBody success1(ResultEnum enums){
ResultBody rb = new ResultBody();
rb.setCode("200");
rb.setMessage(enums.getResultMsg());
rb.setResult(null);
return rb;
}
public void buildSuccess() {
this.setCode(ResultEnum.SUCCESS.getResultCode());
this.setMessage(ResultEnum.SUCCESS.getResultMsg());
}
/**
* 失败
*/
public static ResultBody error(BaseErrorInfoInterface errorInfo) {
ResultBody rb = new ResultBody();
rb.setCode(errorInfo.getResultCode());
rb.setMessage(errorInfo.getResultMsg());
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static ResultBody error(String code, String message) {
ResultBody rb = new ResultBody();
rb.setCode(code);
rb.setMessage(message);
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static ResultBody error(ResultEnum enums) {
ResultBody rb = new ResultBody();
rb.setCode(enums.getResultCode());
rb.setMessage(enums.getResultMsg());
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static ResultBody error(String message) {
ResultBody rb = new ResultBody();
rb.setCode("-1");
rb.setMessage(message);
rb.setResult(null);
return rb;
}
/**
* 失败
*/
public static ResultBody error(ResultEnum enums, Object data) {
ResultBody rb = new ResultBody();
rb.setCode(enums.getResultCode());
rb.setMessage(enums.getResultMsg());
rb.setResult(data);
return rb;
}
public static boolean isSuccess(ResultBody res) {
return res.getCode().equals(ResultEnum.SUCCESS.getResultCode());
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/24 10:05
* @Version 1.0
*/
public interface Share {
}
package com.mmc.payment.common;
import lombok.Data;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/29 10:38
* @Version 1.0
*/
@Data
public class Tenant implements Serializable {
/**
* 用户id
*/
private Integer userId;
/**
* 所在机构id
*/
private Integer tenantId;
/**
* 用户名称
*/
private String userName;
/**
* 管理机构id集合
*/
private String tenantIds;
/**
* 菜单路由路径集合
*/
private String token;
/**
* 角色id
*/
private Integer roleId;
/**
* 角色类型,1超管 2其他角色
*/
private Integer roleType;
public Tenant(String userName) {
this.userId = userId;
this.tenantId = tenantId;
this.userName = userName;
this.tenantIds = tenantIds;
this.token = token;
this.roleId = roleId;
this.roleType = roleType;
}
/**
* userid相同,认为是同个用户
*
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof Tenant) {
Tenant tenant = (Tenant) o;
return getUserId().equals(tenant.getUserId());
} else {
return false;
}
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + getUserId().hashCode();
return result;
}
}
package com.mmc.payment.common;
/**
* @Author small
* @Date 2023/5/23 19:40
* @Version 1.0
*/
public interface Update {
}
package com.mmc.payment.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author small
* @Date 2023/5/29 10:39
* @Version 1.0
*/
@Data
@ConfigurationProperties(prefix = "audience")
@Component
public class Audience {
private String clientId;
private String base64Secret;
private String name;
private long expiresSecond;
}
package com.mmc.payment.config;
import com.alibaba.fastjson.JSONArray;
import com.mmc.payment.common.JsonUtil;
import com.mmc.payment.common.RedisConstant;
import com.mmc.payment.common.ResultEnum;
import com.mmc.payment.exception.BizException;
import com.mmc.payment.jwt.JwtConstant;
import com.mmc.payment.model.dto.BaseAccountDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @Author small @Date 2023/5/23 19:22 @Version 1.0
*/
@Component
public class AuthHandler {
@Autowired private StringRedisTemplate stringRedisTemplate;
/**
* 获取当前用户
*
* @param request
* @return
*/
// public CurrentUserDTO getCurrentUser(HttpServletRequest request) {
// // 登录未做好-统一通过此方法获取当前用户信息
// Integer id = Integer.parseInt(request.getHeader(JwtConstant.USERIDKEY).toString());
// Integer roleId = Integer.parseInt(request.getHeader(JwtConstant.ROLEIDKEY).toString());
// return CurrentUserDTO.builder().id(id).roleId(roleId).build();
// }
/** 获取当前登录账号信息 */
public BaseAccountDTO getCurrentAccount(String token) {
// 获取登录的基本信息
String json = stringRedisTemplate.opsForValue().get(token);
if (StringUtils.isEmpty(json)) {
throw new BizException(ResultEnum.LOGIN_ACCOUNT_STATUS_ERROR);
}
BaseAccountDTO account = JsonUtil.parseJsonToObj(json, BaseAccountDTO.class);
// 如果是PC管理端-获取部门缓存信息
/* if (JwtConstant.SXTB_ACCOUNT_TOKEN.equals(account.getTokenPort())) {
account.getCompanyInfo().setCompanys(this.getCompanys(account.getCompanyInfo().getId()));
}*/
return account;
}
public String addLoginCache(
Integer userId, Integer roleId, String tokenType, BaseAccountDTO loginInfo) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(JwtConstant.USERIDKEY, userId);
map.put(JwtConstant.ROLEIDKEY, roleId);
map.put(JwtConstant.TOKEN_TYPE, tokenType);
String token = JwtUtil.createJwt(map);
// loginInfo.setTokenPort(tokenType);
// 缓存登录token-jwt
stringRedisTemplate
.opsForValue()
.set(
RedisConstant.createLoginTokenKey(tokenType, roleId.toString(), userId.toString()),
token,
JwtConstant.EXPIRATION,
TimeUnit.MILLISECONDS);
// 平台PC管理端登录保存-单位的id及无限下级id集合
if (JwtConstant.SXTB_ACCOUNT_TOKEN.equals(tokenType)) {
/* if (loginInfo.getCompanyInfo() != null && !CollectionUtils.isEmpty(loginInfo.getCompanyInfo().getCompanys())) {
List<Integer> companys = loginInfo.getCompanyInfo().getCompanys();
this.refreshCompanys(companys, loginInfo.getCompanyInfo().getId());
// 置为null--省内存
loginInfo.getCompanyInfo().setCompanys(null);
}*/
}
// 缓存登录对象
stringRedisTemplate
.opsForValue()
.set(
token,
JsonUtil.parseObjToJson(loginInfo),
JwtConstant.EXPIRATION,
TimeUnit.MILLISECONDS);
return token;
}
/**
* 更新单位缓存
*
* @param companys
* @param companyId
*/
public void refreshCompanys(List<Integer> companys, Integer companyId) {
String key = RedisConstant.getCompanyChildKey(companyId);
stringRedisTemplate
.opsForValue()
.set(key, JsonUtil.parseObjToJson(companys), JwtConstant.EXPIRATION, TimeUnit.MILLISECONDS);
}
public List<Integer> getCompanys(Integer companyId) {
String key = RedisConstant.getCompanyChildKey(companyId);
if (stringRedisTemplate.hasKey(key)) {
String json = stringRedisTemplate.opsForValue().get(key);
if (!StringUtils.isEmpty(json)) {
List<Integer> list = JSONArray.parseArray(json, Integer.class);
return list;
}
}
return new ArrayList<Integer>();
}
public void updateLoginCache(String token, BaseAccountDTO loginInfo) {
stringRedisTemplate
.opsForValue()
.set(
token,
JsonUtil.parseObjToJson(loginInfo),
JwtConstant.EXPIRATION,
TimeUnit.MILLISECONDS);
}
/**
* 检验缓存token是否存在
*
* @param token
* @return
*/
public boolean hasToken(String token) {
return stringRedisTemplate.hasKey(token);
}
/**
* 检验token是否进了失效名单 && 检验token是否为最新token
*
* @param token
* @return
*/
public boolean isDisableToken(String token) {
List<String> disableTokens =
stringRedisTemplate
.opsForList()
.range(RedisConstant.DISABLE_TOKEN_LIST, 0, -1); // 需要强制失效的token
return (!CollectionUtils.isEmpty(disableTokens) && disableTokens.contains(token));
}
/**
* 检测是否为最新的token
*
* @param userId
* @param roleId
* @param tokenType
*/
public boolean isLatestToken(String userId, String roleId, String tokenType, String token) {
String key = RedisConstant.createLoginTokenKey(tokenType, roleId, userId);
return (token.equals(stringRedisTemplate.opsForValue().get(key)));
}
public String getUserToken(Integer userAccountId, Integer roleId, String tokenType) {
String token =
stringRedisTemplate
.opsForValue()
.get(
RedisConstant.createLoginTokenKey(
tokenType, roleId.toString(), userAccountId.toString())); // 查询他的token
return token;
}
public void disableOneToken(Integer userAccountId, Integer roleId, String tokenType) {
String token = this.getUserToken(userAccountId, roleId, tokenType); // 查询他的token
if (!StringUtils.isEmpty(token)) {
stringRedisTemplate
.opsForList()
.leftPush(RedisConstant.DISABLE_TOKEN_LIST, token); // 加入token失效列表
}
String cacheLoginKey = RedisConstant.createLoginCacheKey(tokenType, userAccountId);
stringRedisTemplate.delete(cacheLoginKey); // 删除登录信息
}
public void disableListToken(List<Integer> userAccountIds, Integer roleId, String tokenType) {
Set<String> tokenKeyList =
stringRedisTemplate.keys(
RedisConstant.tokenPreFix(tokenType, roleId.toString()) + "*"); // 模糊查询所有key
if (!CollectionUtils.isEmpty(tokenKeyList)) {
List<String> tokenList = stringRedisTemplate.opsForValue().multiGet(tokenKeyList);
stringRedisTemplate.opsForList().leftPushAll(RedisConstant.DISABLE_TOKEN_LIST, tokenList);
}
userAccountIds.forEach(
id -> {
String cacheLoginKey = RedisConstant.createLoginCacheKey(tokenType, id);
stringRedisTemplate.delete(cacheLoginKey);
});
}
}
package com.mmc.payment.config;
import com.mmc.payment.common.CodeUtil;
import com.mmc.payment.jwt.JwtConstant;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
import java.util.Map;
/**
* @Author small
* @Date 2023/5/23 19:32
* @Version 1.0
*/
public class JwtUtil {
/**
* 根据map中的信息生成token, tokenId为随机生成码,有效时间为24h
*
* @param claims 封装到token中的map
* @return
*/
public static String createJwt(Map<String, Object> claims) {
return createJwt(claims, JwtConstant.EXPIRATION);
}
public static String createJwt(Map<String, Object> claims, long expiration) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(JwtConstant.BASE64KEY);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
long nowMillis = System.currentTimeMillis();
long expMillis = nowMillis + expiration;
Date now = new Date(nowMillis);
Date exp = new Date(expMillis);
JwtBuilder builder = Jwts.builder().setClaims(claims).setId(CodeUtil.randomCode(6)).setIssuedAt(now)
.setSubject(JwtConstant.SUBJECT).setIssuer(JwtConstant.ISSUER).signWith(signatureAlgorithm, signingKey)
.setExpiration(exp);
return builder.compact();
}
/**
* 解析前端传来的token,解析成功则返回Claims,解析失败返回null;解析成功后可通过claims获取信息
*
* @param jwt
* @return
*/
public static Claims parseJwt(String jwt) {
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(JwtConstant.BASE64KEY))
.parseClaimsJws(jwt).getBody();
return claims;
}
}
package com.mmc.payment.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author small
* @Date 2023/5/24 10:03
* @Version 1.0
*/
@Target(ElementType.METHOD) // 作用于方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时
public @interface RepeatSubmit {
/**
* 设置请求锁定时间 默认5秒
*/
long lockTime() default 5000L;
/**
* 当发生重复提交时候默认返回的错误信息
*/
String errMsg() default "重复提交,请 second 秒后重试";
/**
* 是否允许lockTime时间内可以再次提交
*/
boolean allowAgain() default true;
}
package com.mmc.payment.config;
/**
* @Author small
* @Date 2023/5/24 10:14
* @Version 1.0
*/
public enum RepoCashMethod {
REG(100, "充值"), RENT(200, "邮寄"), CNO(300, "租赁结算"), REFUND(400, "退款"), DRAWAL(500, "提现"), HANDLER(600, "手动扣除");
RepoCashMethod(Integer code, String status) {
this.code = code;
this.status = status;
}
private Integer code;
private String status;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package com.mmc.payment.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* @Author small
* @Date 2023/5/25 17:45
* @Version 1.0
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// 设置连接超时
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
return factory;
}
}
package com.mmc.payment.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import org.springframework.web.util.UrlPathHelper;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
import javax.servlet.ServletContext;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Author small
* @Date 2023/5/23 17:44
* @Version 1.0
*/
@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(
new ApiInfoBuilder()
.title("产品管理系统API")
.description("产品管理系统API")
.termsOfServiceUrl("")
.version("0.0.1")
.build())
// 分组名称
.groupName("开发版本")
.select()
// 这里指定Controller扫描包路径0
.apis(RequestHandlerSelectors.basePackage("com.mmc.payment"))
.paths(PathSelectors.any())
.build();
}
public static final String DEFAULT_PATH = "swagger";
/**
* SwaggerUI资源访问,自定义访问路径前缀
*
* @param servletContext
* @param order
* @return
* @throws Exception
*/
@Bean
public SimpleUrlHandlerMapping swaggerUrlHandlerMapping(
ServletContext servletContext, @Value("${swagger.mapping.order:10}") int order)
throws Exception {
SimpleUrlHandlerMapping urlHandlerMapping = new SimpleUrlHandlerMapping();
Map<String, ResourceHttpRequestHandler> urlMap = new HashMap<>();
{
PathResourceResolver pathResourceResolver = new PathResourceResolver();
pathResourceResolver.setAllowedLocations(
new ClassPathResource("META-INF/resources/webjars/"));
pathResourceResolver.setUrlPathHelper(new UrlPathHelper());
ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
resourceHttpRequestHandler.setLocations(
Arrays.asList(new ClassPathResource("META-INF/resources/webjars/")));
resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
resourceHttpRequestHandler.setServletContext(servletContext);
resourceHttpRequestHandler.afterPropertiesSet();
// 设置新的路径
urlMap.put(DEFAULT_PATH + "/webjars/**", resourceHttpRequestHandler);
}
{
PathResourceResolver pathResourceResolver = new PathResourceResolver();
pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/"));
pathResourceResolver.setUrlPathHelper(new UrlPathHelper());
ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
resourceHttpRequestHandler.setLocations(
Arrays.asList(new ClassPathResource("META-INF/resources/")));
resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
resourceHttpRequestHandler.setServletContext(servletContext);
resourceHttpRequestHandler.afterPropertiesSet();
// 设置新的路径
urlMap.put(DEFAULT_PATH + "/**", resourceHttpRequestHandler);
}
urlHandlerMapping.setUrlMap(urlMap);
// 调整DispatcherServlet关于SimpleUrlHandlerMapping的排序
urlHandlerMapping.setOrder(order);
return urlHandlerMapping;
}
}
package com.mmc.payment.config;
import com.mmc.payment.common.Tenant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/**
* @Author small
* @Date 2023/5/29 10:38
* @Version 1.0
*/
@Slf4j
public class TenantContext {
private static ThreadLocal<Tenant> tenantHolder = new ThreadLocal<>();
public static void setTenant(Tenant tenant) {
tenantHolder.set(tenant);
}
public static Tenant getTenant() {
return tenantHolder.get();
}
public static Integer getUserId() {
return getTenant().getUserId();
}
public static Integer getTenantId() {
return getTenant().getTenantId();
}
public static Integer getRoleId() {
return getTenant().getRoleId();
}
public static boolean exists() {
return getTenant() != null;
}
public static void clear() {
tenantHolder.remove();
}
public static Tenant buildTenant( String accountNo ) {
if (StringUtils.isBlank(accountNo)) {
log.error("登录信息[accountNo]获取异常");
return null;
}
return new Tenant(accountNo);
}
/**
* valid tenantId is correct
*/
private static boolean validNumeric(String number) {
return StringUtils.isNotEmpty(number) && StringUtils.isNumeric(number);
}
}
package com.mmc.payment.config;
import java.util.HashSet;
import java.util.Set;
/**
* @Author small
* @Date 2023/5/23 19:15
* @Version 1.0
*/
public class UserPorts {
public static final String USER_PORT = "USER_PORT";
public static final String FLYER_PORT = "FLYER_PORT";
public static final String REPO_PORT = "REPO_PORT";
public static final String MALL_PORT = "MALL_PORT";
public static final Set<String> ports = new HashSet<String>();
static {
ports.add(REPO_PORT);
ports.add(USER_PORT);
ports.add(FLYER_PORT);
ports.add(MALL_PORT);
}
}
package com.mmc.payment.controller;
import com.mmc.payment.common.ResultBody;
import com.mmc.payment.config.AuthHandler;
import com.mmc.payment.jwt.JwtConstant;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.dto.RepoAccountDTO;
import com.mmc.payment.model.qo.RepoAccountQO;
import com.mmc.payment.service.RepoAccountService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @Author small
* @Date 2023/5/23 18:40
* @Version 1.0
*/
@Api(tags = {"云仓-账号相关-接口"})
@RestController
@RequestMapping("/repoaccount/")
public class RepoAccountController {
@Autowired
private RepoAccountService repoAccountService;
@Autowired
private AuthHandler authHandler;
@ApiOperation(value = "PC端-云仓-消耗管理")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = RepoAccountDTO.class)})
@PostMapping("listPagePayManager")
public ResultBody listPagePayManager(HttpServletRequest request, @RequestBody RepoAccountQO param) {
return ResultBody.success(repoAccountService.listPagePayManager(param,this.getCurrentAccount(request)));
}
/**
* 获取当前登录账号信息
*/
public BaseAccountDTO getCurrentAccount(HttpServletRequest request) {
String token = request.getHeader(JwtConstant.TOKENKEY);
return authHandler.getCurrentAccount(token);
}
}
package com.mmc.payment.controller;
import com.mmc.payment.common.BaseController;
import com.mmc.payment.common.ResultBody;
import com.mmc.payment.config.RepeatSubmit;
import com.mmc.payment.model.dto.PayCashResultDTO;
import com.mmc.payment.model.dto.RepoCashDTO;
import com.mmc.payment.model.qo.RepoCashQO;
import com.mmc.payment.model.vo.RepoCashVO;
import com.mmc.payment.model.vo.RepoOrderPayVO;
import com.mmc.payment.service.RepoCashService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
/**
* @Author small @Date 2023/5/24 9:53 @Version 1.0
*/
@Api(tags = {"现金管理"})
@RestController
@RequestMapping("/repocash/")
public class RepoCashController extends BaseController {
@Autowired private RepoCashService repoCashService;
@Autowired private StringRedisTemplate stringRedisTemplate;
@ApiOperation(value = "web-订单支付")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = PayCashResultDTO.class)})
@PostMapping("orderPayment")
public PayCashResultDTO orderPayment(HttpServletRequest request, @RequestParam String orderNo) {
return repoCashService.orderPayment(this.getCurrentAccount(request), orderNo);
}
@ApiOperation(value = "支付订单-充值扣款")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = PayCashResultDTO.class)})
@ApiIgnore
@PostMapping("PayCashOrder")
public PayCashResultDTO feignPayCashOrder(@RequestBody RepoOrderPayVO orderPay) {
return repoCashService.payCashOrder(orderPay);
}
@ApiOperation(value = "当前用户剩余的余额")
@GetMapping("RemainingBalance")
public BigDecimal RemainingBalance(
@RequestParam(value = "repoAccountId", required = true) Integer repoAccountId) {
String s = stringRedisTemplate.opsForValue().get("R2023052814538712");
return repoCashService.RemainingBalance(repoAccountId);
}
@ApiOperation(value = "余额变更-分页-列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = RepoCashDTO.class)})
@PostMapping("listPageCash")
public ResultBody listPageCash(@RequestBody RepoCashQO param) {
return ResultBody.success(repoCashService.listPageRepoCash(param));
}
@ApiOperation(value = "余额变更-修改备注")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("updateCashRemark")
public ResultBody updateCashRemark(@RequestParam Integer id, @RequestParam() String remark) {
repoCashService.updateCashRemark(id, remark);
return ResultBody.success();
}
@ApiOperation(value = "v1.0.1Yes-现金-充值")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@RepeatSubmit
@PostMapping("reqCash")
public ResultBody reqCash(HttpServletRequest request, @RequestBody RepoCashVO param) {
return repoCashService.reqCash(this.getCurrentAccount(request), param);
}
@ApiOperation(value = "v1.0.1-Yes现金-手动扣除")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@RepeatSubmit
@PostMapping("dedCash")
public ResultBody dedCash(HttpServletRequest request, @RequestBody RepoCashVO param) {
return repoCashService.dedCash(this.getCurrentAccount(request), param);
}
@ApiIgnore
@ApiOperation(value = "查询退款金额")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = RepoCashDTO.class)})
@GetMapping("feignRefundInfo")
public RepoCashDTO feignRefundInfo(@RequestParam String refundNo) {
return repoCashService.getRefundInfo(refundNo);
}
}
package com.mmc.payment.controller;
import com.mmc.payment.config.SwaggerConfig;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.ResponseEntity;
import org.springframework.plugin.core.PluginRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import springfox.documentation.annotations.ApiIgnore;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.spring.web.json.JsonSerializer;
import springfox.documentation.swagger.web.ApiResourceController;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
import springfox.documentation.swagger2.web.Swagger2ControllerWebMvc;
import springfox.documentation.swagger2.web.WebMvcSwaggerTransformationFilter;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
/**
* @Author small
* @Date 2023/5/23 17:44
* @Version 1.0
*/
@Controller
@ApiIgnore
@RequestMapping(SwaggerConfig.DEFAULT_PATH)
public class SwaggerResourceController implements InitializingBean {
private final ApiResourceController apiResourceController;
private final DocumentationCache documentationCache;
private final ServiceModelToSwagger2Mapper mapper;
private final JsonSerializer jsonSerializer;
private final PluginRegistry<WebMvcSwaggerTransformationFilter, DocumentationType>
transformations;
private static final String HAL_MEDIA_TYPE = "application/hal+json";
private Swagger2ControllerWebMvc swagger2ControllerWebMvc;
public SwaggerResourceController(
ApiResourceController apiResourceController,
DocumentationCache documentationCache,
ServiceModelToSwagger2Mapper mapper,
JsonSerializer jsonSerializer,
PluginRegistry<WebMvcSwaggerTransformationFilter, DocumentationType> transformations) {
this.apiResourceController = apiResourceController;
this.documentationCache = documentationCache;
this.mapper = mapper;
this.jsonSerializer = jsonSerializer;
this.transformations = transformations;
}
@Override
public void afterPropertiesSet() throws Exception {
swagger2ControllerWebMvc =
new Swagger2ControllerWebMvc(documentationCache, mapper, jsonSerializer, transformations);
}
/**
* Swagger API首页地址
*
* @return 首页地址
*/
@RequestMapping
public ModelAndView index() {
return new ModelAndView("redirect:" + SwaggerConfig.DEFAULT_PATH + "/doc.html");
}
@RequestMapping("/swagger-resources/configuration/security")
@ResponseBody
public ResponseEntity<SecurityConfiguration> securityConfiguration() {
return apiResourceController.securityConfiguration();
}
@RequestMapping("/swagger-resources/configuration/ui")
@ResponseBody
public ResponseEntity<UiConfiguration> uiConfiguration() {
return apiResourceController.uiConfiguration();
}
@RequestMapping("/swagger-resources")
@ResponseBody
public ResponseEntity<List<SwaggerResource>> swaggerResources() {
return apiResourceController.swaggerResources();
}
@RequestMapping(
value = "/v2/api-docs",
method = RequestMethod.GET,
produces = {APPLICATION_JSON_VALUE, HAL_MEDIA_TYPE})
@ResponseBody
public ResponseEntity<Json> getDocumentation(
@RequestParam(value = "group", required = false) String swaggerGroup,
HttpServletRequest servletRequest) {
return swagger2ControllerWebMvc.getDocumentation(swaggerGroup, servletRequest);
}
}
package com.mmc.payment.dao;
import com.mmc.payment.entity.RepoAccountDO;
import com.mmc.payment.entity.RepoWalletDO;
import com.mmc.payment.model.qo.RepoAccountQO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @Author small
* @Date 2023/5/23 19:37
* @Version 1.0
*/
@Mapper
public interface RepoAccountDao {
List<RepoAccountDO> listPagePayManager(RepoAccountQO param);
int countPagePayManager(RepoAccountQO param);
List<RepoWalletDO> listWalletInfo(RepoAccountQO param);
}
package com.mmc.payment.dao;
import com.mmc.payment.entity.RepoCashDO;
import com.mmc.payment.entity.RepoWalletDO;
import com.mmc.payment.model.qo.RepoCashQO;
import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
import java.util.List;
/**
* @Author small @Date 2023/5/24 10:10 @Version 1.0
*/
@Mapper
public interface RepoCashDao {
RepoCashDO getRefundCashInfo(String refundNo);
void insertRepoCash(RepoCashDO rc);
void updateCashRemark(Integer id, String remark);
List<RepoCashDO> listPagePFRepoCash(RepoCashQO param);
int countPagePFRepoCash(RepoCashQO param);
RepoWalletDO getRepoWalletInfo(Integer repoAccountId);
void updateRepoWalletAmt(Integer repoAccountId, BigDecimal chageAmt);
BigDecimal RemainingBalance(Integer repoAccountId);
void updateWalletAmt(Integer repoAccountId, BigDecimal addAmt, BigDecimal addPaid);
void orderPayment(RepoCashDO repoCashDO);
}
package com.mmc.payment.entity;
import com.mmc.payment.model.dto.KdnExpDTO;
import com.mmc.payment.model.dto.OrderReceiptDTO;
import com.mmc.payment.model.dto.OrderRefundDTO;
import com.mmc.payment.model.dto.OrderVcuDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Author small @Date 2023/5/29 13:55 @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
// @ApiModel(value = "com.mmc.csf.model.dto.OrderInfoDTO", description = "云仓订单DTO")
public class OrderInfoDO implements Serializable {
private static final long serialVersionUID = 1572467108563651846L;
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "商品ID")
private Integer wareInfoId;
@ApiModelProperty(value = "商品编号")
private String wareNo;
@ApiModelProperty(value = "商品标题")
private String wareTitle;
@ApiModelProperty(value = "商品图片")
private String wareImg;
@ApiModelProperty(value = "套餐(sku)ID")
private Integer skuInfoId;
@ApiModelProperty(value = "套餐(sku)名称")
private String skuTitle;
@ApiModelProperty(value = "购买用户ID")
private Integer repoAccountId;
@ApiModelProperty(value = "用户UID")
private String uid;
@ApiModelProperty(value = "买家name")
private String buyerName;
@ApiModelProperty(value = "买家电话")
private String buyerPhone;
@ApiModelProperty(value = "单价")
private BigDecimal unitPrice;
@ApiModelProperty(value = "购买的商品数量")
private Integer wareNum;
@ApiModelProperty(value = "应付款金额")
private BigDecimal shouldPay;
@ApiModelProperty(value = "实收款金额")
private BigDecimal actualPay;
@ApiModelProperty(value = "订单类型:0租赁 100购买")
private Integer orderType;
@ApiModelProperty(value = "押金")
private BigDecimal deposit;
@ApiModelProperty(value = "租金总金额")
private BigDecimal rentPrice;
@ApiModelProperty(value = "租约开始日")
private Date startDate;
@ApiModelProperty(value = "租约结束日")
private Date endDate;
@ApiModelProperty(value = "付款天数")
private Integer payDay;
@ApiModelProperty(value = "交易状态:查订单状态字典")
private String tranStatus;
@ApiModelProperty(value = "减库方式 0:买家拍下减库存 1:卖家付款减库存")
private Integer exWare;
@ApiModelProperty(value = "用户备注")
private String remark;
@ApiModelProperty(value = "平台人员备注")
private String pfRemark;
@ApiModelProperty(value = "关闭原因")
private String shutReason;
@ApiModelProperty(value = "交易编号")
private String payNo;
@ApiModelProperty(value = "支付时间")
private Date payTime;
@ApiModelProperty(value = "发货时间")
private Date sendWareTime;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "物流信息/收货地址信息")
private OrderReceiptDTO receipt;
@ApiModelProperty(value = "退款单详情信息,无则为null")
private OrderRefundDTO orderRefund;
@ApiModelProperty(value = "发货-物流动态,无则为null")
private KdnExpDTO express;
@ApiModelProperty(value = "退货-物流动态,无则为null")
private KdnExpDTO refundExpress;
@ApiModelProperty(value = "质检详情,无则为null")
private List<OrderVcuDTO> vcus;
@ApiModelProperty(value = "归还时间")
private Date returnTime;
@ApiModelProperty(value = "优惠券id", example = "221")
private Integer couponId;
@ApiModelProperty(value = "规格id", example = "1")
private Integer specsId;
@ApiModelProperty(value = "余额", example = "4")
private BigDecimal balance;
}
package com.mmc.payment.entity;
import com.mmc.payment.model.dto.RepoAccountDTO;
import com.mmc.payment.model.dto.RepoRcdTeamDTO;
import com.mmc.payment.model.dto.RepoRebateWalletDTO;
import com.mmc.payment.model.vo.RepoAccountVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
/**
* @Author small
* @Date 2023/5/23 19:39
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RepoAccountDO implements Serializable {
private static final long serialVersionUID = 6313612168648022544L;
private Integer id;
private String uid;
private String accountName;
private Integer accountType;
private String phoneNum;
private Integer realAuthStatus;
private Integer entAuthStatus;
private Integer channelAuthStatus;
private Integer channelClass;
private String openId;
private String unionId;
private String nickName;
private String resAddress;
private String headerImg;
private BigDecimal lon;
private BigDecimal lat;
private String ports;
private String remark;
private Integer deleted;
private Date createTime;
private Date updateTime;
private Integer sale;
private Integer source;
private Integer rcdCompanyId;
private RepoAccountDO rcdRepo;
/**
* 额外字段
*
*/
private Integer white;
private Date entAuthTime;
private String entName;
private Date rcdCreateTime;
private String rcdRemark;
public RepoAccountDTO buildRepoAccountDTO() {
Integer white = 0;
if(rcdRepo !=null && rcdRepo.getSale() ==1){
white = 1;
}
return RepoAccountDTO.builder().id(this.id).uid(this.uid).accountName(this.accountName)
.accountType(this.accountType).phoneNum(this.phoneNum).realAuthStatus(this.realAuthStatus)
.entAuthStatus(this.entAuthStatus).channelAuthStatus(this.channelAuthStatus).nickName(this.nickName)
.resAddress(this.resAddress).headerImg(this.headerImg).lon(this.lon).lat(this.lat).remark(this.remark)
.deleted(this.deleted).createTime(this.createTime).updateTime(this.updateTime)
.ports(StringUtils.isEmpty(this.ports) ? null
: new HashSet<String>(Arrays.asList(this.ports.split(","))))
.entAuthTime(this.entAuthTime).unionId(this.unionId).entName(this.entName).openId(this.openId)
.rcdUid(this.rcdRepo == null ? null : this.rcdRepo.getUid())
.rcdAccountId(this.rcdRepo == null ? null : this.rcdRepo.getId())
.rcdAccountName(this.rcdRepo == null ? null : this.rcdRepo.getAccountName())
.rcdNickName(this.rcdRepo == null ? null : this.rcdRepo.getNickName())
.channelClass(this.channelClass).sale(this.sale).white(white).source(this.source)
.rcdCompanyId(this.rcdCompanyId)
.build();
}
public RepoRcdTeamDTO builderRepoRcdTeamDTO(){
return RepoRcdTeamDTO.builder().RepoAccountName(this.accountName).id(this.id).accountType(this.accountType)
.realAuthStatus(this.realAuthStatus).entAuthStatus(this.entAuthStatus).createTime(this.rcdCreateTime)
.phoneNum(this.phoneNum).nickName(this.nickName).remark(this.rcdRemark).uid(this.uid).entName(this.entName).build();
}
public RepoRebateWalletDTO buildRepoRebateWalletDTO(){
return RepoRebateWalletDTO.builder().repoAccountId(this.id).uid(this.uid).nickName(this.getNickName()).build();
}
public void buildName() {
if (StringUtils.isBlank(this.accountName) && StringUtils.isBlank(this.entName)) {
this.accountName = null;
} else if (StringUtils.isBlank(this.accountName) && !StringUtils.isBlank(this.entName)) {
this.accountName = this.entName;
} else if (!StringUtils.isBlank(this.accountName) && !StringUtils.isBlank(this.entName)) {
StringBuffer sb = new StringBuffer();
sb.append(this.accountName);
sb.append("(");
sb.append(this.entName);
sb.append(")");
this.accountName = sb.toString();
}
}
public RepoAccountDO(RepoAccountVO repoAccountVO) {
this.id = repoAccountVO.getId();
this.headerImg = repoAccountVO.getHeaderImg();
this.nickName = repoAccountVO.getNickName();
this.resAddress = repoAccountVO.getResAddress();
this.lon = repoAccountVO.getLon();
this.lat = repoAccountVO.getLat();
}
}
package com.mmc.payment.entity;
import com.mmc.payment.model.dto.RepoCashDTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/24 10:09
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RepoCashDO implements Serializable {
private static final long serialVersionUID = -7930603317037474755L;
private Integer id;
private Integer repoAccountId;
private String uid;
private String accountName;
private Integer orderInfoId;
private String orderNo;
private Integer skuInfoId;
private String skuTitle;
private Integer wareInfoId;
private String wareNo;
private String wareTitle;
private String payNo;
private Integer payMethod;
private BigDecimal amtPaid;
private BigDecimal cashAmt;
private Date payTime;
private String refundNo;
private String voucher;
private String remark;
private Integer createUser;
private Date createTime;
private Integer updateUser;
private Date updateTime;
public RepoCashDTO buildRepoCashDTO() {
return RepoCashDTO.builder().id(this.id).repoAccountId(this.repoAccountId).uid(this.uid)
.accountName(this.accountName).orderInfoId(this.orderInfoId).orderNo(this.orderNo)
.skuInfoId(this.skuInfoId).skuTitle(this.skuTitle).wareInfoId(this.wareInfoId).wareNo(this.wareNo)
.wareTitle(this.wareTitle).payNo(this.payNo).payMethod(this.payMethod).amtPaid(this.amtPaid)
.refundNo(this.refundNo).createUser(this.createUser)
.voucher(StringUtils.isBlank(this.voucher) ? null : Arrays.asList(this.voucher.split(",")))
.cashAmt(this.cashAmt).payTime(this.payTime).remark(this.remark).build();
}
}
package com.mmc.payment.entity;
import com.mmc.payment.model.dto.RepoWalletDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/23 20:30
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RepoWalletDO implements Serializable {
private static final long serialVersionUID = 6230679407746486112L;
private Integer id;
private Integer repoAccountId;
private BigDecimal cashAmt;
private BigDecimal cashPaid;
private BigDecimal cashFreeze;
private BigDecimal rcdRebateAmt;
private BigDecimal rebateWdl;
private BigDecimal rebateFreeze;
private String remark;
private Date updateTime;
private Date createTime;
public void initWallet(Integer repoAccountId) {
this.repoAccountId = repoAccountId;
this.cashAmt = BigDecimal.ZERO;
this.cashPaid = BigDecimal.ZERO;
this.cashFreeze = BigDecimal.ZERO;
this.createTime = new Date();
}
public RepoWalletDTO buildRepoWalletDTO() {
return RepoWalletDTO.builder().id(this.id).repoAccountId(this.repoAccountId).cashAmt(this.cashAmt)
.cashPaid(this.cashPaid).cashFreeze(this.cashFreeze).rcdRebateAmt(this.rcdRebateAmt).rebateWdl(this.rebateWdl)
.rebateFreeze(this.rebateFreeze).remark(this.remark).build();
}
/* public RepoRebateSubDTO buildRepoRebateSubDTO(){
RepoRebateSubDTO repoRebateSubDTO = RepoRebateSubDTO.builder().repoAccountId(this.repoAccountId).rcdRebateAmt(this.rcdRebateAmt)
.rebateFreeze(this.rebateFreeze).rebateWdl(this.rebateWdl).build();
repoRebateSubDTO.computerTotalRebate();
return repoRebateSubDTO;
}*/
}
package com.mmc.payment.exception;
import com.mmc.payment.common.BaseErrorInfoInterface;
import com.mmc.payment.common.ResultEnum;
import static com.mmc.payment.common.ResultEnum.CUSTOM_ERROR;
/**
* @Author small
* @Date 2023/5/23 19:25
* @Version 1.0
*/
public class BizException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
protected String errorCode;
/**
* 错误信息
*/
protected String errorMsg;
public BizException() {
super();
}
public BizException(BaseErrorInfoInterface errorInfoInterface) {
super(errorInfoInterface.getResultCode());
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
super(errorInfoInterface.getResultCode(), cause);
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public BizException(ResultEnum enums) {
super(enums.getResultCode());
this.errorCode = enums.getResultCode();
this.errorMsg = enums.getResultMsg();
}
public BizException(String errorMsg) {
super(errorMsg);
this.errorCode = CUSTOM_ERROR.resultCode;
this.errorMsg = errorMsg;
}
public BizException(String errorCode, String errorMsg) {
super(errorCode);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public BizException(String errorCode, String errorMsg, Throwable cause) {
super(errorCode, cause);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
@Override
public String getMessage() {
return errorMsg;
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}
package com.mmc.payment.filter;
/**
* @Author small
* @Date 2023/5/29 10:36
* @Version 1.0
*/
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** 登录认证 */
public interface AuthFilter extends Filter {
/** 拦截前 */
public boolean before(HttpServletRequest request, HttpServletResponse response);
/** 通过拦截后 */
public boolean after();
}
package com.mmc.payment.filter;
import com.alibaba.fastjson2.JSON;
import com.mmc.payment.common.ResultBody;
import com.mmc.payment.common.ResultEnum;
import com.mmc.payment.common.Tenant;
import com.mmc.payment.config.Audience;
import com.mmc.payment.config.TenantContext;
import com.mmc.payment.model.dto.UserAccountDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author small
* @Date 2023/5/29 10:36
* @Version 1.0
*/
@Slf4j
@Component
@WebFilter(filterName = "AuthSignatureFilter", urlPatterns = "/*")
public class AuthSignatureFilter implements AuthFilter {
@Autowired
private Audience audience;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 无需登录白名单
*/
private static final String[] IGNORE_URLS = {"/payment/swagger/swagger-resources","/payment/swagger/v2/api-docs","/payment/swagger/doc.html"};
/*无需加密狗无需登录白名单*/
private static final String[] USE_KEY = {"/crm/account/loginByUsbKey"};
/**
* 请求方式预请求方式值
*/
private static final String REQUEST_METHOD_OPTIONS_VALUE = "OPTIONS";
public static final String SWAGGER_URL_PREFIX = "/payment/swagger";
@Override
public void init(FilterConfig filterConfig) {
log.info(" filter name is 'AuthSignatureFilter' init success");
}
/**
* 过滤器前置处理
*
* @param request
* @param response
* @return
*/
@Override
public boolean before(HttpServletRequest request, HttpServletResponse response) {
String url = request.getRequestURI();
// 忽略以下url请求,白名单路径以及swagger路径
if (!ArrayUtils.contains(IGNORE_URLS, url)
&& !ArrayUtils.contains(USE_KEY, url) && !url.startsWith("/payment/webjars") && !url.startsWith(SWAGGER_URL_PREFIX)) {
if (REQUEST_METHOD_OPTIONS_VALUE.equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return false;
} else {
String token = request.getHeader("token");
if (null==token){
response(response, ResultBody.error(ResultEnum.THE_REQUEST_IS_NOT_AUTHENTICATED));
return false;
}
String s = stringRedisTemplate.opsForValue().get(token);
if (null==s){
response(response,ResultBody.error(ResultEnum.THE_TOKEN_IS_INVALID));
return false;
}
UserAccountDTO userAccountDTO = JSON.parseObject(s, UserAccountDTO.class);
try {
Tenant tenant = TenantContext.buildTenant(userAccountDTO.getAccountNo());
if (tenant!=null){
TenantContext.setTenant(tenant);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return true;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
final HttpServletResponse response = (HttpServletResponse) res;
if (!before(request, response)) {
return;
}
chain.doFilter(req, res);
after();
}
/**
* 过滤器后置处理
*
* @return
*/
@Override
public boolean after() {
TenantContext.clear(); // 上下文清理
return true;
}
private static final String APPLICATION_JSON_UTF8 = "application/json;charset=UTF-8";
public static void response(HttpServletResponse response, ResultBody resultBody) {
response.setContentType(APPLICATION_JSON_UTF8);
try {
response
.getWriter()
.write(JSON.toJSONString(ResultBody.error(resultBody.getCode(), resultBody.getMessage())));
} catch (IOException e) {
log.error(e.getMessage());
}
}
private static String toString(Object obj) {
if (null == obj) {
return "";
}
return obj.toString();
}
@Override
public void destroy() {
}
}
package com.mmc.payment.jwt;
/**
* @Author small
* @Date 2023/5/23 19:22
* @Version 1.0
*/
public interface JwtConstant {
public final static String BASE64KEY = "sharefly@mmc20220616";
public final static String SUBJECT = "cloud_shared_flight_token";
public final static String ISSUER = "mmc";
public final static long EXPIRATION = 1 * 24 * 60 * 60 * 1000L;
public final static long SXTB_PC_LOGIN_INVALID = 1 * 24 * 60 * 60 * 1000L;
public final static String USERIDKEY = "uid";
public final static String ROLEIDKEY = "roleId";
public final static String TOKENKEY = "token";
public final static String TOKEN_TYPE = "TOKEN_TYPE";
public final static String SXTB_ACCOUNT_TOKEN = "SXTB_ACCOUNT_TOKEN";// 神行太保平台平台token
public final static String CSF_USER_ACCOUNT_TOKEN = "USER_ACCOUNT_TOKEN";// 云享飞-用户-token
public final static String CSF_FLYER_ACCOUNT_TOKEN = "FLYER_ACCOUNT_TOKEN";// 飞手-token
public final static String CSF_REPO_ACCOUNT_TOKEN = "REPO_ACCOUNT_TOKEN";// 飞手-token
public final static String MALL_USER_ACCOUNT_TOKEN = "MALL_USER_ACCOUNT_TOKEN";// 商城-token
public final static String OPEN_API_ACCESS_TOKEN = "OPENAPI_ACCESS_TOKEN";// OAUTH-client-token
public final static String AUTHORIZATION = "Authorization";
public final static String GRANT_TYPE = "grant_type";
public final static String CLIENT_CREDENTIALS = "client_credentials";
public final static long OAUTH_EXPIRATION = 1 * 24 * 60 * 60 * 1000L;
public final static String CLIENT_ID_KEY = "MMC_CLIENT_ID_KEY";
public final static String CLIENT_ROLE_KEY = "MMC_CLIENT_ROLE_KEY";
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small @Date 2023/5/23 19:15 @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
// @ApiModel(value = "com.mmc.csf.model.dto.BaseAccountDTO", description = "登录信息DTO")
public class BaseAccountDTO implements Serializable {
private static final long serialVersionUID = -2979712090903806216L;
@ApiModelProperty(value = "token")
private String token;
@ApiModelProperty(value = "账号id")
private Integer userAccountId;
@ApiModelProperty(value = "账号")
private String accountNo;
@ApiModelProperty(value = "账号uid")
private String uid;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "用户昵称")
private String nickName;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/23 19:16
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyCacheDTO implements Serializable {
@ApiModelProperty(value = "单位ID")
private Integer id;
@ApiModelProperty(value = "单位名称")
private String company;
@ApiModelProperty(value = "是否为管理单位:0否 1是",hidden = true)
private Integer manage;
@ApiModelProperty(value = "当前单位ID+子级单位ID的集合",hidden = true)
private List<Integer> companys;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/24 10:18
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.sharefly.dto.CompanySimpleDTO", description = "单位信息DTO")
public class CompanySimpleDTO implements Serializable {
private static final long serialVersionUID = 2541404541696571857L;
@ApiModelProperty(value = "单位ID")
private Integer id;
@ApiModelProperty(value = "单位名称")
private String company;
@ApiModelProperty(value = "账号类型:0合伙人 1员工")
private Integer userType;
@ApiModelProperty(value = "是否为管理单位:0否 1是",hidden = true)
private Integer manage;
@ApiModelProperty(value = "当前单位ID+子级单位ID的集合",hidden = true)
private List<Integer> companys;
}
package com.mmc.payment.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/24 9:55
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CurrentUserDTO implements Serializable {
private static final long serialVersionUID = -2302598593780513593L;
private Integer id;
private Integer roleId;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/27 15:31
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.ExpStationsDTO", description = "物流信息DTO")
public class ExpStationsDTO implements Serializable {
private static final long serialVersionUID = 8737447241343561076L;
@ApiModelProperty(value = "物流状态:查字典")
private String Action;
@ApiModelProperty(value = "描述")
private String AcceptStation;
@ApiModelProperty(value = "时间")
private String AcceptTime;
@ApiModelProperty(value = "所在城市")
private String Location;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/27 15:31
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.KdnExpDTO", description = "物流信息DTO")
public class KdnExpDTO implements Serializable {
private static final long serialVersionUID = 4129710329541565557L;
@ApiModelProperty(value = "物流状态:查字典")
private String StateEx;
@ApiModelProperty(value = "快递公司编码:查字典")
private String ShipperCode;
@ApiModelProperty(value = "物流单号")
private String LogisticCode;
@ApiModelProperty(value = "快递流转信息")
private List<ExpStationsDTO> Traces;
}
package com.mmc.payment.model.dto;
import com.mmc.payment.entity.RepoCashDO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Author small
* @Date 2023/5/27 15:16
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.OrderInfoDTO", description = "云仓订单DTO")
public class OrderInfoDTO implements Serializable {
private static final long serialVersionUID = 1572467108563651846L;
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "商品ID")
private Integer wareInfoId;
@ApiModelProperty(value = "商品编号")
private String wareNo;
@ApiModelProperty(value = "商品标题")
private String wareTitle;
@ApiModelProperty(value = "商品图片")
private String wareImg;
@ApiModelProperty(value = "套餐(sku)ID")
private Integer skuInfoId;
@ApiModelProperty(value = "套餐(sku)名称")
private String skuTitle;
@ApiModelProperty(value = "购买用户ID")
private Integer repoAccountId;
@ApiModelProperty(value = "用户UID")
private String uid;
@ApiModelProperty(value = "买家name")
private String buyerName;
@ApiModelProperty(value = "买家电话")
private String buyerPhone;
@ApiModelProperty(value = "单价")
private BigDecimal unitPrice;
@ApiModelProperty(value = "购买的商品数量")
private Integer wareNum;
@ApiModelProperty(value = "应付款金额")
private BigDecimal shouldPay;
@ApiModelProperty(value = "实收款金额")
private BigDecimal actualPay;
@ApiModelProperty(value = "订单类型:0租赁 100购买")
private Integer orderType;
@ApiModelProperty(value = "押金")
private BigDecimal deposit;
@ApiModelProperty(value = "租金总金额")
private BigDecimal rentPrice;
@ApiModelProperty(value = "租约开始日")
private Date startDate;
@ApiModelProperty(value = "租约结束日")
private Date endDate;
@ApiModelProperty(value = "付款天数")
private Integer payDay;
@ApiModelProperty(value = "交易状态:查订单状态字典")
private String tranStatus;
@ApiModelProperty(value = "减库方式 0:买家拍下减库存 1:卖家付款减库存")
private Integer exWare;
@ApiModelProperty(value = "用户备注")
private String remark;
@ApiModelProperty(value = "平台人员备注")
private String pfRemark;
@ApiModelProperty(value = "关闭原因")
private String shutReason;
@ApiModelProperty(value = "交易编号")
private String payNo;
@ApiModelProperty(value = "支付时间")
private Date payTime;
@ApiModelProperty(value = "发货时间")
private Date sendWareTime;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "物流信息/收货地址信息")
private OrderReceiptDTO receipt;
@ApiModelProperty(value = "退款单详情信息,无则为null")
private OrderRefundDTO orderRefund;
@ApiModelProperty(value = "发货-物流动态,无则为null")
private KdnExpDTO express;
@ApiModelProperty(value = "退货-物流动态,无则为null")
private KdnExpDTO refundExpress;
@ApiModelProperty(value = "质检详情,无则为null")
private List<OrderVcuDTO> vcus;
public RepoCashDO buildRepoCashDO() {
return RepoCashDO.builder().uid(this.uid).accountName(this.buyerName).orderInfoId(this.id)
.orderNo(this.orderNo).skuInfoId(this.skuInfoId).skuTitle(this.skuTitle).wareInfoId(this.wareInfoId)
.wareTitle(this.wareTitle).wareNo(this.wareNo).build();
}
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/27 15:27
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.OrderReceiptDTO", description = "订单收货信息DTO")
public class OrderReceiptDTO implements Serializable {
private static final long serialVersionUID = -6212026509857770276L;
@ApiModelProperty(value = "地址ID")
private Integer id;
@ApiModelProperty(value = "收货方式:0邮寄 1门店地址")
private Integer receiptMethod;
@ApiModelProperty(value = "0-收货人姓名")
private String takeName;
@ApiModelProperty(value = "0-收货人电话")
private String takePhone;
@ApiModelProperty(value = "0-收货区域")
private String region;
@ApiModelProperty(value = "0-收获详细地址")
private String detailAddress;
@ApiModelProperty(value = "1-门店名称")
private String repoName;
@ApiModelProperty(value = "1-门店详细地址")
private String repoAddress;
@ApiModelProperty(value = "1-预留手机号")
private String bookPhone;
@ApiModelProperty(value = "发货-物流公司码")
private String sendExCode;
@ApiModelProperty(value = "发货-物流单号")
private String sendExNo;
@ApiModelProperty(value = "发货地址")
private String sendAddress;
@ApiModelProperty(value = "退还货方式:0邮寄 1门店地址")
private Integer renMethod;
@ApiModelProperty(value = "退还货-收货电话")
private String renPhone;
@ApiModelProperty(value = "退还货-收货人")
private String renName;
@ApiModelProperty(value = "退还货-物流公司码")
private String renExCode;
@ApiModelProperty(value = "退还货-物流单号")
private String renExNo;
@ApiModelProperty(value = "退还货-地址")
private String renAddress;
@ApiModelProperty(value = "退还货-门店名称")
private String renRepoName;
@ApiModelProperty(value = "退还货-门店地址")
private String renRepoAddr;
@ApiModelProperty(value = "退还货-门店联系电话")
private String renRepoPhone;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Author small
* @Date 2023/5/27 15:27
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "com.mmc.csf.model.dto.OrderRefundDTO", description = "退款单DTO")
public class OrderRefundDTO implements Serializable {
private static final long serialVersionUID = -6124933008580173589L;
@ApiModelProperty(value = "退款单ID")
private Integer id;
@ApiModelProperty(value = "订单ID")
private Integer orderInfoId;
@ApiModelProperty(value = "退款单号")
private String refundNo;
@ApiModelProperty(value = "退款单状态:查字典")
private Integer refundStatus;
@ApiModelProperty(value = "应退款金额")
private BigDecimal shouldRefund;
@ApiModelProperty(value = "实际退款金额")
private BigDecimal actualRefund;
@ApiModelProperty(value = "退款理由")
private String reason;
@ApiModelProperty(value = "创建时间/申请时间")
private Date createTime;
@ApiModelProperty(value = "退款-设备情况(图片&视频)")
private OrderVcuDTO orderVcu;
@ApiModelProperty(value = "订单信息")
private OrderInfoDTO orderInfo;
@ApiModelProperty(value = "退款协商历史")
private List<RefundLogDTO> rlogs;
@ApiModelProperty(value = "退款流水信息")
private RepoCashDTO refundCash;
@ApiModelProperty(value = "平台备注")
private String pfRemark;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/27 15:27
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "com.mmc.csf.model.dto.OrderVcuDTO", description = "订单凭证DTO")
public class OrderVcuDTO implements Serializable {
private static final long serialVersionUID = -7101242524092899210L;
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "订单ID")
private Integer orderInfoId;
@ApiModelProperty(value = "0:发货 1:收货 2:归还 3:平台收货")
private Integer vcuType;
@ApiModelProperty(value = "设备状况:0无问题 1有问题")
private Integer vcuSatus;
@ApiModelProperty(value = "描述-备注")
private String remark;
@ApiModelProperty(value = "图片集合")
private List<String> imgs;
@ApiModelProperty(value = "视频")
private String videoUrl;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/27 15:22
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.PayCashResultDTO", description = "云仓支付扣款DTO")
public class PayCashResultDTO implements Serializable {
private static final long serialVersionUID = 5187623898281150213L;
@ApiModelProperty(value = "响应状态(200成功,其他失败)")
private String status;
@ApiModelProperty(value = "响应消息")
private String message;
@ApiModelProperty(value = "交易编号")
private String payNo;
@ApiModelProperty(value = "本次操作支付现金金额")
private BigDecimal cashPaid;
public static PayCashResultDTO error(String status, String message) {
return PayCashResultDTO.builder().status(status).message(message).build();
}
public static PayCashResultDTO success(BigDecimal cashPaid, String payNo) {
return PayCashResultDTO.builder().status("200").message("success").cashPaid(cashPaid).payNo(payNo).build();
}
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/27 15:30
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RefundLogDTO", description = "退款logDTO")
public class RefundLogDTO implements Serializable {
private static final long serialVersionUID = 6524395508534109389L;
@ApiModelProperty(value = "内容")
private String msg;
@ApiModelProperty(value = "账号")
private String opAccount;
@ApiModelProperty(value = "名称")
private String opName;
@ApiModelProperty(value = "创建/发送时间")
private Date createTime;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;
/**
* @Author small
* @Date 2023/5/23 19:13
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RepoAccountDTO", description = "云仓账号信息DTO")
public class RepoAccountDTO implements Serializable {
private static final long serialVersionUID = 1433562781546856233L;
@ApiModelProperty(value = "用户id")
private Integer id;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "账号名称")
private String accountName;
@ApiModelProperty(value = "账号类型")
private Integer accountType;
@ApiModelProperty(value = "联系电话")
private String phoneNum;
@ApiModelProperty(value = "实名认证状态")
private Integer realAuthStatus;
@ApiModelProperty(value = "企业认证状态")
private Integer entAuthStatus;
@ApiModelProperty(value = "渠道认证状态")
private Integer channelAuthStatus;
@ApiModelProperty(value = "渠道等级")
private Integer channelClass;
@ApiModelProperty(value = "常驻城市")
private String resAddress;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "头像url")
private String headerImg;
@ApiModelProperty(value = "经度")
private BigDecimal lon;
@ApiModelProperty(value = "纬度")
private BigDecimal lat;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "删除状态,0未删除,1删除")
private Integer deleted;
@ApiModelProperty(value = "企业名称")
private String entName;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "企业认证时间")
private Date entAuthTime;
@ApiModelProperty(value = "生成时间")
private Date createTime;
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@ApiModelProperty(value = "现金余额")
private BigDecimal cashAmt;
private String unionId;
private String openId;
@ApiModelProperty(value = "多端用户,USER_PORT(云享飞)-FLYER_PORT(云飞手)-REPO_PORT(云仓)")
private Set<String> ports;
@ApiModelProperty(value = "用户推荐人数量")
private Integer rcdRepoTeamNum;
@ApiModelProperty(value = "推荐人Uid")
private String rcdUid;
@ApiModelProperty(value = "推荐人账户名称")
private String rcdAccountName;
@ApiModelProperty(value = "推荐人昵称")
private String rcdNickName;
@ApiModelProperty(value = "推荐人id")
private Integer rcdAccountId;
@ApiModelProperty(value = "是否销售")
private Integer sale;
@ApiModelProperty(value = "是否白名单")
private Integer white;
@ApiModelProperty(value = "用户来源:0自然流,1海报,2抖音,3公众号,4社群,5招投标,默认0")
private Integer source;
@ApiModelProperty(value = "推荐单位")
private String company;
@ApiModelProperty(value = "推荐单位ID", hidden = true)
private Integer rcdCompanyId;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Author small
* @Date 2023/5/24 9:56
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RepoBannerDTO", description = "现金流水DTO")
public class RepoCashDTO implements Serializable {
private static final long serialVersionUID = 4569221850373256579L;
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "用户ID", hidden = true)
private Integer repoAccountId;
@ApiModelProperty(value = "用户UID", hidden = true)
private String uid;
@ApiModelProperty(value = "用户名", hidden = true)
private String accountName;
@ApiModelProperty(value = "订单ID", hidden = true)
private Integer orderInfoId;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "skuID", hidden = true)
private Integer skuInfoId;
@ApiModelProperty(value = "sku标题", hidden = true)
private String skuTitle;
@ApiModelProperty(value = "商品ID", hidden = true)
private Integer wareInfoId;
@ApiModelProperty(value = "商品编号", hidden = true)
private String wareNo;
@ApiModelProperty(value = "商品标题")
private String wareTitle;
@ApiModelProperty(value = "流水编号")
private String payNo;
@ApiModelProperty(value = "流水类型:查字典")
private Integer payMethod;
@ApiModelProperty(value = "变动金额")
private BigDecimal amtPaid;
@ApiModelProperty(value = "当前余额")
private BigDecimal cashAmt;
@ApiModelProperty(value = "支付时间")
private Date payTime;
@ApiModelProperty(value = "退款流水编号")
private String refundNo;
@ApiModelProperty(value = "凭证")
private List<String> voucher;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "操作人账号")
private String opNo;
@ApiModelProperty(value = "操作人姓名")
private String opName;
private Integer createUser;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/23 20:01
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
//@ApiModel(value = "com.mmc.csf.model.dto.RepoRcdTeamDTO", description = "云仓推荐团队DTO")
public class RepoRcdTeamDTO implements Serializable {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "账户名称")
private String RepoAccountName;
@ApiModelProperty(value = "uid")
private String uid;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "发展时间")
private Date createTime;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "企业认证状态:0未认证1已认证")
private Integer entAuthStatus;
@ApiModelProperty(value = "实名认证:0未实名1已实名2未通过")
private Integer realAuthStatus;
@ApiModelProperty(value = "账户类型 0游客1普通用户")
private Integer accountType;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "entName")
private String entName;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/23 20:01
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RepoRebateWalletDTO", description = "奖励管理DTO")
public class RepoRebateWalletDTO implements Serializable {
private static final long serialVersionUID = 4874698532029550117L;
@ApiModelProperty(value = "UID")
private String uid;
@ApiModelProperty(value = "用户ID")
private Integer repoAccountId;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "可提现-奖励金余额")
private BigDecimal rcdRebateAmt;
@ApiModelProperty(value = "提现中(冻结中)金额")
private BigDecimal rebateFreeze;
@ApiModelProperty(value = "已提现金额")
private BigDecimal rebateWdl;
@ApiModelProperty(value = "累计总额")
private BigDecimal totalRebate;
@ApiModelProperty(value = "团队人数")
private Integer teamUserNum;
public void computerTotalRebate() {
this.totalRebate = BigDecimal.ZERO;
if (this.rcdRebateAmt != null && this.rcdRebateAmt.compareTo(BigDecimal.ZERO) > 0) {
this.totalRebate = this.totalRebate.add(rcdRebateAmt);
}
if (this.rebateFreeze != null && this.rebateFreeze.compareTo(BigDecimal.ZERO) > 0) {
this.totalRebate = this.totalRebate.add(rebateFreeze);
}
if (this.rebateWdl != null && this.rebateWdl.compareTo(BigDecimal.ZERO) > 0) {
this.totalRebate = this.totalRebate.add(rebateWdl);
}
this.totalRebate = this.totalRebate.setScale(2, BigDecimal.ROUND_DOWN);
}
public void defaultValue() {
this.rcdRebateAmt = this.rcdRebateAmt == null ? BigDecimal.ZERO : this.rcdRebateAmt;
this.rebateFreeze = this.rebateFreeze == null ? BigDecimal.ZERO : this.rebateFreeze;
this.rebateWdl = this.rebateWdl == null ? BigDecimal.ZERO : this.rebateWdl;
this.totalRebate = this.totalRebate == null ? BigDecimal.ZERO : this.totalRebate;
}
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/23 19:35
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RepoWalletDTO", description = "钱包DTO")
public class RepoWalletDTO implements Serializable {
private static final long serialVersionUID = 5306992787421065922L;
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "用户ID")
private Integer repoAccountId;
@ApiModelProperty(value = "现金余额")
private BigDecimal cashAmt;
@ApiModelProperty(value = "已付金额")
private BigDecimal cashPaid;
@ApiModelProperty(value = "冻结中-金额")
private BigDecimal cashFreeze;
@ApiModelProperty(value = "奖励-余额")
private BigDecimal rcdRebateAmt;
@ApiModelProperty(value = "累计提现")
private BigDecimal rebateWdl;
@ApiModelProperty(value = "提现冻结金额")
private BigDecimal rebateFreeze;
@ApiModelProperty(value = "平台备注")
private String remark;
public void defaultRebateValue() {
if (this.rcdRebateAmt == null) {
this.rcdRebateAmt = BigDecimal.ZERO;
}
if (this.rebateWdl == null) {
this.rebateWdl = BigDecimal.ZERO;
}
}
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/24 10:19
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.RoleInfoDTO", description = "角色信息DTO")
public class RoleInfoDTO implements Serializable {
private static final long serialVersionUID = -4791023169682602298L;
@ApiModelProperty(value = "角色ID")
private Integer id;
@ApiModelProperty(value = "角色编号")
private String roleNo;
@ApiModelProperty(value = "角色名称")
private String roleName;
@ApiModelProperty(value = "是否为管理角色:0否 1是")
private Integer admin;// 是否为管理角色
@ApiModelProperty(value = "是否为运营角色:0否 1是")
private Integer operate;
@ApiModelProperty(value = "是否为系统角色:0否 1是")
private Integer system;
@ApiModelProperty(value = "是否为PMC发货角色:0否 1是")
private Integer pmc;//PMC发货角色
@ApiModelProperty(value = "是否可用:0否 1是")
private Integer roleStatus;
@ApiModelProperty(value = "备注")
private String remark;
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/24 10:18
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.UserAccountDTO", description = "用户信息DTO")
public class UserAccountDTO implements Serializable {
private static final long serialVersionUID = -3760693134872196985L;
@ApiModelProperty(value = "用户ID")
private Integer id;
@ApiModelProperty(value = "UID")
private String uid;
@ApiModelProperty(value = "账号")
private String accountNo;
@ApiModelProperty(value = "密码")
private String passWord;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "姓名")
private String userName;
@ApiModelProperty(value = "身份证号码")
private String idNumber;
@ApiModelProperty(value = "电话号码")
private String phoneNum;
@ApiModelProperty(value = "性别:0未知 1男 2女 ")
private Integer userSex;
@ApiModelProperty(value = "常住地址")
private String resAddres;
private Integer realAuthStatus;
@ApiModelProperty(value = "常住地址-经度")
private String longitude;
@ApiModelProperty(value = "常住地址-纬度")
private String latitude;
@ApiModelProperty(value = "是否企业用户:0否 1是")
private Integer entUser;
@ApiModelProperty(value = "是否渠道用户:0否 1是")
private Integer channelUser;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "账号类型:0神行太保平台账号 ; 100云享飞-客户端; 101云享飞-飞手端; 102云享飞-云仓端")
private Integer accountType;
@ApiModelProperty(value = "账号状态:0禁用 1可用")
private Integer accountStatus;
@ApiModelProperty(value = "角色信息")
private RoleInfoDTO roleInfo;
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@ApiModelProperty(value = "身份证正面照")
private String frontIdImg;
@ApiModelProperty(value = "身份证反面照")
private String backIdImg;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "单位信息")
private CompanySimpleDTO companyInfo;
private Integer rcdCompanyId;
@ApiModelProperty(value = "渠道等级")
private String channelLevel;
@ApiModelProperty(value = "法大大企业认证状态")
private Integer entVerifyStatus;
public UserAccountDTO(Integer id, String uid, String nickName) {
this.id = id;
this.uid = uid;
this.nickName = nickName;
}
}
package com.mmc.payment.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/25 17:50
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserAccountSimpleDTO implements Serializable {
private static final long serialVersionUID = 3451336520607073343L;
@ApiModelProperty(value = "用户id")
private Integer id;
@ApiModelProperty(value = "用户类型")
private Integer accountType;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "用户名称")
private String userName;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "用户性别:0未知、1男、2女")
private Integer userSex;
@ApiModelProperty(value = "用户邮箱")
private String email;
@ApiModelProperty(value = "用户来源,0自然流、1海报、2抖音、3公众号、4社群、5招投标、6官网")
private Integer source;
@ApiModelProperty(value = "用户可用状态:0禁用、1可用")
private Integer accountStatus;
@ApiModelProperty(value = "账号类型:0后台管理账号 ; 100云享飞-客户端;")
private Integer portType;
@ApiModelProperty(value = "企业认证状态, 0未通过,1通过")
private Integer companyAuthStatus;
}
package com.mmc.payment.model.qo;
import com.mmc.payment.common.Freeze;
import com.mmc.payment.common.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* @Author small
* @Date 2023/5/23 19:18
* @Version 1.0
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseInfoQO {
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
@ApiModelProperty(value = "页码")
@NotNull(message = "页码不能为空", groups = { Page.class, Freeze.class })
@Min(value = 1, groups = Page.class,message = "pageNo不能少于1")
private Integer pageNo;
@ApiModelProperty(value = "每页显示数")
@NotNull(message = "每页显示数不能为空", groups = { Page.class, Freeze.class })
@Min(value = 1, groups = Page.class,message = "pageSize不能少于1")
private Integer pageSize;
/**
* 初始化起始查询行并返回当前页
*/
public Integer buildCurrentPage() {
Integer pageNo = this.pageNo;
this.pageNo = (pageNo - 1) * pageSize;
return pageNo;
}
}
package com.mmc.payment.model.qo;
import com.mmc.payment.common.Page;
import com.mmc.payment.config.UserPorts;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @Author small
* @Date 2023/5/23 19:13
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.qo.RepoAccountQO", description = "云仓账号信息查询QO")
public class RepoAccountQO implements Serializable {
private static final long serialVersionUID = -3425378226992206841L;
@ApiModelProperty(value = "关键字")
private String keyword;
@ApiModelProperty(value = "实名认证状态")
private Integer realAuthStatus;
@ApiModelProperty(value = "企业认证状态")
private Integer entAuthStatus;
@ApiModelProperty(value = "用户类型")
private Integer accountType;
@ApiModelProperty(value = "注册开始时间")
private Date startTime;
@ApiModelProperty(value = "注册结束时间")
private Date endTime;
@ApiModelProperty(value = "是否渠道")
private Integer channelAuthStatus;
@ApiModelProperty(value = "渠道等级")
private Integer channelClass;
@ApiModelProperty(value = "是否销售")
private Integer sale;
@ApiModelProperty(value = "是否白名单")
private Integer white;
@ApiModelProperty(value = "用户来源:0自然流,1海报,2抖音,3公众号,4社群,5招投标,默认0")
private Integer source;
@ApiModelProperty(value = "用户ID", hidden = true)
private List<Integer> accountIds;
@ApiModelProperty(value = "多端用户,USER_PORT(云享飞)-FLYER_PORT(云飞手)-REPO_PORT(云仓)")
private Set<String> ports;
@ApiModelProperty(value = "多端用户(差集),USER_PORT(云享飞)-FLYER_PORT(云飞手)-REPO_PORT(云仓)", hidden = true)
private Set<String> eports;
@ApiModelProperty(value = "推荐单位ID")
private Integer rcdCompanyId;
@ApiModelProperty(value = "单位ID", hidden = true)
private List<Integer> companys;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
public void buildEports() {
if (!CollectionUtils.isEmpty(this.ports)) {
this.eports = UserPorts.ports.stream().filter(d -> !this.ports.contains(d)).collect(Collectors.toSet());
}
}
}
package com.mmc.payment.model.qo;
import com.mmc.payment.common.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @Author small
* @Date 2023/5/24 9:56
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.qo.RepoCashQO", description = "现金变更QO")
public class RepoCashQO implements Serializable {
private static final long serialVersionUID = 8705749845968042632L;
@ApiModelProperty(value = "用户ID")
@NotNull(message = "用户ID不能为空", groups = Page.class)
private Integer repoAccountId;
@ApiModelProperty(value = "关键字")
private String keyword;
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
@ApiModelProperty(value = "交易类型:查字典")
private Integer payMethod;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
package com.mmc.payment.model.qo;
import com.mmc.payment.common.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @Author small
* @Date 2023/5/24 10:18
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.qo.UserAccountQO", description = "账号查询条件封装类")
public class UserAccountQO implements Serializable {
private static final long serialVersionUID = -2780882438255193738L;
@ApiModelProperty(value = "关键字", required = false)
private String keyword;
@ApiModelProperty(value = "地区", required = false)
private String area;
@ApiModelProperty(value = "角色id", required = false)
private Integer roleId;
@ApiModelProperty(value = "账号状态:0禁用 1可用")
private Integer accountStatus;
@ApiModelProperty(value = "账号状态:0合伙人 1员工")
private Integer userType;
@ApiModelProperty(value = "用户id集合")
private List<Integer> userIds;
@ApiModelProperty(value = "推荐单位id")
private Integer rcdCompanyId;
@ApiModelProperty(value="单位集合", hidden = true)
private List<Integer> companys;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
package com.mmc.payment.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.annotations.Update;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/23 19:39
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.RepoAccountVO", description = "微信用户信息修改VO")
public class RepoAccountVO implements Serializable {
private static final long serialVersionUID = -2060063935512185318L;
@ApiModelProperty(value = "repoAccountId")
@NotNull(message = "repoAccountId不能为空", groups = Update.class)
private Integer id;
@ApiModelProperty(value = "nickName")
private String nickName;
@ApiModelProperty(value = "常驻地址")
private String resAddress;
@ApiModelProperty(value = "经度")
private BigDecimal lon;
@ApiModelProperty(value = "纬度")
private BigDecimal lat;
@ApiModelProperty(value = "头像")
private String headerImg;
}
package com.mmc.payment.model.vo;
import com.mmc.payment.common.Create;
import com.mmc.payment.common.Refund;
import com.mmc.payment.common.Share;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @Author small @Date 2023/5/24 10:04 @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
// @ApiModel(value = "com.mmc.csf.model.vo.RepoCashVO", description = "现金变更VO")
public class RepoCashVO implements Serializable {
private static final long serialVersionUID = 1828354753495845609L;
/* @ApiModelProperty(value = "用户ID")
@NotNull(
message = "用户ID不能为空",
groups = {Create.class})
private Integer repoAccountId;*/
/* @ApiModelProperty(value = "订单ID")
@NotNull(
message = "orderRefundId不能为空",
groups = {Refund.class})
private Integer orderRefundId;
@ApiModelProperty(value = "返租订单ID")
@NotNull(
message = "shareOrderId不能为空",
groups = {Share.class})
private Integer shareOrderId;*/
@ApiModelProperty(value = "变动金额")
@NotNull(
message = "变动金额不能为空",
groups = {Create.class, Refund.class})
private BigDecimal amtPaid;
@ApiModelProperty(value = "凭证图片集合")
private List<String> voucher;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "操作人员密码")
@NotNull(
message = "变动金额不能为空",
groups = {Refund.class, Share.class})
private String authPwd;
}
package com.mmc.payment.model.vo;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.dto.OrderInfoDTO;
import com.mmc.payment.model.dto.RepoAccountDTO;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/5/27 15:23
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.vo.RepoOrderPayVO", description = "订单支付VO")
public class RepoOrderPayVO implements Serializable {
private static final long serialVersionUID = 8149373745729826654L;
private BaseAccountDTO account;
private OrderInfoDTO orderInfo;
private ShareOrderDTO shareOrder;
private RepoAccountDTO repoAccount;
private RepoCashVO payCash;
private BigDecimal amtPaid;
private String refundNo;
}
package com.mmc.payment.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @Author small
* @Date 2023/5/27 15:23
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
//@ApiModel(value = "com.mmc.csf.model.dto.ShareOrderDTO", description = "共享设备订单DTO")
public class ShareOrderDTO implements Serializable {
private static final long serialVersionUID = -1395178773843809078L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "用户id")
private Integer repoAccountId;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "用户手机号")
private String phoneNum;
@ApiModelProperty(value = "设备品牌")
private String deviceBrand;
@ApiModelProperty(value = "地区")
private String region;
@ApiModelProperty(value = "状态:查字典")
private Integer sdStatus;
@ApiModelProperty(value = "设备ID")
private String deviceCode;
@ApiModelProperty(value = "设备型号")
private String deviceModel;
@ApiModelProperty(value = "用户备注")
private String remark;
@ApiModelProperty(value = "平台备注")
private String pfRemark;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "修改人ID", hidden = true)
private Integer updateUser;
@ApiModelProperty(value = "操作人-名字")
private String opName;
@ApiModelProperty(value = "操作人-账号")
private String opNo;
}
package com.mmc.payment.service.Impl;
import com.mmc.payment.common.PageResult;
import com.mmc.payment.dao.RepoAccountDao;
import com.mmc.payment.entity.RepoWalletDO;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.dto.RepoAccountDTO;
import com.mmc.payment.model.dto.RepoWalletDTO;
import com.mmc.payment.model.qo.RepoAccountQO;
import com.mmc.payment.service.RepoAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author small @Date 2023/5/23 19:12 @Version 1.0
*/
@Service
public class RepoAccountServiceImpl implements RepoAccountService {
@Autowired private RepoAccountDao repoAccountDao;
@Override
public PageResult listPagePayManager(RepoAccountQO param, BaseAccountDTO cuser) {
/*if(!cuser.isManage()){
param.setCompanys(cuser.getCompanyInfo().getCompanys());
}*/
int count = repoAccountDao.countPagePayManager(param);
if (count == 0) {
return PageResult.buildPage(param.getPageNo(), param.getPageSize(), count);
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<RepoAccountDTO> data =
repoAccountDao.listPagePayManager(param).stream()
.map(
d -> {
d.buildName();
return d.buildRepoAccountDTO();
})
.collect(Collectors.toList());
List<Integer> accountIds =
data.stream().map(RepoAccountDTO::getId).collect(Collectors.toList());
param.setAccountIds(accountIds);
// List<RepoWalletDTO> wallets = repoPayServletClient.feignListWalletInfo(param);
List<RepoWalletDTO> wallets = listWalletInfo(param);
Map<Integer, RepoWalletDTO> mapWallet =
wallets.stream()
.collect(
Collectors.toMap(
RepoWalletDTO::getRepoAccountId, wallet -> wallet, (k1, k2) -> k2));
for (RepoAccountDTO ac : data) {
if (mapWallet.containsKey(ac.getId())) {
ac.setCashAmt(mapWallet.get(ac.getId()).getCashAmt());
ac.setRemark(mapWallet.get(ac.getId()).getRemark());
}
}
return PageResult.buildPage(pageNo, param.getPageSize(), count, data);
}
public List<RepoWalletDTO> listWalletInfo(RepoAccountQO param) {
if (CollectionUtils.isEmpty(param.getAccountIds())) {
return java.util.Collections.emptyList();
}
List<RepoWalletDO> wallets = repoAccountDao.listWalletInfo(param);
return wallets.stream()
.map(
d -> {
return d.buildRepoWalletDTO();
})
.collect(Collectors.toList());
}
}
package com.mmc.payment.service;
import com.mmc.payment.common.PageResult;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.qo.RepoAccountQO;
/**
* @Author small
* @Date 2023/5/23 19:10
* @Version 1.0
*/
public interface RepoAccountService {
PageResult listPagePayManager(RepoAccountQO param, BaseAccountDTO cuser);
}
package com.mmc.payment.service;
import com.mmc.payment.common.PageResult;
import com.mmc.payment.common.ResultBody;
import com.mmc.payment.model.dto.BaseAccountDTO;
import com.mmc.payment.model.dto.PayCashResultDTO;
import com.mmc.payment.model.dto.RepoCashDTO;
import com.mmc.payment.model.qo.RepoCashQO;
import com.mmc.payment.model.vo.RepoCashVO;
import com.mmc.payment.model.vo.RepoOrderPayVO;
import java.math.BigDecimal;
/**
* @Author small @Date 2023/5/24 10:06 @Version 1.0
*/
public interface RepoCashService {
PageResult listPageRepoCash(RepoCashQO param);
void updateCashRemark(Integer id, String remark);
/**
* 充值
*
* @param cash
* @return
*/
ResultBody reqCash(BaseAccountDTO cuser, RepoCashVO cash);
ResultBody dedCash(BaseAccountDTO cuser, RepoCashVO cash);
RepoCashDTO getRefundInfo(String refundNo);
BigDecimal RemainingBalance(Integer uid);
PayCashResultDTO orderPayment(BaseAccountDTO currentAccount, String orderNo);
PayCashResultDTO payCashOrder(RepoOrderPayVO orderPay);
}
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default:3306/iuav_payment?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: tmj
password: MMC@2022&MYSQL
redis:
database: 1
host: redis.default
password: MMC@2022&REDIS
port: 6379
jedis:
pool:
max-active: 2
springfox:
documentation:
swagger-ui:
enabled: false
enabled: true #开启文档
aliyun:
oss:
endpoint: oss-cn-shenzhen.aliyuncs.com
access-key-id: LTAI4FzCpyrA33PegnxWS6XV
access-key-secret: ILuNh3zJfRjg3iARSipMWBKCjglz3u
bucket: pad-video-x
mmcflying:
download:
path: /ossservlet/upload/download/
mount:
directory: D:@javaVolume@
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-wz9dd796t4j1giz6t2o.mysql.rds.aliyuncs.com:3306/iuav_payment?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: tmj
password: MMC@2022&MYSQL
redis:
database: 1
host: r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
port: 6379
password: MMC@2022&REDIS
jedis:
pool:
max-active: 2
springfox:
documentation:
swagger-ui:
enabled: false
enabled: true #开启文档
aliyun:
oss:
endpoint: oss-cn-shenzhen.aliyuncs.com
access-key-id: LTAI4FzCpyrA33PegnxWS6XV
access-key-secret: ILuNh3zJfRjg3iARSipMWBKCjglz3u
bucket: pad-video-x
mmcflying:
download:
path: /ossservlet/upload/download/
mount:
directory: D:@javaVolume@
userapp:
url: http://localhost:35150/userapp/
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default:3306/iuav_payment?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: tmj
password: MMC@2022&MYSQL
redis:
database: 1
host: redis.default
port: 6379
password: MMC@2022&REDIS
jedis:
pool:
max-active: 2
springfox:
documentation:
swagger-ui:
enabled: false
enabled: true #开启文档
aliyun:
oss:
endpoint: oss-cn-shenzhen.aliyuncs.com
access-key-id: LTAI4FzCpyrA33PegnxWS6XV
access-key-secret: ILuNh3zJfRjg3iARSipMWBKCjglz3u
bucket: pad-video-x
mmcflying:
download:
path: /ossservlet/upload/download/
mount:
directory: D:@javaVolume@
server:
port: 8088
servlet:
context-path: /payment
spring:
profiles:
active: local
application:
name: payment
mvc:
async:
request-timeout: 600000
pathmatch:
matching-strategy: ANT_PATH_MATCHER
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
logging:
level:
com:
mmc:
payment: DEBUG
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.payment.dao.RepoAccountDao">
<select id="listPagePayManager"></select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.payment.dao.RepoCashDao">
<resultMap id="repoWalletResultMap"
type="com.mmc.payment.entity.RepoWalletDO">
<id property="id" column="id"/>
<result property="repoAccountId" column="repo_account_id"/>
<result property="cashAmt" column="cash_amt"/>
<result property="cashPaid" column="cash_paid"/>
<result property="cashFreeze" column="cash_freeze"/>
<result property="rcdRebateAmt" column="rcd_rebate_amt"/>
<result property="rebateWdl" column="rebate_wdl"/>
<result property="rebateFreeze" column="rebate_freeze"/>
<result property="remark" column="remark"/>
<result property="updateTime" column="create_time"/>
<result property="createTime" column="update_time"/>
</resultMap>
<resultMap id="repoCashResultMap"
type="com.mmc.payment.entity.RepoCashDO">
<id property="id" column="id"/>
<result property="repoAccountId" column="repo_account_id"/>
<result property="uid" column="uid"/>
<result property="accountName" column="account_name"/>
<result property="orderInfoId" column="order_info_id"/>
<result property="orderNo" column="order_no"/>
<result property="skuInfoId" column="sku_info_id"/>
<result property="skuTitle" column="sku_title"/>
<result property="wareInfoId" column="ware_info_id"/>
<result property="wareNo" column="ware_no"/>
<result property="wareTitle" column="ware_title"/>
<result property="payNo" column="pay_no"/>
<result property="payMethod" column="pay_method"/>
<result property="amtPaid" column="amt_paid"/>
<result property="cashAmt" column="cash_amt"/>
<result property="payTime" column="pay_time"/>
<result property="voucher" column="voucher"/>
<result property="refundNo" column="refund_no"/>
<result property="remark" column="remark"/>
<result property="updateTime" column="update_time"/>
<result property="updateUser" column="update_user"/>
<result property="createTime" column="create_time"/>
<result property="createUser" column="create_user"/>
</resultMap>
<select id="getRefundCashInfo" resultMap="repoCashResultMap"
parameterType="Integer">
select c.id,c.repo_account_id,c.ware_title,c.pay_no,
c.order_no,c.refund_no,c.create_user,c.pay_method,
c.amt_paid,c.cash_amt,c.remark,c.voucher,c.pay_time
from repo_cash c
<where>
c.refund_no = #{refundNo}
</where>
</select>
<insert id="insertRepoCash" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.payment.entity.RepoCashDO">
insert into repo_cash
(repo_account_id, uid, account_name, order_info_id, order_no, sku_info_id, sku_title,
ware_info_id, ware_no, ware_title, pay_no, pay_method, amt_paid, cash_amt, pay_time, remark,
voucher, refund_no, update_time, update_user, create_time, create_user)
values (#{repoAccountId}, #{uid}, #{accountName}, #{orderInfoId}, #{orderNo}, #{skuInfoId}, #{skuTitle},
#{wareInfoId}, #{wareNo}, #{wareTitle}, #{payNo}, #{payMethod}, #{amtPaid}, #{cashAmt}, #{payTime},
#{remark},
#{voucher}, #{refundNo}, #{updateTime}, #{updateUser}, #{createTime}, #{createUser})
</insert>
<update id="updateCashRemark">
update repo_cash
set remark = #{remark}
where id = #{id}
</update>
<select id="listPagePFRepoCash" resultMap="repoCashResultMap"
parameterType="com.mmc.payment.model.qo.RepoCashQO">
select c.id,c.repo_account_id,c.ware_title,c.pay_no,
c.order_no,c.refund_no,c.create_user,c.pay_method,
c.amt_paid,c.cash_amt,c.remark,c.voucher
from repo_cash c
<where>
and c.repo_account_id = #{repoAccountId}
<if test=" keyword!=null and keyword!='' ">
and (
c.ware_title like CONCAT('%',#{keyword},'%')
or c.pay_no like CONCAT('%',#{keyword},'%')
or c.order_no like CONCAT('%',#{keyword},'%')
or c.refund_no like CONCAT('%',#{keyword},'%')
)
</if>
<if test=" startTime != null and startTime != '' ">
and c.pay_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test=" endTime != null and endTime != '' ">
and c.pay_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test=" payMethod != null ">
and c.pay_method = #{payMethod}
</if>
</where>
order by c.pay_time desc
limit #{pageNo},#{pageSize}
</select>
<select id="countPagePFRepoCash" resultType="int"
parameterType="com.mmc.payment.model.qo.RepoCashQO">
select count(*)
from repo_cash c
<where>
and c.repo_account_id = #{repoAccountId}
<if test=" keyword!=null and keyword!='' ">
and (
c.ware_title like CONCAT('%',#{keyword},'%')
or c.pay_no like CONCAT('%',#{keyword},'%')
or c.order_no like CONCAT('%',#{keyword},'%')
or c.refund_no like CONCAT('%',#{keyword},'%')
)
</if>
<if test=" startTime != null and startTime != '' ">
and c.pay_time &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test=" endTime != null and endTime != '' ">
and c.pay_time &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d
%H:%i:%s')
</if>
<if test=" payMethod != null ">
and c.pay_method = #{payMethod}
</if>
</where>
</select>
<select id="getRepoWalletInfo" resultMap="repoWalletResultMap">
select w.id,
w.repo_account_id,
w.cash_amt,
w.cash_freeze,
w.cash_paid,
w.rcd_rebate_amt,
w.rebate_wdl,
w.rebate_freeze,
w.create_time,
w.update_time
from repo_wallet w
where w.repo_account_id = #{repoAccountId}
</select>
<update id="updateRepoWalletAmt">
update repo_wallet
set cash_amt = cash_amt + #{chageAmt}
where repo_account_id = #{repoAccountId}
</update>
<select id="RemainingBalance" resultType="java.math.BigDecimal">
select cash_amt
from repo_wallet
where repo_account_id = #{repoAccountId}
</select>
<update id="updateWalletAmt">
update repo_wallet
set cash_amt = cash_amt + #{addAmt},
cash_paid = cash_paid + #{addPaid}
where repo_account_id = #{repoAccountId}
</update>
<insert id="orderPayment" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.payment.entity.RepoCashDO">
insert into repo_cash
(repo_account_id, uid, account_name, order_info_id, order_no, sku_info_id, sku_title,
ware_info_id, ware_no, ware_title, pay_no, pay_method, amt_paid, cash_amt, pay_time, remark,
voucher, refund_no, update_time, update_user, create_time, create_user)
values (#{repoAccountId}, #{uid}, #{accountName}, #{orderInfoId}, #{orderNo}, #{skuInfoId}, #{skuTitle},
#{wareInfoId}, #{wareNo}, #{wareTitle}, #{payNo}, #{payMethod}, #{amtPaid}, #{cashAmt}, #{payTime},
#{remark},
#{voucher}, #{refundNo}, #{updateTime}, #{updateUser}, #{createTime}, #{createUser})
</insert>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论