发放优惠券
文章目录
-
- 概要
- 整体架构流程
- 技术细节
- 小结
概要
发放优惠券
处于暂停状态,或者待发放状态的优惠券,在优惠券列表中才会出现发放按钮,可以被发放:
需求分析以及接口设计
需要我们选择发放方式,使用期限。
发放方式分为两种:立刻发放和定时发放;使用期限也分两种:固定天数、固定时间段。如图:
因此,在提交这个表单时,参数包括:
-
发放(领用)开始时间:如果为空说明是立刻发放,开始时间就是当前时间
-
发放(领用)结束时间
-
有效期天数:如果为空说明是固定有效期
-
使用期限开始时间:如果为空说明是固定天数有效期
-
使用期限结束时间:如果为空说明是固定天数有效期
最后,肯定要带上优惠券id,我们才知道发放的是哪张券,当然这个可以通过路径占位符传参。
技术细节
1.Controller层
@ApiOperation("发放优惠券接口")
@PutMapping("/{id}/issue")
public void beginIssue(@RequestBody @Valid CouponIssueFormDTO dto) {couponService.beginIssue(dto);
}
2.Service层:
@Transactional
@Override
public void beginIssue(CouponIssueFormDTO dto) {// 1.查询优惠券Coupon coupon = getById(dto.getId());if (coupon == null) {throw new BadRequestException("优惠券不存在!");}// 2.判断优惠券状态,是否是暂停或待发放if(coupon.getStatus() != CouponStatus.DRAFT && coupon.getStatus() != PAUSE){throw new BizIllegalException("优惠券状态错误!");}// 3.判断是否是立刻发放LocalDateTime issueBeginTime = dto.getIssueBeginTime();LocalDateTime now = LocalDateTime.now();boolean isBegin = issueBeginTime == null || !issueBeginTime.isAfter(now);// 4.更新优惠券// 4.1.拷贝属性到POCoupon c = BeanUtils.copyBean(dto, Coupon.class);// 4.2.更新状态if (isBegin) {c.setStatus(ISSUING);c.setIssueBeginTime(now);}else{c.setStatus(UN_ISSUE);}// 4.3.写入数据库updateById(c);// TODO 兑换码生成
}