瀏覽代碼

增加优惠券相关功能

hgw 3 年之前
父節點
當前提交
0eab3ec609

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponDao.java

@@ -4,8 +4,12 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysCoupon;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Map;
+
 public interface SysCouponDao extends BaseDAO<Integer, SysCoupon> {
 
     SysCoupon lockCoupon(@Param("id") Integer id);
+
+    int updateExchange(@Param("param") Map<String, Object> param);
 	
 }

+ 5 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponIssueRecordDao.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.entity.SysCouponIssueRecord;
 import org.apache.ibatis.annotations.Param;
 
@@ -23,7 +24,7 @@ public interface SysCouponIssueRecordDao extends BaseMapper<SysCouponIssueRecord
 
     <T> IPage<T> queryIssueRecord(Page<T> page, @Param("param") Map<String, Object> param);
 
-    int queryCouponCode(@Param("issueId") Integer issueId,@Param("state") Integer state);
+    int queryCouponCode(@Param("issueId") Integer issueId, @Param("state") Integer state);
 
     /**
      * 撤回未使用的优惠券
@@ -31,10 +32,11 @@ public interface SysCouponIssueRecordDao extends BaseMapper<SysCouponIssueRecord
     void revoke(Integer issueId);
 
     /**
-     * @param id sys_coupon表的id
+     * @param id         sys_coupon表的id
      * @param consumeNum 消费数量
      */
-    void opsConsume(@Param("id") Integer id,@Param("consumeNum") Integer consumeNum);
+    void opsConsume(@Param("id") Integer id, @Param("consumeNum") Integer consumeNum);
 
+    List<SysCoupon> queryUserCanGetCoupon(@Param("userId") Integer userId);
 }
 

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponIssueRecordService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.entity.SysCouponIssueRecord;
 import com.ym.mec.biz.dal.vo.CouponIssueRecordVo;
 import com.ym.mec.common.page.PageInfo;
@@ -22,10 +23,12 @@ public interface SysCouponIssueRecordService extends IService<SysCouponIssueReco
 
     void manualIssueCoupon(Integer userId, Integer couponId);
 
-    int checkRevoke(Integer couponId);
+    int checkRevoke(Integer issueId);
 
     PageInfo<?> queryIssueDetail(Map<String, Object> param);
 
     PageInfo<CouponIssueRecordVo> queryIssueRecord(Map<String, Object> param);
+
+    List<SysCoupon> queryCanBeGetCoupon(Integer userId);
 }
 

+ 10 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -31,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 
 @Service
 public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode> implements SysCouponCodeService {
@@ -160,12 +159,19 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
             couponCodes.add(couponCode);
         }
         sysCouponCodeDao.batchInsert(couponCodes);
-        sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).addAndGet(exchangeNum));
+
+        Map<String, Object> updateParam = new HashMap<>();
+        updateParam.put("exchangeNum", exchangeNum);
+        updateParam.put("id", sysCoupon.getId());
+        updateParam.put("tenantId", tenantId);
         if (sysCoupon.getWarningStatus() == 0 && sysCoupon.getStockCount() != -1 && sysCoupon.getStockCount() - sysCoupon.getConsumeNum() < sysCoupon.getWarningStockNum()) {
             sysCouponService.stockWarning(sysCoupon.getId(), sysCoupon.getName());
-            sysCoupon.setWarningStatus(1);
+            updateParam.put("warningStatus", 1);
+        }
+        //扣减库存操作
+        if (sysCouponDao.updateExchange(updateParam) != 1) {
+            throw new BizException("优惠券库存不足!");
         }
-        sysCouponDao.update(sysCoupon);
     }
 
     @Override

+ 12 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponIssueRecordServiceImpl.java

