liujc há 9 meses atrás
pai
commit
680a5fb32e
23 ficheiros alterados com 533 adições e 139 exclusões
  1. 2 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java
  2. 15 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  3. 18 2
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  4. 1 1
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  5. 5 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  6. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImUserFriendDao.java
  7. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  8. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetRelatedQueryInfo.java
  9. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EUserVipType.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java
  11. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  12. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  13. 64 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  14. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  15. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  16. 205 86
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  17. 11 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantApplyRecordServiceImpl.java
  18. 98 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  19. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java
  20. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  21. 13 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml
  22. 29 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  23. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

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

@@ -265,9 +265,9 @@ public class StudentController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生编号", "学生姓名", "真实姓名", "性别", "出生日期",
-                    "年龄", "专业", "手机号码", "是否是会员", "注册时间", "用户状态", "学生来源","小组"}, new String[]{
+                    "年龄", "专业", "手机号码", "会员类型", "会员结束时间", "注册时间", "用户状态", "学生来源","小组"}, new String[]{
                     "userId", "username", "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
-                    "isVip.msg", "createTime", "userStatus.msg", "tenantName", "tenantGroupName"}, rows);
+                    "vipType.name", "membershipEndTime", "createTime", "userStatus.msg", "tenantName", "tenantGroupName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=学生列表-" + DateUtil.getDate(new Date()) + ".xls");

+ 15 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -218,9 +218,9 @@ public class TeacherController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"老师编号", "昵称", "姓名", "手机号", "老师类型",
-                    "注册时间", "认证时间", "状态", "是否是会员", "徽章", "机构", "小组"}, new String[]{
+                    "注册时间", "认证时间", "状态", "会员类型", "会员结束时间", "徽章", "机构", "小组"}, new String[]{
                     "userId", "username", "realName", "phone", "entryFlag.code == 1 ? '达人' : '游客'", "createTime",
-                    "entryAuthDate","userStatus.msg", "isVip.code == 1 ? '是' : '否'", "tag", "tenantName",
+                    "entryAuthDate","userStatus.msg", "vipType.name", "membershipEndTime", "tag", "tenantName",
                     "tenantGroupName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
@@ -355,4 +355,17 @@ public class TeacherController extends BaseController {
         imGroupService.setTeacherFansGroup();
         return succeed();
     }
+
+    /**
+     * 老师账号冻结/解冻
+     */
+    @PostMapping("/updateLock/{teacherId}")
+    @ApiOperation(value = "老师账号冻结/解冻")
+    @PreAuthorize("@pcs.hasPermissions('teacher/updateLock')")
+    public HttpResponseResult updateLock(@PathVariable("teacherId") Long teacherId) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        teacherService.updateLock(sysUser, teacherId);
+        return succeed();
+    }
+
 }

+ 18 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -351,8 +351,24 @@ public class MusicSheetController extends BaseController {
     @ApiOperation(value = "关联的曲目列表")
     @GetMapping(value="/queryRelatedList")
     public HttpResponseResult<PageInfo<MusicSheetVo>> queryRelatedList(MusicSheetRelatedQueryInfo queryInfo) {
-    	
-    	IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo),queryInfo);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        Student student = studentService.getById(sysUser.getId());
+        if (student == null) {
+            return failed("用户信息获取失败");
+        }
+        // 如果是机构学生
+        IPage<MusicSheetVo> musicSheetVoIPage;
+        if (student.getTenantId() !=null && student.getTenantId()>0) {
+            queryInfo.setSubjectId(Long.parseLong(student.getSubjectId()));
+            musicSheetVoIPage =musicSheetService.queryTenantRelatedList(PageUtil.getPage(queryInfo),queryInfo);
+        } else {
+
+            musicSheetVoIPage = musicSheetService.queryRelatedList(PageUtil.getPage(queryInfo), queryInfo);
+        }
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 

+ 1 - 1
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -384,7 +384,7 @@
     </update>
 
     <select id="getCustomerServiceByFriendLeast" resultMap="SysUser">
