Browse Source

调整

feature-1.1
wuxicheng 3 years ago
parent
commit
3d2efc73ac
  1. 35
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java
  2. 15
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java
  3. 351
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/CustomParamsValidation.java
  4. 67
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java
  5. 44
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java
  6. 23
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java
  7. 9
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java
  8. 2
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java
  9. 36
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java
  10. 8
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipType.java
  11. 30
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
  12. 94
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java
  13. 20
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java
  14. 31
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml
  15. 4
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
  16. 9
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java
  17. 15
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
  18. 1
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java
  19. 22
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  20. 17
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java
  21. 2
      bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml
  22. 12
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java
  23. 3
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java
  24. 4
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java
  25. 39
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java
  26. 48
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java

35
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java

@ -1,16 +1,12 @@
package com.bnyer.img.api.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Getter
@ -21,15 +17,15 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="主键Id")
private Long id;
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
@ApiModelProperty(value="vip编码")
private String vipCode;
@ApiModelProperty(value="vip名称")
private String vipName;
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) ")
private String vipType;
@ApiModelProperty(value="原价")
private BigDecimal originPrice;
@ -48,25 +44,20 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay;
@ApiModelProperty(value="时长天数")
private Integer days;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private Integer validTimeUnit;
@ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
private Integer validTimeNum;
@ApiModelProperty(value = "会员类型编码")
private String vipTypeCode;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "会员类型名称")
private String vipTypeName;
private static final long serialVersionUID = 1L;
}

15
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java

