Browse Source

vip定制课

zouxuan 8 tháng trước cách đây
mục cha
commit
07171f78af
24 tập tin đã thay đổi với 407 bổ sung85 xóa
  1. 22 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MemberPriceSettingsController.java
  2. 6 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  3. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java
  4. 10 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  5. 2 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  6. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java
  7. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  8. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/course/CourseTypeEnum.java
  9. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  11. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java
  12. 24 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  13. 36 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  14. 34 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  15. 43 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  16. 98 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  17. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  18. 83 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  19. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java
  20. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthMusicianRecordServiceImpl.java
  21. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  22. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  23. 11 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  24. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

+ 22 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MemberPriceSettingsController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
+import com.yonge.cooleshow.biz.dal.enums.EVipType;
 import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
@@ -13,6 +14,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -20,6 +22,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RequestMapping("${app-config.url.admin:}/memberPriceSettings")
 @Api(tags = "会员价格设置")
@@ -44,6 +49,23 @@ public class MemberPriceSettingsController extends BaseController {
 		return succeed(PageUtil.pageInfo(pages));
 	}
 
+	@GetMapping("/groupList")
+	@ApiOperation(value = "按分类分组")
+	@PreAuthorize("@pcs.hasPermissions('memberPriceSettings/groupList')")
+	public HttpResponseResult<Map<EVipType, List<MemberPriceSettingsVo>>> groupList() {
+		MemberPriceSettingsSearch query = new MemberPriceSettingsSearch();
+		query.setStatus(true);
+		query.setSearchType("VIP,SVIP,DISCOUNT");
+		query.setPage(1);
+		query.setRows(1000);
+		IPage<MemberPriceSettingsVo> pages = memberPriceSettingsService.selectPage(PageUtil.getPage(query), query);
+		List<MemberPriceSettingsVo> records = pages.getRecords();
+		if (CollectionUtils.isNotEmpty(records)) {
+			return succeed(records.stream().collect(Collectors.groupingBy(MemberPriceSettingsVo::getVipType));
+		}
+		return succeed();
+	}
+
 	@PostMapping(value = "/update", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
 	@ApiOperation(value = "修改", notes = "传入memberPriceSettings")
 	@PreAuthorize("@pcs.hasPermissions('memberPriceSettings/update')")

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

@@ -258,4 +258,10 @@ public class TaskController extends BaseController {
     public void workOverdue(){
         userMusicService.workOverdue();
     }
+
+    //课程开始前一20分组提醒
+    @GetMapping("/courseStartRemind")
+    public void courseStartRemind(){
+        courseScheduleService.courseStartRemind();
+    }
 }

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -114,7 +114,7 @@ public class CourseHomeworkController extends BaseController {
         return succeed(courseHomeworkService.decorateCourseHomework(saveDto));
     }
 
-    @ApiOperation(value = "趣纠课-作业点评", httpMethod = "POST", consumes = "application/json", produces = "application/json")
+    @ApiOperation(value = "作业点评", httpMethod = "POST", consumes = "application/json", produces = "application/json")
     @PostMapping(value = "/review", consumes = "application/json", produces = "application/json")
     public HttpResponseResult<Boolean> reviewCourseHomework(@Valid @RequestBody CourseHomeworkReviewDto reviewDto) {
         Long userId = sysUserService.getUserId();

+ 10 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -2,12 +2,16 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
@@ -19,8 +23,10 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import io.swagger.annotations.*;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -46,6 +52,9 @@ public class TeacherCourseGroupController extends BaseController {
     private SysUserService sysUserService;
 
     @Resource
+    private SysMessageService sysMessageService;
+
+    @Resource
     private AppVersionInfoService appVersionInfoService;
     @ApiOperation("直播课详情")
     @GetMapping("/queryLiveCourseInfo")
@@ -162,7 +171,7 @@ public class TeacherCourseGroupController extends BaseController {
     @ApiOperation("修改课程规划")
     @PostMapping("/updateCoursePlan")
     public HttpResponseResult<Object> updateCoursePlan(Long groupId, String coursePlan) {
-        courseGroupService.lambdaUpdate().eq(CourseGroup::getId, groupId).set(CourseGroup::getCoursePlan, coursePlan).update();
+        courseGroupService.updateCoursePlan(groupId, coursePlan);
         return succeed();
     }
 }

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

@@ -7,6 +7,8 @@ package com.yonge.cooleshow.common.constant;
  * @Data: 2022/3/24 10:18
  */
 public interface SysConfigConstant {
+    //域名
+    String BASE_API_URL = "base_api_url";
     /***
      * 开通直播需要的粉丝数
      * @author liweifan

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java

@@ -63,7 +63,6 @@ public class CourseSchedule implements Serializable {
     @ApiModelProperty(value = "休息时长结束时间")
     private Date freeEndTime;
 
-
     @TableField("lock_")
     @ApiModelProperty(value = "购买趣纠课及创建直播课时需要锁定课时 0未锁 1锁定")
     private Integer lock;
@@ -112,5 +111,8 @@ public class CourseSchedule implements Serializable {
     @TableField("cancel_mute_flag_")
     private Boolean cancelMuteFlag = true;
 
+    @ApiModelProperty("是否推送过开课消息")
+    @TableField("push_start_msg_")
+    private Boolean pushStartMsg = false;
 }
 

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

@@ -58,6 +58,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     COURSE_SETTLEMENT("课酬结算(每晚9点)"),
     NOT_EVALUATE_STUDENT_PRACTICE("当日趣纠课未评价/布置作业(每晚9点30,已评价/已布置不发)"),
     STUDENT_EVALUATE_TEACHER_PRACTICE("学员对老师评价"),
+    TEACHER_EVALUATE_STUDENT_PRACTICE("老师对学员评价"),
     WITHDRAWAL_SUCCESS("结算成功"),
     STUDENT_JOIN_FANSGROUP("学员申请加入粉丝群"),
     STUDENT_AUTOJOIN_FANSGROUP("学员自动加入粉丝群"),
@@ -155,7 +156,9 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SYS_SUGGEST_FEEDBACK_STUDENT("意见反馈推送"),
     SYS_SUGGEST_FEEDBACK_TEACHER("意见反馈推送"),
     STUDENT_BUY_COURSE_TO_TEACHER("约课提醒"),
-    STUDENT_BUY_COURSE_TO_STUDENT("约课成功")
+    STUDENT_BUY_COURSE_TO_STUDENT("约课成功"),
+    //老师修改课程规划
+    TEACHER_UPDATE_COURSE_PLAN("老师修改课程规划"),
     ;
 
     MessageTypeEnum(String msg) {

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

@@ -14,7 +14,7 @@ public enum CourseTypeEnum implements BaseEnum<String, CourseTypeEnum> {
     LIVE("直播课"),
     PIANO_ROOM_CLASS("琴房课"),
     VIDEO("视频课"),
-    VIP("VIP课"),
+    VIP("VIP定制课"),
     ;
 
     @EnumValue

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

@@ -376,5 +376,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
                                                                   CourseGroupWrapper.TeacherCourseGroupQuery query);
 
     List<CourseGroupWrapper.CourseStudentVo> queryStudentByGroupId(Long groupId);
+
+    void updateCoursePlan(Long groupId, String coursePlan);
 }
 

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

@@ -305,5 +305,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     List<CourseScheduleWrapper.MyCourseVo> queryList(CourseScheduleWrapper.CourseQuery query);
 
     List<CourseScheduleWrapper.StudentCourseList> queryListByStudent(CourseScheduleWrapper.CourseQuery query);
+
+    void courseStartRemind();
 }
 

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMessageService.java

@@ -35,6 +35,9 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Long, String> receivers, Date triggerTime,
 			Integer readStatus, String url,String jpushType, Object... args);
 
+	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum messageType, Map<Long, String> receivers,String[] urlArgs, Date triggerTime,
+			Integer readStatus, String jpushType, Object... args);
+
 
 	/**
 	 * 发送验证码
@@ -91,6 +94,8 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 
 //	String selectConfigUrlJumpType(String messageType, String jumpType, Object... param);
 
+	String selectConfigUrlJumpType(String messageType, String jumpType, Object... param);
+
 	List<SysMessageWrapper.MessageUnreadStat> userMessageUnreadStat(SysMessageWrapper.SysMessageQuery query);
 
 	PageInfo<SysMessage> queryListPage(SysMessageQueryInfo queryInfo);

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

@@ -456,29 +456,30 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
                 if(CollectionUtils.isNotEmpty(activityPlans)){
                     throw new BizException("会员买赠活动时间与其他会员活动时间有交集");
                 }
-            }
-            if (null == activityPlan.getRegistrationMethod()) {
-                throw new BizException("报名缴费方式不能为空");
-            }
-            if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
-                    && (null == activityPlan.getRegistrationPrice() || BigDecimal.ZERO.compareTo(activityPlan.getRegistrationPrice()) > 0)) {
-                throw new BizException("活动收费时,报名金额不能为空");
-            }
-            if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
-                    && (null == activityPlan.getShareRate())) {
-                throw new BizException("活动收费时,分润比例不能为空");
-            }
-            if (StringUtil.isEmpty(activityPlan.getSubjectUrl())) {
-                throw new BizException("主题图片不能为空");
-            }
-            if (StringUtil.isEmpty(activityPlan.getBackgroundUrl())) {
-                throw new BizException("平铺背景不能为空");
-            }
-            if (StringUtil.isEmpty(activityPlan.getShareUrl())) {
-                throw new BizException("分享图片不能为空");
-            }
-            if (StringUtil.isEmpty(activityPlan.getRuleDescribe())) {
-                throw new BizException("活动规则不能为空");
+            }else {
+                if (null == activityPlan.getRegistrationMethod()) {
+                    throw new BizException("报名缴费方式不能为空");
+                }
+                if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
+                        && (null == activityPlan.getRegistrationPrice() || BigDecimal.ZERO.compareTo(activityPlan.getRegistrationPrice()) > 0)) {
+                    throw new BizException("活动收费时,报名金额不能为空");
+                }
+                if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
+                        && (null == activityPlan.getShareRate())) {
+                    throw new BizException("活动收费时,分润比例不能为空");
+                }
+                if (StringUtil.isEmpty(activityPlan.getSubjectUrl())) {
+                    throw new BizException("主题图片不能为空");
+                }
+                if (StringUtil.isEmpty(activityPlan.getBackgroundUrl())) {
+                    throw new BizException("平铺背景不能为空");
+                }
+                if (StringUtil.isEmpty(activityPlan.getShareUrl())) {
+                    throw new BizException("分享图片不能为空");
+                }
+                if (StringUtil.isEmpty(activityPlan.getRuleDescribe())) {
+                    throw new BizException("活动规则不能为空");
+                }
             }
         }
 

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

@@ -18,6 +18,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -493,6 +494,34 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         return Collections.emptyList();
     }
 
+    @Override
+    public void updateCoursePlan(Long groupId, String coursePlan) {
+        CourseGroup courseGroup = this.getById(groupId);
+        if (courseGroup == null) {
+            throw new BizException("课程组不存在!");
+        }
+        this.lambdaUpdate().eq(CourseGroup::getId, groupId).set(CourseGroup::getCoursePlan, coursePlan).update();
+        if(StringUtils.isNotEmpty(coursePlan)){
+            List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.lambdaQuery().
+                    eq(CourseScheduleStudentPayment::getCourseGroupId, groupId).list();
+            if(CollectionUtils.isNotEmpty(studentPayments)){
+                SysUser user = sysUserService.getUser();
+                List<Long> userIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
+                Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> userMap = sysUserService.getMapByIds(userIds);
+                Map<Long,String> receiverMap = userMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,e->e.getValue().getPhone()));
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                        MessageTypeEnum.TEACHER_UPDATE_COURSE_PLAN,
+                        receiverMap,
+                        new String[]{groupId.toString()},
+                        null,
+                        0,
+                        ClientEnum.STUDENT.getCode(),
+                        user.getRealName(),
+                        CourseTypeEnum.valueOf(courseGroup.getType()));
+            }
+        }
+    }
+
     /**
      *
      * 直播课购买后数据写入
@@ -1114,34 +1143,34 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             //极光-消息推送-学生端-通知学生购买成功-跳转到APP
             MessageTypeEnum liveBuy = MessageTypeEnum.LIVE_BUY;
             //查询推送跳转的url
-            String liveBuyUrl = sysMessageService.selectConfigUrl(liveBuy.getCode());
+//            String liveBuyUrl = sysMessageService.selectConfigUrl(liveBuy.getCode());
             Map<Long, String> studentReceivers = new HashMap<>();
             studentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveBuy,
-                    studentReceivers, null, 0, liveBuyUrl, ClientEnum.STUDENT.getCode(),payType,
+                    studentReceivers, null, 0, "", ClientEnum.STUDENT.getCode(),payType,
                     teacherInfo.getUsername(), courseGroup.getName());
             log.info("buyLiveCourseSuccess buyLiveSendMessage LIVE_BUY ok");
 
             //短信-消息推送-学生端-通知学生购买成功-跳转到APP
             MessageTypeEnum smsLiveBuy = MessageTypeEnum.SMS_LIVE_BUY;
             //查询推送跳转的url
-            String smsLiveBuyUrl = sysMessageService.selectConfigUrl(smsLiveBuy.getCode());
+//            String smsLiveBuyUrl = sysMessageService.selectConfigUrl(smsLiveBuy.getCode());
             Map<Long, String> smsStudentReceivers = new HashMap<>();
             smsStudentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsLiveBuy,
-                    smsStudentReceivers, null, 0, null, null,payType,
-                    teacherInfo.getUsername(), courseGroup.getName(), smsLiveBuyUrl);
+                    smsStudentReceivers, null, 0, null,payType,
+                    teacherInfo.getUsername(), courseGroup.getName());
             log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
 
             if (studentPayment.getActualPrice().compareTo(BigDecimal.ZERO) >0) {
                 //极光-消息推送-老师端-通知老师有学生购买课程-跳转到APP
                 MessageTypeEnum studentBuyLive = MessageTypeEnum.STUDENT_BUY_LIVE;
                 //查询推送跳转的url
-                String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode(), courseGroup.getId());
+//                String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode(), courseGroup.getId());
                 Map<Long, String> teacherReceivers = new HashMap<>();
                 teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
-                                                   teacherReceivers, null, 0, studentBuyLiveUrl, ClientEnum.TEACHER.getCode(),
+                                                   teacherReceivers,new String[]{courseGroup.getId().toString()},  null, 0, null,ClientEnum.TEACHER.getCode(),
                                                    studentInfo.getUsername(), courseGroup.getName());
                 log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
 

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

@@ -18,6 +18,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 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.enums.course.CourseTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wordfilter.WordFilter;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -250,7 +251,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         if (flag) {
             // 发送给学生 ->老师布置作业消息
             try {
-                sendDecorateHomework(saveDto.getCourseScheduleId(), courseSchedule.getTeacherId());
+                sendDecorateHomework(courseSchedule);
             } catch (Exception e) {
                 log.warn("老师布置作业信息发送失败,{}",e.getMessage());
             }
@@ -265,23 +266,29 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
      * @param courseScheduleId 课程id
      * @param teacherId 老师id
      */
-    private void sendDecorateHomework(Long courseScheduleId,Long teacherId) {
+    private void sendDecorateHomework(CourseSchedule courseSchedule) {
         List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getByCourseId(
-                courseScheduleId);
+                courseSchedule.getId());
         if (paymentList.isEmpty()) {
             return;
         }
-        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_DECORATE_HOMEWORK.getCode(),courseScheduleId);
+        SysUser teacher = sysUserFeignService.queryUserById(courseSchedule.getTeacherId());
+//        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_DECORATE_HOMEWORK.getCode(),courseSchedule.getId());
         for (CourseScheduleStudentPayment courseScheduleStudentPayment : paymentList) {
             SysUser student = sysUserFeignService.queryUserById(courseScheduleStudentPayment.getUserId());
             Map<Long,String> studentReceivers = new HashMap<>();
             studentReceivers.put(student.getId(), student.getPhone());
 
             try {
-                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum
-                       .TEACHER_DECORATE_HOMEWORK,studentReceivers, null, 0,url ,
-                       ClientEnum.STUDENT.getCode(),teacher.getUsername());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                        MessageTypeEnum.TEACHER_DECORATE_HOMEWORK,
+                        studentReceivers,
+                        new String[]{courseSchedule.getId().toString()},
+                        null,
+                        0 ,
+                        ClientEnum.STUDENT.getCode(),
+                        teacher.getRealName(),
+                        CourseTypeEnum.valueOf(courseSchedule.getType()).getMsg());
             } catch (Exception e) {
                 log.warn("老师布置作业消息发送失败  学生id:{}",student.getId());
             }
@@ -344,9 +351,15 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         SysUser teacher = sysUserFeignService.queryUserById(courseHomeworkDetailVo.getTeacherId());
         Map<Long,String> studentReceivers = new HashMap<>();
         studentReceivers.put(student.getId(), student.getPhone());
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_REVIEW_HOMEWORK.getCode(),reviewDto.getCourseScheduleId());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_REVIEW_HOMEWORK,
-        studentReceivers, null, 0, url , ClientEnum.STUDENT.getCode(), teacher.getUsername());
+//        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_REVIEW_HOMEWORK.getCode(),reviewDto.getCourseScheduleId());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                MessageTypeEnum.TEACHER_REVIEW_HOMEWORK,
+                studentReceivers,
+                new String[]{reviewDto.getCourseScheduleId().toString()},
+                null,
+                0 ,
+                ClientEnum.STUDENT.getCode(),
+                teacher.getRealName());
     }
 
     @Override
