news 2026/6/10 3:09:25

天机学堂-优惠券功能-day09(七)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
天机学堂-优惠券功能-day09(七)

day09 接口

一 优惠券管理

1.新增优惠券

接口说明新增优惠券功能,如果优惠券有限定使用范围,注意保持范围数据
请求方式POST
请求路径/coupons
请求参数{ "name" : "新年大促", // 优惠券名称 "specific" : true, // 是否限定使用范围 "scopes": ["2001", "2004", "2007"], // 限定的分类id集合 "discountType" : 1, // 折扣类型 "thresholdAmount" : 100, // 折扣阈值,0代表无门槛 "discountValue" : 15, // 优惠值。满减填优惠金额,折扣填折扣值 "maxDiscountAmount" : 0, // 最大优惠金额 "obtainWay" : 1, // 领取方式,1-手动领取,2-兑换码 "totalNum" : 200, // 优惠券总发放数量 "userLimit" : 1, // 每个人的限领数量 }
返回值
CouponController.java
/** * 新增优惠券 * * @param coupon * @return */@ApiOperation("新增优惠券")@PostMappingpublicvoidsaveCoupon(@RequestBody@ValidCouponFormDTOcoupon){couponService.saveCoupon(coupon);}
ICouponService.java
voidsaveCoupon(@ValidCouponFormDTOcoupon);
CouponServiceImpl.java

测试时注意:添加优惠券时优惠券名称需要不少于4

@Override@TransactionalpublicvoidsaveCoupon(CouponFormDTOcoupon){// 1.拷贝优惠券相关信息Couponcoupon1=BeanUtils.copyProperties(coupon,Coupon.class);// 2.保存优惠券save(coupon1);// 3.保存限定范围(指定的课程或者分类生效)if(!coupon.getSpecific()){//没有范围限定return;}//4.有的话就需要去存储该获取优惠券的使用范围List<Long>scopes=coupon.getScopes();List<CouponScope>list=newArrayList<>();for(Longscope:scopes){//保存优惠券和课程或者分类的关系// 1.创建对象(三个属性:范围限定的类型,业务的id,优惠券的id)CouponScopescope1=newCouponScope();// 2.设置属性scope1.setCouponId(coupon1.getId());scope1.setBizId(scope);scope1.setType(1);list.add(scope1);}couponScopeService.saveBatch(list);}

2.修改优惠券

  • 请求方式:PUT
  • 请求路径:/coupons/{id}
  • 请求参数:与新增类似,参考新增接口。
  • 返回值:无
CouponController.java
/** * 修改优惠券 * * @param coupon * @return */@ApiOperation("修改优惠券")@PutMapping("{id}")publicvoidupdateCoupon(@RequestBodyCouponFormDTOcoupon){couponService.updateById(BeanUtils.copyProperties(coupon,Coupon.class));}

分页查询优惠券

接口说明分页查询优惠券,默认按照创建时间排序
请求方式GET
请求路径/coupons/page
请求参数{ "pageNo" : 1, // 页码 "pageSize" : 10, // 每页大小 "type" : 1, // 折扣类型 "status" : 1, // 优惠券状态 "name" : "大促", // 优惠券名称关键字 }
返回值{ "list": [ { "id": "110", // 优惠券id "name": "年中大促", // 优惠券名称 "discountType": 1, // 优惠券折扣类型 "thresholdAmount": 100, // 优惠门槛 "discountValue": 10, // 优惠值 "maxDiscountAmount": 0, // 优惠上限 "specific": true, // 是否限定范围 "obtainWay": 1, // 领取方式 "totalNum": 1000, // 总发放数量 "issueNum": 800, // 已领取数量 "usedNum": 100 // 已使用数量 "createTime": "2023-05-01", // 创建时间 "issueBeginTime": "2023-06-01", // 发放开始时间 "issueEndTime": "2023-06-20", // 发放结束时间 "termBeginTime": "2023-06-10", // 使用有效期开始时间 "termEndTime": "2023-06-30", // 使用有效期结束时间 "termDays": 0, // 有效天数 "status": 1, // 状态 } ], "pages": 0, "total": 0 }
CouponController.java
/** * 分页查询优惠券 * * @param query * @return */@ApiOperation("分页查询优惠券")@GetMapping("/page")publicPageDTO<CouponPageVO>queryCoupons(CouponQueryquery){returncouponService.queryCoupons(query);}
ICouponService.java
PageDTO<CouponPageVO>queryCoupons(CouponQueryquery);
CouponServiceImpl.java
@OverridepublicPageDTO<CouponPageVO>queryCoupons(CouponQueryquery){Integerstatus=query.getStatus();Stringname=query.getName();Integertype=query.getType();Page<Coupon>page=lambdaQuery().eq(status!=null,Coupon::getDiscountType,type).eq(status!=null,Coupon::getStatus,status).like(name!=null,Coupon::getName,name).page(query.toMpPageDefaultSortByCreateTimeDesc());List<Coupon>records=page.getRecords();if(CollUtils.isEmpty(records)){returnPageDTO.empty(page);}ArrayList<CouponPageVO>couponPageVOS=newArrayList<>();for(Couponrecord:records){CouponPageVOvo=BeanUtils.copyProperties(record,CouponPageVO.class);couponPageVOS.add(vo);}returnPageDTO.of(page,couponPageVOS);}

3.根据id查询优惠券

接口说明都需要根据id查询优惠券的详细信息
请求方式GET
请求路径/coupons/{id}
请求参数路径占位符id
返回值{ "id": "110", // 优惠券id "name": "年中大促", // 优惠券名称 "discountType": 1, // 优惠券折扣类型 "thresholdAmount": 100, // 优惠门槛 "discountValue": 10, // 优惠值 "maxDiscountAmount": 0, // 优惠上限 "specific": true, // 是否限定范围 "scopes": [ // 限定的分类 {"id": "2001", "name": "IT互联网"} ] "obtainWay": 1, // 领取方式 "totalNum": 1000, // 总发放数量 "useLimit": 1, // 限领数量 "issueBeginTime": "2023-06-01", // 发放开始时间 "issueEndTime": "2023-06-20", // 发放结束时间 "termBeginTime": "2023-06-10", // 使用有效期开始时间 "termEndTime": "2023-06-30", // 使用有效期结束时间 "termDays": 0, // 有效天数 }
CouponController.java
/** * 根据id查询优惠券 * * @param id * @return */@ApiOperation("根据id查询优惠券")@GetMapping("{id}")publicCouponDetailVOgetById(@PathVariable("id")Longid){returncouponService.queryById(id);}
ICouponService.java
CouponDetailVOqueryById(Longid);
CouponServiceImpl.java
@Override public CouponDetailVO queryById(Long id) { Coupon coupon = getById(id); CouponDetailVO couponDetailVO = BeanUtils.copyBean(coupon, CouponDetailVO.class); if (couponDetailVO == null || !coupon.getSpecific()) { // 数据不存在,或者没有限定范围,直接结束 return couponDetailVO; } LambdaQueryWrapper<CouponScope> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CouponScope::getCouponId, id); List<CouponScope> couponScopes = couponScopeMapper.selectList(queryWrapper); if (CollUtils.isEmpty(couponScopes)) { return couponDetailVO; } List<CouponScopeVO> scopeVOS = couponScopes.stream() .map(CouponScope::getBizId) .map(cateId -> new CouponScopeVO(cateId, categoryCache.getNameByLv3Id(cateId))) .collect(Collectors.toList()); couponDetailVO.setScopes(scopeVOS); return couponDetailVO; }

4.删除优惠券

  • 请求方式:DELETE
  • 请求路径:/coupons/{id}
  • 请求参数:与新增类似,参考新增接口。
  • 返回值:无
CouponController.java
/** * 删除优惠券 * * @param id * @return */@ApiOperation("删除优惠券")@DeleteMapping("{id}")publicvoiddeleteById(@PathVariable("id")Longid){couponService.deleteById(id);}
ICouponService.java
voiddeleteById(Longid);
CouponServiceImpl.java
@Override public void deleteById(Long id) { // 1.查询 Coupon coupon = getById(id); if (coupon == null || coupon.getStatus() != DRAFT) { throw new BadRequestException("优惠券不存在或者优惠券正在使用中"); } // 2.删除优惠券 boolean success = remove(new LambdaQueryWrapper<Coupon>() .eq(Coupon::getId, id) .eq(Coupon::getStatus, DRAFT) ); if (!success) { throw new BadRequestException("优惠券不存在或者优惠券正在使用中"); } // 3.删除优惠券对应限定范围 if (!coupon.getSpecific()) { return; } couponScopeService.remove(new LambdaQueryWrapper<CouponScope>().eq(CouponScope::getCouponId, id)); }

二 优惠券发放

1.发放优惠券(版本1)

接口说明发放优惠券
请求方式PUT
请求路径/coupons/{id}/issue
请求参数{ "issueBeginTime": "2023-06-01", // 发放开始时间 "issueEndTime": "2023-06-20", // 发放结束时间 "termBeginTime": "2023-06-10", // 使用有效期开始时间 "termEndTime": "2023-06-30", // 使用有效期结束时间 "termDays": 0, // 有效天数 }
返回值
CouponController.java
/** * 发放优惠券 * * @param dto * @return */@ApiOperation("发放优惠券")@PutMapping("{id}/issue")publicvoidbeginIssue(@RequestBody@ValidCouponIssueFormDTOdto){couponService.beginIssue(dto);}
ICouponService.java
voidbeginIssue(@ValidCouponIssueFormDTOdto);
CouponServiceImpl.java
@OverridepublicvoidbeginIssue(CouponIssueFormDTOdto){//1.查询优惠券CouponbyId=this.getById(dto.getId());//2.判断优惠券的状态,是否是暂停或者待发放if(byId.getStatus()!=DRAFT&&byId.getStatus()!=PAUSE){thrownewBadRequestException("优惠券状态错误");}//3.判断是否是立刻发放(当前时间为null或者发放时间已经过了,都代表立即发放)LocalDateTimeissueBeginTime=dto.getIssueBeginTime();booleanisBegin=issueBeginTime==null||!issueBeginTime.isAfter(LocalDateTime.now());//4.更新优惠券Couponcoupon=BeanUtils.copyProperties(dto,Coupon.class);if(isBegin){coupon.setStatus(CouponStatus.ISSUING);coupon.setIssueBeginTime(issueBeginTime);}else{coupon.setStatus(CouponStatus.UN_ISSUE);}this.updateById(coupon);}

2.发放优惠券(版本2)

兑换码算法

3.暂停发放

  • 请求方式:PUT
  • 请求路径:/coupons/{id}/pause
  • 请求参数:路径占位符id
  • 返回值:无
CouponController.java
@ApiOperation("停发优惠券")@PutMapping("/{id}/pause")publicvoidpauseIssue(@ApiParam("优惠券id")@PathVariable("id")longid){couponService.pauseIssue(id);}
ICouponService.java
voidpauseIssue(longid);
CouponServiceImpl.java
@OverridepublicvoidpauseIssue(longid){this.lambdaUpdate().eq(Coupon::getId,id).set(Coupon::getStatus,CouponStatus.PAUSE).update();}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 12:35:14

OpenAI开源“Circuit‑Sparsity”模型,0.4 B 参数实现 99.9% 权重归零!

12 月 15 日&#xff0c;OpenAI 在官方博客上公布了最新的开源项目——Circuit‑Sparsity 模型。该模型仅拥有 0.4 B 参数&#xff0c;但高达 99.9% 的权重被强制置零&#xff0c;形成极度稀疏的 Transformer 结构。OpenAI 表示&#xff0c;此举旨在破解大语言模型&#xff08…

作者头像 李华
网站建设 2026/6/8 1:31:00

18、软件开发中的交叉引用与测试驱动开发实践

软件开发中的交叉引用与测试驱动开发实践 在软件开发过程中,文档编写和测试是确保软件质量和可维护性的重要环节。下面将介绍 Sphinx 的交叉引用功能,以及测试驱动开发(TDD)的相关内容。 1. Sphinx 交叉引用 Sphinx 提供了内联标记来设置交叉引用。例如,要创建一个指向…

作者头像 李华
网站建设 2026/6/5 18:33:41

AI眼镜热销卖爆:产能紧张与供应链竟然都快跟不上了!

近期&#xff0c;AI眼镜成为消费电子市场的热点。自今年上半年多家厂商相继发布新品后&#xff0c;AI眼镜在天猫、京东、抖音等平台的成交额出现爆发式增长&#xff0c;双十一期间更是实现全网销量第一的成绩。然而&#xff0c;热销的背后却暴露出产能不足、供应链紧张的结构性…

作者头像 李华
网站建设 2026/6/8 22:15:33

COMSOL手性超表面的琼斯矩阵与透射系数计算

COMSOL手性超表面 琼斯矩阵&#xff0c;透射系数计算手性超表面作为一种新兴的电磁调控手段&#xff0c;近年来受到了广泛的关注。它通过在亚波长尺度上设计结构&#xff0c;可以实现对电磁波偏振态的灵活操控&#xff0c;从而在光通信、成像以及隐身技术等领域展现出巨大的应用…

作者头像 李华
网站建设 2026/6/8 15:18:29

AI伦理治理:在创新与规范之间寻找平衡

随着人工智能技术深度融入生产生活&#xff0c;生成式AI创作内容、AI辅助诊疗、智能决策系统等应用层出不穷&#xff0c;为社会带来效率提升的同时&#xff0c;也衍生出数据滥用、算法偏见、责任模糊等伦理风险。如何在鼓励技术创新与守住伦理底线之间实现动态平衡&#xff0c;…

作者头像 李华