浏览代码

学生端22点后的推送延后到第二天9点,教务端新增推送

zouxuan 4 年之前
父节点
当前提交
e61d31a932
共有 24 个文件被更改,包括 480 次插入102 次删除
  1. 1 1
      codegen/src/main/resources/generateConfigration.xml
  2. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java
  3. 46 15
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  4. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/WaitSendMessageDao.java
  5. 103 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/WaitSendMessage.java
  6. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  8. 5 21
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  9. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/WaitSendMessageService.java
  10. 29 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  11. 29 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  12. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java
  13. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  14. 1 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  15. 43 40
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  16. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/WaitSendMessageServiceImpl.java
  17. 11 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  18. 20 0
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  19. 74 0
      mec-biz/src/main/resources/config/mybatis/WaitSendMessageMapper.xml
  20. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  21. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  22. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/PushWaitSendMessageTask.java
  23. 8 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  24. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

+ 1 - 1
codegen/src/main/resources/generateConfigration.xml

@@ -8,7 +8,7 @@
 		<catalog>mec_dev</catalog>
 		<schema>mec_dev</schema>
 	</dbConfiguration>
-	<srcBase>/Users/zouxuan/Documents/javabean</srcBase>
+	<srcBase>d:/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
 	<daoPackageName>com.ym.mec.biz.dal.dao</daoPackageName>
 	<servicePackageName>com.ym.mec.biz.service</servicePackageName>

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDetailDao.java

@@ -197,4 +197,16 @@ public interface MusicGroupPaymentCalenderDetailDao extends BaseDAO<Long, MusicG
 	 */
 	MusicGroupPaymentCalenderDetail findByOrderId(@Param("orderId") Long orderId);
 
+	/**
+	 * 获取未缴费且不是0元的学员列表
+	 * @param calenderId
+	 * @return
+	 */
+    List<Map<Integer, String>> queryNoPaymentAndNotZeroStudent(Long calenderId);
+
+	/**
+	 * 将0元未缴费学员缴费状态更新为已缴费
+	 * @param calenderId
+	 */
+	void updateNoPaymentAndZeroPaymentStatus(Long calenderId);
 }