@@ -407,9 +420,16 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         Map<Long,String> receivers = new HashMap<>();
         receivers.put(teacher.getId(), teacher.getPhone());
 
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK.getCode(),submitDto.getCourseScheduleId(),student.getId());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK,
-        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), student.getUsername());
+//        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK.getCode(),submitDto.getCourseScheduleId(),student.getId());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK,
+                receivers,
+                new String[]{submitDto.getCourseScheduleId().toString(),student.getId().toString()},
+                null,
+                0,
+                ClientEnum.TEACHER.getCode(),
+                student.getUsername(),
+                courseHomeworkDetailVo.getCourseType().getMsg());
     }
 
     @Override

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

@@ -15,6 +15,7 @@ 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.enums.course.CourseTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseRepliedService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.CourseRepliedVo;
@@ -100,6 +101,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
             }else {
                 repliedDao.insert(replied);
             }
+            teacherRepliedSend(courseSchedule, userId);
         }else {
             //当前用户为学员
             isPayment(userId, scheduleId);
@@ -111,7 +113,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
             }else {
                 repliedDao.insert(replied);
             }
-            repliedSend(courseSchedule.getTeacherId(), userId);
+            repliedSend(courseSchedule, userId);
         }
     }
 
@@ -120,18 +122,51 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
      * @Author: cy
      * @Date: 2022/5/6
      */
