فهرست منبع

promotion:增加优惠劵的回收操作

YunaiV 2 سال پیش
والد
کامیت
873b530652
13فایلهای تغییر یافته به همراه96 افزوده شده و 9 حذف شده
  1. 1 0
      yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
  2. 2 2
      yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java
  3. 11 3
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java
  4. 7 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponMapper.java
  5. 3 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java
  6. 7 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java
  7. 34 1
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
  8. 8 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateService.java
  9. 5 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java
  10. 11 0
      yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml
  11. 1 0
      yudao-server/src/main/resources/application-local.yaml
  12. 3 3
      yudao-ui-admin/src/views/mall/promotion/coupon/index.vue
  13. 3 0
      yudao-ui-admin/src/views/mall/promotion/couponTemplate/index.vue

+ 1 - 0
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java

@@ -25,5 +25,6 @@ public interface ErrorCodeConstants {
 
     // ========== 优惠劵模板 1003005000 ==========
     ErrorCode COUPON_NOT_EXISTS = new ErrorCode(1003005000, "优惠劵不存在");
+    ErrorCode COUPON_DELETE_FAIL_USED = new ErrorCode(1003005001, "回收优惠劵失败,优惠劵已被使用");
 
 }

+ 2 - 2
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/coupon/CouponStatusEnum.java

@@ -20,12 +20,12 @@ public enum CouponStatusEnum implements IntArrayValuable {
     EXPIRE(3, "已过期"),
     ;
 
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getValue).toArray();
+    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CouponStatusEnum::getStatus).toArray();
 
     /**
      * 值
      */
-    private final Integer value;
+    private final Integer status;
     /**
      * 名字
      */

+ 11 - 3
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/CouponController.java

@@ -12,12 +12,11 @@ import cn.iocoder.yudao.module.promotion.convert.coupon.CouponConvert;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -47,6 +46,15 @@ public class CouponController {
 //        return success(CouponConvert.INSTANCE.convert(coupon));
 //    }
 
+    @DeleteMapping("/delete")
+    @ApiOperation("回收优惠劵")
+    @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
+    @PreAuthorize("@ss.hasPermission('promotion:coupon:delete')")
+    public CommonResult<Boolean> deleteCoupon(@RequestParam("id") Long id) {
+        couponService.deleteCoupon(id);
+        return success(true);
+    }
+
     @GetMapping("/page")
     @ApiOperation("获得优惠劵分页")
     @PreAuthorize("@ss.hasPermission('promotion:coupon:query')")

+ 7 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponMapper.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Collection;
@@ -26,4 +27,10 @@ public interface CouponMapper extends BaseMapperX<CouponDO> {
                 .orderByDesc(CouponDO::getId));
     }
 
+    default int delete(Long id, Collection<Integer> whereStatuses) {
+        return update(null, new LambdaUpdateWrapper<CouponDO>()
+                .eq(CouponDO::getId, id).in(CouponDO::getStatus, whereStatuses)
+                .set(CouponDO::getDeleted, 1));
+    }
+
 }

+ 3 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 优惠劵模板 Mapper
@@ -24,4 +25,6 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> {
                 .orderByDesc(CouponTemplateDO::getId));
     }
 
+    void updateTakeCount(@Param("id") Long id, @Param("incrCount") Integer incrCount);
+
 }

+ 7 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java

@@ -31,4 +31,11 @@ public interface CouponService {
      */
     PageResult<CouponDO> getCouponPage(CouponPageReqVO pageReqVO);
 
+    /**
+     * 回收优惠劵
+     *
+     * @param id 优惠劵编号
+     */
+    void deleteCoupon(Long id);
+
 }

+ 34 - 1
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java

@@ -9,12 +9,19 @@ import cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO;
 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 import cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponMapper;
