Parcourir la source

Merge branch 'dev_v1.3.4_20220902' of http://git.dayaedu.com/yonge/cooleshow into dev_v1.3.4_20220902

liujunchi il y a 3 ans
Parent
commit
8746b7b8aa

+ 0 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponInfoController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponInfoVO;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponInventoryVO;
-import com.yonge.cooleshow.admin.io.request.coupon.CouponOrderVO;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
@@ -15,7 +14,6 @@ import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
-import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.EStatus;

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

@@ -57,6 +57,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);
         }

+ 40 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -9,12 +9,38 @@ import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.biz.dal.enums.AccountBizTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
+import com.yonge.cooleshow.biz.dal.service.ActivityRegistrationService;
+import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
+import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.PianoRoomBuyRecordService;
+import com.yonge.cooleshow.biz.dal.service.PlatformCashAccountRecordService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.UserAccountService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderDetailService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
+import com.yonge.cooleshow.biz.dal.service.VideoLessonPurchaseRecordService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
@@ -38,11 +64,10 @@ import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.payment.util.DistributedLock;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.joda.time.DateTime;
 import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -52,15 +77,20 @@ import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> implements UserOrderService {
-    private final static Logger log = LoggerFactory.getLogger(UserOrderServiceImpl.class);
 
     @Autowired
     private MemberPriceSettingsService memberPriceSettingsService;
@@ -344,6 +374,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                             .build()
                             .issueIds(orderReq.getCouponId()));
 
+            log.debug("executeOrder couponId={}, wrapper={}", orderReq.getCouponId(), couponOrderWrapper.jsonString());
+
             // 优惠券优惠金额,暂时为0
             couponAmount =couponAmount.add(BigDecimal.valueOf(couponOrderWrapper.getDiscountedPrices()));
 

+ 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="record.excludeUseState != null">
+                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;
+    }
+
+}