@ -20,9 +20,18 @@ import java.util.Date;
@NoArgsConstructor
public class VipOrderVo {
@ApiModelProperty(value="主键")
private Long id;
@ApiModelProperty(value="订单id")
private String orderId;
@ApiModelProperty(value="手机号")
private String phone;
@ApiModelProperty(value="用户id")
private Long userId;
@ApiModelProperty(value="vip表id")
private Long vipId;
@ -43,9 +52,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay;
@ -55,9 +61,6 @@ public class VipOrderVo {
@ApiModelProperty(value="支付金额")
private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;

351
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/CustomParamsValidation.java

@ -0,0 +1,351 @@
package com.bnyer.common.core.annotation;
import org.apache.commons.lang3.StringUtils;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.lang.annotation.ElementType.*;
/**
* @author :WXC
* @Date :2023/04/11
* @description :
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = { CustomParamsValidation.CustomParamsValidationImpl.class })
public @interface CustomParamsValidation {
/**
* 预定义的正则表达式
*/
class Regexp{
/**
* 常规输入框匹配中文,字母数字
*/
private final static String INPUTTXT="^[A-Za-z0-9\u4e00-\u9fa5]*$";
/**
* 昵称匹配匹配中文,字母数字 下划线
*/
private final static String NICKNAME="^[A-Za-z0-9_\u4e00-\u9fa5]*$";
/**********以上public 的正则提供 regexp 属性使用**********/
/**********以下private 的正则提供 paramType 计算**********/
/**
* 匹配邮箱
*/
private final static String EMAIL="^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
/**
* uuid
* 格式
* {8}-{4}-{4}-{4}-{12}
*
* 4cbd6c8b-1111-45f4-b477-a524707aedfd
*/
private static final String UUID="^[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}$";
/**
* yyyy-MM-dd
*/
private static final String DATE = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9]))$";
/**
* yyyyMMdd
*/
private static final String DATE2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))$";
/**
* yyyy-MM-dd HH:mm:ss
*/
private static final String DATETIME = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
/**
* yyyyMMddHHmmss
*/
private static final String DATETIME2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
/**
* yyyy-MM-dd HH:mm
*/
private static final String DATETIME3 = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9])$";
/**
* HH:mm:ss
*/
private static final String TIME = "^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
/**
* HHmmss
*/
private static final String TIME2 = "^([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$";
/**
* 手机号码
*/
private static final String MOBILEPHONE="^1\\d{10}$";
/**
* 匹配IPV4地址
*/
private final static String IPV4="((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))";
//=============可以在此扩展正则=============
/**
* 校验正则
* @param regexp
* @param value
* @return
*/
public static boolean validateRegexp(String regexp,String value){
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(value);
return matcher.matches();
}
}
/**
* 预定义的参数类型
*/
class ParamType {
//匹配IPV4地址
public static final String IPV4 = "ipv4";
/**
* uuid
*/
public static final String UUID="uuid";
/**
* 匹配中文
*/
public static final String INPUTTXT="inputtxt";
/**
* 匹配中文英文数字下划线
*/
public static final String NICKNAME="nickname";
/**
* 匹配邮箱
*/
public static final String EMAIL="email";
/**
* 手机号码
*/
public static final String MOBILEPHONE="mobilephone";
/**
* yyyy-MM-dd
*/
public static final String DATE = "yyyy-MM-dd";
/**
* yyyyMMdd
*/
public static final String DATE2 = "yyyyMMdd";
/**
* yyyy-MM-dd HH:mm:ss
*/
public static final String DATETIME = "yyyy-MM-dd HH:mm:ss";
/**
* yyyyMMddHHmmss
*/
public static final String DATETIME2 = "yyyyMMddHHmmss";
/**
* yyyy-MM-dd HH:mm
*/
public static final String DATETIME3 = "yyyy-MM-dd HH:mm";
/**
* HH:mm:ss
*/
public static final String TIME = "HH:mm:ss";
/**
* HHmmss
*/
public static final String TIME2 = "HHmmss";
/**
* 参数类型校验
*
* @param paramType
* @param value
* @return
*/
public static boolean validateParamType(String paramType, String value) {
boolean flag = false;
switch (paramType) {
case ParamType.IPV4:
value = value.replaceAll(" ","");
flag = Regexp.validateRegexp(Regexp.IPV4, value);
break;
case ParamType.MOBILEPHONE: flag = Regexp.validateRegexp(Regexp.MOBILEPHONE, value);break;
case ParamType.NICKNAME: flag = Regexp.validateRegexp(Regexp.NICKNAME, value);break;
case ParamType.EMAIL: flag = Regexp.validateRegexp(Regexp.EMAIL, value);break;
case ParamType.UUID : flag = Regexp.validateRegexp(Regexp.UUID, value);break;
case ParamType.INPUTTXT : flag = Regexp.validateRegexp(Regexp.INPUTTXT, value);break;
case ParamType.DATE : flag = validateDateParamType(ParamType.DATE, value);break;
case ParamType.DATE2 : flag = validateDateParamType(ParamType.DATE2, value);break;
case ParamType.DATETIME : flag = validateDateParamType(ParamType.DATETIME, value);break;
case ParamType.DATETIME2 : flag = validateDateParamType(ParamType.DATETIME2, value);break;
case ParamType.DATETIME3 : flag = validateDateParamType(ParamType.DATETIME3, value);break;
case ParamType.TIME : flag = validateDateParamType(ParamType.TIME, value);break;
case ParamType.TIME2 : flag = validateDateParamType(ParamType.TIME2, value);break;
}
return flag;
}
/**
* dateFormat 属性配置配置的值 不是内置值验证无法通过
* @param dateFormat
* @param value
* @return
*/
private static boolean validateDateParamType(String dateFormat,String value){
String regexp = null;
if(DATE.equals(dateFormat)){
regexp = Regexp.DATE;
}else if(DATE2.equals(dateFormat)){
regexp = Regexp.DATE2;
}else if(DATETIME.equals(dateFormat)){
regexp = Regexp.DATETIME;
}else if(DATETIME2.equals(dateFormat)){
regexp = Regexp.DATETIME2;
}else if(DATETIME3.equals(dateFormat)){
regexp = Regexp.DATETIME3;
}else if(TIME.equals(dateFormat)){
regexp = Regexp.TIME;
}else if(TIME2.equals(dateFormat)){
regexp = Regexp.TIME2;
}
if(regexp!=null){
boolean flag = Regexp.validateRegexp(regexp, value);
//时间不用做2月29日瑞年判断
if(TIME.equals(dateFormat) || TIME2.equals(dateFormat)){
return flag;
}
if(flag){
//月份和日期部分
String monthAndDay = "";
//2月29日常量
String monthAndDayConstant = "";
Integer year = null;
switch (dateFormat) {
case DATE:
case DATETIME:
case DATETIME3:
monthAndDay = StringUtils.substring(value, 5, 10);
monthAndDayConstant = "02-29";
year = Integer.valueOf(StringUtils.substring(value, 0, 4));
break;
case DATE2:
case DATETIME2:
monthAndDay = StringUtils.substring(value, 4, 8);
monthAndDayConstant = "0229";
year = Integer.valueOf(StringUtils.substring(value, 0, 4));
break;
}
//2月29日判断是否是润年,非润年没有2月29日
if(monthAndDay.equals(monthAndDayConstant)){
if(!isLeapYear(year)){
flag = false;
}
}
}
return flag;
}
return false;
}
/**
* 判断是否是润年
* @param year
* @return
*/
private static boolean isLeapYear(int year){
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
}
/**
* 预定义Range
*
*/
class Range{
private static boolean contains(String range,String value){
boolean flag = false;
if(StringUtils.isEmpty(value)){
return false;
}
if(StringUtils.isNotEmpty(range)){
String[] arr = range.split("\\|");
for (String string : arr) {
if(value.equals(string)){
flag = true;
break;
}
}
}
return flag;
}
}
/**
* 参数类型最优先推荐使用的属性
* @return
*/
String paramType() default "";
/**
* 限制字符串或者数字 可选项, | 分割 00|10|20
* @return
*/
String range() default "";
String message() default "参数基本校验不通过错误:注意格式及长度";
Class<?>[]groups() default {};
Class<? extends Payload>[]payload() default {};
class CustomParamsValidationImpl implements ConstraintValidator<CustomParamsValidation,String> {
String paramType;
String range;
@Override
public void initialize(CustomParamsValidation constraintAnnotation) {
paramType = constraintAnnotation.paramType();
range = constraintAnnotation.range();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(StringUtils.isNotEmpty(value)){
//根据参数类型校验正则
if(StringUtils.isNotEmpty(paramType)){
return ParamType.validateParamType(paramType, value);
}
//校验参数范围
if (StringUtils.isNotEmpty(range)){
return Range.contains(range, value);
}
}
return true;
}
}
}

