فهرست منبع

Merge branch 'feature/1219_opt' of http://git.dayaedu.com/yonge/cooleshow into feature/1219_opt

zouxuan 6 ماه پیش
والد
کامیت
1c835eee53
14فایلهای تغییر یافته به همراه251 افزوده شده و 2 حذف شده
  1. 10 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  2. 30 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  3. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  4. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  5. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java
  6. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EStudentEntitlements.java
  7. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  8. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  9. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/DiscountCardRecordServiceImpl.java
  10. 41 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  11. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  12. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  13. 82 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  14. 21 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

+ 10 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -338,4 +338,14 @@ public class StudentController extends BaseController {
         studentService.save(student);
         return succeed();
     }
+
+
+
+    @GetMapping("/initEntitlements")
+    @ApiOperation(value = "初始化权益")
+    public HttpResponseResult<Boolean> syncEntitlements() {
+
+        studentService.initEntitlements();
+        return succeed();
+    }
 }

+ 30 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -25,6 +25,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import java.io.File;
 import java.net.URL;
 import java.util.Date;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -86,6 +87,12 @@ public class TaskController extends BaseController {
     @Autowired
     private UserMusicService userMusicService;
 
+    @Autowired
+    private VipCardRecordService vipCardRecordService;
+
+    @Autowired
+    private StudentService studentService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -364,4 +371,27 @@ public class TaskController extends BaseController {
             }
         }, 10L, TimeUnit.SECONDS);
     }
