浏览代码

课程锁定时长

刘俊驰 8 月之前
父节点
当前提交
a6aab88ddd

+ 2 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java

@@ -19,6 +19,7 @@ import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
 
@@ -69,7 +70,7 @@ public class StudentCourseGroupController extends BaseController {
 
     @ApiOperation("创建直播课程组-锁定课程时间-将课时写到缓存当作锁定的时间")
     @PostMapping("/lockCourseToCache")
-    public HttpResponseResult<List<CourseTimeEntity>> lockCourseToCache(@RequestBody CheckCourseTimeDto dto) {
+    public HttpResponseResult<List<CourseTimeEntity>> lockCourseToCache(@RequestBody @Valid CheckCourseTimeDto dto) {
         return succeed(courseGroupService.lockCourseToCache(dto));
     }
 

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java

@@ -44,4 +44,6 @@ public interface UserOrderDetailDao extends BaseMapper<UserOrderDetail>{
     List<UserOrderDetailVo> getOrderDetilListByOrderNo(@Param("orderNo")String orderNo);
 
     List<UserOrderDetailVo> getOrderDetilListByOrderNos(@Param("orderNos") List<String> orderNos);
+
+	int getActivityGoodsCount(@Param("userId") Long userId, @Param("client") String client, @Param("activityId") Long activityId);
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CheckCourseTimeDto.java

@@ -32,10 +32,23 @@ public class CheckCourseTimeDto implements Serializable {
     @ApiModelProperty(value = "课程数")
     private Integer courseNum;
 
+
+    @NotNull(message = "课程休息时长不能为空")
+    @ApiModelProperty(value = "课程休息时长")
+    private Integer courseFreeMinutes;
+
     @NotNull(message = "课程时间不能为空")
     @ApiModelProperty(value = "课程时间接收类")
     private List<CourseTimeEntity> timeList;
 
+    public Integer getCourseFreeMinutes() {
+        return courseFreeMinutes;
+    }
+
+    public void setCourseFreeMinutes(Integer courseFreeMinutes) {
+        this.courseFreeMinutes = courseFreeMinutes;
+    }
+
     public Long getTeacherId() {
         return teacherId;
     }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -104,4 +104,9 @@ public class UserOrderDetail implements Serializable {
     @TableField(value = "biz_json_")
     private String bizJson;
 
+
+    @ApiModelProperty("是否赠送商品")
+    @TableField(value = "gift_flag_")
+    private Boolean giftFlag;
+
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java

@@ -40,7 +40,7 @@ public enum CourseScheduleEnum implements BaseEnum<String, CourseScheduleEnum> {
      * @param errMsg 错误异常
      */
     public static CourseScheduleEnum existCourseType(String code, String errMsg) {
-        CourseScheduleEnum[] values = {PRACTICE, LIVE, PIANO_ROOM_CLASS};
+        CourseScheduleEnum[] values = {PRACTICE, LIVE, PIANO_ROOM_CLASS,VIP};
         existCourse(values, code, errMsg);
         //返回枚举对象
         return CourseScheduleEnum.valueOf(code);

+ 7 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -566,8 +566,12 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      */
     @Override
     public List<CourseTimeEntity> lockCourseToCache(CheckCourseTimeDto dto) {
+
+        for (CourseTimeEntity coursePlanDto : dto.getTimeList()) {
+            coursePlanDto.setFreeEndTime(DateUtil.offsetMinute(coursePlanDto.getStartTime(), dto.getCourseFreeMinutes()));
+        }
         // true:趣纠课PRACTICE     false:LIVE直播课
-        boolean courseTypeFlag = CourseScheduleEnum.existCourseType(dto.getCourseType(), "课程类型不正确!").equals(CourseScheduleEnum.PRACTICE);
+        boolean courseTypeFlag = Lists.newArrayList(CourseScheduleEnum.PRACTICE,CourseScheduleEnum.VIP).contains(CourseScheduleEnum.existCourseType(dto.getCourseType(), "课程类型不正确!"));
         //先自校验传入时间是否交集
         List<CourseTimeEntity> timeList = dto.getTimeList();
         if (CollectionUtils.isEmpty(timeList)) {
@@ -580,14 +584,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 }
                 CourseTimeEntity o = timeList.get(i);
                 List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
-                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
+                boolean checkParamTime = courseScheduleService.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime, o.getStartTime(), o.getEndTime());
                 if (checkParamTime) {
                     throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
                 }
             }
         }
         //批量检查老师课时在数据库是否重复
-        batchCheckTeacherCourseTime(dto.getTeacherId(), timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        batchCheckTeacherCourseTime(dto.getTeacherId(), timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime);
 
         //需要自动补全课时
         if (dto.getLoop() == 1) {

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

@@ -535,6 +535,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
                 // 检查时间段是否满足课程时间,不满足则删除,满足 并且可多段的情况下,将时间段拆分
                 courseTime = splitTime(courseTime,courseMinutes,freeMinutes);
+                courseTime.sort(Comparator.comparing(CourseTimeEntity::getStartTime));
                 calendarEntity.setCourseTime(courseTime);
 
                 //如果日历时间集合数据删没了,那么就证明当天课程已经满了  0:未满 1满

+ 11 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -222,12 +222,16 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         // 判断转换天数
 
-        VipCardRecordWrapper.UserVip userVip = vipCardRecordService.userVipInfo(orderDetailVo.getUserId(), orderDetailVo.getOrderClient());
-        int svipDays = getSvipDays(detail, orderDetailVo.getGoodNum(), userVip);
-        if (detail.getVipType() == EVipType.SVIP &&userVip.getVipEndDays() !=null && svipDays >=userVip.getVipEndDays()) {
-            addVipCardRecord.setVipDays(userVip.getVipEndDays());
-            if (userVip.getVipType() == EVipType.VIP) {
-                addVipCardRecord.setVipDays(Math.max(userVip.getVipEndDays()-1,0));
+        // 赠送商品,不可转换
+        boolean giftFlag = orderDetailVo.getGiftFlag() != null && orderDetailVo.getGiftFlag();
+        if (!giftFlag) {
+            VipCardRecordWrapper.UserVip userVip = vipCardRecordService.userVipInfo(orderDetailVo.getUserId(), orderDetailVo.getOrderClient());
+            int svipDays = getSvipDays(detail, orderDetailVo.getGoodNum(), userVip);
+            if (detail.getVipType() == EVipType.SVIP && userVip.getVipEndDays() != null && svipDays >= userVip.getVipEndDays()) {
+                addVipCardRecord.setVipDays(userVip.getVipEndDays());
+                if (userVip.getVipType() == EVipType.VIP) {
+                    addVipCardRecord.setVipDays(Math.max(userVip.getVipEndDays() - 1, 0));
+                }
             }
         }
 
@@ -235,7 +239,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         vipCardRecordService.add(addVipCardRecord);
 
         //会员购买消息推送
-        if (messageFlag) {
+        if (messageFlag && !giftFlag) {
 
             SysUser sysUser = sysUserFeignService.queryUserById(orderDetailVo.getUserId());
             if (sysUser == null) {

+ 24 - 17
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java

@@ -14,6 +14,7 @@ import com.microsvc.toolkit.middleware.payment.common.api.entity.*;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.DivideBackStatus;
 import com.microsvc.toolkit.middleware.payment.common.api.enums.PaymentStatus;
 import com.microsvc.toolkit.middleware.payment.enums.EPaymentVendor;
+import com.yonge.cooleshow.biz.dal.dao.UserOrderDetailDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
@@ -139,6 +140,8 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     @Autowired
     private UserOrderRefundBillService userOrderRefundBillService;
 
+    @Autowired
+    private UserOrderDetailDao userOrderDetailDao;
 
     @Autowired
     private TenantMemberService tenantMemberService;
@@ -567,6 +570,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
                 // 填充商品基础信息,校验参数合法以性
                 orderGoodsCreate.get(item.getGoodType()).accept(item);
                 UserOrderDetail userOrderDetail = item.getUserOrderDetail();
+                userOrderDetail.setGiftFlag(item.getGiftFlag());
                 orderDetails.add(userOrderDetail);
             }
 
@@ -868,11 +872,20 @@ DISCOUNT("畅学卡")
     private void checkActivity(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
         ActivityPlanVo activityPlan = activityPlanService.detail(orderReq.getActivityId());
         Date now = new Date();
-        if (activityPlan != null && activityPlan.getActivityState() == 1
-                && activityPlan.getActivityStart().before(now) && activityPlan.getActivityEnd().after(now)) {
+        if (activityPlan != null && activityPlan.getActivityState() == 1) {
+            if (activityPlan.getActivityStart().after(now)) {
+                throw new BizException("活动未开始");
+            } else if (activityPlan.getActivityEnd().before(now)) {
+                throw new BizException("活动已结束");
+            }
             if (ActivityTypeEnum.MEMBER == activityPlan.getActivityType()) {
 
-                checkActivityTimes(orderReq.getUserId(),orderReq.getPaymentClient(), activityPlan.getId());
+                List<UserPaymentOrderWrapper.OrderGoodsInfo> collect = orderReq.getGoodsInfos().stream().filter(o -> !o.getGiftFlag()).collect(Collectors.toList());
+                if (collect.size() != 1) {
+                    throw new BizException("活动商品不符合要求");
+                }
+
+                checkActivityTimes(orderReq.getUserId(),orderReq.getPaymentClient(), activityPlan.getId(),collect.get(0).getGoodNum());
 
                 // 会员买赠活动 判断购买商品是否符合活动要求
                 Map<String, List<Long>> map = orderReq.getGoodsInfos().stream()
@@ -917,23 +930,23 @@ DISCOUNT("畅学卡")
     /**
      * 检查活动购买次数
      *
-     * @param userId 用户ID
-     * @param client 客户端
+     * @param userId     用户ID
+     * @param client     客户端
      * @param activityId 活动ID
+     * @param goodNum
      */
-    private void checkActivityTimes(Long userId,ClientEnum client, Long activityId) {
+    private void checkActivityTimes(Long userId, ClientEnum client, Long activityId, Integer goodNum) {
         ActivityPlan activityPlan = activityPlanService.getById(activityId);
         if (activityPlan == null) {
             throw new BizException("活动不存在");
         }
 
         //  检查购买次数是否符合要求 待支付,支付中,支付完成的订单小于次数才可以继续购买
-        if (activityPlan.getBuyCount() !=null && activityPlan.getBuyCount() !=-1) {
+        if (activityPlan.getBuyCount() !=null && activityPlan.getBuyCount() >0) {
             int count = getActivityCount(userId, client, activityId);
-            if (count >= activityPlan.getBuyCount()) {
-                throw new BizException("活动以达到参与最大次数");
+            if (count + goodNum > activityPlan.getBuyCount()) {
+                throw new BizException("超出活动最大参与次数");
             }
-
         }
 
     }
@@ -948,13 +961,7 @@ DISCOUNT("畅学卡")
      */
     @Override
     public int getActivityCount(Long userId, ClientEnum client, Long activityId) {
-        return userOrderService.lambdaQuery()
-                    .eq(UserOrder::getActivityId, activityId)
-                    .eq(UserOrder::getUserId, userId)
-                    .eq(UserOrder::getOrderClient, client)
-                    .in(UserOrder::getStatus, OrderStatusEnum.WAIT_PAY.getCode(),
-                            OrderStatusEnum.PAYING.getCode(), OrderStatusEnum.PAID.getCode())
-                    .count();
+        return userOrderDetailDao.getActivityGoodsCount(userId, client.getCode(), activityId);
     }
 
     /**

+ 12 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -49,6 +49,7 @@
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         , t.biz_json_ as bizJson
+        , t.gift_flag_ as giftFlag
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
@@ -137,4 +138,15 @@
             </if>
         </where>
     </select>
+
+	<select id="getActivityGoodsCount" resultType="int">
+        SELECT sum(t.good_num_) as goodNum
+        FROM user_order_detail t
+        left join user_order o on t.order_no_ = o.order_no_
+        where o.activity_id_ = #{activityId}
+        and o.user_id_ = #{userId}
+        and o.order_client_ = #{client}
+        and o.status_ in ('PAID','WAIT_PAY','PAYING')
+        and t.gift_flag_ = 0
+    </select>
 </mapper>