+ 46 - 15
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -28,16 +28,16 @@ public interface StudentManageDao {
     /**
      * @Author: Joburgess
      * @Date: 2019/9/19
-     *根据部门ID获取该部门下所有学生
+     * 根据部门ID获取该部门下所有学生
      */
-    List<StudentManageListDto> findStudentsByOrganId(Map<String,Object> params);
+    List<StudentManageListDto> findStudentsByOrganId(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
      * @Date: 2019/9/19
      * 根据部门ID统计该部门下所有学生数
      */
-    int countStudentByOrganId(Map<String,Object> params);
+    int countStudentByOrganId(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
@@ -65,28 +65,28 @@ public interface StudentManageDao {
      * @Date: 2019/9/20
      * 获取某乐团的排课列表
      */
-    List<StudentManageCourseListDto> findStudentCourseList(Map<String,Object> params);
+    List<StudentManageCourseListDto> findStudentCourseList(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
      * @Date: 2019/9/20
      * 统计乐团排课数
      */
-    int countStudentCourses(Map<String,Object> params);
+    int countStudentCourses(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
      * @Date: 2019/9/20
      * 学生签到列表获取
      */
-    List<StudentManageCourseListDto> findStudentAttendances(Map<String,Object> params);
+    List<StudentManageCourseListDto> findStudentAttendances(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
      * @Date: 2019/9/20
      * 统计学生签到次数
      */
-    int countStudentAttendances(Map<String,Object> params);
+    int countStudentAttendances(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
@@ -97,13 +97,15 @@ public interface StudentManageDao {
 
     /**
      * 获取学员扣费记录列表
+     *
      * @param params
      * @return
      */
     List<StudentPaymentDto> queryStudentPayment(Map<String, Object> params);
 
     /**
-     *  COUNT学员扣费记录列表
+     * COUNT学员扣费记录列表
+     *
      * @param params
      * @return
      */
@@ -111,6 +113,7 @@ public interface StudentManageDao {
 
     /**
      * 获取乐团管理学员列表
+     *
      * @param params
      * @return
      */
@@ -118,6 +121,7 @@ public interface StudentManageDao {
 
     /**
      * COUNT乐团管理学员列表
+     *
      * @param params
      * @return
      */
@@ -125,6 +129,7 @@ public interface StudentManageDao {
 
     /**
      * 获取乐团在读人数
+     *
      * @param musicGroupId
      * @return
      */
@@ -132,6 +137,7 @@ public interface StudentManageDao {
 
     /**
      * 获取乐团退团人数
+     *
      * @param musicGroupId
      * @return
      */
@@ -139,6 +145,7 @@ public interface StudentManageDao {
 
     /**
      * 获取乐团新增的学员人数
+     *
      * @param musicGroupId
      * @return
      */
@@ -146,6 +153,7 @@ public interface StudentManageDao {
 
     /**
      * 乐团管理--点名总览
+     *
      * @param params
      * @return
      */
@@ -153,6 +161,7 @@ public interface StudentManageDao {
 
     /**
      * COUNT乐团管理--点名总览
+     *
      * @param params
      * @return
      */
@@ -160,12 +169,14 @@ public interface StudentManageDao {
 
     /**
      * 修改用户信息
+     *
      * @param sysUser
      */
     void updateUser(SysUser sysUser);
 
     /**
      * 获取学员的vip列表
+     *
      * @param params
      * @return
      */
@@ -173,6 +184,7 @@ public interface StudentManageDao {
 
     /**
      * count学员vip列表
+     *
      * @param params
      * @return
      */
@@ -180,20 +192,23 @@ public interface StudentManageDao {
 
     /**
      * 获取未激活,有课的列表
+     *
      * @return
      */
     List<StudentManageListDto> queryHasCourseStudent(Map<String, Object> params);
 
     /**
      * 获取签到学员数
+     *
      * @param courseScheduleId
      * @param status
      * @return
      */
-    Integer countStudentSignInNum(@Param("courseScheduleId") Integer courseScheduleId,@Param("status") String status);
+    Integer countStudentSignInNum(@Param("courseScheduleId") Integer courseScheduleId, @Param("status") String status);
 
     /**
      * 获取交了作业的学生数
+     *
      * @param courseScheduleId
      * @return
      */
@@ -201,6 +216,7 @@ public interface StudentManageDao {
 
     /**
      * 获取已回复的数量
+     *
      * @param courseScheduleId
      * @return
      */
@@ -208,34 +224,39 @@ public interface StudentManageDao {
 
     /**
      * 是否有课map列表
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,Integer>> getHasPracticeCourse(@Param("userIds") Set<Integer> userIds);
+    List<Map<Integer, Integer>> getHasPracticeCourse(@Param("userIds") Set<Integer> userIds);
 
     /**
      * 是否激活
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,Integer>> getIsActive(@Param("userIds") Set<Integer> userIds);
+    List<Map<Integer, Integer>> getIsActive(@Param("userIds") Set<Integer> userIds);
 
     /**
      * 是否预约陪练课
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,Integer>> getIsMake(@Param("userIds") Set<Integer> userIds);
+    List<Map<Integer, Integer>> getIsMake(@Param("userIds") Set<Integer> userIds);
 
     /**
      * 获取用户所属声部
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,Integer>> querySubjectNames(@Param("userIds") Set<Integer> userIds);
+    List<Map<Integer, Integer>> querySubjectNames(@Param("userIds") Set<Integer> userIds);
 
     /**
      * 乐团修改--学员缴费记录--可新增学员列表
+     *
      * @param musicGroupId
      * @param musicGroupPaymentCalenderId
      * @return
@@ -247,14 +268,24 @@ public interface StudentManageDao {
 
     /**
      * 学员是否有课
+     *
      * @param userIds
      * @return
      */
-    List<Map<Integer,Integer>> queryHasCourseMap(@Param("userIds") Set<Integer> userIds);
-    
+    List<Map<Integer, Integer>> queryHasCourseMap(@Param("userIds") Set<Integer> userIds);
+
     /**
      * 查询学生剩余课程
+     *
      * @return
      */
     List<StudentListCourseDto> queryStudentRemianCourse(@Param("userIds") Set<Integer> userIds);
+
+    /**
+     * 获取教务老师关联的学员列表
+     *
+     * @param groupType
+     * @return
+     */
+    List<BasicUserDto> queryGroupStudents(@Param("groupType") String groupType, @Param("userId") Integer userId);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/WaitSendMessageDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.WaitSendMessage;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface WaitSendMessageDao extends BaseDAO<Integer, WaitSendMessage> {
+
+	
+}

+ 103 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/WaitSendMessage.java

@@ -0,0 +1,103 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(wait_send_message):
+ */
+public class WaitSendMessage {
+
+	/**  */
+	private Integer id;
+	
+	/** 消息发送模式JIGUANG("PUSH"), MOXINGTONG("SMS"), SHIYUAN("SMS"), YIMEI("SMS"), AWSMS("SMS") */
+	private String messageSender;
+	
+	/** 消息模板 */
+	private String messageType;
+	
+	/** 消息接收人 */
+	private String receivers;
+	
+	/** 超链接地址 */
+	private String url;
+	
+	/** 极光客户端 */
+	private String jpushType;
+	
+	/** 参数列表 */
+	private String agrs;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setMessageSender(String messageSender){
+		this.messageSender = messageSender;
+	}
+	
+	public String getMessageSender(){
+		return this.messageSender;
+	}
+			
+	public void setMessageType(String messageType){
+		this.messageType = messageType;
+	}
+	
+	public String getMessageType(){
+		return this.messageType;
+	}
+			
+	public void setReceivers(String receivers){
+		this.receivers = receivers;
+	}
+	
+	public String getReceivers(){
+		return this.receivers;
+	}
+			
+	public void setUrl(String url){
+		this.url = url;
+	}
+	
+	public String getUrl(){
+		return this.url;
+	}
+			
+	public void setJpushType(String jpushType){
+		this.jpushType = jpushType;
+	}
+	
+	public String getJpushType(){
+		return this.jpushType;
+	}
+			
+	public void setAgrs(String agrs){
+		this.agrs = agrs;
+	}
+	
+	public String getAgrs(){
+		return this.agrs;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -194,4 +194,11 @@ public interface StudentManageService {
      * @return
      */
     List<BasicUserDto> queryCanAddStudent(String musicGroupId, Long musicGroupPaymentCalenderId,String search,Integer subjectId);
+
+    /**
+     * 获取教务老师关联的学员列表
+     * @param groupType
+     * @return
+     */
+    List<BasicUserDto> queryGroupStudents(String groupType);
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -310,4 +310,5 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
      * @return boolean
      */
     BigDecimal updateUserSurplusCourseFee(Integer userId, String musicGroupId, BigDecimal amount, String memo, Integer operatorId);
+
 }

+ 5 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java

@@ -45,27 +45,6 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
-	 * 推送im自定义节拍器消息
-	 * @param senderId
-	 * @param roomId
-	 * @param content
-	 */
-//	void batchSendImPlayMidiMessage(String senderId,String roomId, String content);
-
-	/**
-	 * 批量发送消息
-	 * @param messageSender 消息发送者
-	 * @param subject 消息主题
-	 * @param content 消息内容
-	 * @param receivers 消息接受者
-	 * @param triggerTime 触发时间
-	 * @param group 组
-	 * @return
-	 */
-	public boolean batchSendMessage(MessageSender messageSender, String subject, String content, Map<Integer, String> receivers, Date triggerTime,
-			Integer readStatus, String memo, String group,String jpushType);
-
-	/**
 	 * 发送消息
 	 * @param messageSender 消息发送者
 	 * @param messageType 消息类型
@@ -159,4 +138,9 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	 * @param content
 	 */
 	void sendNoAuthPrivateMessage(String sender,String receiver, String content);
+
+	/**
+	 * 每天9点推送前一天22点之后的推送消息
+	 */
+	void pushWaitSendMessageTask();
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/WaitSendMessageService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.WaitSendMessage;
+import com.ym.mec.common.service.BaseService;
+
+public interface WaitSendMessageService extends BaseService<Integer, WaitSendMessage> {
+
+}

+ 29 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -14,6 +14,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -120,21 +121,27 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			musicGroupStudentFeeDao.setPaidCompleted(calenderDetails);
 		}*/
 		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
-//		if(expectAmount.doubleValue() > 0){
-//			Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-			//推送消息
-			if (studentIds.size() > 0) {
-				String musicGroupId = calenderDetails.get(0).getMusicGroupId();
-				Map<Integer, String> push = new HashMap<>();
-				for (Integer userId : studentIds) {
-					push.put(userId, userId + "");
-				}
-				MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-				String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-				String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
-				// 发送续费通知
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push, null, 0, memo,"STUDENT",musicGroup.getName());
+		//推送消息
+		if (studentIds.size() > 0) {
+			String musicGroupId = calenderDetails.get(0).getMusicGroupId();
+			Map<Integer, String> push = new HashMap<>();
+			for (Integer userId : studentIds) {
+				push.put(userId, userId + "");
 			}
+			MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
+			// 发送续费通知
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+					null, 0, memo,"STUDENT",musicGroup.getName());
+
+			//获取未缴费且不是0元的学员列表
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+			if(studentMaps.size() > 0){
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+						null, 0, memo, null, musicGroup.getName());
+			}
+		}
 //		}
 	}
 
@@ -171,7 +178,14 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + calender.getMusicGroupId();
 			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push, null, 0, memo,"STUDENT",musicGroup.getName());
+			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+					null, 0, memo,"STUDENT",musicGroup.getName());
+			//获取未缴费且不是0元的学员列表
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+			if(studentMaps.size() > 0){
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+						null, 0, memo, null, musicGroup.getName());
+			}
 		}
 		StringBuffer append = new StringBuffer("操作成功: 成功开启缴费").append(studentIds.size()).append("条,失败").append(length - studentIds.size()).append("条");
 		return append.toString();

+ 29 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1106,15 +1106,22 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	public void pushWaitRenewMessage(Long calenderId,MusicGroup musicGroup){
 		Set<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentStudentIds(calenderId);
 		if (studentIds.size() > 0) {
+			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroup.getId();
 			Map<Integer, String> push = new HashMap<>();
 			for (Integer userId : studentIds) {
 				push.put(userId, userId + "");
 			}
-			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroup.getId();
 			// 发送续费通知
 			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 					null, 0, memo, "STUDENT", musicGroup.getName());
+
+			//获取未缴费且不是0元的学员列表
+			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId));
+			if(studentMaps.size() > 0){
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+						null, 0, memo, null, musicGroup.getName());
+			}
 		}
 	}
 
@@ -1134,7 +1141,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				mgpc.setUpdateTime(date);
 				mgpc.setStatus(PaymentCalenderStatusEnum.OVER);
 				updateMusicGroupPaymentCalenderList.add(mgpc);
-
+				//将0元未缴费学员缴费状态更新为已缴费
+				musicGroupPaymentCalenderDetailDao.updateNoPaymentAndZeroPaymentStatus(mgpc.getId());
 			} else if (mgpc.getStartPaymentDate() != null && date.after(mgpc.getStartPaymentDate()) && mgpc.getStatus() == PaymentCalenderStatusEnum.NO) {
 				MusicGroup musicGroup = musicGroupDao.get(mgpc.getMusicGroupId());
 				if(musicGroup == null){
@@ -1224,6 +1232,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				// 发送续费通知
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 						null, 0, memo, "STUDENT", musicGroup.getName());
+				//获取未缴费且不是0元的学员列表
+				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId()));
+				if(studentMaps.size() > 0){
+					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+							null, 0, memo, null, musicGroup.getName());
+				}
 			}
 		} else {
 			calender.setStatus(PaymentCalenderStatusEnum.NO);
@@ -1315,6 +1329,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				// 发送续费通知
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 						null, 0, memo, "STUDENT", musicGroup.getName());
+				//获取未缴费且不是0元的学员列表
+				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(id));
+				if(studentMaps.size() > 0){
+					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+							null, 0, memo, null, musicGroup.getName());
+				}
 			}
 		} else {
 			// 获取课推送列表
@@ -1332,6 +1352,12 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				// 发送续费通知
 				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
 						null, 0, memo, "STUDENT", musicGroup.getName());
+				//获取未缴费且不是0元的学员列表
+				Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(id));
+				if(studentMaps.size() > 0){
+					sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, studentMaps,
+							null, 0, memo, null, musicGroup.getName());
+				}
 			}
 		}
 	}

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupStudentFeeServiceImpl.java

@@ -14,7 +14,9 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -73,7 +75,8 @@ public class MusicGroupStudentFeeServiceImpl extends BaseServiceImpl<Long, Music
 			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 			String memo = "4?" + baseUrl + "/#/renew?musicGroupId=" + musicGroup.getId();
 			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push, null, 0, memo,"STUDENT",musicGroup.getName());
+			sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+					null, 0, memo,"STUDENT",musicGroup.getName());
 		}
 
 		// int i = DateUtil.daysBetween(new Date(), musicGroupStudentFee.getNextPaymentDate());

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -686,4 +686,13 @@ public class StudentManageServiceImpl implements StudentManageService {
     public List<BasicUserDto> queryCanAddStudent(String musicGroupId, Long musicGroupPaymentCalenderId,String search,Integer subjectId) {
         return studentManageDao.queryCanAddStudent(musicGroupId, musicGroupPaymentCalenderId,search,subjectId);
     }
+
+    @Override
+    public List<BasicUserDto> queryGroupStudents(String groupType) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            throw new BizException("用户信息获取失败");
+        }
+        return studentManageDao.queryGroupStudents(groupType,sysUser.getId());
+    }
 }

+ 1 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -17,6 +17,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -31,12 +32,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
-import com.ym.mec.biz.dal.dto.CourseFormDto;
-import com.ym.mec.biz.dal.dto.StudentAddDto;
-import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
-import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
-import com.ym.mec.biz.dal.dto.StudentInfo;
-import com.ym.mec.biz.dal.dto.StudentMusicDetailDto;
 import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.ClassGroupStudentMapper;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;