67
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java

@ -1,67 +0,0 @@
package com.bnyer.common.core.annotation;
import org.apache.commons.lang3.StringUtils;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
/**
* @author :WXC
* @Date :2023/03/31
* @description : 自定义参数校验注解
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DiyParamsValidation {
/**
* 限制字符串或者数字 可选项, | 分割 00|10|20
* @return
*/
String range() default "";
/**
* 预定义Range
*
*/
public static class Range{
/**
* 参数只能是0020
*/
public static final String STATE_D_E="00|20";
/**
* 参数只能是001020
*/
public static final String STATE_ALL="00|10|20";
/**
* 参数只能是descasc
*/
public static final String SORT_DIRECTION="desc|asc";
private static boolean contains(String range,String value){
boolean flag = false;
if(StringUtils.isEmpty(value)){
return false;
}
if(StringUtils.isNotEmpty(range)){
String[] arr = range.split("\\|");
for (String string : arr) {
if(value.equals(string)){
flag = true;
break;
}
}
}
return flag;
}
}
String message() default "参数基本校验不通过错误:注意格式及长度";
}

44
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java

@ -21,10 +21,17 @@ public class UserVip extends BaseDomain {
/**
* 主键Id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId(value = "id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value="主键Id")
private Long id;
/**
* vip类型id
*/
@TableField(value = "vip_type_id")
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
/**
* vip名称
*/
@ -39,13 +46,6 @@ public class UserVip extends BaseDomain {
@ApiModelProperty(value="vip编码")
private String vipCode;
/**
* vip类型
*/
@TableField(value = "vip_type")
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) 视频:ai:")
private String vipType;
/**
* 原价
*/
@ -74,13 +74,6 @@ public class UserVip extends BaseDomain {
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
/**
* 时长天数
*/
@TableField(value = "days")
@ApiModelProperty(value="时长天数")
private Integer days;
/**
* 是否到期自动续费(0>;1->)
*/
@ -89,19 +82,18 @@ public class UserVip extends BaseDomain {
private String isDelay;
/**
* 用户客户端类型10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信
* 有效时长单位0天1周2月3季4年
*/
@TableField(value = "user_client_type")
@ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@TableField(value = "valid_time_unit")
@ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private Integer validTimeUnit;
@TableField(value = "category_code")
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/**
* 有效时长表示几天几周几月几年
*/
@TableField(value = "valid_time_num")
@ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
private Integer validTimeNum;
private static final long serialVersionUID = 1L;
}

23
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java

@ -23,7 +23,7 @@ public class UserVipRecord extends BaseDomain {
/**
* 主键id
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId(value = "id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value="主键id")
private Long id;
@ -64,20 +64,6 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="到期时间")
private Date endTime;
/**
* 支付金额
*/
@TableField(value = "price")
@ApiModelProperty(value="支付金额")
private BigDecimal price;
/**
* vip类型
*/
@TableField(value = "vip_type")
@ApiModelProperty(value="vip类型")
private String vipType;
/**
* 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)
*/
@ -92,13 +78,6 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="vip名称")
private String vipName;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/**
* vip类型名称
*/

9
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java

@ -33,7 +33,7 @@ public class VipOrder extends BaseDomain {
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
@TableId(value = "id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value="主键")
private Long id;
@ -151,13 +151,6 @@ public class VipOrder extends BaseDomain {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/**
* vip类型名称
*/

2
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java

@ -54,7 +54,7 @@ public class UserVipDto implements Serializable {
if(StringUtils.isNotBlank(this.getHotSignDesc())){
userVip.setHotSignDesc(this.getHotSignDesc());
}
userVip.setDays(this.getDays());
// userVip.setDays(this.getDays());
userVip.setIsDelay(this.getIsDelay());
return userVip;
}

36
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java

@ -0,0 +1,36 @@
package com.bnyer.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* @author :WXC
* @Date :2023/04/23
* @description :时间单位
*/
@Getter
@AllArgsConstructor
public enum EnumTimeUnit {
DAY(0,"天"),
WEEK(1,"周"),
MONTH(2,"月"),
QUARTER(3,"季"),
YEAR(4,"年"),
HOURS(5,"时"),
MINUTE(6,"分"),
SECONDS(7,"秒"),
;
private final int unit;
private final String name;
public static EnumTimeUnit getEnumTimeUnitByUnit(int unit) {
return Arrays.stream(values())
.filter(vipTimeUnit -> unit == vipTimeUnit.getUnit())
.findFirst().orElseThrow(() -> new SecurityException("unit 未匹配上对应的时间单位"));
}
}

8
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java → bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipType.java

@ -12,7 +12,7 @@ import java.util.Objects;
*/
@Getter
@AllArgsConstructor
public enum EnumVipCategory {
public enum EnumVipType {
IMG_VIP("img","下图会员"),
VIDEO_VIP("video","视频会员"),
@ -25,7 +25,7 @@ public enum EnumVipCategory {
private final String name;
public static String getNameByCode(String code) {
for (EnumVipCategory s : EnumVipCategory.values()) {
for (EnumVipType s : EnumVipType.values()) {
if (Objects.equals(code, s.code)) {
return s.getName();
}
@ -33,9 +33,9 @@ public enum EnumVipCategory {
return null;
}
public static EnumVipCategory getVipCategoryByCode(String code) {
public static EnumVipType getVipTypeByCode(String code) {
return Arrays.stream(values())
.filter(vipCategory -> Objects.equals(vipCategory.getCode(), code))
.findFirst().orElse(EnumVipCategory.UNKNOWN);
.findFirst().orElse(EnumVipType.UNKNOWN);
}
}

30
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java

@ -9,6 +9,7 @@ import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import org.apache.commons.lang3.time.DateFormatUtils;
@ -233,53 +234,60 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
/**
* 根据时间类型+周期创建时间
* @param type 时间类型
* @param unit 时间单位
* @param date 时间
* @param num 周期数
* @return
*/
public static Date getDateByType(int type,Date date,long num){
public static Date getDateByType(EnumTimeUnit unit, Date date, long num){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
String format = "";
switch (type){
case 0:
switch (unit){
case SECONDS:
//秒
LocalDateTime secondsDateTime = localDateTime.plusSeconds(num);
format = secondsDateTime.format(formatter);
break;
case 1:
case MINUTE:
//分
LocalDateTime minuteDateTime = localDateTime.plusMinutes(num);
format = minuteDateTime.format(formatter);
break;
case 2:
case HOURS:
//时
LocalDateTime hoursDateTime = localDateTime.plusHours(num);
format = hoursDateTime.format(formatter);
break;
case 3:
case DAY:
//日
LocalDateTime daysDateTime = localDateTime.plusDays(num);
format = daysDateTime.format(formatter);
break;
case 4:
case MONTH:
//月
LocalDateTime monthsDateTime = localDateTime.plusMonths(num);
format = monthsDateTime.format(formatter);
break;
case 5:
case YEAR:
//年
LocalDateTime yearsDateTime = localDateTime.plusYears(num);
format = yearsDateTime.format(formatter);
break;
case 6:
case WEEK:
//周
LocalDateTime weeksDateTime = localDateTime.plusWeeks(num);
format = weeksDateTime.format(formatter);
break;
case QUARTER:
//季
int monthValue = localDateTime.getMonthValue();
int nextQuarterMonth = (monthValue - 1) / 3 * 3 + ((int) num * 4);
LocalDateTime nextQuarterToday = localDateTime.withMonth(nextQuarterMonth);
format = nextQuarterToday.format(formatter);
break;
default:
throw new IllegalArgumentException("时间类型参数错误");
}
@ -296,7 +304,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
// 下一季度的今天
int currentMonth = now.getMonthValue();
int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + 4;
int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + (2 * 4);
LocalDateTime nextQuarterToday = now.withMonth(nextQuarterMonth);
// 下一年的今天

94
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java

@ -31,53 +31,53 @@ public class UserVipServiceRecordImpl implements UserVipRecordService {
@Override
public boolean payUserVip(PayUserVipDto param) {
UserVipRecord userVipRecord = new UserVipRecord();
//生成订单id
userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr());
//获取分布式锁
RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId());
try{
if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){
//调用支付
//保存订单
userVipRecord.setCreateTime(new Date());
userVipRecord.setUpdateTime(new Date());
userVipRecord.setPrice(new BigDecimal(param.getPrice()));
userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY);
userVipRecord.setIsShow("1");
Date startTime = new Date();
userVipRecord.setStartTime(startTime);
// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){
// //计算月卡(30天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30));
// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){
// //结算季卡(90天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90));
// }else{
// //计算年卡(365天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365));
// }
}else{
userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION);
log.error("用户会员vip支付异常,锁被占用!");
throw new ServiceException("系统繁忙,请稍候重试!");
}
}catch (Exception e){
userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL);
log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage());
throw new ServiceException("系统繁忙,请勿重复操作!");
}finally {
int insert = userVipRecordMapper.insert(userVipRecord);
if(insert > 0){
return true;
}
//释放锁
if(lock.isHeldByCurrentThread()){
lock.unlock();
log.info("用户会员vip支付操作执行完毕,释放锁成功!");
}
}
// UserVipRecord userVipRecord = new UserVipRecord();
// //生成订单id
// userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr());
// //获取分布式锁
// RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId());
// try{
// if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){
// //调用支付
//
// //保存订单
// userVipRecord.setCreateTime(new Date());
// userVipRecord.setUpdateTime(new Date());
// userVipRecord.setPrice(new BigDecimal(param.getPrice()));
// userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY);
// userVipRecord.setIsShow("1");
// Date startTime = new Date();
// userVipRecord.setStartTime(startTime);
//// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){
//// //计算月卡(30天)的结束时间
//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30));
//// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){
//// //结算季卡(90天)的结束时间
//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90));
//// }else{
//// //计算年卡(365天)的结束时间
//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365));
//// }
// }else{
// userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION);
// log.error("用户会员vip支付异常,锁被占用!");
// throw new ServiceException("系统繁忙,请稍候重试!");
// }
// }catch (Exception e){
// userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL);
// log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage());
// throw new ServiceException("系统繁忙,请勿重复操作!");
// }finally {
// int insert = userVipRecordMapper.insert(userVipRecord);
// if(insert > 0){
// return true;
// }
// //释放锁
// if(lock.isHeldByCurrentThread()){
// lock.unlock();
// log.info("用户会员vip支付操作执行完毕,释放锁成功!");
// }
// }
return false;
}
}

20
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java

@ -18,6 +18,9 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="主键Id")
private Long id;
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
@ApiModelProperty(value="vip编码")
private String vipCode;
@ -45,17 +48,20 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay;
@ApiModelProperty(value="时长天数")
private Integer days;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private Integer validTimeUnit;
@ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
private Integer validTimeNum;
@ApiModelProperty(value = "会员类型编码")
private String vipTypeCode;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "会员类型名称")
private String vipTypeName;
private static final long serialVersionUID = 1L;
}

31
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml

@ -6,53 +6,50 @@
<!--@Table img_user_vip-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="vip_name" jdbcType="VARCHAR" property="vipName" />
<result column="vip_name" jdbcType="VARCHAR" property="vipName" />
<result column="vip_code" jdbcType="VARCHAR" property="vipCode" />
<result column="vip_type" jdbcType="VARCHAR" property="vipType" />
<result column="vip_type_id" jdbcType="BIGINT" property="vipTypeId" />
<result column="origin_price" jdbcType="DECIMAL" property="originPrice" />
<result column="price" jdbcType="DECIMAL" property="price" />
<result column="description" jdbcType="VARCHAR" property="description" />
<result column="hot_sign_desc" jdbcType="VARCHAR" property="hotSignDesc" />
<result column="days" jdbcType="INTEGER" property="days" />
<result column="valid_time_unit" jdbcType="INTEGER" property="validTimeUnit" />
<result column="valid_time_num" jdbcType="INTEGER" property="validTimeNum" />
<result column="is_delay" jdbcType="CHAR" property="isDelay" />
<result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" />
<result column="user_client_type" jdbcType="INTEGER" property="userClientType" />
<result column="category_code" jdbcType="VARCHAR" property="categoryCode" />
<result column="category_name" jdbcType="VARCHAR" property="categoryName" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
v.id,
v.vip_name,
v.vip_code,
v.vip_type,
v.vip_type_id,
v.origin_price,
v.price,
v.description,
v.hot_sign_desc,
v.`days`,
v.valid_time_unit,
v.valid_time_num,
v.is_delay,
v.is_show,
v.create_time,
v.update_time,
v.sort,
v.user_client_type,
v.category_code,
v.category_name
v.sort
</sql>
<select id="queryFront" resultType="com.bnyer.img.vo.UserVipVo">
select
<include refid="Base_Column_List"/>
from img_user_vip v
<include refid="Base_Column_List"/>,
vt.type_code AS vip_type_code,
vt.type_name AS vip_type_name
from img_user_vip v left join
img_vip_type vt on vt.id = v.vip_type_id
where v.is_show = '1'
<if test="id!=null">
and v.id=#{id}
</if>
<if test="dataSource!=null and dataSource != ''">
and v.user_client_type=#{userClientType}
</if>
order by sort desc
order by sort asc
</select>
</mapper>

4
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml

@ -10,10 +10,8 @@
<result column="vip_id" jdbcType="BIGINT" property="vipId" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="price" jdbcType="DECIMAL" property="price" />
<result column="vip_name" jdbcType="CHAR" property="vipName" />
<result column="vip_type_name" jdbcType="CHAR" property="vipTypeName" />
<result column="category_name" jdbcType="CHAR" property="categoryName" />
<result column="status" jdbcType="CHAR" property="status" />
<result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@ -22,7 +20,7 @@
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id,order_id, phone,price,vip_name,vip_type_name,category_name,status, vip_id, start_time, end_time,type, is_show, create_time, update_time,
id,order_id, phone,vip_name,vip_type_name,status, vip_id, start_time, end_time, is_show, create_time, update_time,
sort
</sql>
</mapper>

9
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java

@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ -27,9 +28,9 @@ public class AddVipOrderDto implements Serializable {
@ApiModelProperty(value="vip表id")
private Long vipId;
// @NotBlank(message = "用户客户端类型不能为空!")
// @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// private Integer userClientType;
@NotBlank(message = "用户客户端类型不能为空!")
@Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
@ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
}

15
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java

@ -1,6 +1,5 @@
package com.bnyer.order.enums;
import com.bnyer.common.core.enums.EnumVipCategory;
import lombok.AllArgsConstructor;
import lombok.Getter;
@ -14,9 +13,9 @@ import lombok.Getter;
public enum EnumVipType {
//========================下图会员===================
MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP),
SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP),
YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP),
MONTH_CARD("0","月卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP),
SEASON_CARD("1","季卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP),
YEAR_CARD("2","年卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP),
//========================视频会员(待扩展)===================
@ -29,10 +28,10 @@ public enum EnumVipType {
private final String typeName;
private final EnumVipCategory enumVipCategory;
private final com.bnyer.common.core.enums.EnumVipType enumVipType;
public static String getNameByTypeCode(String typeCode) {
for (EnumVipType s : EnumVipType.values()) {
for (EnumVipType s : com.bnyer.order.enums.EnumVipType.values()) {
if (typeCode.equals(s.getTypeCode())) {
return s.getTypeName();
}
@ -41,9 +40,9 @@ public enum EnumVipType {
}
public static String getCategoryByTypeCode(String typeCode){
for (EnumVipType s : EnumVipType.values()) {
for (EnumVipType s : com.bnyer.order.enums.EnumVipType.values()) {
if (typeCode.equals(s.getTypeCode())) {
return s.getEnumVipCategory().getCode();
return s.getEnumVipType().getCode();
}
}
return null;

1
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java

@ -76,7 +76,6 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener<String> {
jsonObject.put("vipId",vipOrder.getVipId());
jsonObject.put("vipName",vipOrder.getVipName());
jsonObject.put("vipTypeName",vipOrder.getVipTypeName());
jsonObject.put("categoryName",vipOrder.getCategoryName());
jsonObject.put("phone",vipOrder.getPhone());
jsonObject.put("userId",vipOrder.getUserId());
return JSON.toJSONString(jsonObject);

22
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java

@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.common.core.domain.R;
import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.common.core.enums.EnumUserClientType;
import com.bnyer.common.core.enums.EnumVipCategory;
import com.bnyer.common.core.enums.EnumVipType;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils;
@ -22,7 +22,7 @@ import com.bnyer.img.api.vo.UserVipVo;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus;
import com.bnyer.order.enums.EnumVipType;
import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.order.mapper.VipOrderMapper;
import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderVo;
@ -113,8 +113,8 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
}
UserVipVo userVipVo = userVipVoList.get(0);
VipOrder vipOrder = null;
EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode());
switch (enumVipCategory){
EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode());
switch (enumVipType){
case IMG_VIP:
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto);
break;
@ -139,17 +139,21 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class);
vipOrder.setPhone(addVipOrderDto.getPhone());
vipOrder.setVipId(addVipOrderDto.getVipId());
vipOrder.setVipName(userVipVo.getVipName());
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setPayAmount(userVipVo.getPrice());
vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode()));
vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType()));
vipOrder.setIsDelay("0");
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setUserId(userId);
// vipOrder.setIsDelay("0");
Date nowDate = new Date();
vipOrder.setStartTime(nowDate);
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit());
//计算会员结束时间
vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(userVipVo.getVipType()), nowDate));
vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate,userVipVo.getValidTimeNum()));
//开通的天数
vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId)));
vipOrder.setUserClientType(addVipOrderDto.getUserClientType());
vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId)));
vipOrder.setCreateTime(nowDate);
return vipOrder;
}

