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 63146f84..ceb9205a 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 @@ -3,19 +3,17 @@ package com.czg.controller.admin; import com.czg.annotation.SaAdminCheckPermission; import com.czg.annotation.SaCheckMainShop; import com.czg.constant.TableValueConstant; -import com.czg.market.dto.MkCouponRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionConfigDTO; import com.czg.market.dto.MkEnableConfigDTO; -import com.czg.market.entity.MkCouponRedemptionConfig; -import com.czg.market.service.MkCouponRedemptionConfigService; +import com.czg.market.service.MkRedemptionConfigService; import com.czg.market.service.MkEnableConfigService; -import com.czg.market.vo.MkCouponRedemptionCodeVO; -import com.czg.market.vo.MkCouponRedemptionConfigVO; +import com.czg.market.vo.MkRedemptionCodeVO; +import com.czg.market.vo.MkRedemptionConfigVO; import com.czg.market.vo.MkEnableConfigVO; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.czg.validator.group.UpdateGroup; import com.mybatisflex.core.paginate.Page; -import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -32,7 +30,7 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/admin/couponRedemption") public class CouponRedemptionController { @Resource - private MkCouponRedemptionConfigService configService; + private MkRedemptionConfigService configService; @Resource private MkEnableConfigService enableConfigService; @@ -58,7 +56,7 @@ public class CouponRedemptionController { */ @SaAdminCheckPermission(value = "couponRedemption:detail", name = "券兑换码列表") @GetMapping - public CzgResult detail(@RequestParam Long id) { + public CzgResult detail(@RequestParam Long id) { return CzgResult.success(configService.detail(StpKit.USER.getMainShopId(), id)); } @@ -67,8 +65,8 @@ public class CouponRedemptionController { */ @SaAdminCheckPermission(value = "couponRedemption:list", name = "券兑换码列表") @GetMapping("/list") - public CzgResult> list(@RequestParam(required = false, defaultValue = "-1") Integer status) { - return CzgResult.success(configService.pageInfo(StpKit.USER.getMainShopId(), status)); + public CzgResult> list(@RequestParam(required = false, defaultValue = "-1") Integer status) { + return CzgResult.success(configService.pageInfo(StpKit.USER.getMainShopId(), status, false)); } /** @@ -77,8 +75,8 @@ public class CouponRedemptionController { @SaAdminCheckPermission(value = "couponRedemption:add", name = "券兑换码配置添加") @PostMapping @SaCheckMainShop - public CzgResult add(@Validated @RequestBody MkCouponRedemptionConfigDTO dto) { - return CzgResult.success(configService.add(StpKit.USER.getMainShopId(), dto)); + public CzgResult add(@Validated @RequestBody MkRedemptionConfigDTO dto) { + return CzgResult.success(configService.add(StpKit.USER.getMainShopId(), dto, false)); } /** @@ -89,8 +87,8 @@ public class CouponRedemptionController { @SaAdminCheckPermission(value = "couponRedemption:edit", name = "券兑换码修改") @SaCheckMainShop @PutMapping - public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @RequestBody MkCouponRedemptionConfigDTO dto) { - return CzgResult.success(configService.edit(StpKit.USER.getShopId(), dto)); + public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @RequestBody MkRedemptionConfigDTO dto) { + return CzgResult.success(configService.edit(StpKit.USER.getShopId(), dto, false)); } /** @@ -100,8 +98,8 @@ public class CouponRedemptionController { */ @SaAdminCheckPermission(value = "couponRedemption:codeList", name = "券兑换码码列表") @GetMapping("/code/list") - public CzgResult> codeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status) { - return CzgResult.success(configService.codeList(StpKit.USER.getMainShopId(), redemptionId, code, status)); + public CzgResult> codeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status) { + return CzgResult.success(configService.codeList(StpKit.USER.getMainShopId(), redemptionId, code, status, false)); } /** @@ -111,7 +109,7 @@ public class CouponRedemptionController { @GetMapping("/code/export") public void exportCodeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status, HttpServletResponse response, HttpServletRequest request) { - configService.exportCodeList(StpKit.USER.getMainShopId(), redemptionId, code, status, response, request); + configService.exportCodeList(StpKit.USER.getMainShopId(), redemptionId, code, status, response, request, false); } } diff --git a/cash-api/market-server/src/main/java/com/czg/controller/admin/RechargeRedemptionController.java b/cash-api/market-server/src/main/java/com/czg/controller/admin/RechargeRedemptionController.java index 4970bd72..16248110 100644 --- a/cash-api/market-server/src/main/java/com/czg/controller/admin/RechargeRedemptionController.java +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/RechargeRedemptionController.java @@ -3,19 +3,17 @@ package com.czg.controller.admin; import com.czg.annotation.SaAdminCheckPermission; import com.czg.annotation.SaCheckMainShop; import com.czg.constant.TableValueConstant; +import com.czg.market.dto.MkRedemptionConfigDTO; import com.czg.market.dto.MkEnableConfigDTO; -import com.czg.market.dto.MkRechargeRedemptionConfigDTO; -import com.czg.market.entity.MkRechargeRedemptionConfig; +import com.czg.market.service.MkRedemptionConfigService; import com.czg.market.service.MkEnableConfigService; -import com.czg.market.service.MkRechargeRedemptionConfigService; +import com.czg.market.vo.MkRedemptionCodeVO; +import com.czg.market.vo.MkRedemptionConfigVO; import com.czg.market.vo.MkEnableConfigVO; -import com.czg.market.vo.MkRechargeRedemptionCodeVO; -import com.czg.market.vo.MkRechargeRedemptionConfigVO; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.czg.validator.group.UpdateGroup; import com.mybatisflex.core.paginate.Page; -import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -32,7 +30,7 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/admin/rechargeRedemption") public class RechargeRedemptionController { @Resource - private MkRechargeRedemptionConfigService configService; + private MkRedemptionConfigService configService; @Resource private MkEnableConfigService enableConfigService; @@ -58,9 +56,8 @@ public class RechargeRedemptionController { */ @SaAdminCheckPermission(value = "rechargeRedemption:detail", name = "充值兑换列表") @GetMapping - public CzgResult detail(@RequestParam Integer id) { - return CzgResult.success(configService.getOneAs(new QueryWrapper().eq(MkRechargeRedemptionConfig::getId, id) - .eq(MkRechargeRedemptionConfig::getMainShopId, StpKit.USER.getMainShopId()), MkRechargeRedemptionConfigVO.class)); + public CzgResult detail(@RequestParam Long id) { + return CzgResult.success(configService.detail(StpKit.USER.getMainShopId(), id)); } /** @@ -68,8 +65,8 @@ public class RechargeRedemptionController { */ @SaAdminCheckPermission(value = "rechargeRedemption:list", name = "充值兑换列表") @GetMapping("/list") - public CzgResult> list(@RequestParam(required = false, defaultValue = "-1") Integer status) { - return CzgResult.success(configService.pageInfo(StpKit.USER.getMainShopId(), status)); + public CzgResult> list(@RequestParam(required = false, defaultValue = "-1") Integer status) { + return CzgResult.success(configService.pageInfo(StpKit.USER.getMainShopId(), status, true)); } /** @@ -78,8 +75,8 @@ public class RechargeRedemptionController { @SaAdminCheckPermission(value = "rechargeRedemption:add", name = "充值兑换配置添加") @PostMapping @SaCheckMainShop - public CzgResult add(@Validated @RequestBody MkRechargeRedemptionConfigDTO dto) { - return CzgResult.success(configService.add(StpKit.USER.getMainShopId(), dto)); + public CzgResult add(@Validated @RequestBody MkRedemptionConfigDTO dto) { + return CzgResult.success(configService.add(StpKit.USER.getMainShopId(), dto, true)); } /** @@ -90,8 +87,8 @@ public class RechargeRedemptionController { @SaAdminCheckPermission(value = "rechargeRedemption:edit", name = "充值兑换修改") @SaCheckMainShop @PutMapping - public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @RequestBody MkRechargeRedemptionConfigDTO dto) { - return CzgResult.success(configService.edit(StpKit.USER.getShopId(), dto)); + public CzgResult edit(@Validated({UpdateGroup.class, Default.class}) @RequestBody MkRedemptionConfigDTO dto) { + return CzgResult.success(configService.edit(StpKit.USER.getShopId(), dto, true)); } /** @@ -101,8 +98,8 @@ public class RechargeRedemptionController { */ @SaAdminCheckPermission(value = "rechargeRedemption:codeList", name = "充值兑换码列表") @GetMapping("/code/list") - public CzgResult> codeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status) { - return CzgResult.success(configService.codeList(StpKit.USER.getMainShopId(), redemptionId, code, status)); + public CzgResult> codeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status) { + return CzgResult.success(configService.codeList(StpKit.USER.getMainShopId(), redemptionId, code, status, true)); } /** @@ -112,7 +109,7 @@ public class RechargeRedemptionController { @GetMapping("/code/export") public void exportCodeList(@RequestParam Long redemptionId, @RequestParam(required = false) String code, @RequestParam(required = false) Integer status, HttpServletResponse response, HttpServletRequest request) { - configService.exportCodeList(StpKit.USER.getMainShopId(), redemptionId, code, status, response, request); + configService.exportCodeList(StpKit.USER.getMainShopId(), redemptionId, code, status, response, request, true); } } 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 index ee116816..dc67da48 100644 --- 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 @@ -1,9 +1,8 @@ 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.market.service.MkRedemptionConfigService; +import com.czg.market.vo.URedemptionVO; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import jakarta.annotation.Resource; @@ -19,22 +18,25 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/user/redemption") public class URedemptionController { @Resource - private MkRechargeRedemptionConfigService rechargeRedemptionConfigService; - @Resource - private MkCouponRedemptionConfigService couponRedemptionConfigService; + private MkRedemptionConfigService redemptionConfigService; /** * 使用券码 */ @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); - } + redemptionConfigService.exchange(StpKit.USER.getLoginIdAsLong(), dto); return CzgResult.success(); } + /** + * 兑换码详细信息 + * @param code 兑换码 + */ + @GetMapping + public CzgResult get(@RequestParam String code) { + return CzgResult.success(redemptionConfigService.getInfo(code)); + } + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRechargeRedemptionConfigDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRechargeRedemptionConfigDTO.java deleted file mode 100644 index 28a4c0f7..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRechargeRedemptionConfigDTO.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.czg.market.dto; - -import com.czg.market.entity.ShopCoupon; -import com.czg.validator.group.UpdateGroup; -import com.mybatisflex.annotation.Column; -import com.mybatisflex.annotation.Id; -import com.mybatisflex.annotation.KeyType; -import jakarta.validation.Valid; -import jakarta.validation.constraints.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author Administrator - */ -@Data -public class MkRechargeRedemptionConfigDTO implements Serializable { - - - @NotNull(message = "id不能为空", groups = UpdateGroup.class) - private Long id; - - /** - * 名称 - */ - @NotBlank(message = "名称不能为空") - private String name; - - /** - * 赠送金额 - */ - @NotNull(message = "赠送金额不能为空") - @DecimalMin(value = "0.01", message = "赠送金额不能小于0.01") - private BigDecimal amount; - - /** - * 库存 - */ - private Integer stock; - - /** - * 总数 - */ - @Min(value = 0, message = "总数不能小于0") - @NotNull(message = "总数不能为空") - @Max(value = 1000, message = "总数不能大于1000") - private Integer total; - - /** - * 可用开始时间 - */ - private LocalDateTime startTime; - - /** - * 可用结束时间 - */ - private LocalDateTime endTime; -} - diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkCouponRedemptionConfigDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionConfigDTO.java similarity index 83% rename from cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkCouponRedemptionConfigDTO.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionConfigDTO.java index c4e0b1a3..34625162 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkCouponRedemptionConfigDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkRedemptionConfigDTO.java @@ -14,7 +14,7 @@ import java.util.List; * @author Administrator */ @Data -public class MkCouponRedemptionConfigDTO implements Serializable { +public class MkRedemptionConfigDTO implements Serializable { @NotNull(message = "id不能为空", groups = UpdateGroup.class) @@ -26,6 +26,12 @@ public class MkCouponRedemptionConfigDTO implements Serializable { @NotBlank(message = "名称不能为空") private String name; + /** + * 赠送金额 + */ + @DecimalMin(value = "0.01", message = "赠送金额不能小于0.01") + private BigDecimal amount; + /** * 券信息 */ 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 index 2ebbdfae..97a06069 100644 --- 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 @@ -22,21 +22,12 @@ 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/entity/MkRechargeRedemptionCode.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRechargeRedemptionCode.java deleted file mode 100644 index a0a42b3c..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRechargeRedemptionCode.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.czg.market.entity; - -import com.mybatisflex.annotation.Column; -import com.mybatisflex.annotation.Id; -import com.mybatisflex.annotation.KeyType; -import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.time.LocalDateTime; - -import java.io.Serial; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 兑换码明细 实体类。 - * - * @author zs - * @since 2025-10-21 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Table("mk_recharge_redemption_code") -@Accessors(chain = true) -public class MkRechargeRedemptionCode implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @Id(keyType = KeyType.Auto) - private Long id; - - /** - * 兑换配置id - */ - private Long redemptionId; - - /** - * 主店id - */ - private Long mainShopId; - - /** - * 兑换时间 - */ - private LocalDateTime redemptionTime; - - /** - * 0未兑换 1已兑换 - */ - private Integer status; - - /** - * 店铺用户id - */ - private Long shopUserId; - - /** - * 用户id - */ - private Long userId; - - /** - * 创建时间 - */ - @Column(onInsertValue = "now()") - private LocalDateTime createTime; - - /** - * 修改时间 - */ - @Column(onInsertValue = "now()", onUpdateValue = "now()") - private LocalDateTime updateTime; - - /** - * 兑换码 - */ - private String code; - -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRechargeRedemptionConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRechargeRedemptionConfig.java deleted file mode 100644 index d8e2d023..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRechargeRedemptionConfig.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.czg.market.entity; - -import com.mybatisflex.annotation.Column; -import com.mybatisflex.annotation.Id; -import com.mybatisflex.annotation.KeyType; -import com.mybatisflex.annotation.Table; -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -import java.io.Serial; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 充值优惠券修改 实体类。 - * - * @author zs - * @since 2025-10-21 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Table("mk_recharge_redemption_config") -@Accessors(chain = true) -public class MkRechargeRedemptionConfig implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @Id(keyType = KeyType.Auto) - private Long id; - - /** - * 名称 - */ - private String name; - - /** - * 赠送金额 - */ - private BigDecimal amount; - - /** - * 库存 - */ - private Integer stock; - - /** - * 总数 - */ - private Integer total; - - /** - * 可用开始时间 - */ - private LocalDateTime startTime; - - /** - * 可用结束时间 - */ - private LocalDateTime endTime; - - /** - * 门店id - */ - private Long mainShopId; - - /** - * 创建时间 - */ - @Column(onInsertValue = "now()") - private LocalDateTime createTime; - - /** - * 修改时间 - */ - @Column(onInsertValue = "now()", onUpdateValue = "now()") - private LocalDateTime updateTime; - - @Column(ignore = true) - private Integer status; -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionCode.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionCode.java similarity index 93% rename from cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionCode.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionCode.java index f80d7acb..0a0135f3 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionCode.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionCode.java @@ -25,9 +25,9 @@ import lombok.experimental.Accessors; @Builder @NoArgsConstructor @AllArgsConstructor -@Table("mk_coupon_redemption_code") +@Table("mk_redemption_code") @Accessors(chain = true) -public class MkCouponRedemptionCode implements Serializable { +public class MkRedemptionCode implements Serializable { @Serial private static final long serialVersionUID = 1L; diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionConfig.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionConfig.java similarity index 91% rename from cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionConfig.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionConfig.java index cbeac085..4632534e 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkCouponRedemptionConfig.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkRedemptionConfig.java @@ -9,7 +9,6 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.io.Serial; -import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; @@ -26,8 +25,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@Table("mk_coupon_redemption_config") -public class MkCouponRedemptionConfig implements Serializable { +@Table("mk_redemption_config") +public class MkRedemptionConfig implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -40,6 +39,8 @@ public class MkCouponRedemptionConfig implements Serializable { */ private String name; + private BigDecimal amount; + /** * 券信息 @@ -89,4 +90,6 @@ public class MkCouponRedemptionConfig implements Serializable { @Column(ignore = true) private int status; + private Integer type; + } 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 deleted file mode 100644 index d37c2cf6..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionConfigService.java +++ /dev/null @@ -1,33 +0,0 @@ -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; -import com.mybatisflex.core.service.IService; -import com.czg.market.entity.MkCouponRedemptionConfig; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -/** - * 充值优惠券修改 服务层。 - * - * @author zs - * @since 2025-10-22 - */ -public interface MkCouponRedemptionConfigService extends IService { - MkCouponRedemptionConfigVO detail(Long mainShopId, Long id); - - Boolean edit(Long shopId, MkCouponRedemptionConfigDTO dto); - - boolean add(Long mainShopId, MkCouponRedemptionConfigDTO dto); - - Page pageInfo(Long mainShopId, Integer status); - - Page 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/MkRechargeRedemptionCodeService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionCodeService.java deleted file mode 100644 index 47eae45e..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionCodeService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.czg.market.service; - -import com.mybatisflex.core.service.IService; -import com.czg.market.entity.MkRechargeRedemptionCode; - -/** - * 兑换码明细 服务层。 - * - * @author zs - * @since 2025-10-21 - */ -public interface MkRechargeRedemptionCodeService extends IService { - -} 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 deleted file mode 100644 index a2593798..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRechargeRedemptionConfigService.java +++ /dev/null @@ -1,34 +0,0 @@ -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; -import com.mybatisflex.core.service.IService; -import com.czg.market.entity.MkRechargeRedemptionConfig; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -/** - * 充值优惠券修改 服务层。 - * - * @author zs - * @since 2025-10-21 - */ -public interface MkRechargeRedemptionConfigService extends IService { - - MkRechargeRedemptionConfigVO detail(Long mainShopId); - - Boolean edit(Long shopId, MkRechargeRedemptionConfigDTO dto); - - boolean add(Long mainShopId, MkRechargeRedemptionConfigDTO dto); - - Page pageInfo(Long mainShopId, Integer status); - - Page 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/MkCouponRedemptionCodeService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionCodeService.java similarity index 52% rename from cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionCodeService.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionCodeService.java index cf309d65..edba0dd1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkCouponRedemptionCodeService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionCodeService.java @@ -1,7 +1,7 @@ package com.czg.market.service; import com.mybatisflex.core.service.IService; -import com.czg.market.entity.MkCouponRedemptionCode; +import com.czg.market.entity.MkRedemptionCode; /** * 兑换码明细 服务层。 @@ -9,6 +9,6 @@ import com.czg.market.entity.MkCouponRedemptionCode; * @author zs * @since 2025-10-22 */ -public interface MkCouponRedemptionCodeService extends IService { +public interface MkRedemptionCodeService extends IService { } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionConfigService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionConfigService.java new file mode 100644 index 00000000..2d273a52 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkRedemptionConfigService.java @@ -0,0 +1,36 @@ +package com.czg.market.service; + +import com.czg.market.dto.MkRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionDTO; +import com.czg.market.vo.MkRedemptionCodeVO; +import com.czg.market.vo.MkRedemptionConfigVO; +import com.czg.market.vo.URedemptionVO; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkRedemptionConfig; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * 充值优惠券修改 服务层。 + * + * @author zs + * @since 2025-10-22 + */ +public interface MkRedemptionConfigService extends IService { + MkRedemptionConfigVO detail(Long mainShopId, Long id); + + Boolean edit(Long shopId, MkRedemptionConfigDTO dto, boolean isRecharge); + + boolean add(Long mainShopId, MkRedemptionConfigDTO dto, boolean isRecharge); + + Page pageInfo(Long mainShopId, Integer status, boolean isRecharge); + + Page codeList(Long mainShopId, Long id, String code, Integer status, boolean isRecharge); + + void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request, boolean isRecharge); + + void exchange(long userId, MkRedemptionDTO dto); + + URedemptionVO getInfo(String code); +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionCodeVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionCodeVO.java deleted file mode 100644 index c7451c59..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionCodeVO.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.czg.market.vo; - -import com.mybatisflex.annotation.Column; -import com.mybatisflex.annotation.Id; -import com.mybatisflex.annotation.KeyType; -import com.mybatisflex.annotation.Table; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 兑换码明细 实体类。 - * - * @author zs - * @since 2025-10-21 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -public class MkRechargeRedemptionCodeVO implements Serializable { - - @Id(keyType = KeyType.Auto) - private Long id; - - /** - * 兑换配置id - */ - private Long redemptionId; - - /** - * 主店id - */ - private Long mainShopId; - - /** - * 兑换时间 - */ - private LocalDateTime redemptionTime; - - /** - * 0未兑换 1已兑换 - */ - private Integer status; - - /** - * 店铺用户id - */ - private Long shopUserId; - - /** - * 用户id - */ - private Long userId; - - /** - * 创建时间 - */ - @Column(onInsertValue = "now()") - private LocalDateTime createTime; - - /** - * 修改时间 - */ - @Column(onInsertValue = "now()", onUpdateValue = "now()") - private LocalDateTime updateTime; - - /** - * 兑换码 - */ - private String code; - - /** - * 用户昵称 - */ - private String nickName; - /** - * 用户手机号 - */ - private String phone; - -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionConfigVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionConfigVO.java deleted file mode 100644 index 0db0c2e3..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRechargeRedemptionConfigVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.czg.market.vo; - -import com.czg.market.dto.MemberConfigDTO; -import com.czg.market.entity.MkRechargeRedemptionConfig; -import jakarta.validation.Valid; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author Administrator - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class MkRechargeRedemptionConfigVO extends MkRechargeRedemptionConfig implements Serializable { - -} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionCodeVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRedemptionCodeVO.java similarity index 95% rename from cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionCodeVO.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRedemptionCodeVO.java index 7592e91a..8b5e6b1d 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionCodeVO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRedemptionCodeVO.java @@ -23,7 +23,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) -public class MkCouponRedemptionCodeVO implements Serializable { +public class MkRedemptionCodeVO implements Serializable { @Id(keyType = KeyType.Auto) private Long id; 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/MkRedemptionConfigVO.java similarity index 89% rename from cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkCouponRedemptionConfigVO.java rename to cash-common/cash-common-service/src/main/java/com/czg/market/vo/MkRedemptionConfigVO.java index 346d5c98..aacbace2 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/MkRedemptionConfigVO.java @@ -1,12 +1,10 @@ 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; import com.mybatisflex.annotation.KeyType; import lombok.Data; -import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; @@ -18,7 +16,7 @@ import java.util.List; * @author Administrator */ @Data -public class MkCouponRedemptionConfigVO implements Serializable { +public class MkRedemptionConfigVO implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -78,4 +76,7 @@ public class MkCouponRedemptionConfigVO implements Serializable { @Column(ignore = true) private Integer status; + + private BigDecimal amount; + private Integer type; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/vo/URedemptionVO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/URedemptionVO.java new file mode 100644 index 00000000..01a10024 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/vo/URedemptionVO.java @@ -0,0 +1,36 @@ +package com.czg.market.vo; + +import com.czg.market.dto.CouponInfoDTO; +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 兑换码明细 实体类。 + * + * @author zs + * @since 2025-10-21 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class URedemptionVO implements Serializable { + + private String shopName; + private String name; + private List couponInfoList; + private BigDecimal amount; + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionCodeMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionCodeMapper.java index b8655dff..8b18f8a6 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionCodeMapper.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionCodeMapper.java @@ -1,7 +1,7 @@ package com.czg.service.market.mapper; import com.mybatisflex.core.BaseMapper; -import com.czg.market.entity.MkCouponRedemptionCode; +import com.czg.market.entity.MkRedemptionCode; /** * 兑换码明细 映射层。 @@ -9,6 +9,6 @@ import com.czg.market.entity.MkCouponRedemptionCode; * @author zs * @since 2025-10-22 */ -public interface MkCouponRedemptionCodeMapper extends BaseMapper { +public interface MkCouponRedemptionCodeMapper extends BaseMapper { } diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionConfigMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionConfigMapper.java index b5db8b66..a122173e 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionConfigMapper.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkCouponRedemptionConfigMapper.java @@ -1,7 +1,7 @@ package com.czg.service.market.mapper; import com.mybatisflex.core.BaseMapper; -import com.czg.market.entity.MkCouponRedemptionConfig; +import com.czg.market.entity.MkRedemptionConfig; /** * 充值优惠券修改 映射层。 @@ -9,6 +9,6 @@ import com.czg.market.entity.MkCouponRedemptionConfig; * @author zs * @since 2025-10-22 */ -public interface MkCouponRedemptionConfigMapper extends BaseMapper { +public interface MkCouponRedemptionConfigMapper extends BaseMapper { } diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionCodeMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionCodeMapper.java deleted file mode 100644 index 6cf3a54a..00000000 --- a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionCodeMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.czg.service.market.mapper; - -import com.mybatisflex.core.BaseMapper; -import com.czg.market.entity.MkRechargeRedemptionCode; - -/** - * 兑换码明细 映射层。 - * - * @author zs - * @since 2025-10-21 - */ -public interface MkRechargeRedemptionCodeMapper extends BaseMapper { - -} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionConfigMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionConfigMapper.java deleted file mode 100644 index 22822da7..00000000 --- a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkRechargeRedemptionConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.czg.service.market.mapper; - -import com.mybatisflex.core.BaseMapper; -import com.czg.market.entity.MkRechargeRedemptionConfig; - -/** - * 充值优惠券修改 映射层。 - * - * @author zs - * @since 2025-10-21 - */ -public interface MkRechargeRedemptionConfigMapper extends BaseMapper { - -} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionCodeServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionCodeServiceImpl.java index 3a8d42a0..9f5b42ae 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionCodeServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionCodeServiceImpl.java @@ -1,8 +1,8 @@ package com.czg.service.market.service.impl; import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.market.entity.MkCouponRedemptionCode; -import com.czg.market.service.MkCouponRedemptionCodeService; +import com.czg.market.entity.MkRedemptionCode; +import com.czg.market.service.MkRedemptionCodeService; import com.czg.service.market.mapper.MkCouponRedemptionCodeMapper; import org.springframework.stereotype.Service; @@ -13,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-10-22 */ @Service -public class MkCouponRedemptionCodeServiceImpl extends ServiceImpl implements MkCouponRedemptionCodeService{ +public class MkCouponRedemptionCodeServiceImpl extends ServiceImpl implements MkRedemptionCodeService { } 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 deleted file mode 100644 index ce797dfa..00000000 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkCouponRedemptionConfigServiceImpl.java +++ /dev/null @@ -1,271 +0,0 @@ -package com.czg.service.market.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.DateUtil; -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; -import com.czg.utils.AssertUtil; -import com.czg.utils.MyQueryWrapper; -import com.czg.utils.PageUtil; -import com.mybatisflex.core.paginate.Page; -import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.market.service.MkCouponRedemptionConfigService; -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; -import java.util.*; - -/** - * 充值优惠券修改 服务层实现。 - * - * @author zs - * @since 2025-10-22 - */ -@Service -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, 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(), CouponInfoDTO.class)); - } - - return infoList; - } - - @Override - public Page pageInfo(Long mainShopId, Integer status) { - QueryWrapper queryWrapper = new QueryWrapper().eq(MkCouponRedemptionConfig::getMainShopId, mainShopId) - .orderBy(MkCouponRedemptionConfig::getId, false); - switch (status) { - case 0: - queryWrapper.le(MkCouponRedemptionConfig::getStartTime, DateUtil.date()).ge(MkCouponRedemptionConfig::getEndTime, DateUtil.date()); - break; - case 1: - queryWrapper.gt(MkCouponRedemptionConfig::getStartTime, DateUtil.date()).lt(MkCouponRedemptionConfig::getEndTime, DateUtil.date()); - break; - } - Page page = page(PageUtil.buildPage(), queryWrapper); - ArrayList configList = new ArrayList<>(); - page.getRecords().forEach(item -> { - if (item.getStartTime() != null && item.getEndTime() != null) { - item.setStatus(!item.getStartTime().isAfter(DateUtil.date().toLocalDateTime()) && item.getEndTime().isBefore(DateUtil.date().toLocalDateTime()) ? 0 : 1); - }else { - item.setStatus(0); - } - - MkCouponRedemptionConfigVO config = BeanUtil.copyProperties(item, MkCouponRedemptionConfigVO.class, "couponInfoList"); - if (StrUtil.isNotBlank(item.getCouponInfoList())) { - config.setCouponInfoList(JSONArray.parseArray(item.getCouponInfoList(), CouponInfoDTO.class)); - config.setCouponNum(config.getCouponInfoList().stream().map(CouponInfoDTO::getNum).reduce(0, Integer::sum)); - } - configList.add(config); - }); - - Page page2 = new Page<>(); - BeanUtil.copyProperties(page, page2, "records"); - page2.setRecords(configList); - return page2; - } - - @Override - public boolean add(Long mainShopId, MkCouponRedemptionConfigDTO dto) { - long count = count(new QueryWrapper().eq(MkCouponRedemptionConfig::getName, dto.getName()).eq(MkCouponRedemptionConfig::getMainShopId, mainShopId)); - AssertUtil.isTrue(count > 0, "名称已存在"); - MkCouponRedemptionConfig config = BeanUtil.copyProperties(dto, MkCouponRedemptionConfig.class, "couponInfoList"); - config.setMainShopId(mainShopId); - config.setStock(config.getTotal()); - if (dto.getCouponInfoList() != null && !dto.getCouponInfoList().isEmpty()) { - config.setCouponInfoList(JSONArray.toJSONString(dto.getCouponInfoList())); - } - save(config); - - ArrayList codeArrayList = new ArrayList<>(); - - MkRechargeRedemptionConfigServiceImpl.generateCodes(config.getId(), config.getTotal()).forEach(code -> { - codeArrayList.add(new MkCouponRedemptionCode().setRedemptionId(config.getId()) - .setMainShopId(mainShopId).setCode(code)); - }); - - return codeService.saveBatch(codeArrayList); - } - - @Override - public Boolean edit(Long shopId, MkCouponRedemptionConfigDTO dto) { - MkCouponRedemptionConfig config = getOne(new QueryWrapper().eq(MkCouponRedemptionConfig::getMainShopId, shopId).eq(MkCouponRedemptionConfig::getId, dto.getId())); - AssertUtil.isNull(config, "活动不存在"); - if (dto.getStock() != null) { - if (config.getStock() < dto.getStock()) { - throw new CzgException("库存仅允许删减"); - } - int subStock = config.getStock() - dto.getStock(); - List subCodeList = codeService.list(new QueryWrapper().eq(MkCouponRedemptionCode::getRedemptionId, config.getId()).eq(MkCouponRedemptionCode::getStatus, 0).limit(subStock)); - subCodeList.forEach(item -> item.setStatus(1)); - codeService.updateBatch(subCodeList); - } - - BeanUtil.copyProperties(dto, config, "total", "amount", "startTime", "endTime", "couponInfoList"); - - if (dto.getCouponInfoList() != null && !dto.getCouponInfoList().isEmpty()) { - config.setCouponInfoList(JSONArray.toJSONString(dto.getCouponInfoList())); - } - return updateById(config); - } - - @Override - public Page codeList(Long mainShopId, Long id, String code, Integer status) { - QueryWrapper queryWrapper = new MyQueryWrapper() - .selectAll(MkCouponRedemptionCode.class) - .select(ShopUser::getNickName, ShopUser::getPhone) - .eq(MkCouponRedemptionCode::getMainShopId, mainShopId) - .eq(MkCouponRedemptionCode::getRedemptionId, id) - .orderBy(MkCouponRedemptionCode::getId, false); - queryWrapper.eq(MkCouponRedemptionCode::getStatus, status); - if (StrUtil.isNotBlank(code)) { - queryWrapper.like(MkCouponRedemptionCode::getCode, code); - } - queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkCouponRedemptionCode::getShopUserId); - return codeService.pageAs(PageUtil.buildPage(), queryWrapper, MkCouponRedemptionCodeVO.class); - } - - @Override - public void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request) { - QueryWrapper queryWrapper = new MyQueryWrapper() - .selectAll(MkCouponRedemptionCode.class) - .select(ShopUser::getNickName, ShopUser::getPhone) - .eq(MkCouponRedemptionCode::getMainShopId, mainShopId) - .eq(MkCouponRedemptionCode::getRedemptionId, redemptionId); - queryWrapper.eq(MkCouponRedemptionCode::getStatus, status); - if (StrUtil.isNotBlank(code)) { - queryWrapper.like(MkCouponRedemptionCode::getCode, code); - } - queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkCouponRedemptionCode::getShopUserId); - List MkCouponRedemptionCodeVOS = codeService.listAs(queryWrapper, MkCouponRedemptionCodeVO.class); - - List> list = MkCouponRedemptionCodeVOS.stream() - .map(item -> { - Map map = new HashMap<>(); - map.put("code", item.getCode()); - map.put("redemptionTime", item.getRedemptionTime()); - map.put("userInfo", item.getShopUserId() == null ? "" : item.getNickName() + " " + item.getPhone()); - return map; - }) - .toList(); - // 1. 创建 ExcelWriter - ExcelWriter writer = ExcelUtil.getWriter(true); - - // 2. 自定义标题别名(可选) - - // 3. 写入数据 - - // 4. 设置响应头,告诉浏览器下载文件 - try (writer) { - writer.addHeaderAlias("code", "兑换码"); - writer.addHeaderAlias("redemptionTime", "兑换时间"); - writer.addHeaderAlias("userInfo", "用户信息"); - writer.write(list, true); - response.setContentType("application/vnd.ms-excel;charset=utf-8"); - String fileName; - fileName = URLEncoder.encode("兑换码", StandardCharsets.UTF_8); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); - // 5. 输出到浏览器 - writer.flush(response.getOutputStream(), true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void exchange(long userId, MkRedemptionDTO dto) { - Long mainShopId = shopInfoService.getMainIdByShopId(dto.getShopId()); - enableConfigService.checkEnable(mainShopId, dto.getShopId(), TableValueConstant.EnableConfig.Type.RECHARGE_REDEMPTION, true); - ShopUser shopUserInfo = shopUserService.getShopUserInfo(dto.getShopId(), userId); - - MkCouponRedemptionCode redemptionCode = codeService.getOne(new QueryWrapper().eq(MkCouponRedemptionCode::getMainShopId, mainShopId).eq(MkCouponRedemptionCode::getCode, dto.getCode())); - AssertUtil.isNull(redemptionCode, "兑换码不存在"); - AssertUtil.isTrue(redemptionCode.getStatus() != 0, "兑换码不存在"); - - MkCouponRedemptionConfigVO config = detail(mainShopId, redemptionCode.getId()); - AssertUtil.isNull(config, "兑换配置不存在"); - AssertUtil.isTrue(config.getStock() <= 0, "兑换码可兑换库存不足"); - if (config.getStartTime() != null) { - AssertUtil.isTrue(config.getStartTime().isAfter(DateUtil.date().toLocalDateTime()), "兑换活动未开始"); - } - if (config.getEndTime() != null) { - AssertUtil.isTrue(config.getEndTime().isBefore(DateUtil.date().toLocalDateTime()), "兑换活动已结束"); - } - - if (config.getCouponInfoList() != null && !config.getCouponInfoList().isEmpty()) { - config.getCouponInfoList().forEach(item -> { - 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/MkRechargeRedemptionCodeServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRechargeRedemptionCodeServiceImpl.java deleted file mode 100644 index a891583f..00000000 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRechargeRedemptionCodeServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.czg.service.market.service.impl; - -import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.market.entity.MkRechargeRedemptionCode; -import com.czg.market.service.MkRechargeRedemptionCodeService; -import com.czg.service.market.mapper.MkRechargeRedemptionCodeMapper; -import org.springframework.stereotype.Service; - -/** - * 兑换码明细 服务层实现。 - * - * @author zs - * @since 2025-10-21 - */ -@Service -public class MkRechargeRedemptionCodeServiceImpl extends ServiceImpl implements MkRechargeRedemptionCodeService{ - -} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRechargeRedemptionConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRechargeRedemptionConfigServiceImpl.java deleted file mode 100644 index 09534a0d..00000000 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRechargeRedemptionConfigServiceImpl.java +++ /dev/null @@ -1,295 +0,0 @@ -package com.czg.service.market.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.poi.excel.ExcelUtil; -import cn.hutool.poi.excel.ExcelWriter; -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.account.service.UserInfoService; -import com.czg.constant.TableValueConstant; -import com.czg.enums.ShopUserFlowBizEnum; -import com.czg.exception.CzgException; -import com.czg.market.dto.MkRechargeRedemptionConfigDTO; -import com.czg.market.dto.MkRedemptionDTO; -import com.czg.market.entity.MkRechargeRedemptionCode; -import com.czg.market.service.MkEnableConfigService; -import com.czg.market.service.MkRechargeRedemptionCodeService; -import com.czg.market.vo.MkRechargeRedemptionCodeVO; -import com.czg.market.vo.MkRechargeRedemptionConfigVO; -import com.czg.utils.AssertUtil; -import com.czg.utils.MyQueryWrapper; -import com.czg.utils.PageUtil; -import com.mybatisflex.core.paginate.Page; -import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.spring.service.impl.ServiceImpl; -import com.czg.market.entity.MkRechargeRedemptionConfig; -import com.czg.market.service.MkRechargeRedemptionConfigService; -import com.czg.service.market.mapper.MkRechargeRedemptionConfigMapper; -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; -import java.util.*; - -/** - * 充值优惠券修改 服务层实现。 - * - * @author zs - * @since 2025-10-21 - */ -@Service -public class MkRechargeRedemptionConfigServiceImpl extends ServiceImpl implements MkRechargeRedemptionConfigService{ - @Resource - private MkRechargeRedemptionCodeService codeService; - @Resource - private MkEnableConfigService enableConfigService; - - @DubboReference - private ShopInfoService shopInfoService; - @DubboReference - private ShopUserService shopUserService; - - - /** - * 生成指定活动的兑换码集合 - * @param activityId 活动ID - * @param count 生成数量(≤1000) - */ - public static Set generateCodes(long activityId, int count) { - Set codes = new HashSet<>(); - - String actPart = String.format("%03d", activityId % 1000); - - while (codes.size() < count) { - String patternPart = generatePatternNumber(); - String code = actPart + patternPart; - codes.add(code); - } - return codes; - } - - /** - * 生成“有规律”的9位数字串 - * 包含连续或重复数字,提升记忆性 - */ - private static String generatePatternNumber() { - // 随机选择模式类型 - int mode = RandomUtil.randomInt(1, 4); - - switch (mode) { - case 1: - // 连续上升(如 123456789, 456789123) - int start = RandomUtil.randomInt(0, 5); - StringBuilder sb1 = new StringBuilder(); - for (int i = 0; i < 9; i++) { - sb1.append((start + i) % 10); - } - return sb1.toString(); - - case 2: - // 连续下降(如 987654321, 654321987) - int down = RandomUtil.randomInt(3, 9); - StringBuilder sb2 = new StringBuilder(); - for (int i = 0; i < 9; i++) { - sb2.append((down - i + 10) % 10); - } - return sb2.toString(); - - case 3: - // 带重复数字(如 112233445, 778899001) - String base = RandomUtil.randomNumbers(3); - String repeat = "%s%s%s%s%s%s".formatted(base.charAt(0), base.charAt(0), base.charAt(1), base.charAt(1), base.charAt(2), base.charAt(2)); - // 补3位随机数 - return (repeat + RandomUtil.randomNumbers(3)).substring(0, 9); - - default: - return RandomUtil.randomNumbers(9); - } - } - - public static void main(String[] args) { - Set codes = generateCodes(12, 1000); - codes.forEach(System.out::println); - } - - - @Override - public MkRechargeRedemptionConfigVO detail(Long mainShopId) { - return getOneAs(new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId), MkRechargeRedemptionConfigVO.class); - } - - @Override - public Page pageInfo(Long mainShopId, Integer status) { - QueryWrapper queryWrapper = new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId) - .orderBy(MkRechargeRedemptionConfig::getId, false); - switch (status) { - case 0: - queryWrapper.le(MkRechargeRedemptionConfig::getStartTime, DateUtil.date()).ge(MkRechargeRedemptionConfig::getEndTime, DateUtil.date()); - break; - case 1: - queryWrapper.gt(MkRechargeRedemptionConfig::getStartTime, DateUtil.date()).lt(MkRechargeRedemptionConfig::getEndTime, DateUtil.date()); - break; - } - Page page = page(PageUtil.buildPage(), queryWrapper); - page.getRecords().forEach(item -> { - if (item.getStartTime() != null && item.getEndTime() != null) { - item.setStatus(!item.getStartTime().isAfter(DateUtil.date().toLocalDateTime()) && item.getEndTime().isBefore(DateUtil.date().toLocalDateTime()) ? 0 : 1); - }else { - item.setStatus(0); - } - }); - - return page; - } - - @Override - public boolean add(Long mainShopId, MkRechargeRedemptionConfigDTO dto) { - long count = count(new QueryWrapper().eq(MkRechargeRedemptionConfig::getName, dto.getName()).eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId)); - AssertUtil.isTrue(count > 0, "名称已存在"); - MkRechargeRedemptionConfig config = BeanUtil.copyProperties(dto, MkRechargeRedemptionConfig.class); - config.setMainShopId(mainShopId); - config.setStock(config.getTotal()); - save(config); - - ArrayList codeArrayList = new ArrayList<>(); - generateCodes(config.getId(), config.getTotal()).forEach(code -> { - codeArrayList.add(new MkRechargeRedemptionCode().setRedemptionId(config.getId()) - .setMainShopId(mainShopId).setCode(code)); - }); - - return codeService.saveBatch(codeArrayList); - } - - @Override - public Boolean edit(Long shopId, MkRechargeRedemptionConfigDTO dto) { - MkRechargeRedemptionConfig config = getOne(new QueryWrapper().eq(MkRechargeRedemptionConfig::getMainShopId, shopId).eq(MkRechargeRedemptionConfig::getId, dto.getId())); - AssertUtil.isNull(config, "活动不存在"); - if (dto.getStock() != null) { - if (config.getStock() < dto.getStock()) { - throw new CzgException("库存仅允许删减"); - } - int subStock = config.getStock() - dto.getStock(); - List subCodeList = codeService.list(new QueryWrapper().eq(MkRechargeRedemptionCode::getRedemptionId, config.getId()).eq(MkRechargeRedemptionCode::getStatus, 0).limit(subStock)); - subCodeList.forEach(item -> item.setStatus(1)); - codeService.updateBatch(subCodeList); - } - - BeanUtil.copyProperties(dto, config, "total", "amount", "startTime", "endTime"); - return updateById(config); - } - - @Override - public Page codeList(Long mainShopId, Long id, String code, Integer status) { - QueryWrapper queryWrapper = new MyQueryWrapper() - .selectAll(MkRechargeRedemptionCode.class) - .select(ShopUser::getNickName, ShopUser::getPhone) - .eq(MkRechargeRedemptionCode::getMainShopId, mainShopId) - .eq(MkRechargeRedemptionCode::getRedemptionId, id) - .orderBy(MkRechargeRedemptionCode::getId, false); - queryWrapper.eq(MkRechargeRedemptionCode::getStatus, status); - if (StrUtil.isNotBlank(code)) { - queryWrapper.like(MkRechargeRedemptionCode::getCode, code); - } - queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRechargeRedemptionCode::getShopUserId); - return codeService.pageAs(PageUtil.buildPage(), queryWrapper, MkRechargeRedemptionCodeVO.class); - } - - @Override - public void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request) { - QueryWrapper queryWrapper = new MyQueryWrapper() - .selectAll(MkRechargeRedemptionCode.class) - .select(ShopUser::getNickName, ShopUser::getPhone) - .eq(MkRechargeRedemptionCode::getMainShopId, mainShopId) - .eq(MkRechargeRedemptionCode::getRedemptionId, redemptionId); - queryWrapper.eq(MkRechargeRedemptionCode::getStatus, status); - if (StrUtil.isNotBlank(code)) { - queryWrapper.like(MkRechargeRedemptionCode::getCode, code); - } - queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRechargeRedemptionCode::getShopUserId); - List mkRechargeRedemptionCodeVOS = codeService.listAs(queryWrapper, MkRechargeRedemptionCodeVO.class); - - List> list = mkRechargeRedemptionCodeVOS.stream() - .map(item -> { - Map map = new HashMap<>(); - map.put("code", item.getCode()); - map.put("redemptionTime", item.getRedemptionTime()); - map.put("userInfo", item.getShopUserId() == null ? "" : item.getNickName() + " " + item.getPhone()); - return map; - }) - .toList(); - // 1. 创建 ExcelWriter - ExcelWriter writer = ExcelUtil.getWriter(true); - - // 2. 自定义标题别名(可选) - - // 3. 写入数据 - - // 4. 设置响应头,告诉浏览器下载文件 - try (writer) { - writer.addHeaderAlias("code", "兑换码"); - writer.addHeaderAlias("redemptionTime", "兑换时间"); - writer.addHeaderAlias("userInfo", "用户信息"); - writer.write(list, true); - response.setContentType("application/vnd.ms-excel;charset=utf-8"); - String fileName; - fileName = URLEncoder.encode("兑换码", StandardCharsets.UTF_8); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); - // 5. 输出到浏览器 - writer.flush(response.getOutputStream(), true); - } catch (Exception e) { - throw new RuntimeException(e); - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void exchange(long userId, MkRedemptionDTO dto) { - Long mainShopId = shopInfoService.getMainIdByShopId(dto.getShopId()); - enableConfigService.checkEnable(mainShopId, dto.getShopId(), TableValueConstant.EnableConfig.Type.RECHARGE_REDEMPTION, true); - ShopUser shopUserInfo = shopUserService.getShopUserInfo(dto.getShopId(), userId); - - MkRechargeRedemptionCode redemptionCode = codeService.getOne(new QueryWrapper().eq(MkRechargeRedemptionCode::getMainShopId, mainShopId).eq(MkRechargeRedemptionCode::getCode, dto.getCode())); - AssertUtil.isNull(redemptionCode, "兑换码不存在"); - AssertUtil.isTrue(redemptionCode.getStatus() != 0, "兑换码不存在"); - - MkRechargeRedemptionConfig config = getOne(new QueryWrapper().eq(MkRechargeRedemptionConfig::getId, redemptionCode.getRedemptionId()).eq(MkRechargeRedemptionConfig::getMainShopId, mainShopId)); - AssertUtil.isNull(config, "兑换配置不存在"); - AssertUtil.isTrue(config.getStock() <= 0, "兑换码可兑换库存不足"); - if (config.getStartTime() != null) { - AssertUtil.isTrue(config.getStartTime().isAfter(DateUtil.date().toLocalDateTime()), "兑换活动未开始"); - } - if (config.getEndTime() != null) { - AssertUtil.isTrue(config.getEndTime().isBefore(DateUtil.date().toLocalDateTime()), "兑换活动已结束"); - } - - ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO() - .setId(shopUserInfo.getId()) - .setMoney(config.getAmount()) - .setType(1) - .setBizEnum(ShopUserFlowBizEnum.RECHARGE_REDEMPTION) - .setRelationId(redemptionCode.getId()); - - shopUserService.updateMoney(shopUserMoneyEditDTO); - 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/MkRedemptionConfigServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRedemptionConfigServiceImpl.java new file mode 100644 index 00000000..ccd2a578 --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkRedemptionConfigServiceImpl.java @@ -0,0 +1,366 @@ +package com.czg.service.market.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +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.ShopInfo; +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.MkRedemptionConfigDTO; +import com.czg.market.dto.MkRedemptionDTO; +import com.czg.market.dto.MkShopCouponGiftDTO; +import com.czg.market.entity.MkRedemptionCode; +import com.czg.market.entity.MkRedemptionConfig; +import com.czg.market.service.MkRedemptionCodeService; +import com.czg.market.service.MkEnableConfigService; +import com.czg.market.service.MkShopCouponRecordService; +import com.czg.market.vo.MkRedemptionConfigVO; +import com.czg.market.vo.MkRedemptionCodeVO; +import com.czg.market.vo.URedemptionVO; +import com.czg.utils.AssertUtil; +import com.czg.utils.MyQueryWrapper; +import com.czg.utils.PageUtil; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.market.service.MkRedemptionConfigService; +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; +import java.util.*; + +/** + * 充值优惠券修改 服务层实现。 + * + * @author zs + * @since 2025-10-22 + */ +@Service +public class MkRedemptionConfigServiceImpl extends ServiceImpl implements MkRedemptionConfigService { + @Resource + private MkRedemptionCodeService codeService; + @Resource + private MkEnableConfigService enableConfigService; + @Resource + private MkShopCouponRecordService shopCouponRecordService; + + @DubboReference + private ShopInfoService shopInfoService; + @DubboReference + private ShopUserService shopUserService; + /** + * 生成指定活动的兑换码集合 + * @param activityId 活动ID + * @param count 生成数量(≤1000) + */ + public static Set generateCodes(long activityId, int count) { + Set codes = new HashSet<>(); + + String actPart = String.format("%03d", activityId % 1000); + + while (codes.size() < count) { + String patternPart = generatePatternNumber(); + String code = actPart + patternPart; + codes.add(code); + } + return codes; + } + + /** + * 生成“有规律”的9位数字串 + * 包含连续或重复数字,提升记忆性 + */ + private static String generatePatternNumber() { + // 随机选择模式类型 + int mode = RandomUtil.randomInt(1, 4); + + switch (mode) { + case 1: + // 连续上升(如 123456789, 456789123) + int start = RandomUtil.randomInt(0, 5); + StringBuilder sb1 = new StringBuilder(); + for (int i = 0; i < 9; i++) { + sb1.append((start + i) % 10); + } + return sb1.toString(); + + case 2: + // 连续下降(如 987654321, 654321987) + int down = RandomUtil.randomInt(3, 9); + StringBuilder sb2 = new StringBuilder(); + for (int i = 0; i < 9; i++) { + sb2.append((down - i + 10) % 10); + } + return sb2.toString(); + + case 3: + // 带重复数字(如 112233445, 778899001) + String base = RandomUtil.randomNumbers(3); + String repeat = "%s%s%s%s%s%s".formatted(base.charAt(0), base.charAt(0), base.charAt(1), base.charAt(1), base.charAt(2), base.charAt(2)); + // 补3位随机数 + return (repeat + RandomUtil.randomNumbers(3)).substring(0, 9); + + default: + return RandomUtil.randomNumbers(9); + } + } + + + @Override + public MkRedemptionConfigVO detail(Long mainShopId, Long id) { + MkRedemptionConfig redemptionConfig = getOne(new QueryWrapper().eq(MkRedemptionConfig::getMainShopId, mainShopId).eq(MkRedemptionConfig::getId, id)); + if (redemptionConfig == null) { + return null; + } + + MkRedemptionConfigVO infoList = BeanUtil.copyProperties(redemptionConfig, MkRedemptionConfigVO.class, "couponInfoList"); + if (StrUtil.isNotBlank(redemptionConfig.getCouponInfoList())) { + infoList.setCouponInfoList(JSONArray.parseArray(redemptionConfig.getCouponInfoList(), CouponInfoDTO.class)); + } + + return infoList; + } + + @Override + public Page pageInfo(Long mainShopId, Integer status, boolean isRecharge) { + QueryWrapper queryWrapper = new QueryWrapper().eq(MkRedemptionConfig::getMainShopId, mainShopId) + .eq(MkRedemptionConfig::getType, isRecharge ? 0 : 1) + .orderBy(MkRedemptionConfig::getId, false); + switch (status) { + case 0: + queryWrapper.le(MkRedemptionConfig::getStartTime, DateUtil.date()).ge(MkRedemptionConfig::getEndTime, DateUtil.date()); + break; + case 1: + queryWrapper.gt(MkRedemptionConfig::getStartTime, DateUtil.date()).lt(MkRedemptionConfig::getEndTime, DateUtil.date()); + break; + } + Page page = page(PageUtil.buildPage(), queryWrapper); + ArrayList configList = new ArrayList<>(); + page.getRecords().forEach(item -> { + if (item.getStartTime() != null && item.getEndTime() != null) { + item.setStatus(item.getStartTime().isBefore(DateUtil.date().toLocalDateTime()) && item.getEndTime().isAfter(DateUtil.date().toLocalDateTime()) ? 0 : 1); + }else { + item.setStatus(0); + } + + MkRedemptionConfigVO config = BeanUtil.copyProperties(item, MkRedemptionConfigVO.class, "couponInfoList"); + if (StrUtil.isNotBlank(item.getCouponInfoList())) { + config.setCouponInfoList(JSONArray.parseArray(item.getCouponInfoList(), CouponInfoDTO.class)); + config.setCouponNum(config.getCouponInfoList().stream().map(CouponInfoDTO::getNum).reduce(0, Integer::sum)); + } + configList.add(config); + }); + + Page page2 = new Page<>(); + BeanUtil.copyProperties(page, page2, "records"); + page2.setRecords(configList); + return page2; + } + + @Override + public boolean add(Long mainShopId, MkRedemptionConfigDTO dto, boolean isRecharge) { + long count = count(new QueryWrapper().eq(MkRedemptionConfig::getName, dto.getName()).eq(MkRedemptionConfig::getMainShopId, mainShopId) + .eq(MkRedemptionConfig::getType, isRecharge ? 0 : 1)); + AssertUtil.isTrue(count > 0, "名称已存在"); + MkRedemptionConfig config = BeanUtil.copyProperties(dto, MkRedemptionConfig.class, "couponInfoList"); + config.setMainShopId(mainShopId); + config.setStock(config.getTotal()); + config.setType(isRecharge ? 0 : 1); + if (dto.getCouponInfoList() != null && !dto.getCouponInfoList().isEmpty()) { + config.setCouponInfoList(JSONArray.toJSONString(dto.getCouponInfoList())); + } + save(config); + + ArrayList codeArrayList = new ArrayList<>(); + + generateCodes(config.getId(), config.getTotal()).forEach(code -> { + codeArrayList.add(new MkRedemptionCode().setRedemptionId(config.getId()) + .setMainShopId(mainShopId).setCode(code)); + }); + + return codeService.saveBatch(codeArrayList); + } + + @Override + public Boolean edit(Long shopId, MkRedemptionConfigDTO dto, boolean isRecharge) { + MkRedemptionConfig config = getOne(new QueryWrapper().eq(MkRedemptionConfig::getMainShopId, shopId).eq(MkRedemptionConfig::getId, dto.getId()) + .eq(MkRedemptionConfig::getType, isRecharge ? 0 : 1)); + AssertUtil.isNull(config, "活动不存在"); + if (dto.getStock() != null) { + if (config.getStock() < dto.getStock()) { + throw new CzgException("库存仅允许删减"); + } + int subStock = config.getStock() - dto.getStock(); + List subCodeList = codeService.list(new QueryWrapper().eq(MkRedemptionCode::getRedemptionId, config.getId()).eq(MkRedemptionCode::getStatus, 0).limit(subStock)); + subCodeList.forEach(item -> item.setStatus(1)); + codeService.updateBatch(subCodeList); + } + + BeanUtil.copyProperties(dto, config, "total", "amount", "startTime", "endTime", "couponInfoList"); + + if (dto.getCouponInfoList() != null && !dto.getCouponInfoList().isEmpty()) { + config.setCouponInfoList(JSONArray.toJSONString(dto.getCouponInfoList())); + } + return updateById(config); + } + + @Override + public Page codeList(Long mainShopId, Long id, String code, Integer status, boolean isRecharge) { + QueryWrapper queryWrapper = new MyQueryWrapper() + .selectAll(MkRedemptionCode.class) + .select(ShopUser::getNickName, ShopUser::getPhone) + .eq(MkRedemptionCode::getMainShopId, mainShopId) + .eq(MkRedemptionCode::getRedemptionId, id) + .orderBy(MkRedemptionCode::getId, false); + queryWrapper.eq(MkRedemptionCode::getStatus, status); + if (StrUtil.isNotBlank(code)) { + queryWrapper.like(MkRedemptionCode::getCode, code); + } + queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRedemptionCode::getShopUserId); + return codeService.pageAs(PageUtil.buildPage(), queryWrapper, MkRedemptionCodeVO.class); + } + + @Override + public void exportCodeList(Long mainShopId, Long redemptionId, String code, Integer status, HttpServletResponse response, HttpServletRequest request, boolean isRecharge) { + QueryWrapper queryWrapper = new MyQueryWrapper() + .selectAll(MkRedemptionCode.class) + .select(ShopUser::getNickName, ShopUser::getPhone) + .eq(MkRedemptionCode::getMainShopId, mainShopId) + .eq(MkRedemptionCode::getRedemptionId, redemptionId); + queryWrapper.eq(MkRedemptionCode::getStatus, status); + if (StrUtil.isNotBlank(code)) { + queryWrapper.like(MkRedemptionCode::getCode, code); + } + queryWrapper.leftJoin(ShopUser.class).on(ShopUser::getId, MkRedemptionCode::getShopUserId); + List MkCouponRedemptionCodeVOS = codeService.listAs(queryWrapper, MkRedemptionCodeVO.class); + + List> list = MkCouponRedemptionCodeVOS.stream() + .map(item -> { + Map map = new HashMap<>(); + map.put("code", item.getCode()); + map.put("redemptionTime", item.getRedemptionTime()); + map.put("userInfo", item.getShopUserId() == null ? "" : item.getNickName() + " " + item.getPhone()); + return map; + }) + .toList(); + // 1. 创建 ExcelWriter + ExcelWriter writer = ExcelUtil.getWriter(true); + + // 2. 自定义标题别名(可选) + + // 3. 写入数据 + + // 4. 设置响应头,告诉浏览器下载文件 + try (writer) { + writer.addHeaderAlias("code", "兑换码"); + writer.addHeaderAlias("redemptionTime", "兑换时间"); + writer.addHeaderAlias("userInfo", "用户信息"); + writer.write(list, true); + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + String fileName; + fileName = URLEncoder.encode("兑换码", StandardCharsets.UTF_8); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); + // 5. 输出到浏览器 + writer.flush(response.getOutputStream(), true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private MkRedemptionConfigVO checkInfo(MkRedemptionCode redemptionCode) { + AssertUtil.isNull(redemptionCode, "兑换码不存在"); + AssertUtil.isTrue(redemptionCode.getStatus() == 1, "兑换码已使用"); + Long mainShopId = redemptionCode.getMainShopId(); + enableConfigService.checkEnable(mainShopId, mainShopId, TableValueConstant.EnableConfig.Type.RECHARGE_REDEMPTION, true); + + + AssertUtil.isTrue(redemptionCode.getStatus() != 0, "兑换码不存在"); + + MkRedemptionConfigVO config = detail(mainShopId, redemptionCode.getRedemptionId()); + AssertUtil.isNull(config, "兑换配置不存在"); + AssertUtil.isTrue(config.getStock() <= 0, "兑换码可兑换库存不足"); + if (config.getStartTime() != null) { + AssertUtil.isTrue(config.getStartTime().isAfter(DateUtil.date().toLocalDateTime()), "兑换活动未开始"); + } + if (config.getEndTime() != null) { + AssertUtil.isTrue(config.getEndTime().isBefore(DateUtil.date().toLocalDateTime()), "兑换活动已结束"); + } + return config; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void exchange(long userId, MkRedemptionDTO dto) { + MkRedemptionCode redemptionCode = codeService.getOne(new QueryWrapper().eq(MkRedemptionCode::getCode, dto.getCode())); + MkRedemptionConfigVO config = checkInfo(redemptionCode); + ShopUser shopUserInfo = shopUserService.getShopUserInfo(redemptionCode.getMainShopId(), userId); + + + if (config.getType() == 0) { + ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO() + .setId(shopUserInfo.getId()) + .setMoney(config.getAmount()) + .setType(1) + .setBizEnum(ShopUserFlowBizEnum.RECHARGE_REDEMPTION) + .setRelationId(redemptionCode.getId()); + + shopUserService.updateMoney(shopUserMoneyEditDTO); + }else { + if (config.getCouponInfoList() != null && !config.getCouponInfoList().isEmpty()) { + config.getCouponInfoList().forEach(item -> { + MkShopCouponGiftDTO giftDTO = new MkShopCouponGiftDTO().setCouponId(item.getId()) + .setShopId(redemptionCode.getMainShopId()) + .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()); + boolean flag = codeService.updateChain().set(MkRedemptionCode::getStatus, 1) + .set(MkRedemptionCode::getUserId, shopUserInfo.getUserId()) + .set(MkRedemptionCode::getShopUserId, shopUserInfo.getId()) + .set(MkRedemptionCode::getRedemptionTime, DateUtil.date().toLocalDateTime()) + .eq(MkRedemptionCode::getId, redemptionCode.getId()) + .eq(MkRedemptionCode::getStatus, 0).update(); + AssertUtil.isTrue(!flag, "使用失败"); + + boolean update = updateChain().eq(MkRedemptionConfig::getId, config.getId()).setRaw(MkRedemptionConfig::getStock, "stock - 1") + .where("stock - 1 >= 0").update(); + AssertUtil.isTrue(!update, "库存不足"); + + } + + @Override + public URedemptionVO getInfo(String code) { + MkRedemptionCode redemptionCode = codeService.getOne(new QueryWrapper().eq(MkRedemptionCode::getCode, code).eq(MkRedemptionCode::getStatus, 0)); + MkRedemptionConfigVO redemptionConfigVO = checkInfo(redemptionCode); + ShopInfo shopInfo = shopInfoService.getById(redemptionConfigVO.getMainShopId()); + return new URedemptionVO().setShopName(shopInfo.getShopName()) + .setName(redemptionConfigVO.getName()).setCouponInfoList(redemptionConfigVO.getCouponInfoList()).setAmount(redemptionConfigVO.getAmount()); + } +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionCodeMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionCodeMapper.xml deleted file mode 100644 index c4ce4100..00000000 --- a/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionCodeMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionConfigMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionConfigMapper.xml deleted file mode 100644 index 6ffbb7d0..00000000 --- a/cash-service/market-service/src/main/resources/mapper/MkRechargeRedemptionConfigMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - -