会员购买

This commit is contained in:
张松
2025-09-23 16:17:41 +08:00
parent 9f9b292919
commit 887746e9d3
9 changed files with 165 additions and 101 deletions

View File

@@ -77,51 +77,30 @@ public class MemberOrderServiceImpl extends ServiceImpl<MemberOrderMapper, Membe
.findFirst()
.orElseThrow(() -> new CzgException("会员开通方案未配置,请联系店铺"));
boolean canOpen = false;
if ("CONDITION".equals(memberConfigVO.getOpenType())){
for (MemberConfigDTO.condition item : memberConfigVO.getConditionList()) {
canOpen = switch (item.getCode()) {
case "BIND_PHONE" -> StrUtil.isNotBlank(shopUser.getPhone());
case "ORDER" ->
orderInfoService.count(new QueryWrapper().eq(OrderInfo::getShopId, shopUser.getSourceShopId()).eq(OrderInfo::getUserId, shopUser.getUserId())
.notIn(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode(), OrderStatusEnums.CANCELLED.getCode())) > Integer.parseInt(item.getValue());
case "COST_AMOUNT" ->
orderInfoService.list(new QueryWrapper().eq(OrderInfo::getShopId, shopUser.getSourceShopId()).eq(OrderInfo::getUserId, shopUser.getUserId())
.notIn(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode(), OrderStatusEnums.CANCELLED.getCode()))
.stream().map(OrderInfo::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) > 0;
case "RECHARGE_AMOUNT" ->
orderPaymentService.list(new QueryWrapper().eq(OrderPayment::getShopId, shopUser.getSourceShopId())
.eq(OrderPayment::getSourceId, shopUser.getId()).isNotNull(OrderPayment::getTradeNumber))
.stream().map(OrderPayment::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) > 0;
default -> throw new CzgException("会员开通条件类型错误");
};
if ("PAY".equals(memberConfigVO.getOpenType())){
//生成订单
MemberOrder orderInfo = new MemberOrder();
orderInfo.setOrderNo(orderDTO.getPlatformType() + IdUtil.getSnowflakeNextId());
orderInfo.setShopId(orderDTO.getShopId());
orderInfo.setPayAmount(BigDecimal.ZERO);
orderInfo.setStatus(OrderStatusEnums.UNPAID.getCode());
orderInfo.setAmount(configItem.getPrice().multiply(BigDecimal.valueOf(orderDTO.getNum())));
orderInfo.setPrice(configItem.getPrice());
orderInfo.setName(configItem.getName());
orderInfo.setUserId(orderDTO.getUserId());
orderInfo.setReward(configItem.getReward());
orderInfo.setCircleTime(configItem.getCircleTime());
orderInfo.setCircleUnit(configItem.getCircleUnit());
if (configItem.getCouponList() != null && !configItem.getCouponList().isEmpty()) {
orderInfo.setCouponList(JSONObject.toJSONString(configItem.getCouponList()));
}
orderInfo.setNum(orderDTO.getNum());
save(orderInfo);
return orderInfo;
}else {
memberConfigService.joinMember(shopInfo.getId(), orderDTO.getUserId(), null);
return null;
}
if (!canOpen) {
throw new CzgException("会员开通条件不满足");
}
//生成订单
MemberOrder orderInfo = new MemberOrder();
orderInfo.setOrderNo(orderDTO.getPlatformType() + IdUtil.getSnowflakeNextId());
orderInfo.setShopId(orderDTO.getShopId());
orderInfo.setPayAmount(BigDecimal.ZERO);
orderInfo.setStatus(OrderStatusEnums.UNPAID.getCode());
orderInfo.setAmount(configItem.getPrice().multiply(BigDecimal.valueOf(orderDTO.getNum())));
orderInfo.setPrice(configItem.getPrice());
orderInfo.setName(configItem.getName());
orderInfo.setUserId(orderDTO.getUserId());
orderInfo.setReward(configItem.getReward());
orderInfo.setCircleTime(configItem.getCircleTime());
orderInfo.setCircleUnit(configItem.getCircleUnit());
if (configItem.getCouponList() != null && !configItem.getCouponList().isEmpty()) {
orderInfo.setCouponList(JSONObject.toJSONString(configItem.getCouponList()));
}
orderInfo.setNum(orderDTO.getNum());
save(orderInfo);
return orderInfo;
}
}

