Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
2025-09-25 11:43:11 +08:00
17 changed files with 290 additions and 60 deletions

View File

@@ -3,14 +3,13 @@ package com.czg.service.market.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.czg.account.dto.shopuser.ShopUserAddDTO;
import com.czg.account.entity.ShopUser;
import com.czg.account.service.*;
import com.czg.market.dto.MemberConfigDTO;
import com.czg.account.entity.ShopInfo;
import com.czg.account.entity.UserInfo;
import com.czg.account.service.ShopInfoService;
import com.czg.account.service.ShopUserService;
import com.czg.market.service.TbMemberConfigService;
import com.czg.account.service.UserInfoService;
import com.czg.market.vo.MemberConfigVO;
import com.czg.exception.CzgException;
import com.czg.market.dto.MemberOrderDTO;
@@ -45,6 +44,8 @@ public class MemberOrderServiceImpl extends ServiceImpl<MemberOrderMapper, Membe
@DubboReference
private UserInfoService userInfoService;
@DubboReference
private UShopUserService uShopUserService;
@DubboReference
private ShopUserService shopUserService;
@DubboReference
private TbMemberConfigService memberConfigService;
@@ -58,30 +59,53 @@ public class MemberOrderServiceImpl extends ServiceImpl<MemberOrderMapper, Membe
ShopInfo shopInfo = shopInfoService.getById(orderDTO.getShopId());
AssertUtil.isNull(shopInfo, "生成订单失败,店铺信息不存在");
if (orderDTO.getUserId() != null) {
UserInfo userInfo = userInfoService.getById(orderDTO.getUserId());
AssertUtil.isNull(userInfo, "生成订单失败,用户信息不存在");
}
ShopUser shopUser = shopUserService.getOne(new QueryWrapper().eq(ShopUser::getSourceShopId, orderDTO.getShopId()).eq(ShopUser::getUserId, orderDTO.getUserId()));
AssertUtil.isNull(shopUser, "生成订单失败,用户信息不存在");
UserInfo userInfo = userInfoService.getById(orderDTO.getUserId());
AssertUtil.isNull(userInfo, "生成订单失败,用户信息不存在");
MemberConfigVO memberConfigVO = memberConfigService.detail(shopInfo.getId());
if(memberConfigVO.getConfigList() == null || memberConfigVO.getConfigList().isEmpty()) {
throw new CzgException("会员开通方案未配置,请联系店铺");
if (memberConfigVO.getIsSubmitInfo() == 1) {
AssertUtil.isBlank(orderDTO.getBirthDay(), "生日不能为空");
AssertUtil.isBlank(orderDTO.getNickName(), "名称不能为空");
AssertUtil.isNull(orderDTO.getSex(), "性别不能为空");
userInfo.setSex(orderDTO.getSex());
userInfo.setNickName(orderDTO.getNickName());
userInfo.setBirthDay(orderDTO.getBirthDay());
}
ShopUser shopUser = shopUserService.getOne(new QueryWrapper().eq(ShopUser::getUserId, orderDTO.getUserId()).eq(ShopUser::getSourceShopId, orderDTO.getShopId()));
if (shopUser == null) {
uShopUserService.join(orderDTO.getShopId(), orderDTO.getUserId(), new ShopUserAddDTO()
.setPhone(userInfo.getPhone())
.setSex(userInfo.getSex())
.setHeadImg(userInfo.getHeadImg())
.setAmount(BigDecimal.ZERO)
.setBirthDay(userInfo.getBirthDay())
.setIsVip(0)
.setAccountPoints(0)
.setNickName(userInfo.getNickName())
);
}
MemberConfigDTO.ConfigList configItem = memberConfigVO.getConfigList().stream()
.filter(item -> item.getName().equals(orderDTO.getName()))
.findFirst()
.orElseThrow(() -> new CzgException("会员开通方案未配置,请联系店铺"));
if ("PAY".equals(memberConfigVO.getOpenType())){
if(memberConfigVO.getConfigList() == null || memberConfigVO.getConfigList().isEmpty()) {
throw new CzgException("会员开通方案未配置,请联系店铺");
}
AssertUtil.isBlank(orderDTO.getName(), "方案名称不能为空");
AssertUtil.isNull(orderDTO.getNum(), "开通周期数不为空");
MemberConfigDTO.ConfigList configItem = memberConfigVO.getConfigList().stream()
.filter(item -> item.getName().equals(orderDTO.getName()))
.findFirst()
.orElseThrow(() -> new CzgException("会员开通方案未配置,请联系店铺"));
//生成订单
MemberOrder orderInfo = new MemberOrder();
orderInfo.setOrderNo(orderDTO.getPlatformType() + IdUtil.getSnowflakeNextId());
orderInfo.setOrderNo(orderDTO.getPlatformType() + "ME" + IdUtil.getSnowflakeNextId());
orderInfo.setShopId(orderDTO.getShopId());
orderInfo.setPayAmount(BigDecimal.ZERO);
orderInfo.setStatus(OrderStatusEnums.UNPAID.getCode());

View File

@@ -14,14 +14,11 @@ import com.czg.account.entity.*;
import com.czg.account.service.*;
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.market.vo.*;
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.sa.StpKit;
import com.czg.service.market.enums.OrderStatusEnums;
import com.czg.service.market.mapper.TbMemberConfigMapper;
import com.czg.utils.AssertUtil;
@@ -36,9 +33,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 会员基础配置 服务层实现。
@@ -69,6 +65,8 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
private MemberExpFlowService memberExpFlowService;
@Resource
private MkShopCouponRecordService shopCouponRecordService;
@DubboReference
private ShopInfoService shopInfoService;
@Override
public MemberConfigVO detail(Long shopId) {
@@ -96,6 +94,48 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
return memberConfigVO;
}
@Override
public UMemberConfigVO detail(Long shopId, Long userId) {
MemberConfigVO memberConfigVO = detail(shopId);
ShopUser shopUserInfo = shopUserService.getShopUserInfo(shopId, userId);
HashMap<String, Object> conditionMap = new HashMap<>();
UMemberConfigVO configVO = new UMemberConfigVO();
configVO.setMemberConfig(memberConfigVO);
configVO.setConditionMap(conditionMap);
if (memberConfigVO.getConditionList() != null) {
for (MemberConfigDTO.condition item : memberConfigVO.getConditionList()) {
switch (item.getCode()) {
case "BIND_PHONE":
conditionMap.put("BIND_PHONE", StrUtil.isNotBlank(shopUserInfo.getPhone()));
break;
case "ORDER":
conditionMap.put("ORDER", orderInfoService.count(new QueryWrapper().eq(OrderInfo::getShopId, shopUserInfo.getSourceShopId()).eq(OrderInfo::getUserId, shopUserInfo.getUserId())
.notIn(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode(), OrderStatusEnums.CANCELLED.getCode())) >= Integer.parseInt(item.getValue()));
break;
case "COST_AMOUNT":
conditionMap.put("BIND_PHONE", orderInfoService.list(new QueryWrapper().eq(OrderInfo::getShopId, shopUserInfo.getSourceShopId()).eq(OrderInfo::getUserId, shopUserInfo.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);
break;
case "RECHARGE_AMOUNT":
conditionMap.put("BIND_PHONE", paymentService.list(new QueryWrapper().eq(OrderPayment::getShopId, shopUserInfo.getSourceShopId())
.eq(OrderPayment::getSourceId, shopUserInfo.getId()).isNotNull(OrderPayment::getTradeNumber))
.stream().map(OrderPayment::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) >= 0);
break;
default:
throw new CzgException("会员开通条件类型错误");
}
}
}
return configVO;
}
@Override
public Boolean edit(Long shopId, MemberConfigDTO memberDTO) {
TbMemberConfig memberConfig = getOne(new QueryWrapper().eq(TbMemberConfig::getShopId, shopId));
@@ -317,10 +357,6 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
// 条件开通
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()) {
@@ -328,15 +364,15 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
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());
.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;
.stream().map(OrderInfo::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) >= 0;
case "RECHARGE_AMOUNT" ->
paymentService.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;
.stream().map(OrderPayment::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(new BigDecimal(item.getValue())) >= 0;
default -> throw new CzgException("会员开通条件类型错误");
};
if (!canOpen) {
@@ -344,15 +380,18 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
}
}
if (DateUtil.isIn(DateUtil.date(), DateUtil.date(shopUser.getStartTime()), DateUtil.date(shopUser.getEndTime()))) {
if (shopUser.getStartTime() != null && shopUser.getEndTime() != null && DateUtil.isIn(DateUtil.date(), DateUtil.date(shopUser.getStartTime()), DateUtil.date(shopUser.getEndTime()))) {
throw new ApiNotPrintException("您已经是会员");
}
shopUser.setMemberLevelId(levelConfig.getId());
shopUser.setStartTime(DateUtil.date().toLocalDateTime());
// shopUser.setEndTime(shopUser.getStartTime().plusDays(30));
shopUser.setEndTime(shopUser.getStartTime().plusDays(20000));
// 购买开通
} else {
if (memberConfigVO.getConfigList() == null || memberConfigVO.getConfigList().isEmpty()) {
throw new CzgException("会员开通方案未配置,请联系店铺");
}
if (shopUser.getStartTime() == null || shopUser.getEndTime().isBefore(DateUtil.date().toLocalDateTime())) {
shopUser.setStartTime(DateUtil.date().toLocalDateTime());
@@ -415,4 +454,40 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
shopUser.setIsVip(1);
return shopUserService.updateById(shopUser);
}
@Override
public List<MemberListVO> getMemberList(Long userId) {
List<ShopUser> shopUsers = shopUserService.list(new QueryWrapper().eq(ShopUser::getUserId, userId));
Set<Long> shopIdList = shopUsers.stream().map(ShopUser::getSourceShopId).collect(Collectors.toSet());
Map<Long, ShopInfo> shopInfoMap = shopInfoService.list(new QueryWrapper().in(ShopInfo::getId, shopIdList)).stream().collect(Collectors.toMap(ShopInfo::getId, item -> item));
ArrayList<MemberListVO> memberListVOS = new ArrayList<>();
shopUsers.forEach(shopUser -> {
if (shopUser.getStartTime() != null && shopUser.getEndTime() != null && DateUtil.isIn(DateUtil.date(), DateUtil.date(shopUser.getStartTime()), DateUtil.date(shopUser.getEndTime()))) {
ShopInfo shopInfo = shopInfoMap.getOrDefault(shopUser.getSourceShopId(), new ShopInfo());
memberListVOS.add(new MemberListVO().setShopName(shopInfo.getShopName())
.setShopId(shopInfo.getId())
.setLogo(shopInfo.getLogo()));
}else {
shopUser.setIsVip(0);
shopUserService.updateById(shopUser);
}
});
return memberListVOS;
}
@Override
public MemberDetailVO getUserDetail(Long userId, Long shopId) {
ShopUser shopUser = shopUserService.getOne(new QueryWrapper().eq(ShopUser::getUserId, userId).eq(ShopUser::getSourceShopId, shopId));
ShopInfo shopInfo = shopInfoService.getById(shopUser.getSourceShopId());
MemberLevelVO levelVO = levelConfigService.detail(shopUser.getMemberLevelId());
MemberLevelConfig nextLevel = levelConfigService.getOne(new QueryWrapper().eq(MemberLevelConfig::getShopId, shopId).ge(MemberLevelConfig::getExperienceValue, shopUser.getExperience())
.ne(MemberLevelConfig::getId, shopUser.getId()).orderBy(MemberLevelConfig::getExperienceValue, true));
return new MemberDetailVO()
.setShopInfo(shopInfo)
.setMemberLevel(levelVO)
.setExperience(shopUser.getExperience())
.setEndTime(shopUser.getEndTime())
.setNextExperienceValue(nextLevel.getExperienceValue() - shopUser.getExperience());
}
}