+ 43 - 40
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -4,9 +4,11 @@ import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SysMessageDao;
+import com.ym.mec.biz.dal.dao.WaitSendMessageDao;
 import com.ym.mec.biz.dal.dto.Mapper;
 import com.ym.mec.biz.dal.entity.SysMessage;
 import com.ym.mec.biz.dal.entity.SysMessageConfig;
+import com.ym.mec.biz.dal.entity.WaitSendMessage;
 import com.ym.mec.biz.dal.enums.MessageSendMode;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.SendStatusEnum;
@@ -23,6 +25,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.string.MessageFormatter;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -31,10 +34,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.Map.Entry;
 
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.STUDENT_PUSH_VIP_BUY;
+
 @Service
 public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> implements SysMessageService {
 
@@ -53,6 +59,9 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	private SysUserFeignService sysUserFeignService;
 
 	@Autowired
+	private WaitSendMessageDao waitSendMessageDao;
+
+	@Autowired
 	private ImFeignService imFeignService;
 
 	@Autowired
@@ -239,57 +248,51 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	@Async
-	public boolean batchSendMessage(MessageSender messageSender, String subject, String content, Map<Integer, String> receivers, Date triggerTime,
-			Integer readStatus, String memo, String group,String jpushType) {
-
-		if (receivers == null || receivers.size() == 0) {
-			throw new BizException("消息接收人不能为空");
-		}
-		if (StringUtils.isBlank(content)) {
-			throw new BizException("消息内容不能为空");
-		}
-		String[] tos = receivers.values().toArray(new String[receivers.size()]);
-		if (tos != null && tos.length > 0) {
-			Date date = new Date();
-			SendStatusEnum status = SendStatusEnum.WAIT;
-
-			String errorMsg = null;
-			try {
-				// 立即发送
-				if (triggerTime == null || date.after(triggerTime)) {
-					status = SendStatusEnum.SENDING;
-					if (debugMode == true || messageSenderPluginContext.batchSend(messageSender, subject, content, tos, memo,jpushType)) {
-						status = SendStatusEnum.SUCCESSED;
-					} else {
-						status = SendStatusEnum.FAILED;
-					}
-				}
-			} catch (Exception e) {
-				status = SendStatusEnum.FAILED;
-				errorMsg = e.getMessage();
-				LOGGER.warn("消息发送失败", e);
-			}
-			MessageSendMode mode = MessageSendMode.SMS;
-			if (messageSender.getSendMode().equals("PUSH")) {
-				mode = MessageSendMode.PUSH;
-			} else if (messageSender.getSendMode().equals("EMAIL")) {
-				mode = MessageSendMode.EMAIL;
+	public void pushWaitSendMessageTask() {
+		List<WaitSendMessage> all = waitSendMessageDao.findAll(null);
+		for (WaitSendMessage waitSendMessage : all) {
+			Map<Integer,String> map = (Map<Integer,String>) JSON.parseObject(waitSendMessage.getReceivers(), Map.class);
+			String[] args = null;
+			if(waitSendMessage.getAgrs() != null){
+				List<String> strings = JSON.parseArray(waitSendMessage.getAgrs(), String.class);
+				String[] str = new String[strings.size()];
+				args = strings.toArray(str);
 			}
-			return addMessage(receivers, subject, content, triggerTime, mode, status, errorMsg, readStatus, memo, null) > 0;
+			batchSendMessage(MessageSender.valueOf(waitSendMessage.getMessageSender()),
+					MessageTypeEnum.valueOf(waitSendMessage.getMessageType()),map,null,0,
+					waitSendMessage.getUrl(),waitSendMessage.getJpushType(),args);
+			waitSendMessageDao.delete(waitSendMessage.getId());
 		}
-
-		return false;
 	}
 
 	@Override
 	@Async
 	public void batchSendMessage(MessageSender messageSender, MessageTypeEnum type, Map<Integer, String> receivers, Date triggerTime, Integer readStatus,
 			String url,String jpushType, Object... args) {
-
 		if (receivers == null || receivers.size() == 0) {
 			throw new BizException("接收地址不能为空");
 		}
+		if(StringUtils.isNotEmpty(jpushType) && jpushType == "STUDENT"){
+			//如果不是缴费信息
+			if(type != STUDENT_PUSH_VIP_BUY){
+				int hour = DateUtil.getHour(new Date());
+				//如果当前时间在22点之后
+				if(hour > 21){
+					//保存推送信息
+					WaitSendMessage waitSendMessage = new WaitSendMessage();
+					if(args != null){
+						waitSendMessage.setAgrs(JSON.toJSONString(args));
+					}
+					waitSendMessage.setJpushType(jpushType);
+					waitSendMessage.setMessageSender(messageSender.name());
+					waitSendMessage.setMessageType(type.name());
+					waitSendMessage.setReceivers(JSON.toJSONString(receivers));
+					waitSendMessage.setUrl(url);
+					waitSendMessageDao.insert(waitSendMessage);
+					return;
+				}
+			}
+		}
 		String[] tos = receivers.values().toArray(new String[receivers.size()]);
 		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
 		if (messageConfig == null) {

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/WaitSendMessageServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service.impl;
+
+
+import com.ym.mec.biz.dal.dao.WaitSendMessageDao;
+import com.ym.mec.biz.dal.entity.WaitSendMessage;
+import com.ym.mec.biz.service.WaitSendMessageService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class WaitSendMessageServiceImpl extends BaseServiceImpl<Integer, WaitSendMessage> implements WaitSendMessageService {
+	
+	@Autowired
+	private WaitSendMessageDao waitSendMessageDao;
+
+	@Override
+	public BaseDAO<Integer, WaitSendMessage> getDAO() {
+		return waitSendMessageDao;
+	}
+	
+}

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml

@@ -382,4 +382,15 @@
 	<select id="queryNoPaymentStudentIds" resultType="java.lang.Integer">
 		SELECT user_id_ FROM music_group_payment_calender_detail WHERE music_group_payment_calender_id_ = #{calenderId} AND payment_status_ = 'NON_PAYMENT'
 	</select>
+
+	<select id="queryNoPaymentAndNotZeroStudent" resultType="java.util.Map">
+		SELECT mgpcd.user_id_ 'key',su.phone_ 'value' FROM music_group_payment_calender_detail mgpcd
+		LEFT JOIN sys_user su ON su.id_ = mgpcd.user_id_
+		WHERE music_group_payment_calender_id_ = #{calenderId} AND expect_amount_ != 0 AND payment_status_ = 'NON_PAYMENT'
+    </select>
+
+	<update id="updateNoPaymentAndZeroPaymentStatus">
+		UPDATE music_group_payment_calender_detail SET payment_status_ = 'PAID_COMPLETED',actual_amount_ = 0,update_time_ = NOW()
+		WHERE music_group_payment_calender_id_ = #{calenderId} AND expect_amount_ = 0 AND payment_status_ = 'NON_PAYMENT'
+	</update>
 </mapper>

+ 20 - 0
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -811,4 +811,24 @@
 		GROUP BY cssp.`user_id_`
     </select>
 
+    <select id="queryGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
+        SELECT su.id_,su.username_,su.phone_,su.avatar_ head_url_,su.gender_ FROM
+        <if test="groupType = 'PRACTICE'">
+            practice_group pg
+        </if>
+        <if test="groupType = 'VIP'">
+            vip_group pg
+        </if>
+        LEFT JOIN class_group_student_mapper cgsm ON pg.id_ = cgsm.music_group_id_
+        LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
+        WHERE cgsm.group_type_ = #{groupType} AND cgsm.status_ != 'QUIT'
+        AND pg.educational_teacher_id_ = #{userId}
+        <if test="groupType = 'PRACTICE'">
+            AND pg.group_status_ NOT IN ('FINISH','CANCEL')
+        </if>
+        <if test="groupType = 'VIP'">
+            AND pg.group_status_ IN (0,1,2,5)
+        </if>
+        GROUP BY cgsm.user_id_
+    </select>
 </mapper>

+ 74 - 0
mec-biz/src/main/resources/config/mybatis/WaitSendMessageMapper.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.WaitSendMessageDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.WaitSendMessage" id="WaitSendMessage">
+		<result column="id_" property="id" />
+		<result column="message_sender_" property="messageSender" />
+		<result column="message_type_" property="messageType" />
+		<result column="receivers_" property="receivers" />
+		<result column="url_" property="url" />
+		<result column="jpush_type_" property="jpushType" />
+		<result column="agrs_" property="agrs" />
+		<result column="create_time_" property="createTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="WaitSendMessage" >
+		SELECT * FROM wait_send_message WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="WaitSendMessage">
+		SELECT * FROM wait_send_message ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.WaitSendMessage" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO wait_send_message (message_sender_,message_type_,receivers_,url_,jpush_type_,agrs_,create_time_)
+		VALUES(#{messageSender},#{messageType},#{receivers},#{url},#{jpushType},#{agrs},NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.WaitSendMessage">
+		UPDATE wait_send_message <set>
+		<if test="receivers != null">
+		receivers_ = #{receivers},
+		</if>
+		<if test="messageType != null">
+		message_type_ = #{messageType},
+		</if>
+		<if test="url != null">
+		url_ = #{url},
+		</if>
+		<if test="jpushType != null">
+		jpush_type_ = #{jpushType},
+		</if>
+		<if test="messageSender != null">
+		message_sender_ = #{messageSender},
+		</if>
+		<if test="agrs != null">
+		agrs_ = #{agrs},
+		</if>
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM wait_send_message WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="WaitSendMessage" parameterType="map">
+		SELECT * FROM wait_send_message ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM wait_send_message
+	</select>
+</mapper>

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -9,6 +9,10 @@ import com.ym.mec.task.fallback.TaskRemoteServiceFallback;
 @FeignClient(name = "web-server", contextId = "TaskRemoteService", configuration = { FeignConfiguration.class }, fallback = TaskRemoteServiceFallback.class)
 public interface TaskRemoteService {
 
+	@GetMapping(value = "task/pushWaitSendMessageTask")
+	// 每天9点推送前一天22点之后的推送消息
+	public void pushWaitSendMessageTask();
+
 	@GetMapping(value = "task/pushTeacherExceptionAttendanceTask")
 	// 教师异常考勤推送
 	public void pushTeacherExceptionAttendanceTask();

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -152,6 +152,11 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	}
 
 	@Override
+	public void pushWaitSendMessageTask() {
+		logger.info("延时推送执行失败");
+	}
+
+	@Override
 	public void pushTeacherExceptionAttendanceTask() {
 		logger.info("教师异常考勤推送失败");
 	}

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/PushWaitSendMessageTask.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PushWaitSendMessageTask extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.pushWaitSendMessageTask();
+	}
+}

+ 8 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -78,6 +78,8 @@ public class TaskController extends BaseController {
 	private GoodsService goodsService;
 	@Autowired
 	private StudentGoodsSellService studentGoodsSellService;
+	@Autowired
+	private SysMessageService sysMessageService;
 
 	@Autowired
 	private CourseEventSource courseEventSource;
@@ -88,6 +90,12 @@ public class TaskController extends BaseController {
 		studentGoodsSellService.affirmReceive(null);
 	}
 
+	@GetMapping(value = "/pushWaitSendMessageTask")
+	// 每天9点推送前一天22点之后的推送消息
+	public void pushWaitSendMessageTask(){
+		sysMessageService.pushWaitSendMessageTask();
+	}
+
 	@GetMapping(value = "/repertoryWarn")
 	// 商品库存预警
 	public void repertoryWarn(){

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentStudentController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.biz.service.StudentManageService;
 import io.swagger.annotations.ApiOperation;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,6 +24,8 @@ public class EduStudentStudentController extends BaseController {
     private StudentAttendanceService studentAttendanceService;
     @Autowired
     private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private StudentManageService studentManageService;
 
     @ApiOperation(value = "获取某节课学生签到列表")
     @GetMapping("eduStudentAttendance/findStudentAttendance")
@@ -36,4 +39,10 @@ public class EduStudentStudentController extends BaseController {
         return succeed(studentRegistrationService.getStudentDetail(studentId));
     }
 
+    @ApiOperation(value = "教务老师关联的学员列表")
+    @PostMapping("studentManage/queryGroupStudents")
+    public Object queryGroupStudents(String groupType){
+        return succeed(studentManageService.queryGroupStudents(groupType));
+    }
+
 }