+import cn.iocoder.yudao.module.promotion.enums.coupon.CouponStatusEnum;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.Set;
 
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_DELETE_FAIL_USED;
+import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_NOT_EXISTS;
+import static java.util.Arrays.asList;
+
 /**
  * 优惠劵 Service 实现类
  *
@@ -25,10 +32,14 @@ import java.util.Set;
 public class CouponServiceImpl implements CouponService {
 
     @Resource
-    private MemberUserApi memberUserApi;
+    private CouponTemplateService couponTemplateService;
+
     @Resource
     private CouponMapper couponMapper;
 
+    @Resource
+    private MemberUserApi memberUserApi;
+
     // TODO 芋艿:待实现
     @Override
     public CouponDO validCoupon(Long id, Long userId) {
@@ -50,4 +61,26 @@ public class CouponServiceImpl implements CouponService {
         return couponMapper.selectPage(pageReqVO, userIds);
     }
 
+    @Override
+    @Transactional
+    public void deleteCoupon(Long id) {
+        // 校验存在
+        validateCouponExists(id);
+
+        // 更新优惠劵
+        int deleteCount = couponMapper.delete(id,
+                asList(CouponStatusEnum.UNUSED.getStatus(), CouponStatusEnum.EXPIRE.getStatus()));
+        if (deleteCount == 0) {
+            throw exception(COUPON_DELETE_FAIL_USED);
+        }
+        // 减少优惠劵模板的领取数量 -1
+        couponTemplateService.updateCouponTemplateTakeCount(id, -1);
+    }
+
+    private void validateCouponExists(Long id) {
+        if (couponMapper.selectById(id) == null) {
+            throw exception(COUPON_NOT_EXISTS);
+        }
+    }
+
 }

+ 8 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateService.java

@@ -61,4 +61,12 @@ public interface CouponTemplateService {
      */
     PageResult<CouponTemplateDO> getCouponTemplatePage(CouponTemplatePageReqVO pageReqVO);
 
+    /**
+     * 更新优惠劵模板的领取数量
+     *
+     * @param id 优惠劵模板编号
+     * @param incrCount 增加数量
+     */
+    void updateCouponTemplateTakeCount(Long id, int incrCount);
+
 }

+ 5 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java

@@ -86,4 +86,9 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
         return couponTemplateMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public void updateCouponTemplateTakeCount(Long id, int incrCount) {
+        couponTemplateMapper.updateTakeCount(id, incrCount);
+    }
+
 }

+ 11 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/coupon/CouponTemplateMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper">
+
+    <update id="updateTakeCount">
+        UPDATE promotion_coupon_template
+        SET take_count = take_count + #{incrCount}
+        WHERE id = #{id}
+    </update>
+
+</mapper>

+ 1 - 0
yudao-server/src/main/resources/application-local.yaml

@@ -174,6 +174,7 @@ logging:
     cn.iocoder.yudao.module.tool.dal.mysql: debug
     cn.iocoder.yudao.module.member.dal.mysql: debug
     cn.iocoder.yudao.module.trade.dal.mysql: debug
+    cn.iocoder.yudao.module.promotion.dal.mysql: debug
 
 --- #################### 微信公众号、小程序相关配置 ####################
 wx:

+ 3 - 3
yudao-ui-admin/src/views/mall/promotion/coupon/index.vue

@@ -57,7 +57,7 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
-                     v-hasPermi="['promotion:coupon:delete']">删除</el-button>
+                     v-hasPermi="['promotion:coupon:delete']">回收</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -145,11 +145,11 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const id = row.id;
-      this.$modal.confirm('是否确认删除优惠劵编号为"' + id + '"的数据项?').then(function() {
+      this.$modal.confirm('回收将会收回会员领取的待使用的优惠券,已使用的将无法回收,确定要回收所选优惠券吗?').then(function() {
           return deleteCoupon(id);
         }).then(() => {
           this.getList();
-          this.$modal.msgSuccess("删除成功");
+          this.$modal.msgSuccess("回收成功");
         }).catch(() => {});
     },
     /** tab 切换 */

+ 3 - 0
yudao-ui-admin/src/views/mall/promotion/couponTemplate/index.vue

@@ -33,6 +33,9 @@
       <el-col :span="1.5">
         <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
                    v-hasPermi="['promotion:coupon-template:create']">新增</el-button>
+        <el-button type="info" plain icon="el-icon-s-operation" size="mini"
+                   @click="() => this.$router.push('/promotion/coupon')"
+                   v-hasPermi="['promotion:coupon:query']">会员优惠劵</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>