diff --git a/cash-api/market-server/src/main/java/com/czg/controller/admin/CouponRedemptionController.java b/cash-api/market-server/src/main/java/com/czg/controller/admin/CouponRedemptionController.java index ad389f39..63146f84 100644 --- a/cash-api/market-server/src/main/java/com/czg/controller/admin/CouponRedemptionController.java +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/CouponRedemptionController.java @@ -58,9 +58,8 @@ public class CouponRedemptionController { */ @SaAdminCheckPermission(value = "couponRedemption:detail", name = "券兑换码列表") @GetMapping - public CzgResult detail(@RequestParam Integer id) { - return CzgResult.success(configService.getOneAs(new QueryWrapper().eq(MkCouponRedemptionConfig::getId, id) - .eq(MkCouponRedemptionConfig::getMainShopId, StpKit.USER.getMainShopId()), MkCouponRedemptionConfigVO.class)); + public CzgResult detail(@RequestParam Long id) { + return CzgResult.success(configService.detail(StpKit.USER.getMainShopId(), id)); } /** diff --git a/cash-api/market-server/src/main/java/com/czg/controller/user/URedemptionController.java b/cash-api/market-server/src/main/java/com/czg/controller/user/URedemptionController.java new file mode 100644 index 00000000..ee116816 --- /dev/null +++ b/cash-api/market-server/src/main/java/com/czg/controller/user/URedemptionController.java @@ -0,0 +1,40 @@ +package com.czg.controller.user; + +import com.czg.market.dto.MkRedemptionDTO; +import com.czg.market.service.MkCouponRedemptionConfigService; +import com.czg.market.service.MkEnableConfigService; +import com.czg.market.service.MkRechargeRedemptionConfigService; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * + * 兑换码相关 + * @author Administrator + */ +@RestController +@RequestMapping("/user/redemption") +public class URedemptionController { + @Resource + private MkRechargeRedemptionConfigService rechargeRedemptionConfigService; + @Resource + private MkCouponRedemptionConfigService couponRedemptionConfigService; + + /** + * 使用券码 + */ + @PostMapping("/exchange") + public CzgResult exchange(@Validated @RequestBody MkRedemptionDTO dto) { + if ("recharge".equals(dto.getType())) { + rechargeRedemptionConfigService.exchange(StpKit.USER.getLoginIdAsLong(), dto); + }else { + couponRedemptionConfigService.exchange(StpKit.USER.getLoginIdAsLong(), dto); + } + return CzgResult.success(); + } + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionDTO.java new file mode 100644 index 00000000..2ebbdfae --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionDTO.java @@ -0,0 +1,42 @@ + +package com.czg.market.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * + * @author ww + * @since 2025-09-12 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MkRedemptionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * recharge充值码 coupon券兑换码 + */ + @NotBlank(message = "类型不为空") + private String type; + /** + * 券码 + */ + @NotBlank(message = "券码不为空") + private String code; + /** + * 门店id + */ + @NotNull(message = "门店不为空") + private Long shopId; + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionConfigService.java index d114661d..d37c2cf6 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionConfigService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionConfigService.java @@ -1,6 +1,7 @@ package com.czg.market.service; import com.czg.market.dto.MkCouponRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionDTO; import com.czg.market.vo.MkCouponRedemptionCodeVO; import com.czg.market.vo.MkCouponRedemptionConfigVO; import com.mybatisflex.core.paginate.Page; @@ -16,7 +17,7 @@ import jakarta.servlet.http.HttpServletResponse; * @since 2025-10-22 */ public interface MkCouponRedemptionConfigService extends IService { - MkCouponRedemptionConfigVO detail(Long mainShopId); + MkCouponRedemptionConfigVO detail(Long mainShopId, Long id); Boolean edit(Long shopId, MkCouponRedemptionConfigDTO dto); @@ -27,4 +28,6 @@ public interface MkCouponRedemptionConfigService extends IService codeList(Long mainShopId, Long id, String code, Integer status); void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request); + + void exchange(long userId, MkRedemptionDTO dto); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkEnableConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkEnableConfigService.java index 4a669839..cc4b87cc 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkEnableConfigService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkEnableConfigService.java @@ -5,6 +5,7 @@ import com.czg.market.dto.MkEnableConfigDTO; import com.czg.market.vo.MkEnableConfigVO; import com.mybatisflex.core.service.IService; import com.czg.market.entity.MkEnableConfig; +import jakarta.validation.constraints.NotNull; /** * 兑换码明细 服务层。 @@ -16,4 +17,6 @@ public interface MkEnableConfigService extends IService { Boolean upEnable(Long mainShopId, Long shopId, MkEnableConfigDTO dto, TableValueConstant.EnableConfig.Type type); MkEnableConfigVO detail(Long mainShopId, Long shopId, TableValueConstant.EnableConfig.Type type); + + void checkEnable(Long mainShopId, @NotNull(message = "门店不为空") Long shopId, TableValueConstant.EnableConfig.Type type, boolean masterMange); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionConfigService.java index 4877e269..a2593798 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionConfigService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionConfigService.java @@ -1,6 +1,7 @@ package com.czg.market.service; import com.czg.market.dto.MkRechargeRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionDTO; import com.czg.market.vo.MkRechargeRedemptionCodeVO; import com.czg.market.vo.MkRechargeRedemptionConfigVO; import com.mybatisflex.core.paginate.Page; @@ -28,4 +29,6 @@ public interface MkRechargeRedemptionConfigService extends IService codeList(Long mainShopId, Long id, String code, Integer status); void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request); + + void exchange(long userId, MkRedemptionDTO dto); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionConfigVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionConfigVO.java index ef0f2604..346d5c98 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionConfigVO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionConfigVO.java @@ -1,5 +1,6 @@ package com.czg.market.vo; +import com.czg.market.dto.CouponInfoDTO; import com.czg.market.entity.MkRechargeRedemptionConfig; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; @@ -32,7 +33,7 @@ public class MkCouponRedemptionConfigVO implements Serializable { /** * 赠送金额 */ - private List couponInfoList; + private List couponInfoList; /** * 优惠券数量 */ diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java b/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java index 151c77c7..ee6bd5a8 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java @@ -30,6 +30,7 @@ public enum ShopUserFlowBizEnum { // ADMIN_REFUND("adminRefund"), //adminOut ADMIN_OUT("adminOut", "管理员退款充值"), + RECHARGE_REDEMPTION("rechargeRedemption", "充值兑换码"), //adminInOut // ADMIN_IN_OUT("adminInOut"), ; diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionConfigServiceImpl.java index dbe28001..ce797dfa 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionConfigServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionConfigServiceImpl.java @@ -6,12 +6,24 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import com.alibaba.fastjson2.JSONArray; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; import com.czg.account.entity.ShopUser; +import com.czg.account.service.ShopInfoService; +import com.czg.account.service.ShopUserService; +import com.czg.constant.TableValueConstant; +import com.czg.enums.ShopUserFlowBizEnum; import com.czg.exception.CzgException; +import com.czg.market.dto.CouponInfoDTO; import com.czg.market.dto.MkCouponRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionDTO; +import com.czg.market.dto.MkShopCouponGiftDTO; import com.czg.market.entity.MkCouponRedemptionCode; import com.czg.market.entity.MkCouponRedemptionConfig; +import com.czg.market.entity.MkRechargeRedemptionCode; +import com.czg.market.entity.MkRechargeRedemptionConfig; import com.czg.market.service.MkCouponRedemptionCodeService; +import com.czg.market.service.MkEnableConfigService; +import com.czg.market.service.MkShopCouponRecordService; import com.czg.market.vo.CouponInfoVO; import com.czg.market.vo.MkCouponRedemptionConfigVO; import com.czg.market.vo.MkCouponRedemptionCodeVO; @@ -26,7 +38,9 @@ import com.czg.service.market.mapper.MkCouponRedemptionConfigMapper; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -42,18 +56,27 @@ import java.util.*; public class MkCouponRedemptionConfigServiceImpl extends ServiceImpl implements MkCouponRedemptionConfigService{ @Resource private MkCouponRedemptionCodeService codeService; + @Resource + private MkEnableConfigService enableConfigService; + @Resource + private MkShopCouponRecordService shopCouponRecordService; + + @DubboReference + private ShopInfoService shopInfoService; + @DubboReference + private ShopUserService shopUserService; @Override - public MkCouponRedemptionConfigVO detail(Long mainShopId) { - MkCouponRedemptionConfig redemptionConfig = getOne(new QueryWrapper().eq(MkCouponRedemptionConfig::getMainShopId, mainShopId)); + public MkCouponRedemptionConfigVO detail(Long mainShopId, Long id) { + MkCouponRedemptionConfig redemptionConfig = getOne(new QueryWrapper().eq(MkCouponRedemptionConfig::getMainShopId, mainShopId).eq(MkCouponRedemptionConfig::getId, id)); if (redemptionConfig == null) { return null; } MkCouponRedemptionConfigVO infoList = BeanUtil.copyProperties(redemptionConfig, MkCouponRedemptionConfigVO.class, "couponInfoList"); if (StrUtil.isNotBlank(redemptionConfig.getCouponInfoList())) { - infoList.setCouponInfoList(JSONArray.parseArray(redemptionConfig.getCouponInfoList(), CouponInfoVO.class)); + infoList.setCouponInfoList(JSONArray.parseArray(redemptionConfig.getCouponInfoList(), CouponInfoDTO.class)); } return infoList; @@ -82,8 +105,8 @@ public class MkCouponRedemptionConfigServiceImpl extends ServiceImpl { + MkShopCouponGiftDTO giftDTO = new MkShopCouponGiftDTO().setCouponId(item.getId()) + .setShopId(mainShopId) + .setSourceId(redemptionCode.getId()) + .setShopUserId(shopUserInfo.getId()) + .setSource("兑换码兑换"); + shopCouponRecordService.receiveCoupon(giftDTO, item.getNum(), false); + + }); + + } + redemptionCode.setStatus(1); + redemptionCode.setUserId(shopUserInfo.getUserId()); + redemptionCode.setShopUserId(shopUserInfo.getId()); + redemptionCode.setRedemptionTime(DateUtil.date().toLocalDateTime()); + codeService.updateById(redemptionCode); + + boolean update = updateChain().eq(MkRechargeRedemptionConfig::getId, config.getId()).setRaw(MkRechargeRedemptionConfig::getStock, "stock - 1") + .where("stock - 1 >= 0").update(); + AssertUtil.isTrue(!update, "库存不足"); } } diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkEnableConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkEnableConfigServiceImpl.java index ad11bb4a..3b873320 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkEnableConfigServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkEnableConfigServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.czg.constant.TableValueConstant; +import com.czg.exception.CzgException; import com.czg.market.dto.MkEnableConfigDTO; import com.czg.market.vo.MkEnableConfigVO; import com.mybatisflex.core.query.QueryWrapper; @@ -62,4 +63,12 @@ public class MkEnableConfigServiceImpl extends ServiceImpl implements MkRechargeRedemptionConfigService{ @Resource private MkRechargeRedemptionCodeService codeService; + @Resource + private MkEnableConfigService enableConfigService; + + @DubboReference + private ShopInfoService shopInfoService; + @DubboReference + private ShopUserService shopUserService; + /** * 生成指定活动的兑换码集合 @@ -229,8 +247,49 @@ public class MkRechargeRedemptionConfigServiceImpl extends ServiceImpl= 0").update(); + AssertUtil.isTrue(!update, "库存不足"); + + } }