From 77ac2778567dffa7b6a29dfea54e1aaecda5be6b Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 13 Sep 2025 15:35:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=86=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ACouponController.java | 35 +++-- .../czg/market/dto/MkShopCouponRecordDTO.java | 135 +++++++++++++++++ .../czg/market/entity/MkShopCouponRecord.java | 137 ++++++++++++++++++ .../service/MkShopCouponRecordService.java | 33 +++++ .../mapper/MkShopCouponRecordMapper.java | 14 ++ .../impl/MkShopCouponRecordServiceImpl.java | 114 +++++++++++++++ .../mapper/MkShopCouponRecordMapper.xml | 7 + 7 files changed, 463 insertions(+), 12 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkShopCouponRecordDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkShopCouponRecord.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/market/service/MkShopCouponRecordService.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkShopCouponRecordMapper.java create mode 100644 cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkShopCouponRecordServiceImpl.java create mode 100644 cash-service/market-service/src/main/resources/mapper/MkShopCouponRecordMapper.xml diff --git a/cash-api/market-server/src/main/java/com/czg/controller/admin/ACouponController.java b/cash-api/market-server/src/main/java/com/czg/controller/admin/ACouponController.java index fef812fc..4cea0d62 100644 --- a/cash-api/market-server/src/main/java/com/czg/controller/admin/ACouponController.java +++ b/cash-api/market-server/src/main/java/com/czg/controller/admin/ACouponController.java @@ -4,9 +4,10 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.thread.ThreadUtil; import com.czg.log.annotation.OperationLog; import com.czg.market.dto.MkCouponGiftDTO; +import com.czg.market.dto.MkShopCouponRecordDTO; import com.czg.market.dto.ShopCouponDTO; import com.czg.market.service.MkCouponGiftService; -import com.czg.market.service.MkShopConsumerCouponService; +import com.czg.market.service.MkShopCouponRecordService; import com.czg.market.service.ShopCouponService; import com.czg.product.service.ShopSyncService; import com.czg.resp.CzgResult; @@ -39,7 +40,7 @@ public class ACouponController { @Resource private MkCouponGiftService couponGiftService; @Resource - private MkShopConsumerCouponService consumerCouponService; + private MkShopCouponRecordService couponRecordService; @DubboReference private ShopSyncService shopSyncService; @@ -135,16 +136,26 @@ public class ACouponController { return CzgResult.success(data); } -// /** -// * 通过关联Id取消该券的关联 -// * -// * @param id /admin/coupon/gifts的 主键Id -// */ -// @DeleteMapping("/cancelGift") -// public CzgResult cancelGift(Long id) { -// couponGiftService.cancelGift(id); -// return CzgResult.success(); -// } + /** + * 优惠券列表/已领取详情 + * @param search 用户Id/昵称/手机号 + * @param param 用户的优惠券列表 使用该对象的UserId + */ + @GetMapping("/record") + public CzgResult> getRecord(@RequestParam(required = false) String search, MkShopCouponRecordDTO param) { + Page data = couponRecordService.getRecord(search, param); + return CzgResult.success(data); + } + + /** + * 删除用户优惠券 + * @param id 优惠券记录Id + */ + @DeleteMapping("/deleteRecord") + public CzgResult cancelRecord(Long id) { + couponRecordService.deleteRecord(id); + return CzgResult.success(); + } private void asyncToBranchShop(Long id, Integer type) { long shopId = StpKit.USER.getShopId(0L); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkShopCouponRecordDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkShopCouponRecordDTO.java new file mode 100644 index 00000000..6705e333 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/MkShopCouponRecordDTO.java @@ -0,0 +1,135 @@ + +package com.czg.market.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +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; + +/** + * 优惠券发放记录表 实体类。 + * + * @author ww + * @since 2025-09-13 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MkShopCouponRecordDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺用户id + */ + private Long shopUserId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 卷Id (校验是否可用) + */ + private Long couponId; + + /** + * 卷描述 满10减2/商品卷 + */ + private String name; + + /** + * 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券 + */ + private Integer type; + + /** + * 满多少金额 + */ + private BigDecimal fullAmount; + + /** + * 减多少金额 + */ + private BigDecimal discountAmount; + + /** + * 折扣率 % + */ + private Integer discountRate; + + /** + * 来源活动id + */ + private Long sourceId; + + /** + * 来源记录Id + */ + private Long sourceFlowId; + + /** + * 领取时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 使用时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime useTime; + + /** + * 过期时间 + */ + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime expiredTime; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + private String couponJson; + + /** + * 来源描述 + */ + private String source; + + /** + * 0未使用 + * 1已使用 + * 2已过期 + */ + private Integer status; + + /** + * 使用记录Id (订单Id) + */ + private Long targetId; + + /** + * 头像 + */ + private String headImg; + + /** + * 用户昵称 + */ + private String nickName; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkShopCouponRecord.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkShopCouponRecord.java new file mode 100644 index 00000000..9398bbab --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/MkShopCouponRecord.java @@ -0,0 +1,137 @@ +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 ww + * @since 2025-09-13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("mk_shop_coupon_record") +@Accessors(chain = true) +public class MkShopCouponRecord implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺用户id + */ + private Long shopUserId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 卷Id (校验是否可用) + */ + private Long couponId; + + /** + * 卷描述 满10减2/商品卷 + */ + private String name; + + /** + * 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券, 6-买一送一券,7-固定价格券,8-免配送费券 + */ + private Integer type; + + /** + * 满多少金额 + */ + private BigDecimal fullAmount; + + /** + * 减多少金额 + */ + private BigDecimal discountAmount; + + /** + * 折扣率 % + */ + private Integer discountRate; + + /** + * 来源活动id + */ + private Long sourceId; + + /** + * 来源记录Id + */ + private Long sourceFlowId; + + /** + * 领取时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 使用时间 + */ + private LocalDateTime useTime; + + /** + * 过期时间 + */ + private LocalDateTime expiredTime; + + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + + private String couponJson; + + /** + * 来源描述 + */ + private String source; + + /** + * 0未使用 + * 1已使用 + * 2已过期 + */ + private Integer status; + + /** + * 使用记录Id (订单Id) + */ + private Long targetId; + /** + * 删除状态 0-正常 1-删除 + */ + private Integer isDel; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkShopCouponRecordService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkShopCouponRecordService.java new file mode 100644 index 00000000..2aaeb01c --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/MkShopCouponRecordService.java @@ -0,0 +1,33 @@ +package com.czg.market.service; + +import com.czg.market.dto.MkShopCouponRecordDTO; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.service.IService; +import com.czg.market.entity.MkShopCouponRecord; + +/** + * 优惠券发放记录表 服务层。 + * + * @author ww + * @since 2025-09-13 + */ +public interface MkShopCouponRecordService extends IService { + + /** + * 优惠券列表/已领取详情 + * @param search 用户Id/昵称/手机号 + */ + Page getRecord(String search, MkShopCouponRecordDTO param); + + /** + * 发放券 统一方法 + * @param mkShopCouponRecordDTO 赠送信息 除Id外 几乎全填 + * @param number 发放数量 + */ + void receiveCoupon(MkShopCouponRecordDTO mkShopCouponRecordDTO,Integer number); + + /** + * 用户优惠券 失效/删除 + */ + void deleteRecord(Long id); +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkShopCouponRecordMapper.java b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkShopCouponRecordMapper.java new file mode 100644 index 00000000..bf62745c --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/mapper/MkShopCouponRecordMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.market.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.market.entity.MkShopCouponRecord; + +/** + * 优惠券发放记录表 映射层。 + * + * @author ww + * @since 2025-09-13 + */ +public interface MkShopCouponRecordMapper extends BaseMapper { + +} diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkShopCouponRecordServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkShopCouponRecordServiceImpl.java new file mode 100644 index 00000000..25414fac --- /dev/null +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/MkShopCouponRecordServiceImpl.java @@ -0,0 +1,114 @@ +package com.czg.service.market.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.czg.account.entity.UserInfo; +import com.czg.account.service.UserInfoService; +import com.czg.exception.CzgException; +import com.czg.market.dto.MkShopCouponRecordDTO; +import com.czg.market.entity.MkShopCouponRecord; +import com.czg.market.service.MkShopCouponRecordService; +import com.czg.service.market.mapper.MkShopCouponRecordMapper; +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 org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 优惠券发放记录表 服务层实现。 + * + * @author ww + * @since 2025-09-13 + */ +@Service +public class MkShopCouponRecordServiceImpl extends ServiceImpl implements MkShopCouponRecordService { + + + @DubboReference + private UserInfoService userInfoService; + + @Override + public Page getRecord(String search, MkShopCouponRecordDTO mkShopCouponRecordDTO) { + Map userInfoMap = new HashMap<>(); + if (StrUtil.isNotBlank(search)) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.and(q -> { + q.like(UserInfo::getId, search).or(r -> { + r.like(UserInfo::getNickName, search); + }).or(s -> { + s.like(UserInfo::getPhone, search); + }); + }); + List userInfos = userInfoService.list(queryWrapper); + if (CollUtil.isNotEmpty(userInfos)) { + userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, userInfo -> userInfo)); + } else { + return new Page<>(); + } + } + QueryWrapper recordQueryWrapper = new QueryWrapper(); + recordQueryWrapper.eq(MkShopCouponRecord::getShopId, mkShopCouponRecordDTO.getShopId()) + .eq(MkShopCouponRecord::getCouponId, mkShopCouponRecordDTO.getCouponId()) + .eq(MkShopCouponRecord::getIsDel, 0) + .eq(MkShopCouponRecord::getStatus, mkShopCouponRecordDTO.getStatus()) + .orderBy(MkShopCouponRecord::getCreateTime).desc(); + if (CollUtil.isNotEmpty(userInfoMap)) { + recordQueryWrapper.in(MkShopCouponRecord::getUserId, userInfoMap.keySet()); + } else { + recordQueryWrapper.eq(MkShopCouponRecord::getUserId, mkShopCouponRecordDTO.getUserId()); + } + Page recordPage = pageAs(PageUtil.buildPage(), recordQueryWrapper, MkShopCouponRecordDTO.class); + if (CollUtil.isNotEmpty(userInfoMap)) { + for (MkShopCouponRecordDTO record : recordPage.getRecords()) { + UserInfo userInfo = userInfoMap.get(record.getUserId()); + record.setHeadImg(userInfo.getHeadImg()); + record.setNickName(userInfo.getNickName()); + } + } + return recordPage; + } + + @Override + public void receiveCoupon(MkShopCouponRecordDTO mkShopCouponRecordDTO, Integer number) { + if (number == null || number <= 0) { + throw new CzgException("发放数量不能小于0"); + } + MkShopCouponRecord bean = BeanUtil.toBean(mkShopCouponRecordDTO, MkShopCouponRecord.class); + if (bean.getType() == 1) { + if (bean.getFullAmount() == null) { + throw new CzgException("满减券,满减金额不能为空"); + } + if (bean.getDiscountAmount() == null) { + throw new CzgException("满减券,折扣金额不能为空"); + } + } else if (bean.getType() == 2) { + // 类型2:fullAmount不能为空 + if (bean.getFullAmount() == null) { + throw new CzgException("商品兑换券,门槛金额不能为空"); + } + } else if (bean.getType() == 3) { + // 类型3:discountRate不能为空 + if (bean.getDiscountRate() == null) { + throw new CzgException("折扣券,折扣率不能为空"); + } + } + + for (int i = 0; i < number; i++) { + bean.setId(null); + save(bean); + } + } + + @Override + public void deleteRecord(Long id) { + updateById(new MkShopCouponRecord().setId(id).setIsDel(1), true); + } +} diff --git a/cash-service/market-service/src/main/resources/mapper/MkShopCouponRecordMapper.xml b/cash-service/market-service/src/main/resources/mapper/MkShopCouponRecordMapper.xml new file mode 100644 index 00000000..1c8a2cc3 --- /dev/null +++ b/cash-service/market-service/src/main/resources/mapper/MkShopCouponRecordMapper.xml @@ -0,0 +1,7 @@ + + + + +