View File

@@ -8,20 +8,25 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.czg.constant.TableValueConstant;
import com.czg.exception.ApiNotPrintException;
import com.czg.exception.CzgException;
import com.czg.market.dto.MemberConfigDTO;
import com.czg.market.dto.MemberLevelDTO;
import com.czg.account.entity.*;
import com.czg.account.service.*;
import com.czg.market.dto.MemberOrderDTO;
import com.czg.market.dto.MkCouponGiftDTO;
import com.czg.market.entity.*;
import com.czg.market.service.*;
import com.czg.market.vo.MemberConfigVO;
import com.czg.market.vo.MemberLevelVO;
import com.czg.exception.ApiNotPrintException;
import com.czg.order.entity.OrderInfo;
import com.czg.order.entity.OrderPayment;
import com.czg.order.service.OrderInfoService;
import com.czg.order.service.OrderPaymentService;
import com.czg.service.market.enums.OrderStatusEnums;
import com.czg.service.market.mapper.TbMemberConfigMapper;
import com.czg.utils.AssertUtil;
import com.czg.validator.ValidatorUtil;
import com.czg.validator.group.member.MemberLevelCycleRewardGroup;
import com.mybatisflex.core.query.QueryWrapper;
@@ -300,6 +305,7 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean joinMember(Long shopId, Long userId, Long memberOrderId) {
@@ -309,50 +315,90 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
log.warn("用户不存在, 店铺id: {}, 用户id: {}", shopId, userId);
return false;
}
MemberLevelConfig levelConfig = levelConfigService.getOne(new QueryWrapper().eq(MemberLevelConfig::getShopId, shopId).orderBy(MemberLevelConfig::getExperienceValue, true).limit(1));
if (shopUser.getStartTime() == null || shopUser.getEndTime().isBefore(DateUtil.date().toLocalDateTime())) {
// 条件开通
if (memberOrderId == null) {
if(memberConfigVO.getConfigList() == null || memberConfigVO.getConfigList().isEmpty()) {
throw new CzgException("会员开通方案未配置,请联系店铺");
}
AssertUtil.isTrue(!"CONDITION".equals(memberConfigVO.getOpenType()), "开通方式未开启");
for (MemberConfigDTO.condition item : memberConfigVO.getConditionList()) {
boolean canOpen = switch (item.getCode()) {
case "BIND_PHONE" -> StrUtil.isNotBlank(shopUser.getPhone());
case "ORDER" ->
orderInfoService.count(new QueryWrapper().eq(OrderInfo::getShopId, shopUser.getSourceShopId()).eq(OrderInfo::getUserId, shopUser.getUserId())
.notIn(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode(), OrderStatusEnums.CANCELLED.getCode())) > Integer.parseInt(item.getValue());
case "COST_AMOUNT" ->
orderInfoService.list(new QueryWrapper().eq(OrderInfo::getShopId, shopUser.getSourceShopId()).eq(OrderInfo::getUserId, shopUser.getUserId())
.notIn(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode(), OrderStatusEnums.CANCELLED.getCode()))
.stream().map(OrderInfo::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) > 0;
case "RECHARGE_AMOUNT" ->
orderPaymentService.list(new QueryWrapper().eq(OrderPayment::getShopId, shopUser.getSourceShopId())
.eq(OrderPayment::getSourceId, shopUser.getId()).isNotNull(OrderPayment::getTradeNumber))
.stream().map(OrderPayment::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) > 0;
default -> throw new CzgException("会员开通条件类型错误");
};
if (!canOpen) {
throw new CzgException("会员开通条件不满足");
}
}
if (DateUtil.isIn(DateUtil.date(), DateUtil.date(shopUser.getStartTime()), DateUtil.date(shopUser.getEndTime()))) {
throw new ApiNotPrintException("您已经是会员");
}
shopUser.setMemberLevelId(levelConfig.getId());
shopUser.setStartTime(DateUtil.date().toLocalDateTime());
}
if (shopUser.getEndTime() == null || shopUser.getEndTime().isBefore(DateUtil.date().toLocalDateTime())) {
shopUser.setEndTime(DateUtil.date().toLocalDateTime());
}
// 购买开通
MemberOrder memberOrder = memberOrderService.getOne(new QueryWrapper().eq(MemberOrder::getId, memberOrderId).eq(MemberOrder::getShopId, shopId));
if (memberOrder == null) {
log.warn("会员购买支付失败会员订单不存在会员订单id{}", memberOrderId);
return false;
}
if (!OrderStatusEnums.UNPAID.getCode().equals(memberOrder.getStatus())) {
log.warn("会员购买支付失败会员订单状态不为待支付会员订单id{}", memberOrderId);
return false;
}
switch (memberOrder.getCircleUnit()) {
case "":
shopUser.setEndTime(shopUser.getEndTime().plusDays(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusWeeks(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusMonths(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusMonths(memberOrder.getCircleTime() * 3L));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusYears(memberOrder.getCircleTime()));
break;
default:
throw new ApiNotPrintException("周期单位错误");
}
// shopUser.setEndTime(shopUser.getStartTime().plusDays(30));
// 购买开通
}else {
if (memberOrder.getReward() != null) {
deliver(shopId, userId, TableValueConstant.MemberExpFlow.Type.PAY, memberOrder.getPayAmount(), memberOrder.getReward(), memberOrderId);
}
if (shopUser.getStartTime() == null || shopUser.getEndTime().isBefore(DateUtil.date().toLocalDateTime())) {
shopUser.setStartTime(DateUtil.date().toLocalDateTime());
}
if (shopUser.getEndTime() == null || shopUser.getEndTime().isBefore(DateUtil.date().toLocalDateTime())) {
shopUser.setEndTime(DateUtil.date().toLocalDateTime());
}
if (StrUtil.isNotBlank(memberOrder.getCouponList())) {
// TODO 发券流程
MemberOrder memberOrder = memberOrderService.getOne(new QueryWrapper().eq(MemberOrder::getId, memberOrderId).eq(MemberOrder::getShopId, shopId));
if (memberOrder == null) {
log.warn("会员购买支付失败会员订单不存在会员订单id{}", memberOrderId);
return false;
}
if (!OrderStatusEnums.UNPAID.getCode().equals(memberOrder.getStatus())) {
log.warn("会员购买支付失败会员订单状态不为待支付会员订单id{}", memberOrderId);
return false;
}
switch (memberOrder.getCircleUnit()) {
case "":
shopUser.setEndTime(shopUser.getEndTime().plusDays(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusWeeks(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusMonths(memberOrder.getCircleTime()));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusMonths(memberOrder.getCircleTime() * 3L));
break;
case "":
shopUser.setEndTime(shopUser.getEndTime().plusYears(memberOrder.getCircleTime()));
break;
default:
throw new ApiNotPrintException("周期单位错误");
}
if (memberOrder.getReward() != null) {
deliver(shopId, userId, TableValueConstant.MemberExpFlow.Type.PAY, memberOrder.getPayAmount(), memberOrder.getReward(), memberOrderId);
}
if (StrUtil.isNotBlank(memberOrder.getCouponList())) {
// TODO 发券流程
// ArrayList<MkCouponGiftDTO> giftDTOS = new ArrayList<>();
// JSONArray.parseArray(memberOrder.getCouponList()).toJavaList(MemberConfigDTO.ConfigCoupon.class).forEach(item -> {
// giftDTOS.add(new MkCouponGiftDTO().setCouponId(item.getCoupon().getId())
@@ -364,15 +410,15 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
// .setNum(item.getNum()));
// });
// couponGiftService.addCouponGift(memberOrderId, "会员开通赠券", 1, giftDTOS);
}
memberOrder.setStatus(OrderStatusEnums.DONE.getCode());
memberOrderService.updateById(memberOrder);
if (shopUser.getMemberLevelId() == null) {
shopUser.setMemberLevelId(levelConfig.getId());
}
}
MemberLevelConfig levelConfig = levelConfigService.getOne(new QueryWrapper().eq(MemberLevelConfig::getShopId, shopId).orderBy(MemberLevelConfig::getExperienceValue, true).limit(1));
shopUser.setMemberLevelId(levelConfig.getId());
shopUser.setIsVip(1);
shopUserService.updateById(shopUser);
memberOrder.setStatus(OrderStatusEnums.DONE.getCode());
memberOrderService.updateById(memberOrder);
return false;
return shopUserService.updateById(shopUser);
}
}