@@ -16,7 +16,6 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
-import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,8 +44,6 @@ public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueR
     private SysCouponService sysCouponService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private RedissonClient redissonClient;
 
     /**
      * 手动发优惠券
@@ -109,7 +106,7 @@ public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueR
                 .map(this::getById)
                 .orElseThrow(() -> new BizException("未查询到该发放记录!"));
 
-        //修改未使用的优惠券为撤回状态
+        //修改优惠券与用户关系表中未使用的优惠券为撤回状态
         baseMapper.revoke(issueId);
         //查询券的信息
         SysCoupon sysCoupon = Optional.ofNullable(issueRecord.getCouponId())
@@ -118,7 +115,7 @@ public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueR
 
         //查询未使用的优惠券有多少
         int useCount = baseMapper.queryCouponCode(issueId, 0);
-        if (useCount >= 0) {
+        if (useCount > 0) {
             //返还库存
             baseMapper.opsConsume(sysCoupon.getId(), useCount);
         }
@@ -148,6 +145,16 @@ public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueR
     }
 
     /**
+     * 查询可以领取的优惠券
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public List<SysCoupon> queryCanBeGetCoupon(Integer userId) {
+        return baseMapper.queryUserCanGetCoupon(userId);
+    }
+
+    /**
      * 查询发放名单
      */
     @Override

+ 65 - 1
mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml

@@ -95,8 +95,72 @@
 
     <update id="opsConsume" parameterType="object">
         UPDATE sys_coupon
-        SET consume_num_ = consume_num_ - #{consumeNum}
+        SET
+            consume_num_ = consume_num_ - #{consumeNum},
+            stock_count_ = stock_count_ + #{consumeNum}
         WHERE id_ = #{id}
     </update>
 
+    <resultMap type="com.ym.mec.biz.dal.entity.SysCoupon" id="SysCoupon">
+        <result column="id_" property="id" />
+        <result column="name_" property="name" />
+        <result column="description_" property="description" />
+        <result column="status_" property="status" />
+        <result column="issuance_type_" jdbcType="INTEGER" property="issuanceType"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="type_detail_" jdbcType="VARCHAR" property="typeDetail"/>
+        <result column="face_value_" property="faceValue" />
+        <result column="full_amount_" property="fullAmount" />
+        <result column="limit_exchange_num_" property="limitExchangeNum" />
+        <result column="effective_type_" property="effectiveType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="deadline_" property="deadline" />
+        <result column="effective_start_time_" property="effectiveStartTime" />
+        <result column="effective_expire_time_" property="effectiveExpireTime" />
+        <result column="end_date_" property="endDate" />
+        <result column="start_date_" property="startDate" />
+        <result column="stock_count_" property="stockCount" />
+        <result column="consume_num_" property="consumeNum" />
+        <result column="warning_stock_num_" property="warningStockNum" />
+        <result column="warning_status_" property="warningStatus" />
+        <result column="create_time_" property="createTime" />
+        <result column="update_time_" property="updateTime" />
+        <result column="tenant_id_" property="tenantId"/>
+    </resultMap>
+
+    <select id="queryUserCanGetCoupon" resultMap="SysCoupon">
+        select id_,
+               name_,
+               description_,
+               status_,
+               issuance_type_,
+               type_,
+               type_detail_,
+               face_value_,
+               full_amount_,
+               limit_exchange_num_,
+               effective_type_,
+               deadline_,
+               effective_start_time_,
+               effective_expire_time_,
+               end_date_,
+               start_date_,
+               stock_count_,
+               consume_num_,
+               warning_stock_num_,
+               warning_status_,
+               create_time_,
+               update_time_,
+               tenant_id_
+        from sys_coupon
+        where issuance_type_ = 0
+          and status_ = 1
+          and (effective_expire_time_ > now() or deadline_ > 0)
+          and (stock_count_ >= consume_num_ or stock_count_ = -1)
+          and id_ not in (
+            select distinct coupon_id_
+            from sys_coupon_code
+            where user_id_ = #{userId}
+        )
+    </select>
+
 </mapper>

+ 16 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -107,6 +107,22 @@
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
 
+    <!-- 修改库存 -->
+    <update id="updateExchange" parameterType="map">
+        UPDATE sys_coupon
+        <set>
+            stock_count_ = stock_count_ - #{param.exchangeNum},
+            consume_num_ =consume_num_ + #{param.exchangeNum},
+            <if test="warningStatus != null">
+                warning_status_ = #{param.warningStatus},
+            </if>
+            update_time_ = NOW()
+        </set>
+        WHERE id_ = #{param.id}
+        and tenant_id_ = #{param.tenantId}
+        and stock_count_ >= #{param.exchangeNum}
+    </update>
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM sys_coupon WHERE id_ = #{id}