-    public void repliedSend(Long teacherId, Long studentId) {
+    public void teacherRepliedSend(CourseSchedule courseSchedule, Long studentId) {
+        CourseTypeEnum courseTypeEnum = CourseTypeEnum.valueOf(courseSchedule.getType());
         try {
             SysUser student = sysUserFeignService.queryUserById(studentId);
-            SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+            SysUser teacher = sysUserFeignService.queryUserById(courseSchedule.getTeacherId());
 
             Map<Long, String> teacherReceivers = new HashMap<>();
-            teacherReceivers.put(teacherId, teacher.getPhone());
+            teacherReceivers.put(studentId, student.getPhone());
+
+//            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_EVALUATE_STUDENT_PRACTICE.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.TEACHER_EVALUATE_STUDENT_PRACTICE,
+                    teacherReceivers,
+                    new String[]{courseSchedule.getId().toString(),studentId.toString()},
+                    null,
+                    0,
+                    ClientEnum.STUDENT.getCode(),
+                    teacher.getRealName(),
+                    courseTypeEnum.getMsg());
+            log.info("send success {}", MessageTypeEnum.TEACHER_EVALUATE_STUDENT_PRACTICE);
+        } catch (Exception e) {
+            log.error("send fail {}", MessageTypeEnum.TEACHER_EVALUATE_STUDENT_PRACTICE);
+            e.printStackTrace();
+        }
+    }
 
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE.getCode());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE,
-                    teacherReceivers, null, 0, url, ClientEnum.TEACHER.getCode(),
-                    student.getUsername());
+    public void repliedSend(CourseSchedule courseSchedule, Long studentId) {
+        CourseTypeEnum courseTypeEnum = CourseTypeEnum.valueOf(courseSchedule.getType());
+        try {
+            SysUser student = sysUserFeignService.queryUserById(studentId);
+            SysUser teacher = sysUserFeignService.queryUserById(courseSchedule.getTeacherId());
+
+            Map<Long, String> teacherReceivers = new HashMap<>();
+            teacherReceivers.put(courseSchedule.getTeacherId(), teacher.getPhone());
+
+//            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE,
+                    teacherReceivers,
+                    new String[]{courseSchedule.getId().toString(),studentId.toString()},
+                    null,
+                    0,
+                    ClientEnum.TEACHER.getCode(),
+                    student.getUsername(),
+                    courseTypeEnum.getMsg());
             log.info("send success {}", MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE);

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

@@ -20,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.course.CourseTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.im.EImUserFriendSourceForm;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
@@ -1435,6 +1436,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (ObjectUtil.isEmpty(schedule)) {
             throw new BizException("无法调整该课程,课程不存在");
         }
+        Date oldStartTime = schedule.getStartTime();
 
         //校验系统配置上下课时间
         String star = sysConfigService.findConfigValue(SysConfigConstant.COURSE_START_SETTING);//系统开课时间
@@ -1471,11 +1473,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         baseMapper.courseAdjust(adjustVo);
 
         // 课程调整后给学生发消息
-        sendCourseAdjustMessage(teacherId,studentPayment.getUserId(),adjustVo.getCourseId(),adjustVo.getStartTime());
+        sendCourseAdjustMessage(teacherId,studentPayment.getUserId(),adjustVo.getCourseId(),adjustVo.getStartTime(),oldStartTime);
     }
 
     //{老师昵称}已将{课程类型趣纠课、琴房课}{课程名称}课调整到{上课时间yyyy-MM-dd HH:mm:ss},请注意查看
