diff --git a/jzo2o-api/src/main/java/com/jzo2o/api/market/CouponApi.java b/jzo2o-api/src/main/java/com/jzo2o/api/market/CouponApi.java index 2d373bc..b55b2eb 100644 --- a/jzo2o-api/src/main/java/com/jzo2o/api/market/CouponApi.java +++ b/jzo2o-api/src/main/java/com/jzo2o/api/market/CouponApi.java @@ -1,5 +1,6 @@ package com.jzo2o.api.market; +import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; import com.jzo2o.api.market.dto.request.CouponUseReqDTO; import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO; import com.jzo2o.api.market.dto.response.CouponUseResDTO; @@ -29,4 +30,10 @@ public interface CouponApi { */ @PostMapping("/use") CouponUseResDTO useCoupon(@RequestBody CouponUseReqDTO couponUseReqDTO); + + /** + * 用户取消订单退回使用优惠卷 + */ + @PostMapping("/useBack") + void useBack(@RequestBody CouponUseBackReqDTO couponUseBackReqDTO); } \ No newline at end of file diff --git a/jzo2o-api/src/main/java/com/jzo2o/api/market/dto/request/CouponUseBackReqDTO.java b/jzo2o-api/src/main/java/com/jzo2o/api/market/dto/request/CouponUseBackReqDTO.java index f836a1e..6fccdcc 100644 --- a/jzo2o-api/src/main/java/com/jzo2o/api/market/dto/request/CouponUseBackReqDTO.java +++ b/jzo2o-api/src/main/java/com/jzo2o/api/market/dto/request/CouponUseBackReqDTO.java @@ -4,8 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -@ApiModel("优惠券使用退回请求模型") @Data +@ApiModel("优惠券使用退回请求模型") public class CouponUseBackReqDTO { @ApiModelProperty("优惠券id") private Long id; @@ -13,4 +13,4 @@ public class CouponUseBackReqDTO { private Long ordersId; @ApiModelProperty("用户id") private Long userId; -} +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/controller/inner/CouponController.java b/jzo2o-market/src/main/java/com/jzo2o/market/controller/inner/CouponController.java index f52aa0c..429246b 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/controller/inner/CouponController.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/controller/inner/CouponController.java @@ -1,10 +1,12 @@ package com.jzo2o.market.controller.inner; import com.jzo2o.api.market.CouponApi; +import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; import com.jzo2o.api.market.dto.request.CouponUseReqDTO; import com.jzo2o.api.market.dto.response.AvailableCouponsResDTO; import com.jzo2o.api.market.dto.response.CouponUseResDTO; import com.jzo2o.market.service.ICouponService; +import com.jzo2o.market.service.ICouponUseBackService; import com.jzo2o.market.service.ICouponWriteOffService; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -27,6 +29,8 @@ public class CouponController implements CouponApi { private ICouponService couponService; @Resource private ICouponWriteOffService couponWriteOffService; + @Resource + private ICouponUseBackService couponUseBackService; /** * 根据订单金额获取当前用户可用优惠卷 @@ -45,4 +49,11 @@ public class CouponController implements CouponApi { public CouponUseResDTO useCoupon(@RequestBody CouponUseReqDTO couponUseReqDTO) { return couponWriteOffService.use(couponUseReqDTO); } + + @Override + @PostMapping("/useBack") + @ApiOperation("优惠券退回接口") + public void useBack(@RequestBody CouponUseBackReqDTO couponUseBackReqDTO) { + couponUseBackService.useBack(couponUseBackReqDTO); + } } \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/CouponUseBack.java b/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/CouponUseBack.java index 8a613da..7443d13 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/CouponUseBack.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/model/domain/CouponUseBack.java @@ -1,22 +1,24 @@ package com.jzo2o.market.model.domain; import com.baomidou.mybatisplus.annotation.IdType; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableId; -import java.io.Serializable; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.io.Serializable; +import java.time.LocalDateTime; + /** *

* 优惠券使用回退记录 *

- * * @author itcast * @since 2023-09-18 */ @Data +@Builder @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class CouponUseBack implements Serializable { @@ -26,7 +28,7 @@ public class CouponUseBack implements Serializable { /** * 回退记录id */ - @TableId(value = "id", type = IdType.NONE) + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** @@ -48,6 +50,4 @@ public class CouponUseBack implements Serializable { * 核销时间 */ private LocalDateTime writeOffTime; - - -} +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponUseBackService.java b/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponUseBackService.java index 70f713f..097aa52 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponUseBackService.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/service/ICouponUseBackService.java @@ -1,18 +1,19 @@ package com.jzo2o.market.service; -import com.jzo2o.market.model.domain.CouponUseBack; import com.baomidou.mybatisplus.extension.service.IService; - -import java.time.LocalDateTime; +import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; +import com.jzo2o.market.model.domain.CouponUseBack; /** *

* 优惠券使用回退记录 服务类 *

- * * @author itcast * @since 2023-09-18 */ public interface ICouponUseBackService extends IService { - -} + /** + * 用户退回优惠卷 + */ + void useBack(CouponUseBackReqDTO couponUseBackReqDTO); +} \ No newline at end of file diff --git a/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponUseBackServiceImpl.java b/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponUseBackServiceImpl.java index 049da04..1c596b3 100644 --- a/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponUseBackServiceImpl.java +++ b/jzo2o-market/src/main/java/com/jzo2o/market/service/impl/CouponUseBackServiceImpl.java @@ -1,25 +1,69 @@ package com.jzo2o.market.service.impl; -import com.jzo2o.common.utils.DateUtils; -import com.jzo2o.common.utils.IdUtils; -import com.jzo2o.market.model.domain.CouponUseBack; -import com.jzo2o.market.mapper.CouponUseBackMapper; -import com.jzo2o.market.service.ICouponUseBackService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jzo2o.api.market.dto.request.CouponUseBackReqDTO; +import com.jzo2o.common.expcetions.BadRequestException; +import com.jzo2o.common.expcetions.DBException; +import com.jzo2o.common.utils.ObjectUtils; +import com.jzo2o.market.enums.CouponStatusEnum; +import com.jzo2o.market.mapper.CouponUseBackMapper; +import com.jzo2o.market.model.domain.Coupon; +import com.jzo2o.market.model.domain.CouponUseBack; +import com.jzo2o.market.service.ICouponService; +import com.jzo2o.market.service.ICouponUseBackService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.time.LocalDateTime; /** *

* 优惠券使用回退记录 服务实现类 *

- * * @author itcast * @since 2023-09-18 */ @Service public class CouponUseBackServiceImpl extends ServiceImpl implements ICouponUseBackService { + @Resource + private ICouponService couponService; -} + @Override + @Transactional + public void useBack(CouponUseBackReqDTO couponUseBackReqDTO) { + Long couponId = couponUseBackReqDTO.getId(); + Long userId = couponUseBackReqDTO.getUserId(); + Long ordersId = couponUseBackReqDTO.getOrdersId(); + + Coupon coupon = couponService.getById(couponId); + if (ObjectUtils.isEmpty(coupon) || ObjectUtils.notEqual(coupon.getUserId(), userId)) { + throw new BadRequestException("优惠卷不存在"); + } else if (coupon.getStatus() != CouponStatusEnum.USED) { + throw new BadRequestException("优惠卷未使用"); + } else if (ObjectUtils.notEqual(coupon.getOrdersId(), ordersId)) { + throw new BadRequestException("优惠券对应订单错误"); + } + + LocalDateTime nowTime = LocalDateTime.now(); + CouponStatusEnum status = coupon.getValidityTime().isAfter(nowTime) ? CouponStatusEnum.NO_USE : CouponStatusEnum.INVALID; + + if (!couponService.lambdaUpdate() + .eq(Coupon::getId, couponId) + .set(Coupon::getUseTime, null) + .set(Coupon::getStatus, status) + .set(Coupon::getOrdersId, null) + .update()) { + throw new DBException("更新优惠卷表失败"); + } + + if (!this.save(CouponUseBack.builder() + .couponId(couponId) + .userId(userId) + .useBackTime(nowTime) + .writeOffTime(coupon.getUseTime()) + .build())) { + throw new DBException("更新退回表失败"); + } + } +} \ No newline at end of file