+
+
+
+    //更新权益
+    @GetMapping("/updateUserVipStatus")
+    public void updateUserVipStatus(){
+        DistributedLock.of(redissonClient).runIfLockCanGet("updateUserVipStatus", () -> {
+            try {
+
+                List<Long> userIds = vipCardRecordService.updateUserVipStatus();
+
+                userIds.parallelStream().forEach(userId -> {
+                    try {
+                        studentService.updateVipStatus(userId);
+                    }catch (Exception e){
+                        log.error("updateUserVipStatus error", e);
+                    }
+                });
+            }catch (Exception e){
+                log.error("updateUserVipStatus error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
+    }
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
@@ -83,4 +84,7 @@ public interface StudentDao extends BaseMapper<Student> {
 
     List<StudentWrapper.UserCount> countStudentByTenantGroupIds(@Param("tenantId") Long tenantId, @Param("groupIdList") List<Long> groupIdList);
 
+    List<String> selectEntitlements(@Param("userId") Long userId);
+
+    List<Long> selectInitEntitlements(@Param("page") IPage<Object> objectPage);
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.EUserVipType;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
@@ -90,6 +91,10 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty(value = "排序方式",hidden = true)
     private String orderBy;
 
+
+    @ApiModelProperty("权益 VIP,SVIP,DISCOUNT:畅学卡,TENANT_ALBUM:训练教程 ,NORMAL:普通用户")
+    private List<String> entitlementsList;
+
     public Date getVipStartTime() {
         return vipStartTime;
     }

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Student.java

@@ -120,4 +120,10 @@ public class Student implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date discountEndTime;
 
+
+    @ApiModelProperty("权益 VIP,SVIP,DISCOUNT:畅学卡,TENANT_ALBUM:训练教程 ,NORMAL:普通用户")
+    @TableField(value = "entitlements_")
+    private String entitlements;
+
+
 }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EStudentEntitlements.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+
+public enum EStudentEntitlements implements BaseEnum<String, EStudentEntitlements> {
+
+    //权益 VIP,SVIP,DISCOUNT:畅学卡,TENANT_ALBUM:训练教程 ,NORMAL:普通用户
+    VIP("VIP"),
+    SVIP("SVIP"),
+    DISCOUNT("畅学卡"),
+    TENANT_ALBUM("训练教程"),
+    NORMAL("普通用户"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    EStudentEntitlements(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -143,4 +143,8 @@ public interface StudentService extends IService<Student> {
     String updateUserCustomerService(SysUser user);
 
     StudentIndexWrapper.SummaryDto indexSummary(Long userId);
+
+    void updateVipStatus(Long userId);
+
+    void initEntitlements();
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java

@@ -135,4 +135,6 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
     VipCardRecordWrapper.Info info(VipCardRecordWrapper.InfoQuery infoQuery);
 
     IPage<VipCardRecordWrapper.VipCardRecord> selectAdminPage(IPage<VipCardRecordWrapper.VipCardRecord> page, VipCardRecordWrapper.VipQuery query);
+
+    List<Long> updateUserVipStatus();
 }

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

@@ -233,6 +233,9 @@ public class DiscountCardRecordServiceImpl extends ServiceImpl<DiscountCardRecor
 
         // 更新学生时长
         baseMapper.updateUserDiscountTime(userId, startTime, endTime);
+
+
+        studentService.updateVipStatus(userId);
     }
 
     @Override

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -1109,4 +1110,44 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         summaryDto.setTotalCourseCount(courseScheduleService.getDao().countStudentOverCourse(userId, monday, sunday,null));
         return summaryDto;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateVipStatus(Long userId) {
+        // 查询有效的会员
+
+        // 查询有效的畅学卡
+
+        // 查询有效的机构专辑
+        List<String> strings = baseMapper.selectEntitlements(userId);
+
+        if (CollectionUtils.isEmpty(strings)) {
+            this.lambdaUpdate()
+                    .eq(Student::getUserId, userId)
+                    .set(Student::getEntitlements, EStudentEntitlements.NORMAL)
+                    .update();
+        } else {
+            String collect = strings.stream().filter(StringUtils::isNotBlank).collect(Collectors.joining(","));
+            this.lambdaUpdate()
+                    .eq(Student::getUserId, userId)
+                    .set(Student::getEntitlements, StringUtils.isBlank(collect)?"NORMAL":collect)
+                    .update();
+
+        }
+    }
+
+    @Override
+    public void initEntitlements() {
+        int page = 1;
+        List<Long> list = baseMapper.selectInitEntitlements(new Page<>(page, 100));
+        while (CollectionUtils.isNotEmpty(list)) {
+            try {
+                list.forEach(this::updateVipStatus);
+            }catch (Exception e){
+                log.error("初始化学生权益失败",e);
+            }
+            page++;
+            list = baseMapper.selectInitEntitlements(new Page<>(page, 100));
+        }
+    }
 }

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

@@ -68,6 +68,9 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
     @Autowired
     private TenantGroupAlbumService tenantGroupAlbumService;
 
+    @Autowired
+    private StudentService studentService;
+
 
     private static final String PHONE_REG = "^1\\d{10}$";
 
@@ -710,5 +713,8 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
         instance.set(Calendar.MILLISECOND, 0);
         userTenantAlbumRecord.setEndTime(instance.getTime());
         userTenantAlbumRecordMapper.insert(userTenantAlbumRecord);
+
+
+        studentService.updateVipStatus(userOrderDetailVo.getUserId());
     }
 }

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

@@ -234,6 +234,7 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
         userTenantAlbumRecord.setEstimatedEndTime(userTenantAlbumRecord.getEndTime());
         userTenantAlbumRecord.setEstimatedStartTime(userTenantAlbumRecord.getStartTime());
         this.save(userTenantAlbumRecord);
+        studentService.updateVipStatus(userTenantAlbumRecord.getUserId());
 
         if (sendMsg) {
             sendVipDeductionMessage(userTenantAlbumRecord.getUserId(),userTenantAlbumRecord.getTimes(),
@@ -803,6 +804,8 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
 
         int days = deductionRecord(result);
 
+        studentService.updateVipStatus(result.getUserId());
+
         TenantAlbum tenantAlbum = tenantAlbumMapper.selectById(discountCardRecord.getTenantAlbumId());
         if (tenantAlbum == null) {
             return;

+ 82 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -13,7 +13,6 @@ import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.*;
-import com.yonge.cooleshow.biz.dal.wrapper.DiscountCardRecordWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -34,7 +33,6 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 
@@ -61,6 +59,12 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
     @Autowired
     private SysUserService sysUserService;
 
+    @Autowired
+    private DiscountCardRecordService discountCardRecordService;
+
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
 
     @Override
     public VipCardRecordVo detail(Long orderDetilId) {
@@ -476,6 +480,8 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             }
         }
 
+        studentService.updateVipStatus(addVipCardRecord.getUserId());
+
         if (Boolean.TRUE.equals(addVipCardRecord.getSendMsg())) {
             sendAddVipMsg(addVipCardRecord.getUserId(),addVipCardRecord.getClientType(),addVipCardRecord.getStatus(),
                     addVipCardRecord.getVipType(),addVipCardRecord.getType(),addVipCardRecord.getTimes(),addVipCardRecord.getReason());
@@ -690,6 +696,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         }
 
 
+        studentService.updateVipStatus(result.getUserId());
         if (Boolean.TRUE.equals(result.getSendMsg())) {
             sendAddVipMsg(record.getUserId(),record.getClientType(),EVipRecordStatus.DEDUCTION,
                     record.getVipType(),record.getType(),record.getTimes(),result.getReason());
@@ -762,6 +769,79 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         return vipCardRecordIPage;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> updateUserVipStatus() {
+        // 更新会员状态
+        List<VipCardRecord> vipCardRecords = this.lambdaQuery()
+                .eq(VipCardRecord::getEfficientFlag, true)
+                .eq(VipCardRecord::getDeductionStatus, EDeductionStatus.EFFECTIVE)
+                .lt(VipCardRecord::getEndTime, new Date())
+                .list();
+        if (CollectionUtils.isNotEmpty(vipCardRecords)) {
+            List<VipCardRecord> updateList = new ArrayList<>();
+            for (VipCardRecord vipCardRecord : vipCardRecords) {
+                VipCardRecord record = new VipCardRecord();
+                record.setId(vipCardRecord.getId());
+                record.setDeductionStatus(EDeductionStatus.EXPIRED);
+                updateList.add(record);
+            }
+            this.updateBatchById(updateList);
+        }
+        // 更新畅学卡状态
+        List<DiscountCardRecord> discountCardRecords = discountCardRecordService.lambdaQuery()
+                .eq(DiscountCardRecord::getEfficientFlag, true)
+                .lt(DiscountCardRecord::getEndTime, new Date())
+                .eq(DiscountCardRecord::getDeductionStatus, EDeductionStatus.EFFECTIVE)
+                .list();
+        if (CollectionUtils.isNotEmpty(discountCardRecords)) {
+            List<DiscountCardRecord> updateList = new ArrayList<>();
+            for (DiscountCardRecord discountCardRecord : discountCardRecords) {
+                DiscountCardRecord record = new DiscountCardRecord();
+                record.setId(discountCardRecord.getId());
+                record.setDeductionStatus(EDeductionStatus.EXPIRED);
+                updateList.add(record);
+            }
+            discountCardRecordService.updateBatchById(updateList);
+        }
+        // 更新机构专辑状态
+        List<UserTenantAlbumRecord> userTenantAlbumRecords = userTenantAlbumRecordService.lambdaQuery()
+                .eq(UserTenantAlbumRecord::getEfficientFlag, true)
+                .lt(UserTenantAlbumRecord::getEndTime, new Date())
+                .eq(UserTenantAlbumRecord::getDeductionStatus, EDeductionStatus.EFFECTIVE)
+                .list();
+        if (CollectionUtils.isNotEmpty(userTenantAlbumRecords)) {
+            List<UserTenantAlbumRecord> updateList = new ArrayList<>();
+            for (UserTenantAlbumRecord userTenantAlbumRecord : userTenantAlbumRecords) {
+                UserTenantAlbumRecord record = new UserTenantAlbumRecord();
+                record.setId(userTenantAlbumRecord.getId());
+                record.setDeductionStatus(EDeductionStatus.EXPIRED);
+                updateList.add(record);
+            }
+            userTenantAlbumRecordService.updateBatchById(updateList);
+        }
+
+        // 更新学生表 权益字段
+        List<Long> userIds = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(vipCardRecords)) {
+            userIds.addAll(vipCardRecords.stream()
+                    .filter(o->o.getClientType() == ClientEnum.STUDENT)
+                    .map(VipCardRecord::getUserId).distinct().collect(Collectors.toList()));
+        }
+        if (CollectionUtils.isNotEmpty(discountCardRecords)) {
+            userIds.addAll(discountCardRecords.stream()
+                    .map(DiscountCardRecord::getUserId).distinct().collect(Collectors.toList()));
+        }
+        if (CollectionUtils.isNotEmpty(userTenantAlbumRecords)) {
+            userIds.addAll(userTenantAlbumRecords.stream()
+                    .map(UserTenantAlbumRecord::getUserId).distinct().collect(Collectors.toList()));
+        }
+
+
+        return userIds;
+
+    }
+
 
     // 会员扣减
     private VipCardRecord deductVip(VipCardRecordWrapper.AddVipCardRecord addVipCardRecord) {

+ 21 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -40,6 +40,7 @@
         , t.im_customer_id_ AS imCustomerId
         , t.discount_start_time_ as discountStartTime
         , t.discount_end_time_ as discountEndTime
+        , t.entitlements_ as entitlements
         </sql>
     <update id="setSubject">
         update student set subject_id_ = #{subjectIds},update_time_ = now() where user_id_ = #{id}
@@ -133,6 +134,13 @@
                     u.phone_ LIKE CONCAT('%', #{param.search}, '%')
                 )
             </if>
+            <if test="param.entitlementsList != null and param.entitlementsList.size() > 0">
+                and
+                <foreach collection="param.entitlementsList" item="item" separator=" and " open="(" close=")">
+                    t.entitlements_ like concat('%',#{item},'%')
+                </foreach>
+
+            </if>
             <if test="null != param.gender">
                 and u.gender_ = #{param.gender}
             </if>
@@ -407,4 +415,17 @@
         </where>
         group by tenant_group_id_
     </select>
+
+    <select id="selectEntitlements" resultType="java.lang.String">
+        select  distinct vip_type_ from vip_card_record where user_id_ = #{userId} and efficient_flag_ = 1 and client_type_ = 'STUDENT' and end_time_ > now() and deduction_status_ = 'EFFECTIVE'
+        union
+        select if(count(1)>0,'DISCOUNT','') from discount_card_record where user_id_ = #{userId} and efficient_flag_ = 1 and client_type_ = 'STUDENT' and end_time_ > now() and deduction_status_ = 'EFFECTIVE'
+        union
+        select if(count(1)>0,'TENANT_ALBUM','') from user_tenant_album_record where user_id_ = #{userId} and efficient_flag_ = 1  and end_time_ > now() and deduction_status_ = 'EFFECTIVE'
+
+    </select>
+
+    <select id="selectInitEntitlements" resultType="java.lang.Long">
+        select user_id_ from student
+    </select>
 </mapper>