-    private void sendCourseAdjustMessage(Long teacherId,Long studentId,Integer courseScheduleId,Date date) {
+    private void sendCourseAdjustMessage(Long teacherId,Long studentId,Integer courseScheduleId,Date date,Date oldStartTime) {
         //  趣纠课调整模板
         try {
             //  发送消息
@@ -1485,16 +1487,26 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             CourseSchedule courseSchedule = this.getById(courseScheduleId);
             CourseGroup courseGroup = courseGroupService.getById(courseSchedule.getCourseGroupId());
 
-            String courseName = courseGroup.getName() + "-第" + courseSchedule.getClassNum() + "课";
-
             String dateString = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(
                     DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
 
+            String oldDateString = oldStartTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(
+                    DateTimeFormatter.ofPattern("MM-dd HH:mm:ss"));
+
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(studentId, student.getPhone());
-
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
-                                               0, null, ClientEnum.STUDENT.getCode(), teacher.getUsername(),"趣纠课",courseName,dateString);
+//            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_ADJUST.getCode(),courseSchedule.getId());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.PRACTICE_ADJUST,
+                    receivers,
+                    new String[]{courseSchedule.getId().toString()},
+                    null,
+                    0,
+                    ClientEnum.STUDENT.getCode(),
+                    teacher.getRealName(),
+                    oldDateString,
+                    CourseTypeEnum.valueOf(courseGroup.getType()).getMsg(),
+                    dateString);
 
         } catch (Exception e) {
             log.error("趣纠课调整发送消息失败--> {}", e.fillInStackTrace());
@@ -1677,9 +1689,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
                 //老师端-明日课程提醒
                 if (liveCount != 0 || practiceCount != 0) {
-                    String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.TOMORROW_COURSE_REMINDER.getCode());
+//                    String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.TOMORROW_COURSE_REMINDER.getCode());
                     sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
-                            teacherReceivers, null, 0, teacherUrl, ClientEnum.TEACHER.getCode(),
+                            teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
                             practiceCount.toString(), liveCount.toString());
                     log.info("send success {}", MessageTypeEnum.TOMORROW_COURSE_REMINDER);
 
@@ -2302,9 +2314,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             Map<Long, String> studentReceivers = new HashMap<>();
             studentReceivers.put(studentId, student.getPhone());
 
-            String pianoUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.ARRANGE_PIANO_ROOM_CLASS.getCode());
+//            String pianoUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.ARRANGE_PIANO_ROOM_CLASS.getCode());
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.ARRANGE_PIANO_ROOM_CLASS,
-                    studentReceivers, null, 0, pianoUrl, ClientEnum.STUDENT.getCode(),
+                    studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
                     teacher.getUsername());
             log.info("老师:{},学员:{},排课推送成功", teacherId, studentId);
         } catch (Exception e) {
@@ -2876,6 +2888,81 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         return courseVos;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void courseStartRemind() {
+        List<CourseSchedule> courseSchedules = this.lambdaQuery()
+                .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START.getCode())
+                .eq(CourseSchedule::getPushStartMsg, false)
+                .lt(CourseSchedule::getStartTime, DateUtil.offsetMinute(new Date(), 20))
+                .list();
+        if (CollectionUtils.isEmpty(courseSchedules)) {
+            return;
+        }
+        //获取所有老师
+        List<Long> teacherIds = courseSchedules.stream().map(CourseSchedule::getTeacherId).distinct().collect(Collectors.toList());
+        Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> teacherMap = sysUserService.getMapByIds(teacherIds);
+        Map<Long, String> sendTeacherMap = teacherIds.stream().collect(Collectors.toMap(teacherId -> teacherId, teacherId -> teacherMap.get(teacherId).getPhone()));
+        //获取学员
+        List<Long> courseScheduleIds = courseSchedules.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+        List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.lambdaQuery().in(CourseScheduleStudentPayment::getCourseId, courseScheduleIds).list();
+        List<Long> studentIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).distinct().collect(Collectors.toList());
+        Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> studentMap = sysUserService.getMapByIds(studentIds);
+        Map<Long, String> sendStudentMap = studentIds.stream().collect(Collectors.toMap(studentId -> studentId, studentId -> studentMap.get(studentId).getPhone()));
+        Map<String,List<CourseSchedule>> courseTypeMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getType));
+        courseTypeMap.forEach((type,courseList) -> {
+            if(CourseScheduleEnum.PRACTICE.getCode().equals(type)){
+                sendStartRemind(CourseScheduleEnum.PRACTICE,sendTeacherMap,courseList);
+            }else if(CourseScheduleEnum.VIP.getCode().equals(type)){
+                sendStartRemind(CourseScheduleEnum.VIP,sendTeacherMap,courseList);
+            }
+        });
+
+        Map<String,List<CourseScheduleStudentPayment>> studentCourseTypeMap = studentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getCourseType));
+        studentCourseTypeMap.forEach((type,courseList) -> {
+            if(CourseScheduleEnum.PRACTICE.getCode().equals(type)){
+                sendStartRemind(CourseScheduleEnum.PRACTICE,courseList,sendStudentMap);
+            }else if(CourseScheduleEnum.VIP.getCode().equals(type)){
+                sendStartRemind(CourseScheduleEnum.VIP,courseList,sendStudentMap);
+            }
+        });
+        this.lambdaUpdate().set(CourseSchedule::getPushStartMsg,true)
+                .in(CourseSchedule::getId,courseScheduleIds)
+                .update();
+    }
+
+    private void sendStartRemind(CourseScheduleEnum courseScheduleEnum, Map<Long, String> teacherMap, List<CourseSchedule> courseList) {
+        courseList.forEach(courseSchedule -> {
+            Map<Long, String> sendTeacherMap = new HashMap<>();
+            sendTeacherMap.put(courseSchedule.getTeacherId(),teacherMap.get(courseSchedule.getTeacherId()));
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.STUDENT_PRACTICE_REMINDER,
+                    sendTeacherMap,
+                    new String[]{courseSchedule.getId().toString()},
+                    null,
+                    0,
+                    ClientEnum.TEACHER.getCode(),
+                    courseScheduleEnum.getMsg());
+        });
+        log.info("send success {}",MessageTypeEnum.STUDENT_PRACTICE_REMINDER);
+    }
+
+    private void sendStartRemind(CourseScheduleEnum courseScheduleEnum, List<CourseScheduleStudentPayment> studentPayments, Map<Long, String> studentMap) {
+        studentPayments.forEach(courseSchedule -> {
+            Map<Long, String> sendTeacherMap = new HashMap<>(1);
+            sendTeacherMap.put(courseSchedule.getUserId(),studentMap.get(courseSchedule.getUserId()));
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.PRACTICE_REMIND,
+                    sendTeacherMap,
+                    new String[]{courseSchedule.getCourseId().toString()},
+                    null,
+                    0,
+                    ClientEnum.STUDENT.getCode(),
+                    courseScheduleEnum.getMsg());
+        });
+        log.info("send success {}",MessageTypeEnum.PRACTICE_REMIND);
+    }
+
     private UserOrderDetail buyPracticeCourseTranV2(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo) {
         log.info("buyPracticeCourse  param:{}", JSON.toJSONString(orderGoodsInfo));
 

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

@@ -1362,18 +1362,18 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                 }
             } else {
 
-                String url = sysMessageService.selectConfigUrl(messageType.getCode());
+//                String url = sysMessageService.selectConfigUrl(messageType.getCode());
 
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
                         messageType, studentReceivers, null,
-                        0, url, orderClient.getCode(), name);
+                        0, null, orderClient.getCode(), name);
                 // 推送学生
                 Map<Long, String> studentSMS = new HashMap<>();
                 studentSMS.put(studentId, student.getPhone());
                 // 推送短信