+ 20 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java

@@ -74,6 +74,26 @@ public class WrapperUtil<T> {
         return this.hasIn(column, WrapperUtil.toList(val));
     }
 
+    public static <S, O> Integer toInt(Map<S, O> map, S str, String exMsg) {
+        Optional<O> o = Optional.ofNullable(map)
+                .map(m -> m.get(str));
+        return intOptional(o)
+                .orElseThrow(() -> new BizException(exMsg));
+    }
+
+    public static <S, O> Integer toInt(Map<S, O> map, S str) {
+        Optional<O> o = Optional.ofNullable(map)
+                .map(m -> m.get(str));
+        return intOptional(o)
+                .orElse(null);
+    }
+
+    public static <O> Optional<Integer> intOptional(Optional<O> optional) {
+        return optional
+                .map(String::valueOf)
+                .map(Integer::valueOf);
+    }
+
     public static <S, O> String toStr(Map<S, O> map, S str) {
         Optional<O> o = Optional.ofNullable(map)
                 .map(m -> m.get(str));

+ 47 - 8
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponIssueRecordController.java

@@ -4,11 +4,9 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.service.SysCouponIssueRecordService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.WrapperUtil;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-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 java.util.Map;
@@ -38,19 +36,54 @@ public class SysCouponIssueRecordController extends BaseController {
         return succeed();
     }
 
+    /**
+     * 检查撤销的优惠券
+     *
+     * @param param issueId发放记录id
+     */
     @ApiOperation("检查撤销的优惠券")
     @PostMapping(value = "/checkRevoke")
-    public HttpResponseResult checkRevoke(Integer id) {
-        return succeed(couponIssueRecordService.checkRevoke(id));
+    public HttpResponseResult checkRevoke(@RequestBody Map<String, Object> param) {
+        Integer issueId = WrapperUtil.toInt(param, "issueId", "传入参数错误!");
+        return succeed(couponIssueRecordService.checkRevoke(issueId));
     }
 
+    /**
+     * 撤销发放优惠券
+     *
+     * @param param issueId发放记录id
+     */
     @ApiOperation("撤销发放优惠券")
     @PostMapping(value = "/revokeCoupon")
-    public HttpResponseResult revokeCoupon(Integer id) {
-        couponIssueRecordService.revokeCoupon(id);
+    public HttpResponseResult revokeCoupon(@RequestBody Map<String, Object> param) {
+        Integer issueId = WrapperUtil.toInt(param, "issueId", "传入参数错误!");
+        couponIssueRecordService.revokeCoupon(issueId);
+        return succeed();
+    }
+
+    /**
+     * 手动领取优惠券
+     *
+     * @param param userId 领取者id
+     * @param param couponId 优惠券id
+     */
+    @ApiOperation("手动领取优惠券")
+    @PostMapping(value = "/manualIssueCoupon")
+    public HttpResponseResult manualIssueCoupon(@RequestBody Map<String, Object> param) {
+        Integer userId = WrapperUtil.toInt(param, "userId", "传入参数错误!");
+        Integer couponId = WrapperUtil.toInt(param, "couponId", "传入参数错误!");
+        couponIssueRecordService.manualIssueCoupon(userId, couponId);
         return succeed();
     }
 
+    /**
+     * 查询优惠券发放名单
+     *
+     * @param param issueId 发放记录id
+     * @param param organId 分部id
+     * @param param subjectId 声部id
+     * @param param usageStatus 状态
+     */
     @ApiOperation("查询优惠券发放名单")
     @PostMapping(value = "/queryIssueDetail")
     public HttpResponseResult queryIssueDetail(@RequestBody Map<String, Object> param) {
@@ -63,5 +96,11 @@ public class SysCouponIssueRecordController extends BaseController {
         return succeed(couponIssueRecordService.queryIssueRecord(param));
     }
 
+    @ApiOperation("查询优惠券发放记录")
+    @GetMapping(value = "/queryCanBeGet")
+    public HttpResponseResult queryCanBeGetCoupon(Integer userId) {
+        return succeed(couponIssueRecordService.queryCanBeGetCoupon(userId));
+    }
+
 }