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; 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
@Getter @Getter
@ -21,15 +17,15 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="主键Id") @ApiModelProperty(value="主键Id")
private Long id; private Long id;
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
@ApiModelProperty(value="vip编码") @ApiModelProperty(value="vip编码")
private String vipCode; private String vipCode;
@ApiModelProperty(value="vip名称") @ApiModelProperty(value="vip名称")
private String vipName; private String vipName;
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) ")
private String vipType;
@ApiModelProperty(value="原价") @ApiModelProperty(value="原价")
private BigDecimal originPrice; private BigDecimal originPrice;
@ -48,25 +44,20 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)") @ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay; 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艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员") @ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private String categoryCode; private Integer validTimeUnit;
@ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
private Integer validTimeNum;
@ApiModelProperty(value = "会员类型编码")
private String vipTypeCode;
@ApiModelProperty(value = "分类名称") @ApiModelProperty(value = "会员类型名称")
private String categoryName; private String vipTypeName;
private static final long serialVersionUID = 1L; 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 @NoArgsConstructor
public class VipOrderVo { public class VipOrderVo {
@ApiModelProperty(value="主键")
private Long id;
@ApiModelProperty(value="订单id")
private String orderId;
@ApiModelProperty(value="手机号") @ApiModelProperty(value="手机号")
private String phone; private String phone;
@ApiModelProperty(value="用户id")
private Long userId;
@ApiModelProperty(value="vip表id") @ApiModelProperty(value="vip表id")
private Long vipId; private Long vipId;
@ -43,9 +52,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)") @ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay; private String isDelay;
@ -55,9 +61,6 @@ public class VipOrderVo {
@ApiModelProperty(value="支付金额") @ApiModelProperty(value="支付金额")
private BigDecimal payAmount; private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称") @ApiModelProperty(value = "vip类型名称")
private String vipTypeName; 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 * 主键Id
*/ */
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value="主键Id") @ApiModelProperty(value="主键Id")
private Long id; private Long id;
/**
* vip类型id
*/
@TableField(value = "vip_type_id")
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
/** /**
* vip名称 * vip名称
*/ */
@ -39,13 +46,6 @@ public class UserVip extends BaseDomain {
@ApiModelProperty(value="vip编码") @ApiModelProperty(value="vip编码")
private String vipCode; 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="热门描述") @ApiModelProperty(value="热门描述")
private String hotSignDesc; private String hotSignDesc;
/**
* 时长天数
*/
@TableField(value = "days")
@ApiModelProperty(value="时长天数")
private Integer days;
/** /**
* 是否到期自动续费(0>;1->) * 是否到期自动续费(0>;1->)
*/ */
@ -89,19 +82,18 @@ public class UserVip extends BaseDomain {
private String isDelay; private String isDelay;
/** /**
* 用户客户端类型10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信 * 有效时长单位0天1周2月3季4年
*/ */
@TableField(value = "user_client_type") @TableField(value = "valid_time_unit")
@ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private Integer userClientType; private Integer validTimeUnit;
@TableField(value = "category_code") /**
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员") * 有效时长表示几天几周几月几年
private String categoryCode; */
@TableField(value = "valid_time_num")
@TableField(value = "category_name") @ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
@ApiModelProperty(value = "分类名称") private Integer validTimeNum;
private String categoryName;
private static final long serialVersionUID = 1L; 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 * 主键id
*/ */
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.ASSIGN_ID)
@ApiModelProperty(value="主键id") @ApiModelProperty(value="主键id")
private Long id; private Long id;
@ -64,20 +64,6 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="到期时间") @ApiModelProperty(value="到期时间")
private Date endTime; 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->支付异常) * 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)
*/ */
@ -92,13 +78,6 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="vip名称") @ApiModelProperty(value="vip名称")
private String vipName; private String vipName;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/** /**
* vip类型名称 * 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="主键") @ApiModelProperty(value="主键")
private Long id; private Long id;
@ -151,13 +151,6 @@ public class VipOrder extends BaseDomain {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/** /**
* vip类型名称 * 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())){ if(StringUtils.isNotBlank(this.getHotSignDesc())){
userVip.setHotSignDesc(this.getHotSignDesc()); userVip.setHotSignDesc(this.getHotSignDesc());
} }
userVip.setDays(this.getDays()); // userVip.setDays(this.getDays());
userVip.setIsDelay(this.getIsDelay()); userVip.setIsDelay(this.getIsDelay());
return userVip; 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 @Getter
@AllArgsConstructor @AllArgsConstructor
public enum EnumVipCategory { public enum EnumVipType {
IMG_VIP("img","下图会员"), IMG_VIP("img","下图会员"),
VIDEO_VIP("video","视频会员"), VIDEO_VIP("video","视频会员"),
@ -25,7 +25,7 @@ public enum EnumVipCategory {
private final String name; private final String name;
public static String getNameByCode(String code) { public static String getNameByCode(String code) {
for (EnumVipCategory s : EnumVipCategory.values()) { for (EnumVipType s : EnumVipType.values()) {
if (Objects.equals(code, s.code)) { if (Objects.equals(code, s.code)) {
return s.getName(); return s.getName();
} }
@ -33,9 +33,9 @@ public enum EnumVipCategory {
return null; return null;
} }
public static EnumVipCategory getVipCategoryByCode(String code) { public static EnumVipType getVipTypeByCode(String code) {
return Arrays.stream(values()) return Arrays.stream(values())
.filter(vipCategory -> Objects.equals(vipCategory.getCode(), code)) .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.Calendar;
import java.util.Date; import java.util.Date;
import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import org.apache.commons.lang3.time.DateFormatUtils; 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 date 时间
* @param num 周期数 * @param num 周期数
* @return * @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); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
Instant instant = date.toInstant(); Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault(); ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
String format = ""; String format = "";
switch (type){ switch (unit){
case 0: case SECONDS:
//秒 //秒
LocalDateTime secondsDateTime = localDateTime.plusSeconds(num); LocalDateTime secondsDateTime = localDateTime.plusSeconds(num);
format = secondsDateTime.format(formatter); format = secondsDateTime.format(formatter);
break; break;
case 1: case MINUTE:
//分 //分
LocalDateTime minuteDateTime = localDateTime.plusMinutes(num); LocalDateTime minuteDateTime = localDateTime.plusMinutes(num);
format = minuteDateTime.format(formatter); format = minuteDateTime.format(formatter);
break; break;
case 2: case HOURS:
//时 //时
LocalDateTime hoursDateTime = localDateTime.plusHours(num); LocalDateTime hoursDateTime = localDateTime.plusHours(num);
format = hoursDateTime.format(formatter); format = hoursDateTime.format(formatter);
break; break;
case 3: case DAY:
//日 //日
LocalDateTime daysDateTime = localDateTime.plusDays(num); LocalDateTime daysDateTime = localDateTime.plusDays(num);
format = daysDateTime.format(formatter); format = daysDateTime.format(formatter);
break; break;
case 4: case MONTH:
//月 //月
LocalDateTime monthsDateTime = localDateTime.plusMonths(num); LocalDateTime monthsDateTime = localDateTime.plusMonths(num);
format = monthsDateTime.format(formatter); format = monthsDateTime.format(formatter);
break; break;
case 5: case YEAR:
//年 //年
LocalDateTime yearsDateTime = localDateTime.plusYears(num); LocalDateTime yearsDateTime = localDateTime.plusYears(num);
format = yearsDateTime.format(formatter); format = yearsDateTime.format(formatter);
break; break;
case 6: case WEEK:
//周 //周
LocalDateTime weeksDateTime = localDateTime.plusWeeks(num); LocalDateTime weeksDateTime = localDateTime.plusWeeks(num);
format = weeksDateTime.format(formatter); format = weeksDateTime.format(formatter);
break; 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: default:
throw new IllegalArgumentException("时间类型参数错误"); throw new IllegalArgumentException("时间类型参数错误");
} }
@ -296,7 +304,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
// 下一季度的今天 // 下一季度的今天
int currentMonth = now.getMonthValue(); int currentMonth = now.getMonthValue();
int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + 4; int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + (2 * 4);
LocalDateTime nextQuarterToday = now.withMonth(nextQuarterMonth); 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 @Override
public boolean payUserVip(PayUserVipDto param) { public boolean payUserVip(PayUserVipDto param) {
UserVipRecord userVipRecord = new UserVipRecord(); // UserVipRecord userVipRecord = new UserVipRecord();
//生成订单id // //生成订单id
userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr()); // userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr());
//获取分布式锁 // //获取分布式锁
RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId()); // RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId());
try{ // try{
if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){ // if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){
//调用支付 // //调用支付
//
//保存订单 // //保存订单
userVipRecord.setCreateTime(new Date()); // userVipRecord.setCreateTime(new Date());
userVipRecord.setUpdateTime(new Date()); // userVipRecord.setUpdateTime(new Date());
userVipRecord.setPrice(new BigDecimal(param.getPrice())); // userVipRecord.setPrice(new BigDecimal(param.getPrice()));
userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY); // userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY);
userVipRecord.setIsShow("1"); // userVipRecord.setIsShow("1");
Date startTime = new Date(); // Date startTime = new Date();
userVipRecord.setStartTime(startTime); // userVipRecord.setStartTime(startTime);
// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){ //// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){
// //计算月卡(30天)的结束时间 //// //计算月卡(30天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30)); //// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30));
// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){ //// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){
// //结算季卡(90天)的结束时间 //// //结算季卡(90天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90)); //// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90));
// }else{ //// }else{
// //计算年卡(365天)的结束时间 //// //计算年卡(365天)的结束时间
// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365)); //// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365));
// } //// }
}else{ // }else{
userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION); // userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION);
log.error("用户会员vip支付异常,锁被占用!"); // log.error("用户会员vip支付异常,锁被占用!");
throw new ServiceException("系统繁忙,请稍候重试!"); // throw new ServiceException("系统繁忙,请稍候重试!");
} // }
}catch (Exception e){ // }catch (Exception e){
userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL); // userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL);
log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage()); // log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage());
throw new ServiceException("系统繁忙,请勿重复操作!"); // throw new ServiceException("系统繁忙,请勿重复操作!");
}finally { // }finally {
int insert = userVipRecordMapper.insert(userVipRecord); // int insert = userVipRecordMapper.insert(userVipRecord);
if(insert > 0){ // if(insert > 0){
return true; // return true;
} // }
//释放锁 // //释放锁
if(lock.isHeldByCurrentThread()){ // if(lock.isHeldByCurrentThread()){
lock.unlock(); // lock.unlock();
log.info("用户会员vip支付操作执行完毕,释放锁成功!"); // log.info("用户会员vip支付操作执行完毕,释放锁成功!");
} // }
} // }
return false; 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") @ApiModelProperty(value="主键Id")
private Long id; private Long id;
@ApiModelProperty(value="vip类型id")
private Long vipTypeId;
@ApiModelProperty(value="vip编码") @ApiModelProperty(value="vip编码")
private String vipCode; private String vipCode;
@ -45,17 +48,20 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)") @ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay; private String isDelay;
@ApiModelProperty(value="时长天数")
private Integer days;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员") @ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年")
private String categoryCode; private Integer validTimeUnit;
@ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年")
private Integer validTimeNum;
@ApiModelProperty(value = "会员类型编码")
private String vipTypeCode;
@ApiModelProperty(value = "分类名称") @ApiModelProperty(value = "会员类型名称")
private String categoryName; private String vipTypeName;
private static final long serialVersionUID = 1L; 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--> <!--@Table img_user_vip-->
<id column="id" jdbcType="BIGINT" property="id" /> <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_name" jdbcType="VARCHAR" property="vipName" />
<result column="vip_code" jdbcType="VARCHAR" property="vipCode" /> <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="origin_price" jdbcType="DECIMAL" property="originPrice" />
<result column="price" jdbcType="DECIMAL" property="price" /> <result column="price" jdbcType="DECIMAL" property="price" />
<result column="description" jdbcType="VARCHAR" property="description" /> <result column="description" jdbcType="VARCHAR" property="description" />
<result column="hot_sign_desc" jdbcType="VARCHAR" property="hotSignDesc" /> <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_delay" jdbcType="CHAR" property="isDelay" />
<result column="is_show" jdbcType="CHAR" property="isShow" /> <result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" /> <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> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
v.id, v.id,
v.vip_name, v.vip_name,
v.vip_code, v.vip_code,
v.vip_type, v.vip_type_id,
v.origin_price, v.origin_price,
v.price, v.price,
v.description, v.description,
v.hot_sign_desc, v.hot_sign_desc,
v.`days`, v.valid_time_unit,
v.valid_time_num,
v.is_delay, v.is_delay,
v.is_show, v.is_show,
v.create_time, v.create_time,
v.update_time, v.update_time,
v.sort, v.sort
v.user_client_type,
v.category_code,
v.category_name
</sql> </sql>
<select id="queryFront" resultType="com.bnyer.img.vo.UserVipVo"> <select id="queryFront" resultType="com.bnyer.img.vo.UserVipVo">
select select
<include refid="Base_Column_List"/> <include refid="Base_Column_List"/>,
from img_user_vip v 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' where v.is_show = '1'
<if test="id!=null"> <if test="id!=null">
and v.id=#{id} and v.id=#{id}
</if> </if>
<if test="dataSource!=null and dataSource != ''"> order by sort asc
and v.user_client_type=#{userClientType}
</if>
order by sort desc
</select> </select>
</mapper> </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="vip_id" jdbcType="BIGINT" property="vipId" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" /> <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" /> <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_name" jdbcType="CHAR" property="vipName" />
<result column="vip_type_name" jdbcType="CHAR" property="vipTypeName" /> <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="status" jdbcType="CHAR" property="status" />
<result column="is_show" jdbcType="CHAR" property="isShow" /> <result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@ -22,7 +20,7 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@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 sort
</sql> </sql>
</mapper> </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.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -27,9 +28,9 @@ public class AddVipOrderDto implements Serializable {
@ApiModelProperty(value="vip表id") @ApiModelProperty(value="vip表id")
private Long vipId; private Long vipId;
// @NotBlank(message = "用户客户端类型不能为空!") @NotBlank(message = "用户客户端类型不能为空!")
// @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// private Integer userClientType; 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; package com.bnyer.order.enums;
import com.bnyer.common.core.enums.EnumVipCategory;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@ -14,9 +13,9 @@ import lombok.Getter;
public enum EnumVipType { public enum EnumVipType {
//========================下图会员=================== //========================下图会员===================
MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), MONTH_CARD("0","月卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP),
SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), SEASON_CARD("1","季卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP),
YEAR_CARD("2","年卡",EnumVipCategory.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 String typeName;
private final EnumVipCategory enumVipCategory; private final com.bnyer.common.core.enums.EnumVipType enumVipType;
public static String getNameByTypeCode(String typeCode) { 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())) { if (typeCode.equals(s.getTypeCode())) {
return s.getTypeName(); return s.getTypeName();
} }
@ -41,9 +40,9 @@ public enum EnumVipType {
} }
public static String getCategoryByTypeCode(String typeCode){ 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())) { if (typeCode.equals(s.getTypeCode())) {
return s.getEnumVipCategory().getCode(); return s.getEnumVipType().getCode();
} }
} }
return null; 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("vipId",vipOrder.getVipId());
jsonObject.put("vipName",vipOrder.getVipName()); jsonObject.put("vipName",vipOrder.getVipName());
jsonObject.put("vipTypeName",vipOrder.getVipTypeName()); jsonObject.put("vipTypeName",vipOrder.getVipTypeName());
jsonObject.put("categoryName",vipOrder.getCategoryName());
jsonObject.put("phone",vipOrder.getPhone()); jsonObject.put("phone",vipOrder.getPhone());
jsonObject.put("userId",vipOrder.getUserId()); jsonObject.put("userId",vipOrder.getUserId());
return JSON.toJSONString(jsonObject); 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.R;
import com.bnyer.common.core.domain.VipOrder; import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.common.core.enums.EnumUserClientType; 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.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils; 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.AddVipOrderDto;
import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus; 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.mapper.VipOrderMapper;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderVo; import com.bnyer.order.vo.VipOrderVo;
@ -113,8 +113,8 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
} }
UserVipVo userVipVo = userVipVoList.get(0); UserVipVo userVipVo = userVipVoList.get(0);
VipOrder vipOrder = null; VipOrder vipOrder = null;
EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode()); EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode());
switch (enumVipCategory){ switch (enumVipType){
case IMG_VIP: case IMG_VIP:
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto);
break; break;
@ -139,17 +139,21 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class);
vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setPhone(addVipOrderDto.getPhone());
vipOrder.setVipId(addVipOrderDto.getVipId()); vipOrder.setVipId(addVipOrderDto.getVipId());
vipOrder.setVipName(userVipVo.getVipName());
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setPayAmount(userVipVo.getPrice()); vipOrder.setPayAmount(userVipVo.getPrice());
vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode())); vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType())); vipOrder.setUserId(userId);
vipOrder.setIsDelay("0"); // vipOrder.setIsDelay("0");
Date nowDate = new Date(); Date nowDate = new Date();
vipOrder.setStartTime(nowDate); 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.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); vipOrder.setCreateTime(nowDate);
return vipOrder; 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; package com.bnyer.order.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@ -19,9 +21,18 @@ import java.util.Date;
@NoArgsConstructor @NoArgsConstructor
public class VipOrderVo { public class VipOrderVo {
@ApiModelProperty(value="主键")
private Long id;
@ApiModelProperty(value="订单id")
private String orderId;
@ApiModelProperty(value="手机号") @ApiModelProperty(value="手机号")
private String phone; private String phone;
@ApiModelProperty(value="用户id")
private Long userId;
@ApiModelProperty(value="vip表id") @ApiModelProperty(value="vip表id")
private Long vipId; private Long vipId;
@ -42,9 +53,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)") @ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay; private String isDelay;
@ -54,9 +62,6 @@ public class VipOrderVo {
@ApiModelProperty(value="支付金额") @ApiModelProperty(value="支付金额")
private BigDecimal payAmount; private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称") @ApiModelProperty(value = "vip类型名称")
private String vipTypeName; 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="is_delay" jdbcType="CHAR" property="isDelay" />
<result column="days" jdbcType="INTEGER" property="days" /> <result column="days" jdbcType="INTEGER" property="days" />
<result column="vip_type_name" jdbcType="INTEGER" property="vipTypeName" /> <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="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" /> <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="order_status" jdbcType="INTEGER" property="orderStatus" /> <result column="order_status" jdbcType="INTEGER" property="orderStatus" />
@ -43,7 +42,6 @@
o.is_delay, o.is_delay,
o.`days`, o.`days`,
o.vip_type_name, o.vip_type_name,
o.category_name,
o.start_time, o.start_time,
o.end_time, o.end_time,
o.order_status, 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 @Resource
private PayInfoMapper payInfoMapper; 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 * @param checkDto
@ -52,7 +42,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy {
String notifyPayAmount = checkDto.getPayAmount(); String notifyPayAmount = checkDto.getPayAmount();
//对账状态 //对账状态
Integer singleStatus = payInfo.getSingleStatus(); Integer singleStatus = payInfo.getSingleStatus();
log.info("回调中的金额:{},订单中的金额:{}",payInfoPayAmount,notifyPayAmount); log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount);
if (payInfoPayAmount.equals(notifyPayAmount)){ if (payInfoPayAmount.equals(notifyPayAmount)){
if (Objects.nonNull(singleStatus)){ if (Objects.nonNull(singleStatus)){
resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,"OK"); 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.EnumPayType; 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.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.DateUtils;
@ -75,7 +76,7 @@ public class AliPayStrategy extends AbstractPayStrategy {
model.setBody(dto.getGoodsDesc()); model.setBody(dto.getGoodsDesc());
model.setOutTradeNo(dto.getOrderId()); 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.setTimeoutExpress(AliPayConstant.timeoutExpress);
//元 //元
model.setTotalAmount(dto.getPayAmount()); 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; 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 io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -31,7 +31,7 @@ public class AddPayInfoDto {
private String payType; private String payType;
@ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1") @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; private String tradeType;
@ApiModelProperty(value="备注") @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