-                url = sysMessageService.selectConfigUrl(smsMessageType.getCode());
+//                url = sysMessageService.selectConfigUrl(smsMessageType.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsMessageType,
-                        studentSMS, null, 0, url, null, name);
+                        studentSMS, null, 0, null, null, name);
             }
         } catch (Exception e) {
             log.error("购买曲目消息推送失败,", e);

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.dayaedu.cbs.common.enums.EAppKey;
 import com.dayaedu.cbs.common.enums.EClientType;
 import com.dayaedu.cbs.common.enums.message.EMessageSendMode;
@@ -11,18 +12,22 @@ import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.biz.dal.dao.SysMessageDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.dto.JumpUrlDto;
 import com.yonge.cooleshow.biz.dal.dto.PageUtil;
 import com.yonge.cooleshow.biz.dal.dto.search.SysMessageQueryInfo;
 import com.yonge.cooleshow.biz.dal.entity.SysMessage;
+import com.yonge.cooleshow.biz.dal.entity.SysMessageConfig;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageSendMode;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SendStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.SysMessageConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.wrapper.SysMessageWrapper;
 import com.yonge.cooleshow.common.entity.Mapper;
 import com.yonge.cooleshow.common.redis.service.RedisCache;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.string.MessageFormatter;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext.MessageSender;
@@ -51,6 +56,8 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	private RedisCache<String, Object> redisCache;
 	@Resource
 	private MessageFeignClientService messageFeignClientService;
+	@Resource
+	private SysMessageConfigService sysMessageConfigService;
 	// 验证码有效期
 	public static final int CODE_EXPIRE = 60 * 10;
 	// 发送验证码的间隔时间
@@ -117,6 +124,53 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		});
 		messageFeignClientService.sysMessageBatchSendMessage(messageParams);
 	}