-        select t.*
+        select m.*
         from (SELECT te.user_id_,
                      count(distinct iuf.friend_id_) friends
               from teacher te

+ 5 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -455,4 +455,9 @@ public interface SysConfigConstant {
      * 添加客服好友时,客服发送消息标题
      */
     String CUSTOMER_SERVICE_ADD_MSG_TITLE = "customer_service_add_msg_title";
+
+    /**
+     * 群成员人数限制
+     */
+    String GROUP_MEMBER_LIMIT = "group_member_limit";
 }

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

@@ -23,5 +23,7 @@ public interface ImUserFriendDao extends BaseMapper<ImUserFriend> {
 
     void delStudentFriendByTenantId(@Param("tenantId") Long tenantId,@Param("userId") Long userId ,
                                     @Param("clientType") String clientType);
+
+    List<ImUserFriend> queryExistCustomerServiceFriend(@Param("userIds") String userIds, @Param("clientType") String clientType);
 }
 

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

@@ -213,4 +213,6 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
     MusicSheet get(Long id);
 
     IPage<MusicSheet> selectSyncPage(Page<Object> objectPage);
+
+    IPage<MusicSheetVo> queryTenantRelatedList(@Param("page") IPage<Object> page, @Param("queryInfo") MusicSheetRelatedQueryInfo queryInfo);
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.MusicSheetTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 
 public class MusicSheetRelatedQueryInfo extends QueryInfo {
@@ -10,6 +11,16 @@ public class MusicSheetRelatedQueryInfo extends QueryInfo {
 
     private Long subjectId;
 
+    private MusicSheetTypeEnum musicSheetType;
+
+    public MusicSheetTypeEnum getMusicSheetType() {
+        return musicSheetType;
+    }
+
+    public void setMusicSheetType(MusicSheetTypeEnum musicSheetType) {
+        this.musicSheetType = musicSheetType;
+    }
+
     public Long getSubjectId() {
         return subjectId;
     }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/EUserVipType.java

@@ -9,8 +9,8 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum EUserVipType implements BaseEnum<String, EUserVipType> {
 
     NORMAL("普通用户"),
-    VIP("会员"),
-    SVIP("SVIP"),
+    VIP("VIP会员"),
+    SVIP("SVIP会员"),
 
     ;
     @EnumValue

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

@@ -60,6 +60,8 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
      */
     Integer registerUserBindCustomerService(Long userId, List<Long> friendIds, ClientEnum clientType);
 
+    void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType);
+
     /**
      * 发送系统客服消息
      * @param sender 发送者

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

@@ -416,4 +416,6 @@ public interface MusicSheetService extends IService<MusicSheet> {
     PageInfo<CbsMusicSheetWrapper.MusicSheetAccApplication> queryCbsMusicSheetSoundApplication(CbsMusicSheetWrapper.MusicSheetApplicationQuery query);
 
     List<CbsMusicSheetWrapper.MusicSheetApplication> queryCbsMusicSheetApplication(CbsMusicSheetWrapper.MusicSheetApplicationQuery query);
+
+    IPage<MusicSheetVo> queryTenantRelatedList(IPage<Object> page, MusicSheetRelatedQueryInfo queryInfo);
 }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
@@ -188,4 +189,6 @@ public interface TeacherService extends IService<Teacher> {
     Map<Long, Teacher> getMapByIds(List<Long> teacherIds);
 
     List<Teacher> getCustomerService();
+
+    void updateLock(SysUser sysUser, Long teacherId);
 }

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

@@ -1,7 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alipay.api.domain.SystemParam;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -54,6 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -248,20 +248,16 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         if (ClientEnum.STUDENT.getCode().equals(friendClientType)) {
             StudentVo detail = studentDao.detail(userId);
             if (detail != null && StringUtils.isNotEmpty(detail.getSubjectId())) {
-                String subjectId = detail.getSubjectId();
-                List<Subject> subject = subjectService.findBySubjectByIdList(subjectId);
-                if (!subject.isEmpty()) {
-                    result.setFriendSubjectName(subject.get(0).getName());
-                }
+                List<Subject> subject = subjectService.findBySubjectByIdList(detail.getSubjectId());
+                String subjectName = subject.stream().map(Subject::getName).collect(Collectors.joining("、"));
+                result.setFriendSubjectName(subjectName);
             }
         } else if (ClientEnum.TEACHER.getCode().equals(friendClientType)) {
             TeacherVo detail = teacherDao.detail(userId);
             if (detail != null && StringUtils.isNotEmpty(detail.getSubjectId())) {
-                String subjectId = detail.getSubjectId();
-                List<Subject> subject = subjectService.findBySubjectByIdList(subjectId);
-                if (!subject.isEmpty()) {
-                    result.setFriendSubjectName(subject.get(0).getName());
-                }
+                List<Subject> subject = subjectService.findBySubjectByIdList(detail.getSubjectId());
+                String subjectName = subject.stream().map(Subject::getName).collect(Collectors.joining("、"));
+                result.setFriendSubjectName(subjectName);
             }
         }
         VipCardRecordWrapper.UserVip userVip = vipCardRecordService.UserVipInfo(userId, ClientEnum.valueOf(friendClientType));
@@ -400,6 +396,63 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     }
 
     /**
+     * 与客服建立好友关系时,客服给好友发送消息
+     */
+    @Override
+    public void sendCustomerServiceAddFriendMessage(Long customerServiceId, String sendTitle, String sendMessage, List<Long> friendIds, ClientEnum friendType) {
+
+        if (customerServiceId == null || CollectionUtils.isEmpty(friendIds)) {
+            return;
+        }
+
+        try {
+            if (StringUtils.isEmpty(sendMessage)) {
+                sendMessage = MK.IM_SYS_FRIEND;
+            }
+
+            if (StringUtils.isEmpty(sendTitle)) {
+                sendTitle = MK.IM_SYS_TITLE;
+            }
+
+            // 拓展消息
+            PushExt pushExt = PushExt.build(sendTitle, 1,
+                    new PushExt.HW("channelId", "NORMAL"), new PushExt.VIVO("1"),
+                    new PushExt.APNs("", ""),
+                    new PushExt.OPPO(""));
+
+
+            List<String> targetIds = friendIds.stream().map(n -> imGroupService.getImUserId(n, friendType)).collect(Collectors.toList());
+            MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                    .senderId(imGroupService.getImUserId(customerServiceId.toString(), ClientEnum.TEACHER.getCode()))
+                    .targetIds(targetIds)
+                    //.objectName(txtMessage.getType())
+                    //.rongCloueMessage(txtMessage)
+                    .pushExt(JSON.toJSONString(pushExt))
+                    .includeSender(0)
+                    .build();
+
+
+            if (TencentCloudImPlugin.PLUGIN_NAME.equals(imPluginContext.defaultService())) {
+                // 腾讯IM消息
+                TencentRequest.MessageBody message = TencentRequest.MessageBody.builder()
+                        .msgType(ETencentMessage.TIMTextElem.name())
+                        .msgContent(TencentRequest.TextMessageBody.builder().text(sendMessage).build())
+                        .build();
+
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getMsgType()).tencentMessage(message));
+                log.info("registerUserBindCustomerService GROUP tencentCloud senderId={}, ret={}", build.getSenderId(), ret);
+            } else {
+                // 融云IM消息
+                TxtMessage message = new TxtMessage(sendMessage, "");
+                Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getType()).rongCloueMessage(message));
+                log.info("registerUserBindCustomerService GROUP rongCloud senderId={}, ret={}", build.getSenderId(), ret);
+            }
+        } catch (Exception e) {
+            log.error("registerUserBindCustomerService userId={}", customerServiceId, e);
+        }
+    }
+
+    /**
      * 发送系统客服消息
      *
      * @param sender 发送者

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

@@ -229,6 +229,9 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         VipCardRecordWrapper.UserVip userVip = vipCardRecordService.userVipInfo(orderDetailVo.getUserId(), orderDetailVo.getOrderClient());
         int svipDays = getSvipDays(detail, orderDetailVo.getGoodNum(), userVip);
+        if (userVip.getVipType() == EVipType.VIP) {
+            addVipCardRecord.setVipDays(Math.max(userVip.getVipEndDays()-1,0));
+        }
         if (detail.getVipType() == EVipType.SVIP &&userVip.getVipEndDays() !=null && svipDays >=userVip.getVipEndDays()) {
             addVipCardRecord.setVipDays(userVip.getVipEndDays());
         }

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

@@ -275,6 +275,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 if (queryInfo.getSubjectId() !=null) {
                     query.setSubjectIdList(Lists.newArrayList(queryInfo.getSubjectId()));
                 }
+                query.setState(YesOrNoEnum.YES);
+                query.setProviderType(SourceTypeEnum.PLATFORM);
                 query.setExcludeMusicIds(Lists.newArrayList(queryInfo.getMusicSheetId()));
                 if (StringUtils.isNotBlank(musicSheet.getMusicSubject())) {
                     List<Long> subjectIds = Arrays.stream(musicSheet.getMusicSubject().split(",")).filter(StringUtils::isNotBlank).map(Long::parseLong).collect(Collectors.toList());
@@ -286,6 +288,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             // 查询带有当前曲目标签的所有曲目
             MusicAlbumDetailSearch query = new MusicAlbumDetailSearch();
             query.setId(queryInfo.getAlbumId());
+            query.setState(YesOrNoEnum.YES);
             query.setType(2);
             if (queryInfo.getSubjectId() !=null) {
                 query.setSubjectIdList(Lists.newArrayList(queryInfo.getSubjectId()));
@@ -694,6 +697,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByIds(collect);
                     if (CollectionUtils.isNotEmpty(musicSheetIds) && musicSheetIds.contains(detail.getId())) {
                         detail.setPlay(YesOrNoEnum.YES);
+                        detail.setBuyed(true);
                     }
                 }
             } else if (ClientEnum.TEACHER == userType) {
@@ -703,6 +707,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     List<Long> musicSheetIds = tenantAlbumMusicService.getMusicIdsByTenantIds(teacher.getTenantId());
                     if (musicSheetIds.contains(detail.getId())) {
                         detail.setPlay(YesOrNoEnum.YES);
+                        detail.setBuyed(true);
                     }
                 }
             }
@@ -2396,6 +2401,20 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         return new ArrayList<>();
     }
 
+    @Override
+    public IPage<MusicSheetVo> queryTenantRelatedList(IPage<Object> page, MusicSheetRelatedQueryInfo queryInfo) {
+
+        MusicSheet musicSheet = musicSheetDao.get(queryInfo.getMusicSheetId());
+        if (musicSheet == null) {
+            throw new BizException("曲目不存在");
+        }
+        queryInfo.setMusicSheetType(musicSheet.getMusicSheetType());
+        if (musicSheet.getMusicSheetType() == MusicSheetTypeEnum.CONCERT) {
+            queryInfo.setSubjectId(null);
+        }
+        return musicSheetDao.queryTenantRelatedList(page,queryInfo);
+    }
+
 
     private void syncMusicSheet(MusicSheet record, Date date) {
         List<MusicSheetAccompaniment> list = musicSheetAccompanimentService.lambdaQuery().eq(MusicSheetAccompaniment::getMusicSheetId, record.getId()).list();

+ 205 - 86
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -67,6 +67,7 @@ import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
@@ -630,6 +631,12 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 }
             }
         } else {
+            // 客服状态变更,移交好友信息
+            Boolean customerService = teacher.getCustomerService();
+            List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = new ArrayList<>();
+            if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
+                customerServiceSendMsg2User.addAll(transferFriend(teacher.getUserId(), true));
+            }
             // 如果机构解绑,更新机构ID为-1
             if (Boolean.TRUE.equals(teacherSubmitReq.getBindTenant())) {
                 teacherSubmitReq.setTenantId(-1L);
@@ -650,11 +657,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 updateTenant(updateTenant, teacherSubmitReq.getUpdateBy());
             }
 
-            // 客服状态变更,移交好友信息
-            if (Boolean.TRUE.equals(teacher.getCustomerService()) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
-                transferFriend(teacher.getUserId());
-            }
-
             teacher.setUpdateTime(new Date());
             teacher = getTeacherDetil(teacher, teacherSubmitReq);
             if (null == teacher.getEntryAuthDate() || null == teacher.getMusicianDate()) {
@@ -667,106 +669,198 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             // 老师头像
             teacher.setAvatar(Optional.ofNullable(teacherSubmitReq.getAvatar()).orElse(teacher.getAvatar()));
             baseMapper.updateById(teacher);
+
+
+            // 交接后的客服发送消息
+            if (Boolean.TRUE.equals(customerService) && Boolean.FALSE.equals(teacherSubmitReq.getCustomerService())) {
+                String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
+                String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
+                for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
+                    imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getTeacherIds(),
+                            ClientEnum.TEACHER);
+                    imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getStudentIds(),
+                            ClientEnum.STUDENT);
+                }
+            }
+
         }
 
         return teacher;
     }
 
     // 客服好友移交给其他客服
-    private void transferFriend(Long userId) {
-        // 群里的好友保留
-        List<String> groupIdList = imGroupMemberService.lambdaQuery()
-                .eq(ImGroupMember::getUserId, userId)
-                .eq(ImGroupMember::getIsAdmin, true)
-                .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
-                .list()
-                .stream()
-                .map(ImGroupMember::getGroupId).collect(Collectors.toList());
-
-        List<Long> savedTeacherIdList = new ArrayList<>();
-        List<Long> savedStudentIdList = new ArrayList<>();
-
-        if (!groupIdList.isEmpty()) {
-            List<ImGroupMember> savedMemberList = imGroupMemberService.lambdaQuery()
-                    .in(ImGroupMember::getGroupId, groupIdList)
-                    .eq(ImGroupMember::getIsAdmin, false)
-                    .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Member)
-                    .list();
-
-            savedTeacherIdList.addAll(savedMemberList.stream()
-                    .filter(n -> ImGroupMemberRoleType.TEACHER.equals(n.getRoleType()))
-                    .map(ImGroupMember::getUserId)
-                    .collect(Collectors.toList()));
-
-            savedStudentIdList.addAll(savedMemberList.stream()
-                    .filter(n -> ImGroupMemberRoleType.STUDENT.equals(n.getRoleType()))
-                    .map(ImGroupMember::getUserId)
-                    .collect(Collectors.toList()));
-        }
-
-        List<ImUserFriend> friendList = imUserFriendService.lambdaQuery()
+    private List<TeacherWrapper.CustomerServiceSendMsg2User> transferFriend(Long userId, boolean saveGroupFriend) {
+        List<TeacherWrapper.CustomerServiceSendMsg2User> result = new ArrayList<>();
+        // 所有的好友
+        List<ImUserFriend> userFriendList = imUserFriendService.lambdaQuery()
                 .eq(ImUserFriend::getUserId, userId)
                 .eq(ImUserFriend::getClientType, ClientEnum.TEACHER)
                 .list();
 
-        friendList.removeIf(n -> {
-            if (ClientEnum.STUDENT.equals(n.getClientType())) {
-                return savedStudentIdList.contains(n.getFriendId());
+        // 其他客服
+        List<TeacherWrapper.TeacherFriend> customerServiceFriendNums = this.getBaseMapper().getCustomerServiceFriendNums();
+        customerServiceFriendNums.removeIf(n -> n.getTeacherId().equals(userId));
+        List<Long> customerIds = customerServiceFriendNums.stream().map(TeacherWrapper.TeacherFriend::getTeacherId).collect(Collectors.toList());
+        userFriendList.removeIf(n -> customerIds.contains(n.getFriendId()) && ClientEnum.TEACHER.equals(n.getFriendType()));
+        if (userFriendList.isEmpty()) { // 没有好友
+            return result;
+        }
+
+        List<ImUserFriend> removeFriendList = userFriendList;
+        if (saveGroupFriend) {
+            // 群里的好友保留
+            List<String> groupIdList = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getUserId, userId)
+                    .eq(ImGroupMember::getIsAdmin, true)
+                    .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                    .list()
+                    .stream()
+                    .map(ImGroupMember::getGroupId).collect(Collectors.toList());
+
+            List<Long> savedTeacherIdList = new ArrayList<>();
+            List<Long> savedStudentIdList = new ArrayList<>();
+
+            if (!groupIdList.isEmpty()) {
+                List<ImGroupMember> savedMemberList = imGroupMemberService.lambdaQuery()
+                        .in(ImGroupMember::getGroupId, groupIdList)
+                        .eq(ImGroupMember::getIsAdmin, false)
+                        .ne(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                        .list();
+
+                savedTeacherIdList.addAll(savedMemberList.stream()
+                        .filter(n -> ImGroupMemberRoleType.TEACHER.equals(n.getRoleType()))
+                        .map(ImGroupMember::getUserId)
+                        .collect(Collectors.toList()));
+
+                savedStudentIdList.addAll(savedMemberList.stream()
+                        .filter(n -> ImGroupMemberRoleType.STUDENT.equals(n.getRoleType()))
+                        .map(ImGroupMember::getUserId)
+                        .collect(Collectors.toList()));
             }
-            if (ClientEnum.TEACHER.equals(n.getClientType())) {
-                return savedTeacherIdList.contains(n.getFriendId());
+
+            // 机构好友保留
+            Teacher teacher = this.getById(userId);
+            List<Long> tenantTeacherIds = new ArrayList<>();
+            List<Long> tenantStudentIds = new ArrayList<>();
+            if (teacher.getTenantId() > 0) {
+                List<Long> teacherIdList = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getFriendType())).map(ImUserFriend::getFriendId).collect(Collectors.toList());
+                List<Long> studentIdList = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getFriendType())).map(ImUserFriend::getFriendId).collect(Collectors.toList());
+                if (!teacherIdList.isEmpty()) {
+                    List<Long> tenantTeacherIdsTemp = this.lambdaQuery().in(Teacher::getUserId, teacherIdList)
+                            .eq(Teacher::getTenantId, teacher.getTenantId())
+                            .list()
+                            .stream().filter(n -> n.getTenantId() > 0).map(Teacher::getUserId).collect(Collectors.toList());
+                    tenantTeacherIds.addAll(tenantTeacherIdsTemp);
+                }
+                if (!studentIdList.isEmpty()) {
+                    List<Long> tenantStudentIdsTemp = studentService.lambdaQuery().in(Student::getUserId, studentIdList)
+                            .eq(Student::getTenantId, teacher.getTenantId())
+                            .list()
+                            .stream().filter(n -> n.getTenantId() > 0).map(Student::getUserId).collect(Collectors.toList());
+                    tenantStudentIds.addAll(tenantStudentIdsTemp);
+                }
             }
-            return false;
+
+            // 删除的好友
+            removeFriendList = userFriendList.stream().filter(n -> {
+                if (ClientEnum.STUDENT.equals(n.getFriendType())) {
+                    if (tenantStudentIds.contains(n.getFriendId())) {
+                        return false;
+                    }
+                    return !savedStudentIdList.contains(n.getFriendId());
+                }
+                if (ClientEnum.TEACHER.equals(n.getFriendType())) {
+                    if (tenantTeacherIds.contains(n.getFriendId())) {
+                        return false;
+                    }
+                    return !savedTeacherIdList.contains(n.getFriendId());
+                }
+                return false;
+            }).collect(Collectors.toList());
+        }
+
+        // 删除好友
+        removeFriendList.stream().collect(Collectors.groupingBy(ImUserFriend::getFriendType)).forEach((client, friends) -> {
+            List<Long> friendIds = friends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
+            imUserFriendService.lambdaUpdate()
+                    .eq(ImUserFriend::getUserId, userId)
+                    .eq(ImUserFriend::getClientType, ClientEnum.TEACHER)
+                    .in(ImUserFriend::getFriendId, friendIds)
+                    .eq(ImUserFriend::getFriendType, client)
+                    .remove();
+
+            imUserFriendService.lambdaUpdate()
+                    .eq(ImUserFriend::getFriendId, userId)
+                    .eq(ImUserFriend::getFriendType, ClientEnum.TEACHER)
+                    .in(ImUserFriend::getUserId, friendIds)
+                    .eq(ImUserFriend::getClientType, client)
+                    .remove();
         });
-        if (friendList.isEmpty()) { // 没有好友
-            return;
+
+        if (customerIds.isEmpty()) {
+            return result;
         }
-        List<Long> customerIdList = getCustomerService().stream().map(Teacher::getUserId).collect(Collectors.toList());
-        customerIdList.removeIf(n -> n.equals(userId));
-        if (customerIdList.isEmpty()) { // 没有客服
-            return;
+        // 去除好友里面存在其他客服关系的好友,只有没有客服好友的好友,才需要与客服建立好友关系
+        List<ImUserFriend> teacherFriends = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getFriendType())).collect(Collectors.toList());
+        if (!teacherFriends.isEmpty()) {
+            String teacherFriendIds = teacherFriends.stream().map(n -> n.getFriendId().toString()).distinct().collect(Collectors.joining(","));
+            List<Long> existFriendIds = imUserFriendService.getDao().queryExistCustomerServiceFriend(teacherFriendIds, ClientEnum.TEACHER.getCode())
+                    .stream()
+                    .map(ImUserFriend::getUserId)
+                    .collect(Collectors.toList());
+            userFriendList.removeIf(n -> ClientEnum.TEACHER.equals(n.getFriendType()) && existFriendIds.contains(n.getFriendId()));
         }
-        List<ImUserFriend> userFriendList = friendList.stream()
-                .filter(n -> !ClientEnum.TEACHER.equals(n.getFriendType()) || !customerIdList.contains(n.getFriendId()))
-                .collect(Collectors.toList());
-        if (userFriendList.isEmpty()) { // 除去客服好友,没有其他好友
-            return;
+
+        List<ImUserFriend> studentFriends = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getFriendType())).collect(Collectors.toList());
+        if (!studentFriends.isEmpty()) {
+            String studentFriendIds = studentFriends.stream().map(n -> n.getFriendId().toString()).distinct().collect(Collectors.joining(","));
+            List<Long> existFriendIds = imUserFriendService.getDao().queryExistCustomerServiceFriend(studentFriendIds, ClientEnum.STUDENT.getCode())
+                    .stream()
+                    .map(ImUserFriend::getUserId)
+                    .collect(Collectors.toList());
+            userFriendList.removeIf(n -> ClientEnum.STUDENT.equals(n.getFriendType()) && existFriendIds.contains(n.getFriendId()));
+        }
+
+        if (userFriendList.isEmpty()) {
+            return result;
         }
 
         // 好友交接
-        List<TeacherWrapper.TeacherFriend> customerServiceFriendNums = this.getBaseMapper().getCustomerServiceFriendNums();
-        if (customerServiceFriendNums.size() == 1) { // 只有一个客服
-            List<ImUserFriend> teacherFriends = userFriendList.stream().filter(n -> ClientEnum.TEACHER.equals(n.getClientType())).collect(Collectors.toList());
-            if (!teacherFriends.isEmpty()) {
-                List<Long> friendIds = teacherFriends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
-                imUserFriendService.saveUserTeacherFriend(customerServiceFriendNums.get(0).getTeacherId(), new HashSet<>(friendIds));
-            }
-            List<ImUserFriend> studentFriends = userFriendList.stream().filter(n -> ClientEnum.STUDENT.equals(n.getClientType())).collect(Collectors.toList());
-            if (!studentFriends.isEmpty()) {
-                List<Long> friendIds = studentFriends.stream().map(ImUserFriend::getFriendId).collect(Collectors.toList());
-                imUserFriendService.saveUserFriend(customerServiceFriendNums.get(0).getTeacherId(), new HashSet<>(friendIds));
-            }
-        } else {
-            Map<Long, Set<Long>> teacherFriends = new LinkedHashMap<>();
-            Map<Long, Set<Long>> studentFriends = new LinkedHashMap<>();
-            for (ImUserFriend imUserFriend : userFriendList) {
-                TeacherWrapper.TeacherFriend teacherFriend = customerServiceFriendNums.get(0);
-                if (ClientEnum.TEACHER.equals(imUserFriend.getClientType())) {
-                    Set<Long> set = teacherFriends.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
-                    set.add(imUserFriend.getFriendId());
-                    teacherFriends.put(teacherFriend.getTeacherId(), set);
-                } else if (ClientEnum.STUDENT.equals(imUserFriend.getClientType())) {
-                    Set<Long> set = studentFriends.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
-                    set.add(imUserFriend.getFriendId());
-                    studentFriends.put(teacherFriend.getTeacherId(), set);
-                }
-                teacherFriend.setFriendNums(teacherFriend.getFriendNums() + 1);
-                Collections.sort(customerServiceFriendNums);
+        Map<Long, Set<Long>> teacherFriendMap = new LinkedHashMap<>();
+        Map<Long, Set<Long>> studentFriendMap = new LinkedHashMap<>();
+        for (ImUserFriend imUserFriend : userFriendList) {
+            TeacherWrapper.TeacherFriend teacherFriend = customerServiceFriendNums.get(0);
+            if (ClientEnum.TEACHER.equals(imUserFriend.getFriendType())) {
+                Set<Long> set = teacherFriendMap.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
+                set.add(imUserFriend.getFriendId());
+                teacherFriendMap.put(teacherFriend.getTeacherId(), set);
+            } else if (ClientEnum.STUDENT.equals(imUserFriend.getFriendType())) {
+                Set<Long> set = studentFriendMap.getOrDefault(teacherFriend.getTeacherId(), new HashSet<>());
+                set.add(imUserFriend.getFriendId());
+                studentFriendMap.put(teacherFriend.getTeacherId(), set);
             }
-
-            teacherFriends.forEach((key, value) -> imUserFriendService.saveUserTeacherFriend(key, value));
-            studentFriends.forEach((key, value) -> imUserFriendService.saveUserFriend(key, value));
-        }
+            teacherFriend.setFriendNums(teacherFriend.getFriendNums() + 1);
+            Collections.sort(customerServiceFriendNums);
+        }
+
+        teacherFriendMap.forEach((teacherId, teacherIds) -> {
+            imUserFriendService.saveUserTeacherFriend(teacherId, teacherIds);
+            // 发送消息
+            TeacherWrapper.CustomerServiceSendMsg2User customerServiceSendMsg2User = new TeacherWrapper.CustomerServiceSendMsg2User();
+            customerServiceSendMsg2User.setCustomerId(teacherId);
+            customerServiceSendMsg2User.getTeacherIds().addAll(teacherIds);
+            result.add(customerServiceSendMsg2User);
+//            imUserFriendService.sendCustomerServiceAddFriendMessage(teacherId, customerTitle, customerMessage, new ArrayList<>(teacherIds), ClientEnum.TEACHER);
+        });
+        studentFriendMap.forEach((teacherId, studentIds) -> {
+            imUserFriendService.saveUserFriend(teacherId, studentIds);
+            TeacherWrapper.CustomerServiceSendMsg2User customerServiceSendMsg2User = new TeacherWrapper.CustomerServiceSendMsg2User();
+            customerServiceSendMsg2User.setCustomerId(teacherId);
+            customerServiceSendMsg2User.getTeacherIds().addAll(studentIds);
+            result.add(customerServiceSendMsg2User);
+//            imUserFriendService.sendCustomerServiceAddFriendMessage(teacherId, customerTitle, customerMessage, new ArrayList<>(studentIds), ClientEnum.STUDENT);
+        });
+        return result;
     }
 
     /***
@@ -1407,4 +1501,29 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 .eq(Teacher::getLockFlag, false)
                 .list();
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateLock(SysUser sysUser, Long teacherId) {
+        Teacher teacher = this.getById(teacherId);
+        if (teacher == null) {
+            throw new BizException("无效的老师账号");
+        }
+
+        // 冻结客服,移交好友给其他客服
+        Boolean customerService = teacher.getCustomerService();
+        if (UserLockFlag.NORMAL.equals(teacher.getLockFlag()) && Boolean.TRUE.equals(customerService)) {
+            List<TeacherWrapper.CustomerServiceSendMsg2User> customerServiceSendMsg2User = transferFriend(teacherId, false);
+            String customerMessage = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG);
+            String customerTitle = sysConfigService.findConfigValue(SysConfigConstant.CUSTOMER_SERVICE_ADD_MSG_TITLE);
+            for (TeacherWrapper.CustomerServiceSendMsg2User serviceSendMsg2User : customerServiceSendMsg2User) {
+                imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getTeacherIds(),
+                        ClientEnum.TEACHER);
+                imUserFriendService.sendCustomerServiceAddFriendMessage(serviceSendMsg2User.getCustomerId(), customerTitle, customerMessage, serviceSendMsg2User.getStudentIds(),
+                        ClientEnum.STUDENT);
+            }
+        }
+        teacher.setLockFlag(UserLockFlag.NORMAL.equals(teacher.getLockFlag()) ? UserLockFlag.LOCKED : UserLockFlag.NORMAL);
+        this.updateById(teacher);
+    }
 }

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

@@ -296,11 +296,9 @@ public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordM
         tenantApplyRecord.setVerifyUserId(verifyUserId);
         tenantApplyRecord.setReason(entry.getReason());
         tenantApplyRecord.setBriefIntroduction(applyRecord.getBriefIntroduction());
-
-        applyRecord.setStatus(Boolean.TRUE.equals(ifPass) ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        applyRecord.setVerifyUserId(verifyUserId);
-        applyRecord.setReason(entry.getReason());
         if (ifPass == true){
+            tenantApplyRecord.setStatus(AuthStatusEnum.PASS);
+
 
             //机构账户新增逻辑
             TenantInfo tenantInfo = new TenantInfo();
@@ -315,13 +313,19 @@ public class TenantApplyRecordServiceImpl extends ServiceImpl<TenantApplyRecordM
             tenantInfo.setBriefIntroduction(applyRecord.getBriefIntroduction());
             if (tenantInfoService.add(tenantInfo)) {
                 applyRecord.setUserId(tenantInfo.getUserId());
+                tenantApplyRecordMapper.updateById(applyRecord);
             }
+            //更改当前记录的审核状态
+            tenantApplyRecordMapper.updateStatusById(id);
+        } else {
+            tenantApplyRecord.setStatus(AuthStatusEnum.UNPASS);
+            tenantApplyRecordMapper.updateUnpassStatusById(id);
         }
-        tenantApplyRecordMapper.updateById(applyRecord);
-
 
+        String name = tenantEntryRecordMapper.selectName(verifyUserId);
+        tenantApplyRecord.setVerifyUserName(name);
 
-        TenantEntryRecord tenantEntryRecord = JSON.parseObject(JSON.toJSONString(applyRecord), TenantEntryRecord.class);
+        TenantEntryRecord tenantEntryRecord = JSON.parseObject(JSON.toJSONString(tenantApplyRecord), TenantEntryRecord.class);
          tenantEntryRecordMapper.insert(tenantEntryRecord);
 
 

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

@@ -112,6 +112,9 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             periodType = PeriodEnum.MONTH.getCode();
         } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
             periodType = PeriodEnum.YEAR.getCode();
+        } else {
+            periodType = PeriodEnum.PERPETUAL.getCode();
+
         }
 
         return getVipCardRecord(orderDetailVo.getUserId(),orderDetailVo.getOrderClient(),orderDetailVo.getOrderNo(),
@@ -382,6 +385,28 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             int num = DateUtil.daysBetween(new Date(), userVip.getSvipEndDate()) +1;
             userVip.setSvipEndDays(Math.max(num, 0));
         }
+
+        // 设置会员过期时间
+        EVipType expireVipType = userVip.getExpireVipType();
+        List<VipCardRecordWrapper.UserVipInfo> userVipInfos = this.baseMapper.queryUserVipInfo(Collections.singletonList(userId), clientEnum.getCode());
+        if(!userVipInfos.isEmpty()){
+            VipCardRecordWrapper.UserVipInfo userVipInfo = userVipInfos.get(0);
+            Date date = new Date();
+            if (EVipType.VIP.equals(expireVipType) || EVipType.ALL_VIP.equals(expireVipType)) {
+                Date vipEndTime = userVipInfo.getVipEndTime();
+                if (vipEndTime != null && vipEndTime.before(date)) {
+                    double days = Math.ceil((date.getTime() - vipEndTime.getTime()) * 1.0D / (24 * 60 * 60 * 1000));
+                    userVip.setVipExpireDays((int) days);
+                }
+            }
+            if (EVipType.SVIP.equals(expireVipType) || EVipType.ALL_VIP.equals(expireVipType)) {
+                Date svipEndTime = userVipInfo.getSvipEndTime();
+                if (svipEndTime != null && svipEndTime.before(date)) {
+                    double days = Math.ceil((date.getTime() - svipEndTime.getTime()) * 1.0D / (24 * 60 * 60 * 1000));
+                    userVip.setSvipExpireDays((int) days);
+                }
+            }
+        }
         return userVip;
     }
 
@@ -588,6 +613,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         PeriodEnum period = addVipCardRecord.getType();
         // 扣减永久
         if (PeriodEnum.PERPETUAL.equals(period)) {
+            addVipCardRecord.setTimes(1);
             return deductedSVipPerpetual(addVipCardRecord, vipCardRecordList);
         }
 
@@ -597,6 +623,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             throw new BizException("剩余扣减数量不足");
         }
 
+        Date now = new Date();
         LocalDateTime maxEndTime = collect.stream().map(VipCardRecord::getEndTime).max(Comparator.naturalOrder()).get().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         // 扣减后的开始时间
         LocalDateTime deductedStartTime;
@@ -626,15 +653,18 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         if (deductedStartDate.before(minStartTime)) {
             double day = (minStartTime.getTime() - deductedStartDate.getTime()) * 1.0D / (24 * 60 * 60 * 1000);
             if (day > 1.0D) {
-//                throw new BizException("剩余扣减数量不足");
+                throw new BizException("剩余扣减数量不足");
             }
+//            deductedStartDate = minStartTime;
         }
 
         // 重新计算会员时间,每一条记录置换成一条新的记录,时间区间重新计算
         List<VipCardRecord> updateRecords = new ArrayList<>();
         Long deductMills = null;
+        Long endDeductMills = null;
 
         EVipType vipType = addVipCardRecord.getVipType();
+        boolean giveFlag = false; // 扣减后,剩余时间前移,第一条记录赠送当天的时间
         for (VipCardRecord vipCardRecord : vipCardRecordList) {
             Date startTime = vipCardRecord.getStartTime();
             Date endTime = vipCardRecord.getEndTime();
@@ -648,28 +678,43 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 
             Long addId = null;
             // 扣减到当前时间区间
-            if (deductedStartDate.after(startTime) && deductedStartDate.before(endTime)) {
-                VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
-                addRecord.setId(null);
-                addRecord.setDisplayFlag(false);
-                addRecord.setEfficientFlag(true);
-                addRecord.setEndTime(deductedStartDate);
-                addRecord.setStatus(EVipRecordStatus.UPDATE);
-                save(addRecord);
-                addId = addRecord.getId();
+            if ((deductedStartDate.after(startTime) || deductedStartDate.equals(startTime)) && deductedStartDate.before(endTime)) {
+                if (deductedStartDate.after(now)) { // 还有剩余天数,不足一天,补充到当前全天
+                    VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
+                    addRecord.setId(null);
+                    addRecord.setDisplayFlag(false);
+                    addRecord.setEfficientFlag(true);
+                    addRecord.setEndTime(formatEnd(deductedStartDate));
+                    addRecord.setStatus(EVipRecordStatus.UPDATE);
+                    save(addRecord);
+                    addId = addRecord.getId();
+                }
+
 
                 deductMills = endTime.getTime() - deductedStartDate.getTime();
+                endDeductMills = endTime.getTime() - formatEnd(deductedStartDate).getTime();
             } else {
-                // 有扣减,整体时间前移
-                if (deductMills != null) {
-                    VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
-                    newRecord.setId(null);
-                    newRecord.setEfficientFlag(true);
-                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
-                    newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
-                    newRecord.setStatus(EVipRecordStatus.UPDATE);
-                    save(newRecord);
-                    addId = newRecord.getId();
+                if (vipCardRecord.getVipType().equals(vipType)) {
+                    deductMills = endTime.getTime() - deductedStartDate.getTime();
+                    endDeductMills = endTime.getTime() - formatEnd(deductedStartDate).getTime();
+                } else {
+                    // 有扣减,整体时间前移
+                    if (deductMills != null) {
+                        VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
+                        newRecord.setId(null);
+                        newRecord.setDisplayFlag(false);
+                        newRecord.setEfficientFlag(true);
+                        if (!giveFlag) {
+                            newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
+                            giveFlag = true;
+                        } else {
+                            newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - endDeductMills));
+                        }
+                        newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - endDeductMills));
+                        newRecord.setStatus(EVipRecordStatus.UPDATE);
+                        save(newRecord);
+                        addId = newRecord.getId();
+                    }
                 }
             }
 
@@ -701,27 +746,36 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 
         // 最后一个非永久SVIP的结束时间
         Date lastUnPereutalDate = new Date();
-        long deductMills = 0L;
+        Date lastEndUnPereutalDate = formatEnd(new Date());
+        Long deductMills = null;
+        Long endDeductMills = null;
+        boolean giveFlag = false;
         for (VipCardRecord vipCardRecord : vipCardRecordList) {
             if (EVipType.SVIP.equals(vipCardRecord.getVipType())) {
                 // 获取后续VIP向前平移的开始时间
                 if (!PeriodEnum.PERPETUAL.equals(vipCardRecord.getType())) {
                     if (vipCardRecord.getEndTime().after(lastUnPereutalDate)) {
                         lastUnPereutalDate = vipCardRecord.getEndTime();
+                        lastEndUnPereutalDate = vipCardRecord.getEndTime();
                     }
                     continue;
                 }
                 vipCardRecord.setEfficientFlag(false);
                 updateById(vipCardRecord);
             } else {
-                deductMills += vipCardRecord.getStartTime().getTime() - lastUnPereutalDate.getTime();
-
                 VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
                 newRecord.setId(null);
                 newRecord.setDisplayFlag(false);
                 newRecord.setEfficientFlag(true);
-                newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
-                newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
+                if (vipCardRecord.getVipType().equals(addVipCardRecord.getVipType()) && !giveFlag) {
+                    deductMills = vipCardRecord.getStartTime().getTime() - lastUnPereutalDate.getTime();
+                    endDeductMills = vipCardRecord.getStartTime().getTime() - lastEndUnPereutalDate.getTime();
+                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
+                    giveFlag = true;
+                } else {
+                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - endDeductMills));
+                }
+                newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - endDeductMills));
                 save(newRecord);
                 Long refId = newRecord.getId();
 
@@ -878,4 +932,23 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
             log.error("会员添加消息发送失败 : {}", e.getMessage());
         }
     }
+
+    private Date formatEnd(Date date) {
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(date);
+        c1.set(Calendar.HOUR_OF_DAY, 23);
+        c1.set(Calendar.MINUTE, 59);
+        c1.set(Calendar.SECOND, 59);
+        return c1.getTime();
+    }
+
+    private Date formatStart(Date date) {
+        Calendar c1 = Calendar.getInstance();
+        c1.setTime(date);
+        c1.set(Calendar.HOUR_OF_DAY, 0);
+        c1.set(Calendar.MINUTE, 0);
+        c1.set(Calendar.SECOND, 0);
+        c1.set(Calendar.MILLISECOND, 0);
+        return c1.getTime();
+    }
 }

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/VipCardRecordWrapper.java

@@ -39,6 +39,12 @@ public class VipCardRecordWrapper {
 
         @ApiModelProperty(value = "svip剩余天数")
         private Integer svipEndDays =0;
+
+        @ApiModelProperty("vip失效天数")
+        private Integer vipExpireDays;
+
+        @ApiModelProperty("Svip失效天数")
+        private Integer svipExpireDays;
     }
 
     @ApiModel("添加/扣减会员")

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java

@@ -172,4 +172,23 @@ public class TeacherWrapper {
             return friendNums.compareTo(o.getFriendNums());
         }
     }
+
+
+    /**
+     * 客服发送消息的对象列表
+     */
+    @Data
+    public static class CustomerServiceSendMsg2User {
+
+        @ApiModelProperty("客服ID")
+        private Long customerId;
+
+        @ApiModelProperty("老师好友")
+        private List<Long> teacherIds = new ArrayList<>();
+
+
+        @ApiModelProperty("学生好友")
+        private List<Long> studentIds = new ArrayList<>();
+
+    }
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml

