Browse Source

优化会员记录逻辑

feature-1.1
wuxicheng 3 years ago
parent
commit
c5f16daf63
  1. 8
      bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/bean/vo/VipOrderVo.java
  2. 7
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java
  3. 16
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java
  4. 10
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java
  5. 6
      bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/domain/img/AddUserVipRecordMessage.java
  6. 4
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java
  7. 4
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java
  8. 33
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java
  9. 3
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipRecordVo.java
  10. 2
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
  11. 8
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/bean/vo/VipOrderVo.java
  12. 4
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java
  13. 17
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  14. 4
      bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml
  15. 21
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bean/dto/UnifiedOrderExtDto.java
  16. 8
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java
  17. 4
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java
  18. 20
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java

8
bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/bean/vo/VipOrderVo.java

@ -40,14 +40,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "vip名称")
private String vipName;
@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;

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

@ -18,13 +18,6 @@ import java.util.Date;
@TableName(value = "img_user_vip_record")
public class UserVipRecord extends BaseDomain {
/**
* 订单号
*/
@TableField(value = "order_no")
@ApiModelProperty(value="订单号")
private String orderNo;
/**
* 用户id
*/

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

@ -89,22 +89,6 @@ public class VipOrder extends BaseDomain {
@ApiModelProperty(value="时长天数")
private Integer days;
/**
* 开始时间
*/
@TableField(value = "start_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
/**
* 到期时间
*/
@TableField(value = "end_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
/**
* 订单状态0未处理1成功2失败
*/

10
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java

@ -3,7 +3,9 @@ package com.bnyer.common.core.dto;
import com.bnyer.common.core.domain.UserVipRecord;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
@ -12,9 +14,6 @@ import java.util.Date;
@NoArgsConstructor
public class AddUserVipRecordDto extends BaseDto<UserVipRecord>{
@ApiModelProperty(value="订单号")
private String orderNo;
@ApiModelProperty(value="用户id")
private Long userId;
@ -32,6 +31,9 @@ public class AddUserVipRecordDto extends BaseDto<UserVipRecord>{
@ApiModelProperty(value="到期时间")
private Date endTime;
@ApiModelProperty(value="时长天数")
private Integer days;
@ApiModelProperty(value="vip名称")
private String vipName;

6
bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/domain/img/AddUserVipRecordMessage.java

@ -19,9 +19,6 @@ import java.util.Date;
@NoArgsConstructor
public class AddUserVipRecordMessage extends BaseMessage {
@ApiModelProperty(value="订单号")
private String orderNo;
@ApiModelProperty(value="用户id")
private Long userId;
@ -39,6 +36,9 @@ public class AddUserVipRecordMessage extends BaseMessage {
@ApiModelProperty(value="到期时间")
private Date endTime;
@ApiModelProperty(value="本次开通计算后的天数")
private Integer days;
@ApiModelProperty(value="vip名称")
private String vipName;

4
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java

@ -29,8 +29,8 @@ public class VipRecordCreateConsumer extends EnhanceMessageHandler<AddUserVipRec
public void onMessage(AddUserVipRecordMessage message) {
super.dispatchMessage(message);
AddUserVipRecordDto addUserVipRecordDto = EntityConvertUtil.copy(message, AddUserVipRecordDto.class);
//添加用户会员记录
userVipRecordService.addUserVipRecord(addUserVipRecordDto);
//保存用户会员记录
userVipRecordService.saveUserVipRecord(addUserVipRecordDto);
}
@Override

4
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java

@ -18,10 +18,10 @@ public interface UserVipRecordService {
/**
* 添加用户会员记录
* 保存用户会员记录
* @param dto
*/
void addUserVipRecord(AddUserVipRecordDto dto);
void saveUserVipRecord(AddUserVipRecordDto dto);
/**
* 查询用户会员记录

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

@ -1,34 +1,24 @@
package com.bnyer.img.service.impl;
import cn.hutool.core.util.IdUtil;
import com.bnyer.common.core.constant.RedisKeyConstant;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.UserVipRecord;
import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.common.core.dto.AddUserVipRecordDto;
import com.bnyer.common.core.dto.PayUserVipDto;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.common.core.utils.DateUtils;
import com.bnyer.common.core.vo.UserInfoVo;
import com.bnyer.common.redis.service.RedissonService;
import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.img.constants.UserVipOrderStatusConstant;
import com.bnyer.img.enums.EnumUserVipRecordStatus;
import com.bnyer.img.mapper.UserVipRecordMapper;
import com.bnyer.img.query.UserVipRecordQuery;
import com.bnyer.img.service.UserVipRecordService;
import com.bnyer.img.vo.UserVipRecordVo;
import com.bnyer.img.vo.UserVipVo;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
@ -93,11 +83,26 @@ public class UserVipServiceRecordImpl implements UserVipRecordService {
return false;
}
/**
* 保存会员记录
* @param dto
*/
@Override
public void addUserVipRecord(AddUserVipRecordDto dto) {
public void saveUserVipRecord(AddUserVipRecordDto dto) {
UserVipRecord userVipRecord = dto.toEntity();
UserVipRecord oldUserVipRecord = userVipRecordMapper.selectOne(new LambdaQueryWrapper<UserVipRecord>().eq(UserVipRecord::getUserId, userVipRecord.getUserId())
.eq(UserVipRecord::getUserClientType, userVipRecord.getUserClientType())
.eq(UserVipRecord::getStatus,EnumUserVipRecordStatus.VALID.getStatus()));
//判断是否存在生效的数据,存在走续费
if (Objects.isNull(oldUserVipRecord)){
userVipRecord.setStatus(EnumUserVipRecordStatus.VALID.getStatus());
userVipRecordMapper.insert(userVipRecord);
}else {
//续费
userVipRecord.setId(oldUserVipRecord.getId());
userVipRecord.setEndTime(DateUtils.getDateByType(EnumTimeUnit.DAY,oldUserVipRecord.getEndTime(), dto.getDays()));
userVipRecordMapper.updateById(userVipRecord);
}
}
/**

3
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipRecordVo.java

@ -18,9 +18,6 @@ public class UserVipRecordVo {
@ApiModelProperty(value="id")
private Long id;
@ApiModelProperty(value="订单号")
private String orderNo;
@ApiModelProperty(value="用户id")
private Long userId;

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

@ -5,7 +5,6 @@
<!--@mbg.generated-->
<!--@Table img_user_vip_record-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="order_no" jdbcType="VARCHAR" property="orderNo" />
<result column="user_id" jdbcType="BIGINT" property="userId" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="vip_id" jdbcType="BIGINT" property="vipId" />
@ -23,7 +22,6 @@
<sql id="Base_Column_List">
<!--@mbg.generated-->
a.id,
a.order_no,
a.user_id ,
a.phone,vip_name,
a.vip_type_name,

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

@ -40,14 +40,6 @@ public class VipOrderVo {
@ApiModelProperty(value = "vip名称")
private String vipName;
@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;

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

@ -72,9 +72,7 @@ public class VipOrderPayNotifyConsumer extends EnhanceMessageHandler<VipOrderPay
AddUserVipRecordMessage message = new AddUserVipRecordMessage();
message.setKey(IdUtils.randomUUID());
message.setSource(ServiceNameConstants.ORDER_SERVICE);
message.setOrderNo(vipOrder.getOrderNo());
message.setStartTime(vipOrder.getStartTime());
message.setEndTime(vipOrder.getEndTime());
message.setDays(vipOrder.getDays());
message.setVipId(vipOrder.getVipId());
message.setVipName(vipOrder.getVipName());
message.setVipTypeName(vipOrder.getVipTypeName());

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

@ -180,13 +180,18 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setUserId(userId);
// vipOrder.setIsDelay("0");
Date nowDate = new Date();
vipOrder.setStartTime(nowDate);
// vipOrder.setStartTime(nowDate);
// EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit());
// //计算会员结束时间
// vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipVo.getValidTimeNum()));
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit());
//计算会员结束时间
vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipVo.getValidTimeNum()));
//开通的天数
vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
//计算本次开通的天数
Date nowDate = new Date();
if (EnumTimeUnit.DAY == enumTimeUnitByUnit){
vipOrder.setDays(userVipVo.getValidTimeNum());
}else {
vipOrder.setDays((int) DateUtil.betweenDay(nowDate, DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipVo.getValidTimeNum()), true));
}
vipOrder.setUserClientType(userClientType);
vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(userClientType),String.valueOf(userId)));
return vipOrder;

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

@ -15,8 +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="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="order_status" jdbcType="INTEGER" property="orderStatus" />
<result column="pay_time" jdbcType="TIMESTAMP" property="payTime" />
<result column="cancel_time" jdbcType="TIMESTAMP" property="cancelTime" />
@ -40,8 +38,6 @@
o.is_delay,
o.`days`,
o.vip_type_name,
o.start_time,
o.end_time,
o.order_status,
o.pay_time,
o.cancel_time,

21
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bean/dto/UnifiedOrderExtDto.java

@ -0,0 +1,21 @@
package com.bnyer.pay.bean.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class UnifiedOrderExtDto extends UnifiedOrderDto{
/**
* 请求的ip地址
*/
private String ip;
}

8
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java

@ -3,10 +3,13 @@ package com.bnyer.pay.controller;
import com.bnyer.common.core.domain.R;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.utils.ip.IpUtils;
import com.bnyer.pay.annotation.LimitRepeatRequest;
import com.bnyer.pay.bean.dto.RefundDto;
import com.bnyer.pay.bean.dto.UnifiedOrderDto;
import com.bnyer.pay.bean.dto.QueryOrderDto;
import com.bnyer.pay.bean.dto.UnifiedOrderExtDto;
import com.bnyer.pay.bean.vo.ThirdRefundVo;
import com.bnyer.pay.service.UnifiedPayService;
import com.bnyer.pay.bean.vo.UnifiedOrderVo;
@ -42,7 +45,10 @@ public class UnifiedPayController {
@PostMapping("/unifiedOrder")
@Operation(summary = "统一下单,并生成支付订单" , description = "生成支付订单,返回前端支付所需参数")
public R<UnifiedOrderVo> unifiedOrder(@Valid @RequestBody UnifiedOrderDto dto, HttpServletRequest request){
UnifiedOrderVo unifiedOrderVo = unifiedPayService.unifiedOrder(dto,request);
UnifiedOrderExtDto unifiedOrderExtDto = EntityConvertUtil.copy(dto, UnifiedOrderExtDto.class);
//单独处理request的ip地址,request不作为参数传递到service,避免后续如果出现异步调用,会导致bean失效问题
unifiedOrderExtDto.setIp(IpUtils.getIpAddr(request));
UnifiedOrderVo unifiedOrderVo = unifiedPayService.unifiedOrder(unifiedOrderExtDto);
return R.ok(unifiedOrderVo);
}

4
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java

@ -3,6 +3,7 @@ package com.bnyer.pay.service;
import com.bnyer.pay.bean.dto.RefundDto;
import com.bnyer.pay.bean.dto.UnifiedOrderDto;
import com.bnyer.pay.bean.dto.QueryOrderDto;
import com.bnyer.pay.bean.dto.UnifiedOrderExtDto;
import com.bnyer.pay.bean.vo.ThirdRefundVo;
import com.bnyer.pay.bean.vo.UnifiedOrderVo;
import com.bnyer.pay.bean.vo.QueryOrderVo;
@ -19,10 +20,9 @@ public interface UnifiedPayService {
/**
* 统一下单并生成支付订单
* @param dto
* @param request
* @return
*/
UnifiedOrderVo unifiedOrder(UnifiedOrderDto dto, HttpServletRequest request);
UnifiedOrderVo unifiedOrder(UnifiedOrderExtDto dto);
/**
* 统一订单查询

20
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java

@ -20,10 +20,7 @@ import com.bnyer.order.api.remote.RemoteVipOrderService;
import com.bnyer.pay.bean.bo.QueryOrderBo;
import com.bnyer.pay.bean.bo.RefundBo;
import com.bnyer.pay.bean.bo.UnifiedOrderBo;
import com.bnyer.pay.bean.dto.AddPayInfoDto;
import com.bnyer.pay.bean.dto.QueryOrderDto;
import com.bnyer.pay.bean.dto.RefundDto;
import com.bnyer.pay.bean.dto.UnifiedOrderDto;
import com.bnyer.pay.bean.dto.*;
import com.bnyer.pay.bean.vo.*;
import com.bnyer.pay.constant.KSPayConstants;
import com.bnyer.pay.design.factory.PayFactory;
@ -40,7 +37,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
@ -66,11 +62,10 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
/**
* 统一下单并生成支付订单
* @param dto
* @param request
* @return
*/
@Override
public UnifiedOrderVo unifiedOrder(UnifiedOrderDto dto, HttpServletRequest request) {
public UnifiedOrderVo unifiedOrder(UnifiedOrderExtDto dto) {
//下单前校验
checkData(dto);
//支付金额
@ -108,7 +103,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
throw new ServiceException("sceneCode未匹配上对应支付场景");
}
//构建统一下单请求实体
UnifiedOrderBo unifiedOrderBo = buildUnifiedOrderDto(dto,goodsDesc, goodsType,payAmount,payId, request);
UnifiedOrderBo unifiedOrderBo = buildUnifiedOrderDto(dto,goodsDesc, goodsType,payAmount,payId);
//下单,获取第三方返回信息
IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType());
if (Objects.isNull(payStrategy)){
@ -141,7 +136,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* @param dto
* @return
*/
private AddPayInfoDto buildPayInfo(ThirdUnifiedOrderVo thirdUnifiedOrderVo, UnifiedOrderBo unifiedOrderBo, UnifiedOrderDto dto) {
private AddPayInfoDto buildPayInfo(ThirdUnifiedOrderVo thirdUnifiedOrderVo, UnifiedOrderBo unifiedOrderBo, UnifiedOrderExtDto dto) {
AddPayInfoDto addPayInfoDto = new AddPayInfoDto();
addPayInfoDto.setAppid(thirdUnifiedOrderVo.getAppId());
addPayInfoDto.setOrderNo(dto.getOrderNo());
@ -168,10 +163,9 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* @param goodsType 商品类型
* @param payAmount 不同支付场景下的支付金额
* @param payId 内部系统支付单号
* @param request 请求request用于获取ip地址
* @return
*/
private UnifiedOrderBo buildUnifiedOrderDto(UnifiedOrderDto dto, String goodsDesc, int goodsType, String payAmount, String payId, HttpServletRequest request) {
private UnifiedOrderBo buildUnifiedOrderDto(UnifiedOrderExtDto dto, String goodsDesc, int goodsType, String payAmount, String payId) {
UserInfoVo userInfo = SecurityUtils.getUserInfo();
String openId = dto.getOpenId();
if (StringUtils.isBlank(openId)){
@ -179,12 +173,10 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
}
//当前时间
Date currDate = new Date();
//ip地址
String ip = IpUtils.getIpAddr(request);
UnifiedOrderBo unifiedOrderBo = EntityConvertUtil.copy(dto, UnifiedOrderBo.class);
unifiedOrderBo.setOpenId(openId);
unifiedOrderBo.setPayId(payId);
unifiedOrderBo.setIp(ip);
unifiedOrderBo.setIp(dto.getIp());
unifiedOrderBo.setCurrDate(currDate);
unifiedOrderBo.setPayAmount(payAmount);
unifiedOrderBo.setGoodsType(goodsType);

Loading…
Cancel
Save