فهرست منبع

调整优惠券更新规则

Eric 2 سال پیش
والد
کامیت
0ffd57ee9f

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInfoQuery.java

@@ -53,6 +53,9 @@ public class CouponInfoQuery implements Serializable {
 
         // 使用状态
         private CouponUseStateEnum useState;
+
+        // 状态排除
+        private List<CouponUseStateEnum> excludeUseState;
     }
 
     /**

+ 65 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponValidTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInventoryMapper;
 import com.yonge.cooleshow.biz.dal.mapper.CouponIssueMapper;
@@ -25,6 +26,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.ThreadPool;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
@@ -35,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -99,13 +102,39 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
                     return x.getRealName();
                 }, (o, n) -> n));
 
+        List<Long> updateIds = Lists.newArrayList();
         for (CouponInfoWrapper item : wrappers) {
 
+            if (CouponValidTypeEnum.TIME_PERIOD == item.getValidType()
+                    && Optional.ofNullable(item.getEndTime()).orElse(0L) > 0
+                    && DateTime.now().getMillis() > item.getEndTime()) {
+
+                updateIds.add(item.getId());
+                // 更新显示状态为禁用
+                item.setStatus(EStatus.DISABLE.getValue());
+            }
+
             item.rewardNum(rewardNumMap.getOrDefault(item.getId(), 0))
                     .updatedUser(userNameMap.getOrDefault(item.getUpdatedBy(), ""))
                     .setIssueNum(issueNumMap.getOrDefault(item.getId(), 0));
         }
 
+        // 增加优惠券时间过期处理流程
+        if (CollectionUtils.isNotEmpty(updateIds)) {
+
+            ThreadPool.getExecutor().submit(() -> {
+
+                CouponInfoWrapper wrapper = CouponInfoWrapper.builder()
+                        .status(EStatus.DISABLE.getValue())
+                        .build();
+
+                getBaseMapper().update(JSON.parseObject(wrapper.jsonString(), CouponInfo.class),
+                        Wrappers.<CouponInfo>lambdaQuery().in(CouponInfo::getId, updateIds));
+
+            });
+
+        }
+
         return page.setRecords(wrappers);
     }
 
@@ -162,6 +191,42 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
                 throw new BizException("无效的优惠券ID");
             }
 
+            // 优惠券已过期
+            if (CouponValidTypeEnum.TIME_PERIOD == info.getValidType()
+                    && Optional.ofNullable(info.getEndTime()).orElse(0L) > 0
+                    && DateTime.now().getMillis() > info.getEndTime()) {
+
+                throw new BizException("已过期优惠券不允许修改");
+            }
+
+            // 优惠券未过期,已发放不允许修复
+            List<Long> couponIds = Lists.newArrayList(couponInfo.getId());
+
+            int ret = 0;
+            // 查询优惠券发放人数
+            ret += getBaseMapper().selectCouponIssueStatInfo(couponIds,
+                            CouponInfoQuery.IssueStatQuery.builder()
+                                    .excludeUseState(Lists.newArrayList(CouponUseStateEnum.WITHDRAW)).build()).stream()
+                    .mapToInt(StatGroupWrapper::getTotal).sum();
+            if (ret > 0) {
+                throw new BizException("已发放优惠券不允许修改");
+            }
+
+            // 关联奖品数
+            ret += getBaseMapper().selectActivityCouponStatInfo(couponIds).stream()
+                    .mapToInt(StatGroupWrapper::getTotal).sum();
+
+            if (ret > 0) {
+                throw new BizException("已关联奖品优惠券不允许修改");
+            }
+
+            // 启用状态不允许修改
+            if (Objects.isNull(couponInfo.getStatus())
+                    && EStatus.ENABLE.match(info.getStatus())) {
+
+                throw new BizException("已启用优惠券不允许修改");
+            }
+
             // 更新优惠券
             updateById(couponInfo);
         }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/coupon/CouponInfoWrapper.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo.coupon;
 
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponValidTypeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -32,6 +33,9 @@ public class CouponInfoWrapper implements Serializable {
     private Long createdBy;
     private Date createdTime;
 
+    private CouponValidTypeEnum validType;
+    private Long endTime;
+
     // 发放领取数
     private Integer issueNum;
     // 关联奖品数

+ 4 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInfoMapper.xml

@@ -32,7 +32,7 @@
 
     <!--优惠券分页查询-->
     <select id="selectCouponPageInfo" resultType="com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper">
-        SELECT t1.id_, t1.name_, t1.client_type_, t1.category_, t1.coupon_type_, t1.inventory_, t1.status_, t1.updated_by_, t1.update_time_, t1.created_time_ FROM coupon_info t1
+        SELECT t1.id_, t1.name_, t1.client_type_, t1.category_, t1.coupon_type_, t1.inventory_, t1.status_, t1.updated_by_, t1.update_time_, t1.created_time_, t1.valid_type_, t1.end_time_ FROM coupon_info t1
         <where>
             <if test="record.name != null">
                 AND t1.name_ LIKE '%${record.name}%'
@@ -63,6 +63,9 @@
             <if test="record.timestamp != null">
                 AND (t1.start_time_ &lt;= #{record.timestamp} AND #{record.timestamp} &lt;= t1.end_time_)
             </if>
+            <if test="">
+                AND t1.use_state_ NOT IN (<foreach collection="record.excludeUseState" separator="," item="item">#{item}</foreach>)
+            </if>
         </where>
         GROUP BY t1.coupon_id_
     </select>

+ 52 - 0
toolset/toolset-base/src/main/java/com/yonge/toolset/base/util/ThreadPool.java

@@ -0,0 +1,52 @@
+package com.yonge.toolset.base.util;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Eric.Shang on 23/11/16.
+ */
+public final class ThreadPool {
+    private static ExecutorService executor;
+
+    private ThreadPool(){}
+
+    /**
+     * 线程对象
+     * @return ExecutorService
+     */
+    public static ExecutorService getExecutor() {
+        if (executor == null) {
+            synchronized (ThreadPool.class) {
+                if (executor == null) {
+                    executor = Executors.newFixedThreadPool(100);
+                }
+            }
+        }
+        return executor;
+    }
+
+    /**
+     * 终断超时任务
+     * @param executor ExecutorService
+     * @param future Future
+     * @param timeout 超时时间
+     * @param unit 超时单位
+     */
+    public static Object shutdownTimeoutSubmit(ExecutorService executor, Future<?> future,
+                                             Integer timeout, TimeUnit unit) {
+        Object o = null;
+        // 设置超时时间
+        try {
+            o = future.get(timeout, unit);
+        } catch (Exception e) {
+            future.cancel(true);
+        } finally {
+            executor.shutdown();
+        }
+        return o;
+    }
+
+}