+	@Override
+	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum type, Map<Long, String> receivers,String[] urlArgs, Date triggerTime, Integer readStatus
+			,String jpushType, Object... args) {
+		LOGGER.info("batchSendMessage type {}, receivers {} ", type, receivers);
+		if (receivers == null || receivers.isEmpty()) {
+			LOGGER.error("接收地址不能为空");
+			return;
+		}
+		// 处理注册时没有用户ID
+		if (receivers.containsKey(null)) {
+			String phone = receivers.get(null);
+			receivers.remove(null);
+			if (StringUtils.isNotEmpty(phone)) {
+				receivers.put(-1L, phone);
+			}
+		}
+		List<CbsMessageWrapper.MessageParam> messageParams = new ArrayList<>();
+		List<BasicUserInfo> basicUserInfo = teacherDao.findBasicUserInfo(receivers.keySet());
+		Map<Long, String> userIdPhoneMap = basicUserInfo.stream().collect(Collectors.toMap(BasicUserInfo::getUserId, BasicUserInfo::getPhone));
+		receivers.forEach((userId, value) -> {
+			String phone = userIdPhoneMap.getOrDefault(userId, null);
+			CbsMessageWrapper.MessageParam messageParam = new CbsMessageWrapper.MessageParam();
+			messageParam.setUserId(userId);
+			messageParam.setAppKey(EAppKey.KLX);
+			messageParam.setClientType(getClientType(jpushType));
+			messageParam.setClientId(messageParam.getClientType());
+			messageParam.setType(type.getCode());
+			messageParam.setUrlArgs(urlArgs);
+			Map<Long, String> params = new HashMap<>();
+			params.put(userId, Optional.ofNullable(phone).orElse(value));
+			messageParam.setReceivers(params);
+			messageParam.setRealSend(!debugMode);
+			if (args != null && args.length > 0) {
+				String[] argsStr = new String[args.length];
+				for (int i = 0; i < args.length; i++) {
+					if (args[i] != null) {
+						argsStr[i] = args[i].toString();
+					} else {
+						argsStr[i] = "";
+					}
+				}
+				messageParam.setContentArgs(argsStr);
+			}
+			messageParams.add(messageParam);
+		});
+		messageFeignClientService.sysMessageBatchSendMessage(messageParams);
+	}
 
 	public EClientType getClientType(String jpushType){
 		if(StringUtils.isEmpty(jpushType)){
@@ -261,10 +315,38 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	public String selectConfigUrl(String messageType,Object ...param) {
-        return "";
+//		return selectConfigUrlJumpType(messageType,null,param);
+		return null;
     }
 
 	@Override
+	public String selectConfigUrlJumpType(String messageType, String jumpType, Object... param) {
+		SysMessageConfig sysMessageConfig = sysMessageConfigService.queryByType(messageType);
+		if (sysMessageConfig == null) {
+			throw new BizException("消息类型错误");
+		}
+		if(StringUtils.isEmpty(sysMessageConfig.getAction())) {
+			return null;
+		}
+		if (sysMessageConfig.getAction().equals("sms")) {
+			return sysMessageConfig.getActionUrl();
+		} else if (sysMessageConfig.getAction().equals("h5")) {
+			sysMessageConfig.setActionUrl(MessageFormatter.arrayFormat(sysMessageConfig.getActionUrl(), param));
+		} else if (sysMessageConfig.getAction().equals("app")) {
+			sysMessageConfig.setParams(MessageFormatter.arrayFormat(sysMessageConfig.getParams(), param));
+		}
+		JumpUrlDto jumpUrlDto = new JumpUrlDto();
+		jumpUrlDto.setAction(sysMessageConfig.getAction());
+		jumpUrlDto.setUrl(sysMessageConfig.getActionUrl());
+		jumpUrlDto.setPageTag(sysMessageConfig.getPageTag());
+		jumpUrlDto.setParams(sysMessageConfig.getParams());
+		if (StringUtils.isNotBlank(jumpType) && ClientEnum.TENANT_STUDENT.getCode().equals(jumpType)) {
+			jumpUrlDto.setClientType("TENANT");
+		}
+		return JSON.toJSONString(jumpUrlDto);
+	}
+
+	@Override
 	public List<SysMessageWrapper.MessageUnreadStat> userMessageUnreadStat(SysMessageWrapper.SysMessageQuery param) {
 		CbsMessageWrapper.SysMessageQuery query = new CbsMessageWrapper.SysMessageQuery();
 		query.setUserId(param.getUserId());

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java

@@ -252,9 +252,9 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
         receivers.put(userId, phone);
         if (isPass) {
             try {
-                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_AUTH_PASS.getCode());
+//                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_AUTH_PASS.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_AUTH_PASS,
-                        receivers, null, 0, url, ClientEnum.TEACHER.getCode());
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode());
             } catch (Exception e) {
                 log.error("入驻审核极光消息推送异常,userId={}", userId);
             }
@@ -266,9 +266,9 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
             }
         } else {
             try {
-                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_AUTH_FAIL.getCode());
+//                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.TEACHER_AUTH_FAIL.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_AUTH_FAIL,
-                        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), reason);
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), reason);
             } catch (Exception e) {
                 log.error("入驻审核极光消息推送异常,userId={}", userId);
             }

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

