diff --git a/cash-api/market-server/src/main/java/com/czg/controller/user/UMemberController.java b/cash-api/market-server/src/main/java/com/czg/controller/user/UMemberController.java new file mode 100644 index 00000000..f6b191a0 --- /dev/null +++ b/cash-api/market-server/src/main/java/com/czg/controller/user/UMemberController.java @@ -0,0 +1,26 @@ +package com.czg.controller.user; + +import com.czg.market.dto.MemberOrderDTO; +import com.czg.market.entity.MemberOrder; +import com.czg.market.entity.MkShopConsumeDiscountRecord; +import com.czg.market.service.MkShopConsumeDiscountRecordService; +import com.czg.market.service.TbMemberConfigService; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.utils.ServletUtil; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 新客立减相关 + * + * @author Administrator + */ +@RestController +@RequestMapping("/user/member") +public class UMemberController { + @Resource + private TbMemberConfigService memberConfigService; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MemberJoinDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MemberJoinDTO.java new file mode 100644 index 00000000..29b07d60 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MemberJoinDTO.java @@ -0,0 +1,11 @@ +package com.czg.market.dto; + +import jakarta.validation.constraints.NotNull; + +/** + * @author Administrator + */ +public class MemberJoinDTO { + @NotNull(message = "店铺id不为空") + private Long shopId; +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/TbMemberConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/TbMemberConfigService.java index 4a4e3ecf..ec451062 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/TbMemberConfigService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/TbMemberConfigService.java @@ -4,6 +4,8 @@ import com.czg.constant.TableValueConstant; import com.czg.exception.ApiNotPrintException; import com.czg.market.dto.MemberConfigDTO; import com.czg.market.dto.MemberLevelDTO; +import com.czg.market.dto.MemberOrderDTO; +import com.czg.market.entity.MemberOrder; import com.czg.market.vo.MemberConfigVO; import com.czg.market.vo.MemberLevelVO; import com.mybatisflex.core.service.IService; diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MemberOrderServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MemberOrderServiceImpl.java index d43cf1c5..da369b89 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MemberOrderServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MemberOrderServiceImpl.java @@ -77,51 +77,30 @@ public class MemberOrderServiceImpl extends ServiceImpl 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; } } diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/TbMemberConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/TbMemberConfigServiceImpl.java index 8b65a028..cde443c0 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/TbMemberConfigServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/TbMemberConfigServiceImpl.java @@ -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 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 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> ltPayMember(String clientIP, VipMemberPayParamDTO payParam) { MemberOrder memberOrder = memberOrderService.getOne(new QueryWrapper().eq(MemberOrder::getId, payParam.getMemberOrderId())); AssertUtil.isNull(memberOrder, "充值会员失败 该会员订单不存在"); - ShopUser shopUser = shopUserService.getById(payParam.getShopUserId()); + ShopUser shopUser = shopUserService.getOne(new QueryWrapper().eq(ShopUser::getSourceShopId, payParam.getShopId()).eq(ShopUser::getId, payParam.getShopUserId())); AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); @@ -535,7 +535,7 @@ public class PayServiceImpl implements PayService { .setRelationId(refPaymentId) .setRechargeId(inFlow.getId()); //更新会员余额 并生成流水 - shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO); + shopUserService.updateMoney(shopUser.getSourceShopId(), shopUserMoneyEditDTO); userFlowService.updateRefund(inFlow.getId(), refPayParam.getRefAmount()); if (giftFlow != null && (giftFlow.getAmount().subtract(giftFlow.getRefundAmount())).compareTo(BigDecimal.ZERO) > 0) { ShopUserMoneyEditDTO giftFlowEdit = new ShopUserMoneyEditDTO() @@ -547,7 +547,7 @@ public class PayServiceImpl implements PayService { .setRelationId(refPaymentId) .setRechargeId(giftFlow.getId()); //更新会员余额 并生成流水 - shopUserService.updateMoney(shopUser.getShopId(), giftFlowEdit); + shopUserService.updateMoney(shopUser.getSourceShopId(), giftFlowEdit); userFlowService.updateRefund(giftFlow.getId(), giftFlow.getAmount()); } //移除优惠券 @@ -670,7 +670,7 @@ public class PayServiceImpl implements PayService { .setType(1) .setRelationId(orderInfo.getId()) .setBizEnum(ShopUserFlowBizEnum.ORDER_REFUND); - shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO); + shopUserService.updateMoney(shopUser.getSourceShopId(), shopUserMoneyEditDTO); } else if (orderInfo.getPayType().equals(PayEnums.CREDIT_PAY.getValue())) { AssertUtil.isNull(orderInfo.getCreditBuyerId(), "挂账单退款失败,未查询到挂账人"); buyerOrderService.partRefund(orderInfo.getCreditBuyerId().toString(), orderInfo.getId(), param.getRefundAmount()); diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopStorageServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopStorageServiceImpl.java index c478c882..d85a41cc 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopStorageServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ShopStorageServiceImpl.java @@ -70,7 +70,7 @@ public class ShopStorageServiceImpl extends ServiceImpl