17
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java

@ -1,5 +1,7 @@
package com.bnyer.order.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
@ -19,9 +21,18 @@ import java.util.Date;
@NoArgsConstructor
public class VipOrderVo {
@ApiModelProperty(value="主键")
private Long id;
@ApiModelProperty(value="订单id")
private String orderId;
@ApiModelProperty(value="手机号")
private String phone;
@ApiModelProperty(value="用户id")
private Long userId;
@ApiModelProperty(value="vip表id")
private Long vipId;
@ -42,9 +53,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay;
@ -54,9 +62,6 @@ public class VipOrderVo {
@ApiModelProperty(value="支付金额")
private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;

2
bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml

@ -15,7 +15,6 @@
<result column="is_delay" jdbcType="CHAR" property="isDelay" />
<result column="days" jdbcType="INTEGER" property="days" />
<result column="vip_type_name" jdbcType="INTEGER" property="vipTypeName" />
<result column="category_name" jdbcType="INTEGER" property="categoryName" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="order_status" jdbcType="INTEGER" property="orderStatus" />
@ -43,7 +42,6 @@
o.is_delay,
o.`days`,
o.vip_type_name,
o.category_name,
o.start_time,
o.end_time,
o.order_status,

12
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java

@ -24,16 +24,6 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
@Resource
private PayInfoMapper payInfoMapper;
public <T> T payNotify(Object o,Class<T> tClass,EnumPayType payType){
String string = "";
if (EnumPayType.ALI_PAY == payType){
string = o.toString();
}else if (EnumPayType.WX_PAY == payType){
}
return JSON.parseObject(string,tClass);
}
/**
* 校验是否已支付避免重复调用
* @param checkDto
@ -52,7 +42,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
String notifyPayAmount = checkDto.getPayAmount();
//对账状态
Integer singleStatus = payInfo.getSingleStatus();
log.info("回调中的金额:{},订单中的金额:{}",payInfoPayAmount,notifyPayAmount);
log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount);
if (payInfoPayAmount.equals(notifyPayAmount)){
if (Objects.nonNull(singleStatus)){
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,"OK");

3
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java

@ -15,6 +15,7 @@ import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.EnumPayType;
import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils;
@ -75,7 +76,7 @@ public class AliPayStrategy extends AbstractPayStrategy {
model.setBody(dto.getGoodsDesc());
model.setOutTradeNo(dto.getOrderId());
//直接固定好过期时间比较好
model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(1,dto.getCurrDate(),30)));
model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(EnumTimeUnit.MINUTE,dto.getCurrDate(),30)));
// model.setTimeoutExpress(AliPayConstant.timeoutExpress);
//元
model.setTotalAmount(dto.getPayAmount());

4
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java

@ -1,6 +1,6 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import com.bnyer.common.core.annotation.CustomParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
@ -31,7 +31,7 @@ public class AddPayInfoDto {
private String payType;
@ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1")
@DiyParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI")
@CustomParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI")
private String tradeType;
@ApiModelProperty(value="备注")

39
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java

@ -1,39 +0,0 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class AliPayInOrderDto {
@ApiModelProperty(value="orderId",example = "1")
@NotBlank(message = "orderId 不能为空")
private String orderId;
@ApiModelProperty(value="费用(单位元)",example = "0.01")
@NotBlank(message = "请输入金额(单位元)")
private String payAmount;
@ApiModelProperty(value="用户ip",example = "127.0.0.1")
@NotBlank(message = "请输入终端IP")
private String ip;
@ApiModelProperty(value="商品标题",example = "商品标题")
@NotBlank(message = "请输入支付标题")
private String goodsSubject;
@ApiModelProperty(value="商品描述",example = "商品描述")
@NotBlank(message = "请输入支付描述")
private String goodsDesc;
}

48
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java

@ -1,48 +0,0 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author :WXC
* @Date :2023/04/05
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class WxPayInOrderDto {
@ApiModelProperty(value="orderId",example = "1")
@NotBlank
private String orderId;
@ApiModelProperty(value="timestamp",example = "1111111111")
@NotBlank
private String timestamp;
@ApiModelProperty(value="费用(单位分)",example = "1")
@NotBlank(message = "请输入金额(单位分)")
private String feeFen;
@ApiModelProperty(value="商品描述",example = "商品描述")
@NotBlank(message = "请输入支付描述")
private String goodsDesc;
@ApiModelProperty(value="用户ip",example = "127.0.0.1")
@NotBlank(message = "请输入终端IP")
private String ip;
@ApiModelProperty(value="交易类型[APP不传,JSAPI必传|MINIPROGRAM],APP|JSAPI|MWEB|MINIPROGRAM",example = "JSAPI")
@DiyParamsValidation(range = "APP|JSAPI|MWEB|MINIPROGRAM",message = "请输入正确的交易类型")
private String tradeType;
@ApiModelProperty(value="openid[APP不传,JSAPI必传]",example = "12345678")
private String openid;
}
Loading…
Cancel
Save