@@ -129,9 +129,9 @@ public class TeacherAuthMusicianRecordServiceImpl extends ServiceImpl<TeacherAut
         receivers.put(userId, phone);
         if (isPass) {
             try {
-                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.MUSICIAN_AUTH_PASS.getCode());
+//                String url = sysMessageService.selectConfigUrl(MessageTypeEnum.MUSICIAN_AUTH_PASS.getCode());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.MUSICIAN_AUTH_PASS,
-                        receivers, null, 0, url, ClientEnum.TEACHER.getCode());
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode());
             } catch (Exception e) {
                 log.error("音乐人认证极光消息推送异常,userId={}", userId);
             }

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

@@ -204,6 +204,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private TeacherSubjectPriceService teacherSubjectPriceService;
 
+    @Autowired
+    private TeacherFreeTimeService teacherFreeTimeService;
+
     @Override
     public TeacherDao getDao() {
         return baseMapper;
@@ -264,6 +267,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             // 老师本身是客服,不显示客服入口;重置客服数量为0
             detail.setCustomerServiceNum(0);
         }
+        //是否设置可约课时间段
+        detail.setCourseTimeFlag(teacherFreeTimeService.lambdaQuery().eq(TeacherFreeTime::getTeacherId, userId).count() > 0);
 
         return detail;
     }

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

