ソースを参照

Merge remote-tracking branch 'origin/feature/1113-vipCourse' into feature/1113-vipCourse

zouxuan 7 ヶ月 前
コミット
25b2dd1181
14 ファイル変更126 行追加99 行削除
  1. 2 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java
  2. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java
  3. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CheckCourseTimeDto.java
  4. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  5. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseScheduleEnum.java
  6. 0 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RedisCacheService.java
  7. 7 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  8. 43 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/DiscountCardRecordServiceImpl.java
  10. 11 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  11. 0 37
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RedisCacheServiceImpl.java
  12. 28 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  13. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
  14. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

+ 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);

+ 0 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RedisCacheService.java

@@ -64,13 +64,6 @@ public interface RedisCacheService {
      */
     void saveUserOrderConfig(String userId, String orderType, String config);
 
-    /**
-     * 用户下单金额分账配置
-     *
-     * @param subOrderNo 用户Id
-     * @param config 下单配置信息
-     */
-    void saveUserAccountConfig(String subOrderNo, String config);
 
     /**
      * 查询用户下单配置
@@ -80,12 +73,6 @@ public interface RedisCacheService {
      */
     String getUserOrderConfig(String userId, String orderType);
 
-    /**
-     * 用户下单金额分账配置
-     *
-     * @param subOrderNo 订单详情号
-     */
-    String getUserAccountConfig(String subOrderNo);
 
     /**
      * 删除用户下单配置

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

@@ -595,8 +595,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)) {
@@ -609,14 +613,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) {

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import cn.hutool.core.date.DateUnit;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -323,7 +324,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 Iterator<CourseTimeEntity> iterator = calendarEntity.getCourseTime().iterator();
                 while (iterator.hasNext()) {
                     CourseTimeEntity next = iterator.next();
-                    boolean flag = checkCourseTime(nowCourse, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, next.getStartTime(), next.getEndTime());
+                    boolean flag = checkCourseTime(nowCourse, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime, next.getStartTime(), next.getFreeEndTime());
                     if (flag) {
                         iterator.remove();
                     }
@@ -443,6 +444,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 timeEntity.setEndTime(edate);
                 //再加上单节课休息时间
                 edate = DateUtil.addMinutes(edate, freeCourseMinutes);
+                timeEntity.setFreeEndTime(edate);
                 result.add(timeEntity);
             }
         }
@@ -536,6 +538,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
                 // 检查时间段是否满足课程时间,不满足则删除,满足 并且可多段的情况下,将时间段拆分
                 courseTime = splitTime(courseTime,courseMinutes,freeMinutes);
+                courseTime.sort(Comparator.comparing(CourseTimeEntity::getStartTime));
                 calendarEntity.setCourseTime(courseTime);
 
                 //如果日历时间集合数据删没了,那么就证明当天课程已经满了  0:未满 1满
@@ -611,10 +614,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         }
         for (CourseTimeEntity trainingPlanTimeDetail : timeList) {
             if (time.getStartTime().compareTo(trainingPlanTimeDetail.getStartTime()) < 0) {
-                if (time.getEndTime().compareTo(trainingPlanTimeDetail.getStartTime()) <= 0) {
+                if (time.getFreeEndTime().compareTo(trainingPlanTimeDetail.getStartTime()) <= 0) {
                     result.add(time);
                     return result;
-                } else if (time.getEndTime().compareTo(trainingPlanTimeDetail.getEndTime()) <= 0) {
+                } else if (time.getFreeEndTime().compareTo(trainingPlanTimeDetail.getFreeEndTime()) <= 0) {
                     CourseTimeEntity trainingPlanTimeDetail1 = new CourseTimeEntity();
                     trainingPlanTimeDetail1.setStartTime(time.getStartTime());
                     trainingPlanTimeDetail1.setEndTime(trainingPlanTimeDetail.getStartTime());
@@ -627,9 +630,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     result.add(trainingPlanTimeDetail1);
                     time.setStartTime(trainingPlanTimeDetail.getEndTime());
                 }
-            } else if (time.getStartTime().compareTo(trainingPlanTimeDetail.getEndTime()) <= 0) {
-                if (time.getEndTime().compareTo(trainingPlanTimeDetail.getEndTime()) > 0) {
-                    time.setStartTime(trainingPlanTimeDetail.getEndTime());
+            } else if (time.getStartTime().compareTo(trainingPlanTimeDetail.getFreeEndTime()) <= 0) {
+                if (time.getFreeEndTime().compareTo(trainingPlanTimeDetail.getFreeEndTime()) > 0) {
+                    time.setStartTime(trainingPlanTimeDetail.getFreeEndTime());
                 } else {
                     return result;
                 }
@@ -653,16 +656,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         for (int i = 1; i < timeList.size(); i++) {
             CourseTimeEntity nextTime = timeList.get(i);
             // 如果下一个时间段的开始时间小于等于上一个时间段的结束时间
-            if (nextTime.getStartTime().compareTo(time.getEndTime()) <= 0 ) {
+            if (nextTime.getStartTime().compareTo(time.getFreeEndTime()) <= 0 ) {
                 // 合并时间段
-                if (nextTime.getEndTime().compareTo(time.getEndTime()) >= 0) {
+                if (nextTime.getFreeEndTime().compareTo(time.getFreeEndTime()) >= 0) {
                     time.setEndTime(nextTime.getEndTime());
+                    time.setFreeEndTime(nextTime.getFreeEndTime());
                 }
             } else {
                 // 保存上一个时间段
                 result.add(time);
                 // 重置时间段
-                if (nextTime.getEndTime().compareTo(time.getEndTime()) >= 0) {
+                if (nextTime.getFreeEndTime().compareTo(time.getFreeEndTime()) >= 0) {
                     time = nextTime;
                 }
             }
@@ -687,6 +691,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String star = sysConfigService.findConfigValue(SysConfigConstant.COURSE_START_SETTING);//系统开课时间
         String end = sysConfigService.findConfigValue(SysConfigConstant.COURSE_END_SETTING);//系统关课时间
 
+        LocalDate now = LocalDate.now();
         //获取每日日期数据
         while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
             CourseCalendarEntity entity = new CourseCalendarEntity();
@@ -700,7 +705,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                         .map(t -> getCourseTimeEntity(entity, (JSONObject) t))
                         .filter(f -> checkTime(f, star, end))
                         .collect(Collectors.toList());
-                entity.setCourseTime(timeEntities);
+                if (!now.isAfter(firstDay)) {
+                    entity.setCourseTime(timeEntities);
+                }
             }
             list.add(entity);
             firstDay = firstDay.plusDays(1L);
@@ -742,6 +749,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
             courseTimeEntity.setStartTime(DateUtil.addDays(time.getStartTime(), addDay));
             courseTimeEntity.setEndTime(DateUtil.addDays(time.getEndTime(), addDay));
+            courseTimeEntity.setFreeEndTime(DateUtil.addDays(time.getFreeEndTime(), addDay));
             times.add(courseTimeEntity);
         });
         entity.setCourseTime(times);
@@ -814,6 +822,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     lockCourse.setClassDate(DateUtil.toDate(ymd));
                     lockCourse.setStartTime(courseTimeEntity.getStartTime());
                     lockCourse.setEndTime(courseTimeEntity.getEndTime());
+                    lockCourse.setFreeEndTime(courseTimeEntity.getFreeEndTime());
                     lockCourseList.add(lockCourse);
                 });
             }
@@ -839,7 +848,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                         v.forEach(course -> {
                             CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
                             courseTimeEntity.setStartTime(course.getStartTime());
-                            courseTimeEntity.setEndTime(course.getFreeEndTime());
+                            courseTimeEntity.setEndTime(course.getEndTime());
+                            courseTimeEntity.setFreeEndTime(course.getFreeEndTime());
                             value.add(courseTimeEntity);
                         });
                         nowCourse.put(DateUtil.dateToString(k), value);
@@ -1459,16 +1469,24 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         baseMapper.update(null, Wrappers.<CourseSchedule>lambdaUpdate()
                 .eq(CourseSchedule::getId, adjustVo.getCourseId())
                 .set(CourseSchedule::getStartTime, DateUtil.getYesterday())
-                .set(CourseSchedule::getEndTime, DateUtil.getYesterday()));
+                .set(CourseSchedule::getEndTime, DateUtil.getYesterday())
+                .set(CourseSchedule::getFreeEndTime, DateUtil.getYesterday())
+        );
 
         CourseTimeEntity timeEntity = new CourseTimeEntity();
         timeEntity.setStartTime(startTime);
         timeEntity.setEndTime(endTime);
+
+        // 加上课间时间
+        int feeTime = Integer.parseInt(String.valueOf(cn.hutool.core.date.DateUtil.between(schedule.getEndTime(), schedule.getFreeEndTime(), DateUnit.MINUTE)));
+        Date freeEndTime = DateUtil.offsetMinute(endTime, feeTime);
+        timeEntity.setFreeEndTime(freeEndTime);
+
         List<CourseTimeEntity> timeList = Arrays.asList(timeEntity);
         //校验老师课程是否冲突
-        this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime);
         //校验学生课程是否冲突
-        this.batchCheckTeacherCourseTime(studentPayment.getUserId(), timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        this.batchCheckStudentCourseTime(studentPayment.getUserId(), timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
 
         baseMapper.courseAdjust(adjustVo);
 
@@ -2442,6 +2460,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             throw new BizException("无法修改课程");
         }
 
+        // 加上课间时间
+        int feeTime = Integer.parseInt(String.valueOf(cn.hutool.core.date.DateUtil.between(courseSchedule.getStartTime(), startTime, DateUnit.MINUTE)));
+        Date freeEndTime = DateUtil.offsetMinute(endTime, feeTime);
+        courseTime.setFreeEndTime(freeEndTime);
+
         //校验上下课时间
         Integer singleCourseTime = courseSchedule.getSingleCourseTime();
         if (!DateUtil.offsetMinute(startTime, singleCourseTime).equals(endTime)) {
@@ -2452,10 +2475,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         baseMapper.update(null, Wrappers.<CourseSchedule>lambdaUpdate()
                 .eq(CourseSchedule::getId, courseId)
                 .set(CourseSchedule::getStartTime, DateUtil.getYesterday())
+                .set(CourseSchedule::getFreeEndTime, DateUtil.getYesterday())
                 .set(CourseSchedule::getEndTime, DateUtil.getYesterday()));
 
         //批量检查老师课时在数据库是否重复
-        this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
+        this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime);
 
         //校验购买的课程组每节课时间是否和自己的课时冲突
         List<CourseScheduleStudentPayment> studentPayments = paymentDao.selectList(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
@@ -2472,7 +2496,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 .eq(CourseSchedule::getId, courseId)
                 .set(CourseSchedule::getClassDate, DateUtil.trunc(startTime))
                 .set(CourseSchedule::getStartTime, startTime)
-                .set(CourseSchedule::getEndTime, endTime));
+                .set(CourseSchedule::getEndTime, endTime)
+                .set(CourseSchedule::getFreeEndTime, freeEndTime)
+        );
 
         if (CollectionUtils.isNotEmpty(studentPayments)) {
             SysUser teacher = sysUserService.getByUserId(teacherId);
@@ -2505,7 +2531,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                     0, null, ClientEnum.STUDENT.getCode(), teacher.getUsername(),"琴房课",courseName,dateString);
 
         } catch (Exception e) {
-            log.error("琴房课调整发送消息失败--> {}", e.fillInStackTrace());
+            log.error("琴房课调整发送消息失败", e);
         }
     }
 

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

@@ -98,7 +98,7 @@ public class DiscountCardRecordServiceImpl extends ServiceImpl<DiscountCardRecor
                 log.error("时间类型错误{}", discountCardRecord.getType());
         }
         discountCardRecord.setStartTime(DateUtil.localDateTimeToDate(startTime.atTime(LocalTime.MIN)));
-        discountCardRecord.setEndTime(DateUtil.localDateTimeToDate(endTime.atTime(LocalTime.MAX)));
+        discountCardRecord.setEndTime(DateUtil.localDateTimeToDate(endTime.atTime(23,59,59)));
 
         this.save(discountCardRecord);
 

+ 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) {

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

@@ -175,43 +175,6 @@ public class RedisCacheServiceImpl implements RedisCacheService {
     }
 
 
-    /**
-     * 用户下单金额分账配置
-     *
-     * @param subOrderNo 订单详情号
-     * @param config 下单配置信息
-     */
-    @Override
-    public void saveUserAccountConfig(String subOrderNo, String config) {
-
-        String cacheKey = getCacheKey(CacheKey.USER_ORDER_ACCOUNT, subOrderNo);
-
-        RBucket<Object> bucket = redissonClient.getBucket(cacheKey);
-
-        // 缓存数据
-        bucket.set(config, 150L, TimeUnit.MINUTES);
-    }
-
-
-    /**
-     * 用户下单金额分账配置
-     *
-     * @param subOrderNo 订单详情号
-     */
-    @Override
-    public String getUserAccountConfig(String subOrderNo) {
-
-        String cacheKey = getCacheKey(CacheKey.USER_ORDER_ACCOUNT,subOrderNo);
-
-        // 获取用户支付配置信息
-        RBucket<Object> bucket = redissonClient.getBucket(cacheKey);
-        Object data = bucket.get();
-        if (Objects.isNull(data)) {
-            return StringUtils.EMPTY;
-        }
-
-        return (String) data;
-    }
 
     /**
      * 删除用户下单配置

+ 28 - 19
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);
             }
 
@@ -867,16 +871,27 @@ DISCOUNT("畅学卡")
 
     private void checkActivity(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
         ActivityPlanVo activityPlan = activityPlanService.detail(orderReq.getActivityId());
+        Date now = new Date();
         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()
-                        .filter(o -> o.getGiftFlag() != null && !o.getGiftFlag())
+                        .filter(o -> o.getGiftFlag() != null && o.getGiftFlag())
                         .collect(Collectors.groupingBy(o -> o.getGoodType().getCode(),
-                                Collectors.mapping(UserPaymentOrderWrapper.OrderGoodsInfo::getBizId, Collectors.toList())));
+                                Collectors.mapping(o->Long.valueOf(o.getBizContent().toString()), Collectors.toList())));
                 for (ActivityPlanRewardDto activityPlanRewardDto : activityPlan.getActivityRewardList()) {
                     RewardTypeEnum rewardType = activityPlanRewardDto.getActivityReward().getRewardType();
                     if (map.containsKey(rewardType.toString())) {
@@ -890,9 +905,9 @@ DISCOUNT("畅学卡")
                 }
                 // 购买的商品判断
                 map = orderReq.getGoodsInfos().stream()
-                        .filter(o -> o.getGiftFlag() == null || o.getGiftFlag())
+                        .filter(o -> o.getGiftFlag() == null || !o.getGiftFlag())
                         .collect(Collectors.groupingBy(o -> o.getGoodType().getCode(),
-                                Collectors.mapping(UserPaymentOrderWrapper.OrderGoodsInfo::getBizId, Collectors.toList())));
+                                Collectors.mapping(o->Long.valueOf(o.getBizContent().toString()), Collectors.toList())));
                 if (map.containsKey(GoodTypeEnum.VIP.name()) || map.containsKey(GoodTypeEnum.SVIP.name())) {
                     MemberPriceSettings settings = memberPriceSettingsService.getById(activityPlan.getVipCardId());
                     if (settings == null) {
@@ -915,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("超出活动最大参与次数");
             }
-
         }
 
     }
@@ -946,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);
     }
 
     /**

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml

@@ -60,6 +60,7 @@
         , ar.update_time_ as "activityReward.updateTime"
         , ar.update_by_ as "activityReward.updateBy"
         , ar.discount_price_ as "activityReward.discountPrice"
+        , ar.vip_card_id_ as "activityReward.vipCardId"
     </sql>
 
     <select id="queryActivityPlanReward" resultType="com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto">

+ 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>