From 9f3d544b11afa0bd15582026af08e9e4c66f9a41 Mon Sep 17 00:00:00 2001 From: zhonghengtech Date: Wed, 5 Jun 2024 11:55:29 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=8F=91=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code4java/springbok/utils/CodeUtils.java | 65 +++++++++++++++ .../springbok/dto/CouponDirectDTO.java | 20 +++++ .../springbok/dto/MemberCouponCreateDTO.java | 27 +++++++ .../cn/code4java/springbok/entity/Coupon.java | 15 ++++ .../springbok/entity/CouponDirectLine.java | 4 +- .../springbok/entity/MemberCoupon.java | 6 ++ .../service/CouponDirectService.java | 15 ++++ .../service/MemberCouponService.java | 21 +++++ .../controller/CouponDirectController.java | 13 +++ .../mapper/CouponDirectLineMapper.java | 14 ++++ .../service/CouponDirectServiceImpl.java | 81 +++++++++++++++++++ .../service/MemberCouponServiceImpl.java | 39 +++++++++ 12 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 springbok-common/src/main/java/cn/code4java/springbok/utils/CodeUtils.java create mode 100644 springbok-mall-api/src/main/java/cn/code4java/springbok/dto/CouponDirectDTO.java create mode 100644 springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java create mode 100644 springbok-mall-api/src/main/java/cn/code4java/springbok/service/MemberCouponService.java create mode 100644 springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java create mode 100644 springbok-mall/src/main/java/cn/code4java/springbok/service/MemberCouponServiceImpl.java diff --git a/springbok-common/src/main/java/cn/code4java/springbok/utils/CodeUtils.java b/springbok-common/src/main/java/cn/code4java/springbok/utils/CodeUtils.java new file mode 100644 index 0000000..f987b7e --- /dev/null +++ b/springbok-common/src/main/java/cn/code4java/springbok/utils/CodeUtils.java @@ -0,0 +1,65 @@ +package cn.code4java.springbok.utils; + +/** + * @ClassName CodeUtils + * @Description: 券码生成工具 + * @Author zhonghengtech + * @Date 2024/6/5 + * @Version V1.0 + **/ +public class CodeUtils { + + private static long workerId = 1; + private static long sequence = 0L; + private static long twepoch = 1609459200000L; // 起始时间戳,如:2021-01-01 00:00:00 + private static long workerIdBits = 10L; // 机器ID所占位数 + private static long sequenceBits = 12L; // 序列号所占位数 + private static long workerIdShift = sequenceBits; + private static long timestampLeftShift = sequenceBits + workerIdBits; + private static long sequenceMask = -1L ^ (-1L << sequenceBits); + private static long lastTimestamp = -1L; + + /** + * 生成带前缀券码 + * @param prx + * @return + */ + public synchronized static String generateCouponCode(String prx) { + return prx + generateCouponCode(); + } + + /** + * 生成券码 + * @return + */ + public synchronized static String generateCouponCode() { + long timestamp = System.currentTimeMillis(); + + if (timestamp < lastTimestamp) { + throw new RuntimeException("时钟回拨,无法生成券码"); + } + + if (timestamp == lastTimestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + + lastTimestamp = timestamp; + + long id = ((timestamp - twepoch) << timestampLeftShift) | (workerId << workerIdShift) | sequence; + + return String.valueOf(id); + } + + private static long tilNextMillis(long lastTimestamp) { + long timestamp = System.currentTimeMillis(); + while (timestamp <= lastTimestamp) { + timestamp = System.currentTimeMillis(); + } + return timestamp; + } +} diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/CouponDirectDTO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/CouponDirectDTO.java new file mode 100644 index 0000000..7930653 --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/CouponDirectDTO.java @@ -0,0 +1,20 @@ +package cn.code4java.springbok.dto; + +import cn.code4java.springbok.entity.CouponDirect; +import cn.code4java.springbok.entity.CouponDirectLine; +import lombok.Data; + +import java.util.List; + +/** + * @ClassName CouponDTO + * @Description: CouponDTO + * @Author zhonghengtech + * @Date 2023/11/25 + * @Version V1.0 + **/ +@Data +public class CouponDirectDTO extends CouponDirect { + + private List couponDirectLineList; +} diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java new file mode 100644 index 0000000..d84ceba --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java @@ -0,0 +1,27 @@ +package cn.code4java.springbok.dto; + +import lombok.Data; + +/** + * @ClassName MemberCouponCreateDTO + * @Description: 创建会员券DTO + * @Author zhonghengtech + * @Date 2024/6/5 + * @Version V1.0 + **/ +@Data +public class MemberCouponCreateDTO { + + /** + * 会员id + */ + private Integer memberId; + /** + * 券id + */ + private Integer couponId; + /** + * 创建数量,不传默认为1 + */ + private Integer num; +} diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java index 518cc69..27cd50e 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; +import java.util.Date; /** * @ClassName Coupon @@ -59,4 +60,18 @@ public class Coupon extends BaseEntity { * 2:指定商品不可用 */ private Integer usedItemSaleType; + /** + * 券有效开始日期 + */ + private Date couponStartDate; + /** + * 券有效结束日期 + */ + private Date couponEndDate; + /** + * 券状态 + * 1:未生效 + * 2:已生效 + */ + private Integer couponStatus; } diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java index ead74b2..f7480c0 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java @@ -26,11 +26,11 @@ public class CouponDirectLine { /** * 定向发券id */ - private Long couponDirectId; + private Integer couponDirectId; /** * 券id */ - private Long couponId; + private Integer couponId; /** * 发放数量 */ diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java index 3e0467b..2ccb07b 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.util.Date; + /** * @ClassName MemberCoupon * @Description: 会员优惠券 @@ -39,4 +41,8 @@ public class MemberCoupon extends BaseEntity { * 2:已使用 */ private Integer couponStatus; + /** + * 核销时间 + */ + private Date verifyTime; } diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java index 3117eec..6a20dcd 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java @@ -1,5 +1,6 @@ package cn.code4java.springbok.service; +import cn.code4java.springbok.dto.CouponDirectDTO; import cn.code4java.springbok.dto.CouponDirectQueryDTO; import cn.code4java.springbok.entity.CouponDirect; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -19,4 +20,18 @@ public interface CouponDirectService { * @return */ Page pageCouponDirect(CouponDirectQueryDTO couponDirectQueryDTO); + /** + * 新增定向发券 + * + * @param couponDirectDTO + * @return + */ + boolean addCouponDirect(CouponDirectDTO couponDirectDTO); + /** + * 发券 + * + * @param couponDirectId + * @return + */ + boolean sendCoupon(Integer couponDirectId); } diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/service/MemberCouponService.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/MemberCouponService.java new file mode 100644 index 0000000..c3da534 --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/MemberCouponService.java @@ -0,0 +1,21 @@ +package cn.code4java.springbok.service; + +import cn.code4java.springbok.dto.MemberCouponCreateDTO; +import cn.code4java.springbok.entity.MemberCoupon; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @ClassName MemberCouponService + * @Description: 会员券服务类 + * @Author zhonghengtech + * @Date 2024/6/5 + * @Version V1.0 + **/ +public interface MemberCouponService extends IService { + + /** + * 创建会员券 + * @return + */ + boolean createMemberCoupon(MemberCouponCreateDTO memberCouponCreateDTO); +} diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java b/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java index 2ac0344..0fd47e9 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java @@ -1,6 +1,7 @@ package cn.code4java.springbok.controller; import cn.code4java.springbok.dto.CouponDTO; +import cn.code4java.springbok.dto.CouponDirectDTO; import cn.code4java.springbok.dto.CouponDirectQueryDTO; import cn.code4java.springbok.dto.CouponQueryDTO; import cn.code4java.springbok.service.CouponDirectService; @@ -37,4 +38,16 @@ public class CouponDirectController { public BaseResponse pageCouponDirect(CouponDirectQueryDTO params) { return BaseResponse.success(couponDirectService.pageCouponDirect(params)); } + + /** + * 新增定向发券 + * + * @param couponDirectDTO + * @return + */ + @PostMapping("/addCouponDirect") + @Operation(summary = "新增定向发券", description = "新增定向发券") + public BaseResponse addCouponDirect(@RequestBody CouponDirectDTO couponDirectDTO) { + return BaseResponse.success(couponDirectService.addCouponDirect(couponDirectDTO)); + } } diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java b/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java new file mode 100644 index 0000000..62b47f9 --- /dev/null +++ b/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java @@ -0,0 +1,14 @@ +package cn.code4java.springbok.mapper; + +import cn.code4java.springbok.entity.CouponDirectLine; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @ClassName CouponDirectMapper + * @Description: CouponDirectMapper + * @Author zhonghengtech + * @Date 2024/6/1 + * @Version V1.0 + **/ +public interface CouponDirectLineMapper extends BaseMapper { +} diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java index 8945097..bbb1f1a 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java @@ -1,13 +1,26 @@ package cn.code4java.springbok.service; +import cn.code4java.springbok.dto.CouponDirectDTO; import cn.code4java.springbok.dto.CouponDirectQueryDTO; +import cn.code4java.springbok.dto.MemberCouponCreateDTO; import cn.code4java.springbok.entity.CouponDirect; +import cn.code4java.springbok.entity.CouponDirectLine; +import cn.code4java.springbok.entity.Member; +import cn.code4java.springbok.mapper.CouponDirectLineMapper; import cn.code4java.springbok.mapper.CouponDirectMapper; +import cn.code4java.springbok.mapper.MemberMapper; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * @ClassName CouponDirectServiceImpl * @Description: 定向发券服务类 @@ -15,12 +28,21 @@ import org.springframework.stereotype.Service; * @Date 2024/6/1 * @Version V1.0 **/ +@Slf4j @Service @AllArgsConstructor public class CouponDirectServiceImpl extends ServiceImpl implements CouponDirectService { + private MemberCouponService memberCouponService; private CouponDirectMapper couponDirectMapper; + private CouponDirectLineMapper couponDirectLineMapper; + private MemberMapper memberMapper; + /** + * 分页查询定向发券 + * @param couponDirectQueryDTO + * @return + */ @Override public Page pageCouponDirect(CouponDirectQueryDTO couponDirectQueryDTO) { Page page = new Page<>(); @@ -28,4 +50,63 @@ public class CouponDirectServiceImpl extends ServiceImpl { + couponDirectLine.setCouponDirectLineId(couponDirect.getCouponDirectId()); + couponDirectLineMapper.insert(couponDirectLine); + }); + this.sendCoupon(couponDirect.getCouponDirectId()); + return true; + } + + /** + * 发券 + * @param couponDirectId + * @return + */ + @Override + public boolean sendCoupon(Integer couponDirectId) { + // 发券 + CouponDirect couponDirect = couponDirectMapper.selectById(couponDirectId); + List couponDirectLines = couponDirectLineMapper.selectList(Wrappers.lambdaQuery().eq(CouponDirectLine::getCouponDirectId, couponDirectId)); + int sendNum = 0; + List members = new ArrayList<>(); + for (CouponDirectLine couponDirectLine : couponDirectLines) { + String[] sendTargetIds = couponDirect.getSendTargetIds().split(","); + if (couponDirect.getSendType() == 1) { + // 按标签 + } else if (couponDirect.getSendType() == 2) { + // 按手机号 + members = memberMapper.selectList(Wrappers.lambdaQuery().eq(Member::getPhone, ListUtil.toList(sendTargetIds))); + } + if (CollectionUtil.isNotEmpty(members)) { + for (Member member : members) { + MemberCouponCreateDTO memberCouponCreateDTO = new MemberCouponCreateDTO(); + memberCouponCreateDTO.setNum(couponDirectLine.getSendNum()); + memberCouponCreateDTO.setCouponId(couponDirectLine.getCouponId()); + memberCouponCreateDTO.setMemberId(member.getMemberId()); + memberCouponService.createMemberCoupon(memberCouponCreateDTO); + sendNum += couponDirectLine.getSendNum(); + } + } + } + log.info("定向发券成功,{}名用户共发放{}张券", members.size(), sendNum); + couponDirect.setStatus(2); + couponDirectMapper.updateById(couponDirect); + return true; + } + + public static void main(String[] args) { + log.info("定向发券成功,{}名用户共发放{}张券", "asd", 60); + } } diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/MemberCouponServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/MemberCouponServiceImpl.java new file mode 100644 index 0000000..d2e1dd3 --- /dev/null +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/MemberCouponServiceImpl.java @@ -0,0 +1,39 @@ +package cn.code4java.springbok.service; + +import cn.code4java.springbok.dto.MemberCouponCreateDTO; +import cn.code4java.springbok.entity.MemberCoupon; +import cn.code4java.springbok.mapper.MemberCouponMapper; +import cn.code4java.springbok.utils.CodeUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * @ClassName MemberCouponServiceImpl + * @Description: 会员券服务类 + * @Author zhonghengtech + * @Date 2024/6/5 + * @Version V1.0 + **/ +@Service +@AllArgsConstructor +public class MemberCouponServiceImpl extends ServiceImpl implements MemberCouponService { + + @Override + public boolean createMemberCoupon(MemberCouponCreateDTO memberCouponCreateDTO) { + int num = memberCouponCreateDTO.getNum() == null ? 1 : memberCouponCreateDTO.getNum(); + List memberCouponList = new LinkedList<>(); + for (int i = 0; i < num; i++) { + MemberCoupon memberCoupon = new MemberCoupon(); + memberCoupon.setCouponNo(CodeUtils.generateCouponCode()); + memberCoupon.setMemberId(memberCouponCreateDTO.getMemberId()); + memberCoupon.setCouponId(memberCouponCreateDTO.getCouponId()); + memberCoupon.setCouponStatus(1); + memberCouponList.add(memberCoupon); + } + return this.saveBatch(memberCouponList); + } +} -- Gitee From 3f688546ad178cc6b4bf6c2c70eb80fbbdeef387 Mon Sep 17 00:00:00 2001 From: zhonghengtech Date: Wed, 5 Jun 2024 13:47:46 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=8F=91=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code4java/springbok/dto/MemberCouponCreateDTO.java | 10 ++++++++++ .../java/cn/code4java/springbok/entity/Coupon.java | 8 -------- .../cn/code4java/springbok/entity/MemberCoupon.java | 9 +++++++++ .../springbok/service/CouponDirectServiceImpl.java | 8 ++++++++ .../springbok/service/MemberCouponServiceImpl.java | 2 ++ 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java index d84ceba..6cd3fbb 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java @@ -2,6 +2,8 @@ package cn.code4java.springbok.dto; import lombok.Data; +import java.time.LocalDate; + /** * @ClassName MemberCouponCreateDTO * @Description: 创建会员券DTO @@ -20,6 +22,14 @@ public class MemberCouponCreateDTO { * 券id */ private Integer couponId; + /** + * 开始日期 + */ + private LocalDate startDate; + /** + * 结束日期 + */ + private LocalDate endDate; /** * 创建数量,不传默认为1 */ diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java index 27cd50e..3c8cb34 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java @@ -60,14 +60,6 @@ public class Coupon extends BaseEntity { * 2:指定商品不可用 */ private Integer usedItemSaleType; - /** - * 券有效开始日期 - */ - private Date couponStartDate; - /** - * 券有效结束日期 - */ - private Date couponEndDate; /** * 券状态 * 1:未生效 diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java index 2ccb07b..b786c45 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.time.LocalDate; import java.util.Date; /** @@ -45,4 +46,12 @@ public class MemberCoupon extends BaseEntity { * 核销时间 */ private Date verifyTime; + /** + * 券有效开始日期 + */ + private LocalDate startDate; + /** + * 券有效结束日期 + */ + private LocalDate endDate; } diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java index bbb1f1a..8dc6c6a 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java @@ -18,6 +18,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -95,6 +96,13 @@ public class CouponDirectServiceImpl extends ServiceImpl Date: Wed, 5 Jun 2024 13:50:59 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=8F=91=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code4java/springbok/service/CouponDirectServiceImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java index 8dc6c6a..1833752 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java @@ -72,6 +72,7 @@ public class CouponDirectServiceImpl extends ServiceImpl Date: Fri, 14 Jun 2024 15:18:15 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=8F=91=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code4java/springbok/utils/DateUtils.java | 25 ++++++ .../springbok/dto/MemberCouponCreateDTO.java | 6 +- .../cn/code4java/springbok/entity/Coupon.java | 7 -- .../springbok/entity/CouponDirect.java | 2 +- .../springbok/entity/CouponDirectLine.java | 7 +- .../springbok/entity/MemberCoupon.java | 4 +- .../service/CouponDirectService.java | 27 +++++++ .../springbok/vo/CouponDirectLineVO.java | 29 +++++++ .../springbok/vo/CouponDirectVO.java | 20 +++++ .../controller/CouponDirectController.java | 48 +++++++++++ .../mapper/CouponDirectLineMapper.java | 4 + .../service/CouponDirectServiceImpl.java | 79 ++++++++++++++++--- .../mapper/CouponDirectLineMapper.xml | 18 +++++ 13 files changed, 250 insertions(+), 26 deletions(-) create mode 100644 springbok-common/src/main/java/cn/code4java/springbok/utils/DateUtils.java create mode 100644 springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectLineVO.java create mode 100644 springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectVO.java create mode 100644 springbok-mall/src/main/resources/mapper/CouponDirectLineMapper.xml diff --git a/springbok-common/src/main/java/cn/code4java/springbok/utils/DateUtils.java b/springbok-common/src/main/java/cn/code4java/springbok/utils/DateUtils.java new file mode 100644 index 0000000..d448391 --- /dev/null +++ b/springbok-common/src/main/java/cn/code4java/springbok/utils/DateUtils.java @@ -0,0 +1,25 @@ +package cn.code4java.springbok.utils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.Date; + +/** + * @ClassName DateUtils + * @Description: TODO + * @Author zhonghengtech + * @Date 2024/6/14 + * @Version V1.0 + **/ +public class DateUtils { + + public static Date localDateToDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay(ZoneOffset.systemDefault()).toInstant()); + } + + public static Date localDateTimeToDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } +} diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java index 6cd3fbb..2e1b4c9 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java @@ -2,7 +2,7 @@ package cn.code4java.springbok.dto; import lombok.Data; -import java.time.LocalDate; +import java.util.Date; /** * @ClassName MemberCouponCreateDTO @@ -25,11 +25,11 @@ public class MemberCouponCreateDTO { /** * 开始日期 */ - private LocalDate startDate; + private Date startDate; /** * 结束日期 */ - private LocalDate endDate; + private Date endDate; /** * 创建数量,不传默认为1 */ diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java index 3c8cb34..518cc69 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/Coupon.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; -import java.util.Date; /** * @ClassName Coupon @@ -60,10 +59,4 @@ public class Coupon extends BaseEntity { * 2:指定商品不可用 */ private Integer usedItemSaleType; - /** - * 券状态 - * 1:未生效 - * 2:已生效 - */ - private Integer couponStatus; } diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirect.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirect.java index 41443ae..1c051a9 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirect.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirect.java @@ -24,7 +24,7 @@ public class CouponDirect extends BaseEntity { /** * 发券名称 */ - private Integer couponDirectName; + private String couponDirectName; /** * 发放类型 1 按标签 2 指定手机号 */ diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java index f7480c0..54f7a81 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/CouponDirectLine.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDate; +import java.util.Date; /** * @ClassName CouponDirect @@ -36,17 +37,17 @@ public class CouponDirectLine { */ private Integer sendNum; /** - * 有效期类型 0 指定日期 1 指定周期 + * 有效期类型 1 指定日期 2 指定周期 */ private Integer validityType; /** * 开始日期 */ - private LocalDate startDate; + private Date startDate; /** * 结束日期 */ - private LocalDate endDate; + private Date endDate; /** * 发券后N天 */ diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java index b786c45..3415c3a 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/entity/MemberCoupon.java @@ -49,9 +49,9 @@ public class MemberCoupon extends BaseEntity { /** * 券有效开始日期 */ - private LocalDate startDate; + private Date startDate; /** * 券有效结束日期 */ - private LocalDate endDate; + private Date endDate; } diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java index 6a20dcd..f403bac 100644 --- a/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/service/CouponDirectService.java @@ -3,6 +3,7 @@ package cn.code4java.springbok.service; import cn.code4java.springbok.dto.CouponDirectDTO; import cn.code4java.springbok.dto.CouponDirectQueryDTO; import cn.code4java.springbok.entity.CouponDirect; +import cn.code4java.springbok.vo.CouponDirectVO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; /** @@ -20,6 +21,15 @@ public interface CouponDirectService { * @return */ Page pageCouponDirect(CouponDirectQueryDTO couponDirectQueryDTO); + + /** + * 根据id查询优惠券 + * + * @param id + * @return + */ + CouponDirectVO selectCouponDirectById(Integer id); + /** * 新增定向发券 * @@ -27,6 +37,23 @@ public interface CouponDirectService { * @return */ boolean addCouponDirect(CouponDirectDTO couponDirectDTO); + + /** + * 修改定向发券 + * + * @param couponDirectDTO + * @return + */ + boolean updateCouponDirect(CouponDirectDTO couponDirectDTO); + + /** + * 删除定向发券 + * + * @param id + * @return + */ + boolean deleteCouponDirect(Integer id); + /** * 发券 * diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectLineVO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectLineVO.java new file mode 100644 index 0000000..efa57c7 --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectLineVO.java @@ -0,0 +1,29 @@ +package cn.code4java.springbok.vo; + +import cn.code4java.springbok.entity.CouponDirectLine; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @ClassName CouponDirectVO + * @Description: CouponDirectVO + * @Author zhonghengtech + * @Date 2024/06/13 + * @Version V1.0 + **/ +@Data +public class CouponDirectLineVO extends CouponDirectLine { + /** + * 券名称 + */ + private String couponName; + /** + * 券门槛 + */ + private BigDecimal couponLimit; + /** + * 券抵扣金额,折扣券填(0-1)区间的数字,例如0.88代表88折 + */ + private BigDecimal couponAmount; +} diff --git a/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectVO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectVO.java new file mode 100644 index 0000000..4c181f6 --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/vo/CouponDirectVO.java @@ -0,0 +1,20 @@ +package cn.code4java.springbok.vo; + +import cn.code4java.springbok.entity.CouponDirect; +import cn.code4java.springbok.entity.CouponDirectLine; +import lombok.Data; + +import java.util.List; + +/** + * @ClassName CouponDirectVO + * @Description: CouponDirectVO + * @Author zhonghengtech + * @Date 2024/06/13 + * @Version V1.0 + **/ +@Data +public class CouponDirectVO extends CouponDirect { + + private List couponDirectLineList; +} diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java b/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java index 0fd47e9..d9fe71a 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/controller/CouponDirectController.java @@ -39,6 +39,18 @@ public class CouponDirectController { return BaseResponse.success(couponDirectService.pageCouponDirect(params)); } + /** + * 根据id查询定向发券 + * + * @param couponDirectId + * @return + */ + @GetMapping("/selectCouponDirectById") + @Operation(summary = "根据id查询定向发券", description = "根据id查询定向发券") + public BaseResponse selectCouponDirectById(Integer couponDirectId) { + return BaseResponse.success(couponDirectService.selectCouponDirectById(couponDirectId)); + } + /** * 新增定向发券 * @@ -50,4 +62,40 @@ public class CouponDirectController { public BaseResponse addCouponDirect(@RequestBody CouponDirectDTO couponDirectDTO) { return BaseResponse.success(couponDirectService.addCouponDirect(couponDirectDTO)); } + + /** + * 修改定向发券 + * + * @param couponDirectDTO + * @return + */ + @PostMapping("/updateCouponDirect") + @Operation(summary = "修改定向发券", description = "修改定向发券") + public BaseResponse updateCouponDirect(@RequestBody CouponDirectDTO couponDirectDTO) { + return BaseResponse.success(couponDirectService.updateCouponDirect(couponDirectDTO)); + } + + /** + * 删除定向发券 + * + * @param couponDirectId + * @return + */ + @PostMapping("/deleteCouponDirect") + @Operation(summary = "删除定向发券", description = "删除定向发券") + public BaseResponse deleteCouponDirect(Integer couponDirectId) { + return BaseResponse.success(couponDirectService.deleteCouponDirect(couponDirectId)); + } + + /** + * 发券 + * + * @param couponDirectId + * @return + */ + @PostMapping("/sendCoupon") + @Operation(summary = "发券", description = "发券") + public BaseResponse sendCoupon(Integer couponDirectId) { + return BaseResponse.success(couponDirectService.sendCoupon(couponDirectId)); + } } diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java b/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java index 62b47f9..6b983e4 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java @@ -1,8 +1,11 @@ package cn.code4java.springbok.mapper; import cn.code4java.springbok.entity.CouponDirectLine; +import cn.code4java.springbok.vo.CouponDirectLineVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @ClassName CouponDirectMapper * @Description: CouponDirectMapper @@ -11,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @Version V1.0 **/ public interface CouponDirectLineMapper extends BaseMapper { + List selectCouponDirectLine(int couponDirectId); } diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java index 1833752..9b75874 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java @@ -3,12 +3,19 @@ package cn.code4java.springbok.service; import cn.code4java.springbok.dto.CouponDirectDTO; import cn.code4java.springbok.dto.CouponDirectQueryDTO; import cn.code4java.springbok.dto.MemberCouponCreateDTO; +import cn.code4java.springbok.entity.Coupon; import cn.code4java.springbok.entity.CouponDirect; import cn.code4java.springbok.entity.CouponDirectLine; import cn.code4java.springbok.entity.Member; import cn.code4java.springbok.mapper.CouponDirectLineMapper; import cn.code4java.springbok.mapper.CouponDirectMapper; import cn.code4java.springbok.mapper.MemberMapper; +import cn.code4java.springbok.utils.DateUtils; +import cn.code4java.springbok.vo.CouponDirectLineVO; +import cn.code4java.springbok.vo.CouponDirectVO; +import cn.code4java.springbok.vo.CouponItemSaleVO; +import cn.code4java.springbok.vo.CouponVO; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -17,6 +24,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.ArrayList; @@ -41,6 +49,7 @@ public class CouponDirectServiceImpl extends ServiceImpl couponDirectLineList = couponDirectLineMapper.selectCouponDirectLine(id); + couponDirectVO.setCouponDirectLineList(couponDirectLineList); + return couponDirectVO; + } + /** * 新增定向发券 + * * @param couponDirectDTO * @return */ @Override + @Transactional public boolean addCouponDirect(CouponDirectDTO couponDirectDTO) { - CouponDirect couponDirect = new CouponDirect(); - couponDirect.setStatus(0); - couponDirectMapper.insert(couponDirect); - couponDirectDTO.getCouponDirectLineList().stream().forEach(couponDirectLine -> { - couponDirectLine.setCouponDirectLineId(couponDirect.getCouponDirectId()); - couponDirectLineMapper.insert(couponDirectLine); - }); - this.sendCoupon(couponDirect.getCouponDirectId()); + couponDirectDTO.setStatus(0); + couponDirectMapper.insert(couponDirectDTO); + if (CollectionUtil.isNotEmpty(couponDirectDTO.getCouponDirectLineList())) { + couponDirectDTO.getCouponDirectLineList().stream().forEach(couponDirectLine -> { + couponDirectLine.setCouponDirectId(couponDirectDTO.getCouponDirectId()); + couponDirectLineMapper.insert(couponDirectLine); + }); + } return true; } + /** + * 修改定向发券 + * + * @param couponDirectDTO + * @return + */ + @Override + @Transactional + public boolean updateCouponDirect(CouponDirectDTO couponDirectDTO) { + couponDirectLineMapper.delete(Wrappers.lambdaQuery().eq(CouponDirectLine::getCouponDirectId, couponDirectDTO.getCouponDirectId())); + if (CollectionUtil.isNotEmpty(couponDirectDTO.getCouponDirectLineList())) { + couponDirectDTO.getCouponDirectLineList().stream().forEach(couponDirectLine -> { + couponDirectLine.setCouponDirectLineId(couponDirectDTO.getCouponDirectId()); + couponDirectLineMapper.insert(couponDirectLine); + }); + } + return updateById(couponDirectDTO); + } + + /** + * 删除定向发券 + * + * @param id + * @return + */ + @Override + @Transactional + public boolean deleteCouponDirect(Integer id) { + couponDirectLineMapper.delete(Wrappers.lambdaQuery().eq(CouponDirectLine::getCouponDirectId, id)); + return removeById(id); + } + /** * 发券 * todo 发券接口较慢,应移入消息队列中 + * * @param couponDirectId * @return */ @@ -101,8 +160,8 @@ public class CouponDirectServiceImpl extends ServiceImpl + + + + + -- Gitee From a87bcddaf6a35a191e5ea5d365a60da5b002b4f0 Mon Sep 17 00:00:00 2001 From: zhonghengtech Date: Fri, 14 Jun 2024 15:48:30 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=8F=91=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code4java/springbok/service/CouponDirectServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java index 9b75874..561dafe 100644 --- a/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/CouponDirectServiceImpl.java @@ -136,6 +136,7 @@ public class CouponDirectServiceImpl extends ServiceImpllambdaQuery().eq(Member::getPhone, ListUtil.toList(sendTargetIds))); + members = memberMapper.selectList(Wrappers.lambdaQuery().in(Member::getPhone, ListUtil.toList(sendTargetIds))); } if (CollectionUtil.isNotEmpty(members)) { for (Member member : members) { @@ -156,7 +157,7 @@ public class CouponDirectServiceImpl extends ServiceImpl Date: Fri, 14 Jun 2024 16:08:22 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E8=A1=A5=E5=85=85member=5Fcoupon=E8=A1=A8?= =?UTF-8?q?=E5=88=B8=E6=9C=89=E6=95=88=E6=9C=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/springbok-mall.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/database/springbok-mall.sql b/database/springbok-mall.sql index 52db415..8f5e0de 100644 --- a/database/springbok-mall.sql +++ b/database/springbok-mall.sql @@ -190,6 +190,8 @@ CREATE TABLE `mall_member_coupon` ( `coupon_id` int(11) DEFAULT NULL, `coupon_no` varchar(255) DEFAULT NULL, `coupon_status` int(1) DEFAULT NULL, + `start_date` date DEFAULT NULL COMMENT '开始日期', + `end_date` date DEFAULT NULL COMMENT '结束日期', `created_name` varchar(255) DEFAULT NULL, `created_time` datetime DEFAULT NULL, `updated_name` varchar(255) DEFAULT NULL, -- Gitee