@@ -135,12 +135,12 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
         }
         for (TeacherEarningVo teacherEarningVo : teacherEarningVoList) {
             Map<Long, String> receivers = new HashMap<>();
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.COURSE_SETTLEMENT.getCode());
+//            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.COURSE_SETTLEMENT.getCode());
             receivers.put(teacherEarningVo.getTeacherId(), teacherEarningVo.getTeacherPhone());
             String dateString = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             try {
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.COURSE_SETTLEMENT,
-                        receivers, null, 0, url, ClientEnum.TEACHER.getCode(), dateString);
+                        receivers, null, 0, null, ClientEnum.TEACHER.getCode(), dateString);
                 log.info(" COURSE_SETTLEMENT ok");
             } catch (Exception e) {
                 log.warn("老师课酬结算消息推送失败,{}", e.getMessage());

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

@@ -387,10 +387,17 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         try {
 
 
-            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(), lesson.getId());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
-                    studentReceivers, null, 0, url, ClientEnum.STUDENT.getCode(),payType,
-                    teacher.getUsername(), lesson.getLessonName());
+//            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode(), lesson.getId());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.VIDEO_BUY,
+                    studentReceivers,
+                    new String[]{lesson.getId().toString()},
+                    null,
+                    0,
+                    ClientEnum.STUDENT.getCode(),
+                    payType,
+                    teacher.getUsername(),
+                    lesson.getLessonName());
             log.info("send success {}", MessageTypeEnum.VIDEO_BUY);
         } catch (Exception e) {
             log.error("send fail {}", MessageTypeEnum.VIDEO_BUY);

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -128,6 +128,9 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty("客服数量")
     private Integer customerServiceNum;
 
+    @ApiModelProperty("是否设置可约课时间段")
+    private Boolean courseTimeFlag;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }