Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

weifanli 3 lat temu
rodzic
commit
f779093520
17 zmienionych plików z 242 dodań i 45 usunięć
  1. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/UsernameAuthenticationFilter.java
  2. 3 0
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java
  3. 2 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/service/CustomTokenServices.java
  4. 1 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java
  5. 3 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  6. 17 4
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/SysNewsInformationDao.java
  7. 17 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsInformationServiceImpl.java
  8. 14 0
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  9. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  10. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  11. 41 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  12. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  13. 46 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  14. 27 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  15. 21 6
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  17. 13 0
      toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/filter/UsernameAuthenticationFilter.java

@@ -73,6 +73,9 @@ public class UsernameAuthenticationFilter extends AbstractAuthenticationProcessi
 		if (userInfo == null) {
 			throw new UsernameNotFoundException("404.9");
 		}
+		if (userInfo.getSysUser().getLockFlag() == 1) {
+			throw new LockedException("用户已锁定");
+		}
 	
 //		if (userInfo.getSysUser().getUserType() != SysUserType.SYSTEM && !StringUtils.equalsIgnoreCase(clientId, userInfo.getSysUser().getUserType().getCode())) {
 //			throw new LockedException("登录失败");

+ 3 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -80,6 +80,9 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 			if (user == null) {
 				throw new LockedException("用户不存在");
 			}
+			if (user.getLockFlag() == 1) {
+				throw new LockedException("用户已锁定");
+			}
 			
 			if (StringUtils.isNotBlank(deviceNum)) {
 				sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum);

+ 2 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/service/CustomTokenServices.java

@@ -275,14 +275,13 @@ public class CustomTokenServices implements AuthorizationServerTokenServices, Re
 		return clientAuth.getClientId();
 	}
 	
-	public boolean revokeToken(String clientId, String phone){
+	public boolean revokeToken(String clientId, String phone) {
 		Collection<OAuth2AccessToken> list = tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.PHONE_PRINCIPAL_PREFIX + phone);
 
 		if (list == null || list.size() == 0) {
 			list = tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.USERNAME_PRINCIPAL_PREFIX + phone);
-		} else {
-			list.addAll(tokenStore.findTokensByClientIdAndUserName(clientId, SecurityConstants.USERNAME_PRINCIPAL_PREFIX + phone));
 		}
+
 		if (list != null) {
 			for (OAuth2AccessToken accessToken : list) {
 				if (accessToken != null) {

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserDeviceServiceImpl.java

@@ -52,7 +52,7 @@ public class SysUserDeviceServiceImpl extends BaseServiceImpl<Long, SysUserDevic
 
 			if (!deviceList.contains(deviceNum)) {
 				if (deviceList.size() >= 5) {
-					throw new BadCredentialsException("当前账号绑定设备过多,请联系主教老师");
+					throw new BadCredentialsException("登录失败,当前账号绑定设备过多");
 				}
 
 				SysUserDevice sysUserDevice = new SysUserDevice();

+ 3 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -318,13 +318,13 @@ public class UserController extends BaseController {
         
         if(lockFlag == 1){
         	if(sysUser.getUserType().contains("STUDENT")){
-        		tokenService.revokeToken("STUDENT", sysUser.getPhone());
+        		tokenService.revokeToken("student", sysUser.getPhone());
         	}
         	if(sysUser.getUserType().contains("TEACHER")){
-        		tokenService.revokeToken("TEACHER", sysUser.getPhone());
+        		tokenService.revokeToken("teacher", sysUser.getPhone());
         	}
         	if(sysUser.getUserType().contains("SYSTEM")){
-        		tokenService.revokeToken("SYSTEM", sysUser.getPhone());
+        		tokenService.revokeToken("system", sysUser.getPhone());
         	}
         }
         sysUser.setUpdateTime(new Date());

+ 17 - 4
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/SysNewsInformationDao.java

@@ -6,11 +6,13 @@ import java.util.Map;
 import com.yonge.cooleshow.cms.dal.entity.SysNewsInformation;
 import com.yonge.cooleshow.cms.dto.SysNewsInformationDto;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation> {
 
 	/**
 	 * 根据类型查询资讯列表
+	 *
 	 * @param type
 	 * @return
 	 */
@@ -18,21 +20,23 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 
 	/**
 	 * 逻辑删除
+	 *
 	 * @param id
 	 * @return
 	 */
 	int deleteWithLogical(Long id);
-	
+
 	List<SysNewsInformation> queryHomePage(Map<String, Object> params);
-	
+
 	int queryHomeCount(Map<String, Object> params);
-	
+
 	/**
 	 * 查询需要更新状态的对象集合
+	 *
 	 * @return
 	 */
 	List<SysNewsInformation> queryNeedUpdateStatusList();
-	
+
 	SysNewsInformationDto queryById(Long id);
 
 	/**
@@ -57,4 +61,13 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 	 * @param id
 	 */
     void updateStatus(Long id);
+
+	/**
+	 * 查看广告版本
+	 *
+	 * @param version 版本
+	 * @param status  状态
+	 * @return
+	 */
+	Integer selectByVersionAndStatus(@Param("version") String version, @Param("status") Integer status);
 }

+ 17 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.cms.dal.entity.NewsStatusEnum;
 import com.yonge.cooleshow.cms.dal.entity.SysNewsInformation;
 import com.yonge.cooleshow.cms.dto.SysNewsInformationDto;
 import com.yonge.cooleshow.cms.service.SysNewsInformationService;
+import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
@@ -176,8 +177,23 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
     @Override
 	@Transactional
     public boolean updateStatus(Long id) {
-		sysNewsInformationDao.updateStatus(id);
+		SysNewsInformationDto sysNewsInformationDto = sysNewsInformationDao.queryById(id);
+		if (sysNewsInformationDto.getType() != 2) {
+			sysNewsInformationDao.updateStatus(id);
+			return true;
+		}
+
+		if (sysNewsInformationDto.getStatus().getCode().equals(NewsStatusEnum.SHOW.getCode())) {
+			sysNewsInformationDao.updateStatus(id);
+			return true;
+		}
 
+		Integer count = sysNewsInformationDao.selectByVersionAndStatus(sysNewsInformationDto.getAttribute1(),NewsStatusEnum.SHOW.getCode());
+
+		if (count >0) {
+			throw  new BizException("有正在启用的公告");
+		}
+		sysNewsInformationDao.updateStatus(id);
 		return true;
     }
 

+ 14 - 0
cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -276,4 +276,18 @@
 	<update id="updateStatus">
 		UPDATE sys_news_information SET status_ = if(status_ = 0,1,0),update_time_ = NOW() WHERE id_ = #{id}
     </update>
+
+	<select id="selectByVersionAndStatus" resultType="java.lang.Integer">
+		select count(1)
+		from sys_news_information sni
+		<where>
+		sni.del_flag_ = 0 and sni.type_ = 2
+			<if test="status != null">
+				and sni.status_ = #{status}
+			</if>
+			<if test="version != null || version != ''">
+				and sni.attribute1_ = #{version}
+			</if>
+		</where>
+	</select>
 </mapper>

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -161,5 +162,8 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
      * @return
      */
     Integer selectWeekStudentRepliedCourseSchedule(@Param("userId") Long userId);
+
+    //根据订单号查询开课时间
+    List<String> selectStartTime(String orderNo);
 }
 

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

@@ -26,7 +26,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     LIVE_COMPLETION_SUCCESS("LIVE_COMPLETION_SUCCESS","直播课成课"),
     LIVE_COMPLETION_FAIL("LIVE_COMPLETION_FAIL","直播课成课失败"),
     TOMORROW_COURSE_REMINDER("TOMORROW_COURSE_REMINDER","明日课程提醒(每晚9点)"),
-    PRACTICE_REMINDER("PRACTICE_REMINDER","陪练课提醒(陪练课开始前20分钟)"),
+    STUDENT_PRACTICE_REMINDER("STUDENT_PRACTICE_REMINDER","陪练课提醒(陪练课开始前20分钟)"),
     LIVE_REMINDER("LIVE_REMINDER","直播课提醒(直播课开始前20分钟)"),
     COURSE_SETTLEMENT("COURSE_SETTLEMENT","课酬结算(每晚9点)"),
     NOT_EVALUATE_STUDENT_PRACTICE("NOT_EVALUATE_STUDENT_PRACTICE","当日陪练课未评价/布置作业(每晚9点30,已评价/已布置不发)"),
@@ -42,7 +42,13 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     PRACTICE_REMIND("PRACTICE_REMIND","陪练课提醒(陪练课开始前20分钟)"),
     LIVE_REMIND("LIVE_REMIND","直播课提醒(直播课开始前20分钟)"),
     NOT_EVALUATE_TEACHER_PRACTICE("NOT_EVALUATE_TEACHER_PRACTICE","当日陪练课未对老师评价(每晚9点,已评价不发)"),
-    FANSGROUP_APPLY_SUCCESS("FANSGROUP_APPLY_SUCCESS","粉丝群申请通过")
+    FANSGROUP_APPLY_SUCCESS("FANSGROUP_APPLY_SUCCESS","粉丝群申请通过"),
+
+    //------短信模板------
+    SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
+
+    SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱(短信)"),
+
     ;
 
     MessageTypeEnum(String code, String msg) {

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

@@ -22,6 +22,8 @@ import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -38,6 +40,8 @@ import java.util.stream.Collectors;
 @Service
 public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, CourseHomework> implements CourseHomeworkService {
 
+    private static final Logger log = LoggerFactory.getLogger(CourseHomeworkServiceImpl.class);
+
     @Autowired
     @Lazy
     private CourseScheduleService courseScheduleService;
@@ -133,7 +137,11 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
         if (flag) {
             // 发送给学生 ->老师布置作业消息
-            sendDecorateHomework(saveDto.getCourseScheduleId(), courseSchedule.getTeacherId());
+            try {
+                sendDecorateHomework(saveDto.getCourseScheduleId(), courseSchedule.getTeacherId());
+            } catch (Exception e) {
+                log.warn("老师布置作业信息发送失败,{}",e.getMessage());
+            }
         }
         return flag;
 
@@ -152,8 +160,8 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
         Map<Long,String> studentReceivers = new HashMap<>();
         studentReceivers.put(student.getId(), student.getPhone());
-        // todo url设置
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_DECORATE_HOMEWORK, studentReceivers, null, 0,null , ClientEnum.STUDENT.getCode(),teacher.getUsername(),"url");
+
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_DECORATE_HOMEWORK, studentReceivers, null, 0,"homework?courseId=" + courseScheduleId , ClientEnum.STUDENT.getCode(),teacher.getUsername());
     }
 
     /**
@@ -195,16 +203,24 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         boolean flag = studentCourseHomeworkService.reviewCourseHome(courseHomeworkDetailVo.getStudentHomeworkId(),reviewDto.getReview());
         if (flag) {
              // 发送消息给学生  老师点评作业
-            SysUser student = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getStudentId());
-            SysUser teacher = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getTeacherId());
-            Map<Long,String> studentReceivers = new HashMap<>();
-            studentReceivers.put(student.getId(), student.getPhone());
-            // todo url设置
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_REVIEW_HOMEWORK, studentReceivers, null, 0,null , ClientEnum.STUDENT.getCode(),teacher.getUsername(),"url");
+            try {
+                sendReviewMessage(reviewDto, courseHomeworkDetailVo);
+            } catch (Exception e) {
+                log.warn("老师点评作业消息发送失败,{}",e.getMessage());
+            }
         }
         return flag;
     }
 
+    // 发送老师点评信息
+    private void sendReviewMessage(CourseHomeworkReviewDto reviewDto, CourseHomeworkDetailVo courseHomeworkDetailVo) {
+        SysUser student = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getStudentId());
+        SysUser teacher = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getTeacherId());
+        Map<Long,String> studentReceivers = new HashMap<>();
+        studentReceivers.put(student.getId(), student.getPhone());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_REVIEW_HOMEWORK, studentReceivers, null, 0, "homework?courseId=" + reviewDto.getCourseScheduleId() , ClientEnum.STUDENT.getCode(), teacher.getUsername());
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean submitCourseHomework(CourseHomeworkSubmitDto submitDto) {
@@ -233,13 +249,11 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
             courseHomework.setCompletedNum(courseHomework.getCompletedNum() + 1);
             this.updateById(courseHomework);
 
-            // 发送学生提交作业消息给老师
-            SysUser student = sysUserFeignService.queryUserById(submitDto.getStudentId());
-            SysUser teacher = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getTeacherId());
-            Map<Long,String> receivers = new HashMap<>();
-            receivers.put(teacher.getId(), teacher.getPhone());
-            // todo url设置
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK, receivers, null, 0,null , ClientEnum.TEACHER.getCode(),student.getUsername(),"url");
+            try {
+                sendSubmitMessage(submitDto, courseHomeworkDetailVo);
+            }catch (Exception e) {
+                log.warn("学生提交作业消息发送失败,{}",e.getMessage());
+            }
             return true;
 
         } else {
@@ -248,6 +262,17 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
     }
 
+    //  发送学生提交作业消息
+    private void sendSubmitMessage(CourseHomeworkSubmitDto submitDto, CourseHomeworkDetailVo courseHomeworkDetailVo) {
+        // 发送学生提交作业消息给老师
+        SysUser student = sysUserFeignService.queryUserById(submitDto.getStudentId());
+        SysUser teacher = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getTeacherId());
+        Map<Long,String> receivers = new HashMap<>();
+        receivers.put(teacher.getId(), teacher.getPhone());
+
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK, receivers, null, 0, "homework?courseId=" + submitDto.getCourseScheduleId(), ClientEnum.TEACHER.getCode(), student.getUsername());
+    }
+
     @Override
     public IPage<CourseHomeworkVo> selectAdminPage(IPage<CourseHomeworkVo> page, HomeworkAdminSearch query) {
         IPage<CourseHomeworkVo> courseHomeworkVoIPage = page.setRecords(baseMapper.selectAdminPage(page, query));

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleRepliedDao;
@@ -11,16 +12,23 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseRepliedService;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo;
 import com.yonge.cooleshow.biz.dal.vo.MyRepliedVo;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @Author: cy
  * @Date: 2022/4/12
@@ -30,6 +38,10 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     private final static Logger log = LoggerFactory.getLogger(CourseRepliedServiceImpl.class);
 
     @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
     private CourseScheduleRepliedDao repliedDao;
     @Autowired
     private CourseScheduleDao scheduleDao;
@@ -85,6 +97,15 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
             return;
         }
         repliedDao.insert(replied);
+
+        //消息推送
+        SysUser student = sysUserFeignService.queryUserById(userId);
+        Map<Long, String> studentReceivers = new HashMap<>();
+        studentReceivers.put(studentId, student.getPhone());
+        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE,
+                studentReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                student.getUsername(), url);
     }
 
     /**

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

@@ -30,6 +30,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -42,6 +43,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
@@ -81,6 +85,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
     @Autowired
     private TeacherFreeTimeDao teacherFreeTimeDao;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -937,7 +943,47 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyPracticeCourseSuccess ok");
 
+        //消息推送
+        try {
+            practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(),paymentList.size() + "",orderNo);
+        }catch (Exception e){
+            log.error("陪练课消息推送失败");
+        }
+    }
 
+    public void practiceSend(Long teacherId, Long studentId,String courseNum,String orderNo) {
+        //查询老师&学生信息
+        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+
+        //消息接收者(Key:用户编号 value:消息接收对象)
+        Map<Long, String> teacherReceivers = new HashMap<>();
+        teacherReceivers.put(teacherId, teacher.getPhone());
+        Map<Long, String> studentReceivers = new HashMap<>();
+        studentReceivers.put(studentId, student.getPhone());
+
+        //老师端-学生买陪练课
+        String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_PRACTICE.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
+                teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                student.getUsername(),courseNum, teacherUrl);
+
+        //学生端-买陪练课
+        String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
+                studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                teacher.getUsername(), courseNum, studentUrl);
+
+        //陪练课开课提醒
+        List<String> startTimeList = baseMapper.selectStartTime(orderNo);
+        for (String startTime : startTimeList) {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PRACTICE_REMINDER,
+                    teacherReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.TEACHER.getCode(),
+                    student.getUsername());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_REMIND,
+                    studentReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername());
+        }
     }
 
     /**

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

@@ -274,17 +274,27 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         Map<Long,String> receivers = new HashMap<>();
         SysUser teacher = sysUserFeignService.queryUserById(musicSheet.getUserId());
         receivers.put(musicSheet.getUserId(), teacher.getPhone());
-        if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.MUSIC_SHEET_AUTH_PASS,
-                                               receivers,null,0,null,ClientEnum.TEACHER.getCode(),musicSheet.getMusicSheetName());
-        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())){
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,MessageTypeEnum.MUSIC_SHEET_AUTH_UNPASS,
-                                               receivers,null,0,null,ClientEnum.TEACHER.getCode(),musicSheet.getMusicSheetName(),param.getRemark());
+        try {
+            sendMusicSheetAuditMessage(param, musicSheet, receivers);
+        } catch (Exception e) {
+            log.warn("曲目审核消息发送失败,{}",e.getMessage());
         }
 
         return flag;
     }
 
+    // 发送曲目审核消息
+    private void sendMusicSheetAuditMessage(TeacherMusicSheetAuditReq param, MusicSheet musicSheet, Map<Long, String> receivers) {
+        if (AuthStatusEnum.PASS.getCode().equals(param.getAuthStatus().getCode())) {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_PASS,
+                                               receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName());
+        } else if (AuthStatusEnum.UNPASS.getCode().equals(param.getAuthStatus().getCode())){
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSIC_SHEET_AUTH_UNPASS,
+                                               receivers, null, 0, null, ClientEnum.TEACHER.getCode(), musicSheet.getMusicSheetName(),
+                                               param.getRemark());
+        }
+    }
+
     @Override
     public boolean del(Long id) {
 
@@ -400,7 +410,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         addTeacherAccount(userOrderDetailVo, actualPrice, serviceFeeAmount, userOrderDetailVo.getBizId());
 
         // 消息通知
-        sendBuyMessage(userOrderDetailVo.getMerchId(),userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+        try {
+            sendBuyMessage(userOrderDetailVo.getMerchId(),userOrderDetailVo.getUserId(),userOrderDetailVo.getBizId());
+        }catch (Exception e) {
+            log.warn("学生购买曲目消息推送失败 {}",e.getMessage());
+        }
     }
 
     /**
@@ -435,7 +449,12 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         // todo 乐谱连接
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
                                            MessageTypeEnum.STUDENT_BUY_MUSIC_SHEET_SUCCESS, studentReceivers, null,
-                                           0, null,ClientEnum.STUDENT.getCode(),musicSheet.getMusicSheetName(),"url");
+                                           0, null,ClientEnum.STUDENT.getCode(),musicSheet.getMusicSheetName());
+        // 推送学生
+        Map<Long,String> studentSMS = new HashMap<>();
+        studentSMS.put(studentId, student.getPhone());
+        // 推送短信
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS,studentSMS,null,0,null,null,musicSheet.getMusicSheetName());
 
         return true;
     }

+ 21 - 6
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -342,19 +342,28 @@
         t.subject_ AS schoolSubject,
 
         (SELECT group_concat(p.subject_name_) FROM teacher_subject_price p WHERE find_in_set(t.user_id_,p.teacher_id_)) AS configSubject,
-        sp.subject_id_ AS subjectId,
-        sp.subject_name_ AS subjectName,
-        sp.subject_price_ AS subjectPrice,
-        sp.course_minutes_ AS courseMinutes
+        sp.subjectId AS subjectId,
+        sp.subjectName AS subjectName,
+        sp.subjectPrice AS subjectPrice,
+        sp.courseMinutes AS courseMinutes
 
         FROM teacher t
         LEFT JOIN sys_user u ON t.user_id_ = u.id_
         LEFT JOIN teacher_total tt ON t.user_id_=tt.user_id_
-        LEFT JOIN teacher_subject_price sp ON t.user_id_=sp.teacher_id_
+        LEFT JOIN (SELECT
+        f.teacher_id_ AS teacherId,
+        p.subject_id_ AS subjectId,
+        p.subject_name_ AS subjectName,
+        p.subject_price_ AS subjectPrice,
+        p.course_minutes_ AS courseMinutes
+        FROM teacher_free_time f
+        LEFT JOIN teacher_subject_price p ON f.id_=p.teacher_free_time_id
+        WHERE f.default_flag_=1
+        AND p.subject_id_=#{param.subjectId}) sp ON t.user_id_=sp.teacherId
 
         WHERE t.user_id_ IN (SELECT teacher_id_ FROM teacher_free_time GROUP BY teacher_id_)
         <if test="param.subjectId !=null">
-            AND sp.subject_id_=#{param.subjectId}
+            AND sp.subjectId=#{param.subjectId}
         </if>
         <if test="param.search !=null and param.search !=''">
             AND u.username_ LIKE CONCAT('%', #{param.search}, '%')
@@ -563,4 +572,10 @@
         where cs.teacher_id_ = #{userId} and cs.status_ = 'COMPLETE' and cs.type_ = 'PRACTICE'
         and csr.student_replied_ is not null
     </select>
+    <select id="selectStartTime" resultType="java.lang.String" parameterType="java.lang.String">
+        SELECT s.start_time_
+        FROM course_schedule_student_payment p
+        LEFT JOIN course_schedule s ON p.course_id_=s.id_
+        WHERE p.order_no_=#{orderNo}
+    </select>
 </mapper>

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

@@ -247,7 +247,7 @@
 			</if>
 			<if	test="param.studentId != null">
 				g.id_ IN
-				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_=1)
+				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_='PAID')
 			</if>
 		</where>
 		ORDER BY g.create_time_ DESC

+ 13 - 0
toolset/utils/src/main/java/com/yonge/toolset/utils/date/DateUtil.java

@@ -1306,6 +1306,19 @@ public class DateUtil {
         }
     }
 
+	public static Date offsetMinute(String time,int offset){
+		try {
+			Date parse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time);
+			Calendar beforeTime = Calendar.getInstance();
+			beforeTime.setTime(parse);
+			beforeTime.add(Calendar.MINUTE, offset);
+			return beforeTime.getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
 	public static void main(String[] args) throws ParseException {
 		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");