diff --git a/database/springbok-mall.sql b/database/springbok-mall.sql index 52db41523857d7c0b3253c229df275e69227bef3..8f5e0de9526e92289349c7d113c786b839ef46c8 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, 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 0000000000000000000000000000000000000000..f987b7e57d1befb6c258a32a9d6947cda3ffc1e1 --- /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-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 0000000000000000000000000000000000000000..d4483914247d976ed8aa2304e37b4b9a8319f5ba --- /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/CouponDirectDTO.java b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/CouponDirectDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..7930653a3895b1f75aa25bbb257b968b6dcc6ae8 --- /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 0000000000000000000000000000000000000000..2e1b4c94c5dd8a8208ee4556c63658fdd95307f9 --- /dev/null +++ b/springbok-mall-api/src/main/java/cn/code4java/springbok/dto/MemberCouponCreateDTO.java @@ -0,0 +1,37 @@ +package cn.code4java.springbok.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * @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; + /** + * 开始日期 + */ + private Date startDate; + /** + * 结束日期 + */ + private Date endDate; + /** + * 创建数量,不传默认为1 + */ + private Integer num; +} 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 41443ae472d1c5fc3fc299a263defb09ac804680..1c051a9bc6d9834ec7c49b1cceb0f387c3c1b8d5 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 ead74b2a16602c239efa1ed74ec60fe386483071..54f7a8124d02b958d99770f0519651f6ae5a76f4 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 @@ -26,27 +27,27 @@ public class CouponDirectLine { /** * 定向发券id */ - private Long couponDirectId; + private Integer couponDirectId; /** * 券id */ - private Long couponId; + private Integer couponId; /** * 发放数量 */ 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 3e0467b985b1c699d44804284dae70db242d50a3..3415c3af18d83437bc18aabb02d05a456e72e93d 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,9 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.time.LocalDate; +import java.util.Date; + /** * @ClassName MemberCoupon * @Description: 会员优惠券 @@ -39,4 +42,16 @@ public class MemberCoupon extends BaseEntity { * 2:已使用 */ private Integer couponStatus; + /** + * 核销时间 + */ + private Date verifyTime; + /** + * 券有效开始日期 + */ + private Date startDate; + /** + * 券有效结束日期 + */ + 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 3117eec89bceb9ad1924c98ea368eef9a1057424..f403bac8f19061eabd5d1e781cdbadd350779bd3 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,7 +1,9 @@ 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; /** @@ -19,4 +21,44 @@ public interface CouponDirectService { * @return */ Page pageCouponDirect(CouponDirectQueryDTO couponDirectQueryDTO); + + /** + * 根据id查询优惠券 + * + * @param id + * @return + */ + CouponDirectVO selectCouponDirectById(Integer id); + + /** + * 新增定向发券 + * + * @param couponDirectDTO + * @return + */ + boolean addCouponDirect(CouponDirectDTO couponDirectDTO); + + /** + * 修改定向发券 + * + * @param couponDirectDTO + * @return + */ + boolean updateCouponDirect(CouponDirectDTO couponDirectDTO); + + /** + * 删除定向发券 + * + * @param id + * @return + */ + boolean deleteCouponDirect(Integer id); + + /** + * 发券 + * + * @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 0000000000000000000000000000000000000000..c3da53491807011f8fd78716150392c3ba7f8841 --- /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-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 0000000000000000000000000000000000000000..efa57c731776d1e98091809a734eb0e8aed9266f --- /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 0000000000000000000000000000000000000000..4c181f6ad4b4d20ceb3c40ec1d03473a7c1e90c0 --- /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 2ac0344581ad75a26c6bae493fee7ddd70dc066f..d9fe71a9bf6fb6b1b78fbf6fed1b6a3b46e39f93 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,64 @@ public class CouponDirectController { public BaseResponse pageCouponDirect(CouponDirectQueryDTO params) { 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)); + } + + /** + * 新增定向发券 + * + * @param couponDirectDTO + * @return + */ + @PostMapping("/addCouponDirect") + @Operation(summary = "新增定向发券", description = "新增定向发券") + 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 new file mode 100644 index 0000000000000000000000000000000000000000..6b983e455f56c71497af41662055a32533edd9b1 --- /dev/null +++ b/springbok-mall/src/main/java/cn/code4java/springbok/mapper/CouponDirectLineMapper.java @@ -0,0 +1,18 @@ +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 + * @Author zhonghengtech + * @Date 2024/6/1 + * @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 89450978016f94be837e038466d70b7eb3b3f543..561dafeda859e0ad66a9afb96936c092da2765a7 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,12 +1,34 @@ 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; 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 org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; /** * @ClassName CouponDirectServiceImpl @@ -15,12 +37,22 @@ 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 +60,118 @@ public class CouponDirectServiceImpl extends ServiceImpl couponDirectLineList = couponDirectLineMapper.selectCouponDirectLine(id); + couponDirectVO.setCouponDirectLineList(couponDirectLineList); + return couponDirectVO; + } + + /** + * 新增定向发券 + * + * @param couponDirectDTO + * @return + */ + @Override + @Transactional + public boolean addCouponDirect(CouponDirectDTO couponDirectDTO) { + 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 + */ + @Override + @Transactional + 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().in(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()); + if (couponDirectLine.getValidityType() == 1) { + memberCouponCreateDTO.setStartDate(couponDirectLine.getStartDate()); + memberCouponCreateDTO.setEndDate(couponDirectLine.getEndDate()); + } else { + memberCouponCreateDTO.setStartDate(DateUtils.localDateToDate(LocalDate.now().plusDays(couponDirectLine.getAfterDayNum()))); + memberCouponCreateDTO.setEndDate(DateUtils.localDateToDate(LocalDate.now().plusDays(couponDirectLine.getAfterDayNum()).plusDays(couponDirectLine.getValidDayNum()))); + } + memberCouponService.createMemberCoupon(memberCouponCreateDTO); + sendNum += couponDirectLine.getSendNum(); + } + } + } + log.info("定向发券成功,{}名用户共发放{}张券", members.size(), sendNum); + couponDirect.setStatus(2); + couponDirectMapper.updateById(couponDirect); + return true; + } } 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 0000000000000000000000000000000000000000..53d00bede7e9c20a9abe19c382bff58202f47e11 --- /dev/null +++ b/springbok-mall/src/main/java/cn/code4java/springbok/service/MemberCouponServiceImpl.java @@ -0,0 +1,41 @@ +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.setStartDate(memberCouponCreateDTO.getStartDate()); + memberCoupon.setEndDate(memberCouponCreateDTO.getEndDate()); + memberCoupon.setCouponStatus(1); + memberCouponList.add(memberCoupon); + } + return this.saveBatch(memberCouponList); + } +} diff --git a/springbok-mall/src/main/resources/mapper/CouponDirectLineMapper.xml b/springbok-mall/src/main/resources/mapper/CouponDirectLineMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ef7b2da40856181ace403ea85faf6cc9866728b --- /dev/null +++ b/springbok-mall/src/main/resources/mapper/CouponDirectLineMapper.xml @@ -0,0 +1,18 @@ + + + + + +