@@ -45,4 +45,17 @@
         WHERE (t1.user_id_ = #{userId} and t1.client_type_ = #{clientType} and t2.tenant_id_ = #{tenantId})
            OR (t1.friend_id_ = #{userId} and t1.friend_type_ = #{clientType} and t3.tenant_id_ = #{tenantId})
     </delete>
+
+    <select id="queryExistCustomerServiceFriend" resultMap="BaseResultMap">
+        select distinct t.*
+        from im_user_friend t
+                 left join teacher te on t.friend_id_ = te.user_id_ and te.customer_service_ = 1 and te.lock_flag_ = 0
+                 left join sys_user su on te.user_id_ = su.id_
+        where t.friend_type_ = 'TEACHER'
+          and find_in_set(t.user_id_, #{userIds})
+          and t.client_type_ = #{clientType}
+          and su.del_flag_ = 0
+          and su.lock_flag_ = 0
+          and te.user_id_ is not null
+    </select>
 </mapper>

+ 29 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -1041,5 +1041,34 @@
         from music_sheet
         where del_flag_ = 0 and audit_status_ = 'PASS' and cbs_music_sheet_id_ is null
     </select>
+
+    <select id="queryTenantRelatedList" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+
+        select
+        <include refid="Base_Column_List"/>
+        from music_sheet t
+            left join tenant_album_music t1 on t1.music_sheet_id_ = t.id_
+        <where>
+            t.del_flag_ = 0 and t.state_ =1  and t.audit_status_ = 'PASS' and t.cbs_music_sheet_id_ is not null
+            and t1.del_flag_=0 and t1.subject_type_ in ('ENSEMBLE', 'MUSIC', 'SUBJECT')
+            <if test="queryInfo.albumId != null">
+                and t1.tenant_album_id_ = #{queryInfo.albumId}
+            </if>
+
+            <if test="queryInfo.albumId == null">
+                and 1=2
+            </if>
+            <if test="queryInfo.musicSheetId != null">
+                and t.id_ != #{queryInfo.musicSheetId}
+            </if>
+            <if test="queryInfo.subjectId != null">
+                and find_in_set(#{queryInfo.subjectId},t.music_subject_)
+            </if>
+            <if test="queryInfo.musicSheetType != null">
+                and t.music_sheet_type_ = #{queryInfo.musicSheetType}
+            </if>
+        </where>
+
+    </select>
     <!--单曲专辑数量统计-->
 </mapper>

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

@@ -455,7 +455,7 @@
                count(distinct iuf.friend_id_) friendNums
         from teacher te
                  left join sys_user su on te.user_id_ = su.id_
-                 left join im_user_friend iuf on te.user_id_ = iuf.user_id_
+                 left join im_user_friend iuf on te.user_id_ = iuf.user_id_ and iuf.client_type_ = 'TEACHER'
         where te.lock_flag_ = 0
           and te.customer_service_ = 1
           and su.del_flag_ = 0