瀏覽代碼

Merge branch 'system_fee_update' of http://git.dayaedu.com/yonge/mec

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
	mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
zouxuan 4 年之前
父節點
當前提交
0dcb6c4066
共有 22 個文件被更改,包括 335 次插入137 次删除
  1. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  2. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java
  3. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ArrearageStudentsQueryInfo.java
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  7. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailService.java
  8. 2 6
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  9. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  10. 1 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  11. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  12. 7 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  13. 17 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  14. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java
  15. 112 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  16. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  17. 58 87
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  18. 10 6
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  19. 6 3
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  20. 10 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  21. 17 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  22. 7 1
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -239,9 +239,22 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<Integer> queryPushMemberRenew(String pushMemberRenew);
 
     /**
+     * 会员结束前15天自动创建乐团缴费
+     * @param pushMemberRenew
+     * @return
+     */
+    List<Map<String,String>> queryAutoCreateStudentMap(String pushMemberRenew);
+
+    /**
      * 清空学员会员
      */
     void cleanStudentMember();
 
     void cleanMember(Integer userId);
+
+    /**
+     * 清空乐团会员时长
+     * @param userId
+     */
+    void cleanMusicMember(@Param("userId") Integer userId);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java

@@ -52,6 +52,16 @@ public class MusicGroupPaymentCalenderDto {
 	//会员等级编号
 	private Integer memberRankSettingId;
 
+	private Boolean autoCreate = false;
+
+	public Boolean getAutoCreate() {
+		return autoCreate;
+	}
+
+	public void setAutoCreate(Boolean autoCreate) {
+		this.autoCreate = autoCreate;
+	}
+
 	public Integer getMemberValidDate() {
 		return memberValidDate;
 	}

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java

@@ -70,6 +70,28 @@ public class Student extends SysUser {
 	@ApiModelProperty(value = "活动排课信息")
 	private String activityCourseDetail;
 
+	//乐团会员有效期截止时间
+	private Date musicMembershipEndTime;
+
+	//会员团编号
+	private String memberMusicGroupId;
+
+	public Date getMusicMembershipEndTime() {
+		return musicMembershipEndTime;
+	}
+
+	public void setMusicMembershipEndTime(Date musicMembershipEndTime) {
+		this.musicMembershipEndTime = musicMembershipEndTime;
+	}
+
+	public String getMemberMusicGroupId() {
+		return memberMusicGroupId;
+	}
+
+	public void setMemberMusicGroupId(String memberMusicGroupId) {
+		this.memberMusicGroupId = memberMusicGroupId;
+	}
+
 	public Student(Integer userId, String subjectIdList) {
 		this.userId = userId;
 		this.subjectIdList = subjectIdList;

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -6,6 +6,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_APPLY_MESSAGE("SMS_APPLY_MESSAGE", "报名通知"),
     SYSTEM_REMIND_EDUCATION_COURSE_TIME("SYSTEM_REMIND_EDUCATION_COURSE_TIME", "排课提醒"),
     STUDENT_MEMBER_RENEW_MESSAGE("STUDENT_MEMBER_RENEW_MESSAGE", "会员续费提醒"),
+    AUTO_STUDENT_MEMBER_RENEW_MESSAGE("AUTO_STUDENT_MEMBER_RENEW_MESSAGE", "会员续费提醒"),
     STUDENT_MEMBER_RENEW_QUIT_MESSAGE("STUDENT_MEMBER_RENEW_QUIT_MESSAGE", "会员续费提醒"),
     SMS_VERIFY_CODE_LOGIN("SMS_VERIFY_CODE_LOGIN", "验证码登录"),
     KAPTCHA_SESSION_KEY("KAPTCHA_SESSION_KEY", "登录图形验证码"),

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ArrearageStudentsQueryInfo.java

@@ -21,6 +21,16 @@ public class ArrearageStudentsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "未缴费类型:0历史,1进行中")
     private Integer noPaymentType;
 
+    private Integer courseViewType;
+
+    public Integer getCourseViewType() {
+        return courseViewType;
+    }
+
+    public void setCourseViewType(Integer courseViewType) {
+        this.courseViewType = courseViewType;
+    }
+
     public String getOrganIds() {
         return organIds;
     }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java

@@ -174,4 +174,6 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @param batchNo
 	 */
 	void revoke(String batchNo);
+
+	List<MusicGroupPaymentCalender> findByBatchNo(String batchNo);
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentStudentCourseDetailService.java

@@ -1,8 +1,13 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.common.service.BaseService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface MusicGroupPaymentStudentCourseDetailService extends BaseService<Long, MusicGroupPaymentStudentCourseDetail> {
 
+    String getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(String musicGroupId,Integer studentId,CourseSchedule.CourseScheduleType courseType,List<String> batchNos);
 }

+ 2 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import java.text.ParseException;
 import java.util.List;
 
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
@@ -70,12 +71,7 @@ public interface StudentService extends BaseService<Integer, Student> {
     /**
      * 更新学员会员信息
      */
-    void updateMemberRank(Integer userId, Integer rankSettingId, PeriodEnum periodEnum, int quantityPerPeriod);
-
-    /**
-     * 更新学员会员信息
-     */
-    void batchUpdateMemberRank(List<Integer> studentIds, Integer rankSettingId, PeriodEnum periodEnum, int quantityPerPeriod);
+    void updateMemberRank(CloudTeacherOrder cloudTeacherOrder, PeriodEnum periodEnum);
 
     /**
      * 更新服务指标

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -218,6 +218,10 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     //会员结束前15天提醒学员续费(默认提前15天)
     String PUSH_MEMBER_RENEW = "push_member_renew";
+
+    //会员结束前15天自动创建乐团续费(默认提前15天)
+    String AUTO_CREATE_MEMBER_RENEW = "auto_create_member_renew";
+
     //会员结束前15天提醒学员续费(默认提前5天)
     String PUSH_MEMBER_RENEW_AGAIN = "push_member_renew_again";
 

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

@@ -14,7 +14,6 @@ import org.springframework.transaction.annotation.Transactional;
 import com.ym.mec.biz.dal.dao.CloudTeacherDao;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.entity.CloudTeacher;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
@@ -34,8 +33,6 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     @Autowired
     private CloudTeacherOrderDao cloudTeacherOrderDao;
     @Autowired
-    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-    @Autowired
     private CourseScheduleDao courseScheduleDao;
     @Autowired
     private CloudTeacherDao cloudTeacherDao;
@@ -105,7 +102,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 			break;
 		}
         //更新student表信息
-        studentService.updateMemberRank(cloudTeacherOrder.getStudentId(), cloudTeacherOrder.getLevel(), periodEnum, cloudTeacherOrder.getTime());
+        studentService.updateMemberRank(cloudTeacherOrder,periodEnum);
         
         if (cloudTeacher == null) {
             cloudTeacher = new CloudTeacher();

+ 5 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -156,22 +156,22 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 		switch (periodEnum) {
 		case DAY:
-			actualAmount = memberFeeSetting.getCurrentDayFee();
+			actualAmount = memberFeeSetting.getOriginalDayFee();
 			cloudTeacherOrder.setType(1);
 			cloudTeacherOrder.setTime(1);
 			break;
 		case MONTH:
-			actualAmount = memberFeeSetting.getCurrentMonthFee();
+			actualAmount = memberFeeSetting.getOriginalMonthFee();
 			cloudTeacherOrder.setType(2);
 			cloudTeacherOrder.setTime(1);
 			break;
 		case YEAR_HALF:
-			actualAmount = memberFeeSetting.getCurrentHalfYearFee();
+			actualAmount = memberFeeSetting.getOriginalHalfYearFee();
 			cloudTeacherOrder.setType(2);
 			cloudTeacherOrder.setTime(6);
 			break;
 		case YEAR:
-			actualAmount = memberFeeSetting.getCurrentYearFee();
+			actualAmount = memberFeeSetting.getOriginalYearFee();
 			cloudTeacherOrder.setType(3);
 			cloudTeacherOrder.setTime(1);
 			break;
@@ -332,7 +332,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 
 			cloudTeacherOrderService.update(cloudTeacherOrder);
 			// 添加会员有效时长
-			studentService.updateMemberRank(userId,cloudTeacherOrder.getLevel(), periodEnum, cloudTeacherOrder.getTime());
+			studentService.updateMemberRank(cloudTeacherOrder, periodEnum);
 
 			// 插入交易明细
 			BigDecimal amount = studentPaymentOrder.getActualAmount();

+ 7 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -176,9 +176,14 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 					cloudTeacherOrder.setStatus(2);
 					cloudTeacherOrder.setStartTime(date);
 					cloudTeacherOrder.setEndTime(DateUtil.addMonths(date,calender.getMemberValidDate()));
-					cloudTeacherOrder.setRemark("进行中乐团加学生,缴费金额改为0元");
+					if(calender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT){
+						cloudTeacherOrder.setRemark("进行中乐团加学生,缴费金额改为0元");
+					}else {
+						cloudTeacherOrder.setRemark("乐团续费,缴费金额改为0元");
+					}
+					cloudTeacherOrder.setMusicGroupId(calender.getMusicGroupId());
 					cloudTeacherOrderDao.insert(cloudTeacherOrder);
-					studentService.updateMemberRank(e.getUserId(),calender.getMemberRankSettingId(),PeriodEnum.MONTH,calender.getMemberValidDate());
+					studentService.updateMemberRank(cloudTeacherOrder,PeriodEnum.MONTH);
 				}
 				calender.setActualNum((calender.getActualNum()==null?0:calender.getActualNum()) + 1);
 				e.setPaymentStatus(PAID_COMPLETED);

+ 17 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -156,7 +156,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
 
 		if(musicGroupPaymentCalenderDto.getMemberRankSettingId() != null){
-			if(paymentType != ADD_STUDENT && paymentType != MUSIC_APPLY){
+			if(paymentType != ADD_STUDENT && paymentType != MUSIC_APPLY && paymentType != MUSIC_RENEW){
 				throw new BizException("操作失败:{} 不支持会员收费",paymentType.getDesc());
 			}
 		}
@@ -204,11 +204,14 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE && musicGroupPaymentDateRangeList.size() > 1) {
 			throw new BizException("创建缴费失败:会员收费乐团不支持多周期缴费");
 		}
-		// 所有缴费项目已完成排课才能创建下一个缴费项目
-		String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,musicGroupPaymentCalenderDto.getIgnoreBatchNoList());
-		if (StringUtils.isNoneBlank(orignBatchNo)) {
-			if(StringUtils.isEmpty(musicGroupPaymentCalenderDto.getBatchNo()) || !musicGroupPaymentCalenderDto.getBatchNo().equals(orignBatchNo)){
-				throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+		//是否自动创建
+		if(!musicGroupPaymentCalenderDto.getAutoCreate()){
+			// 所有缴费项目已完成排课才能创建下一个缴费项目
+			String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,musicGroupPaymentCalenderDto.getIgnoreBatchNoList());
+			if (StringUtils.isNoneBlank(orignBatchNo)) {
+				if(StringUtils.isEmpty(musicGroupPaymentCalenderDto.getBatchNo()) || !musicGroupPaymentCalenderDto.getBatchNo().equals(orignBatchNo)){
+					throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+				}
 			}
 		}
 
@@ -582,7 +585,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
 
 		if(musicGroupPaymentCalenderDto.getMemberRankSettingId() != null){
-			if(paymentType != ADD_STUDENT && paymentType != MUSIC_APPLY){
+			if(paymentType != ADD_STUDENT && paymentType != MUSIC_APPLY && paymentType != MUSIC_RENEW){
 				throw new BizException("操作失败:{} 不支持会员收费",paymentType.getDesc());
 			}
 		}
@@ -1035,8 +1038,9 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 						cloudTeacherOrder.setStartTime(date);
 						cloudTeacherOrder.setEndTime(DateUtil.addMonths(date,musicGroupPaymentCalender.getMemberValidDate()));
 						cloudTeacherOrder.setRemark("进行中乐团0元加学生");
+						cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
 						cloudTeacherOrderDao.insert(cloudTeacherOrder);
-						studentService.updateMemberRank(Integer.parseInt(studentId),musicGroupPaymentCalender.getMemberRankSettingId(),PeriodEnum.MONTH,musicGroupPaymentCalender.getMemberValidDate());
+						studentService.updateMemberRank(cloudTeacherOrder,PeriodEnum.MONTH);
 					}
 					MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(Integer.parseInt(studentId), musicGroupPaymentCalender.getMusicGroupId());
 					if (musicGroupStudentFee != null) {
@@ -1473,6 +1477,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	}
 
 	@Override
+	public List<MusicGroupPaymentCalender> findByBatchNo(String batchNo) {
+		return musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
 	public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
 		Date date = new Date();

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentStudentCourseDetailServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -9,6 +10,8 @@ import com.ym.mec.biz.service.MusicGroupPaymentStudentCourseDetailService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
+import java.util.List;
+
 @Service
 public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentStudentCourseDetail>  implements MusicGroupPaymentStudentCourseDetailService {
 	
@@ -19,5 +22,9 @@ public class MusicGroupPaymentStudentCourseDetailServiceImpl extends BaseService
 	public BaseDAO<Long, MusicGroupPaymentStudentCourseDetail> getDAO() {
 		return musicGroupPaymentStudentCourseDetailDao;
 	}
-	
+
+    @Override
+    public String getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(String musicGroupId, Integer studentId, CourseSchedule.CourseScheduleType courseType, List<String> batchNos) {
+        return musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, studentId, courseType, batchNos);
+    }
 }

+ 112 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java

@@ -1,33 +1,37 @@
 package com.ym.mec.biz.service.impl;
 
+import com.sun.javafx.collections.MappingChange;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.service.MusicGroupSchoolTermCourseDetailService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
+
 @Service
 public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl<Integer, MusicGroupSchoolTermCourseDetail>  implements MusicGroupSchoolTermCourseDetailService {
 	
@@ -55,6 +59,18 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 	private StudentDao studentDao;
 	@Autowired
 	private MemberRankSettingDao memberRankSettingDao;
+	@Autowired
+	private MemberFeeSettingDao memberFeeSettingDao;
+	@Autowired
+	private OrganizationDao organizationDao;
+	@Autowired
+	private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
+	@Autowired
+	private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+	@Autowired
+	private RedisCache<String, Object> redisCache;
+
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
 	@Override
 	public BaseDAO<Integer, MusicGroupSchoolTermCourseDetail> getDAO() {
@@ -152,7 +168,12 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void musicSchoolTermPush() {
+//		Object o = redisCache.get("musicSchoolTermPush");
+//		if(o != null){
+//			return;
+//		}
 		String remindCourseTime = sysConfigDao.findConfigValue(SysConfigService.REMIND_COURSE_TIME);
 		if(StringUtils.isEmpty(remindCourseTime)){
 			remindCourseTime = "14";
@@ -191,8 +212,9 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 		if(memberRankSetting != null){
 			memberName = memberRankSetting.getName();
 		}
+		Date date = new Date();
 		//会员结束前15天提醒学员续费
-		String pushMemberRenew = sysConfigDao.findConfigValue(SysConfigService.PUSH_MEMBER_RENEW);
+		/*String pushMemberRenew = sysConfigDao.findConfigValue(SysConfigService.PUSH_MEMBER_RENEW);
 		if(StringUtils.isEmpty(pushMemberRenew)){
 			pushMemberRenew = "15";
 		}
@@ -220,8 +242,8 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 					0,
 					null,
 					"STUDENT",memberName,pushMemberRenew);
-		}
-		//会员结束前15天提醒学员续费
+		}*/
+		//会员结束前5天提醒学员续费
 		String pushMemberRenewAgain = sysConfigDao.findConfigValue(SysConfigService.PUSH_MEMBER_RENEW_AGAIN);
 		if(StringUtils.isEmpty(pushMemberRenewAgain)){
 			pushMemberRenewAgain = "5";
@@ -251,6 +273,86 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 					null,
 					"STUDENT",memberName,pushMemberRenewAgain);
 		}
+
+
+		//会员结束前15天自动创建乐团续费(默认提前15天)
+		String autoCreateMemberRenew = sysConfigDao.findConfigValue(SysConfigService.AUTO_CREATE_MEMBER_RENEW);
+		if(StringUtils.isEmpty(autoCreateMemberRenew)){
+			autoCreateMemberRenew = "15";
+		}
+		Map<String,String> studentMusicMap = MapUtil.convertMybatisMap(studentDao.queryAutoCreateStudentMap(autoCreateMemberRenew));
+		if(studentMusicMap.size() > 0){
+			for (String musicGroupId : studentMusicMap.keySet()) {
+				MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+				// 所有缴费项目已完成排课才能创建下一个缴费项目
+//				String orignBatchNo = musicGroupPaymentStudentCourseDetailService.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,null);
+//				if (StringUtils.isNoneBlank(orignBatchNo)) {
+//					logger.error("自动创建缴费项目失败,{} 乐团存在未排课的缴费项目",musicGroup.getName());
+//					continue;
+//				}
+				MemberFeeSetting memberFee = memberFeeSettingDao.findByRankIdAndOrganId(musicGroup.getOrganId(), memberRankSetting.getId());
+				if(memberFee == null){
+					Organization organization = organizationDao.get(musicGroup.getOrganId());
+					logger.error("自动创建缴费项目失败,{} 分部会员收费标准未配置",organization.getName());
+					continue;
+				}
+				//创建缴费项目
+				MusicGroupPaymentCalenderDto musicGroupPaymentCalenderDto = new MusicGroupPaymentCalenderDto();
+				musicGroupPaymentCalenderDto.setMusicGroupId(musicGroupId);
+				musicGroupPaymentCalenderDto.setMemberValidDate(6);
+				musicGroupPaymentCalenderDto.setMemo("系统自动创建缴费项目");
+				musicGroupPaymentCalenderDto.setMemberRankSettingId(memberRankSetting.getId());
+				musicGroupPaymentCalenderDto.setPayUserType(MusicGroupPaymentCalender.PayUserType.STUDENT);
+				musicGroupPaymentCalenderDto.setPaymentType(MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW);
+				musicGroupPaymentCalenderDto.setPaymentPattern(1);
+				musicGroupPaymentCalenderDto.setMemberPaymentAmount(memberFee.getCurrentHalfYearFee().setScale(0, BigDecimal.ROUND_HALF_UP));
+				musicGroupPaymentCalenderDto.setAutoCreate(true);
+				musicGroupPaymentCalenderDto.setIsGiveMusicNetwork(false);
+				List<MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = new ArrayList<>();
+				MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange range = new MusicGroupPaymentCalenderDto().new MusicGroupPaymentDateRange();
+				range.setStartPaymentDate(date);
+				range.setDeadlinePaymentDate(DateUtil.addMonths(date,1));
+				musicGroupPaymentDateRangeList.add(range);
+				musicGroupPaymentCalenderDto.setMusicGroupPaymentDateRangeList(musicGroupPaymentDateRangeList);
+				String batchNo = "";
+				try {
+					batchNo = musicGroupPaymentCalenderService.create(musicGroupPaymentCalenderDto);
+				}catch (Exception e){
+					logger.error("{} 乐团自动创建缴费项目失败,失败原因:{}",musicGroup.getName(),e.getMessage());
+					continue;
+				}
+				MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.findByBatchNo(batchNo).get(0);
+				Set<Integer> userIdList = Arrays.stream(studentMusicMap.get(musicGroupId).split(",")).map(Integer::new).collect(Collectors.toSet());
+				musicGroupPaymentCalenderDetailService.batchAdd(calender.getId(),userIdList,musicGroup);
+				Map<Integer, String> studentPhoneMap = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(studentMusicMap.get(musicGroupId)));
+				Map<Integer,String> userMap = new HashMap<>(userIdList.size());
+				Map<Integer,String> userMap1 = new HashMap<>(userIdList.size());
+				for (Integer studentId : userIdList) {
+					userMap.put(studentId,studentPhoneMap.get(studentId));
+					userMap1.put(studentId,studentId.toString());
+				}
+				String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+				String pushUrl = "4?" + baseApiUrl + "/#/musicGroupRenew?calenderId=" + calender.getId() + "&id=" + musicGroupId;
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,
+						MessageTypeEnum.AUTO_STUDENT_MEMBER_RENEW_MESSAGE,
+						userMap,
+						null,
+						0,
+						pushUrl,
+						null,memberName,autoCreateMemberRenew);
+
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+						MessageTypeEnum.AUTO_STUDENT_MEMBER_RENEW_MESSAGE,
+						userMap1,
+						null,
+						0,
+						pushUrl,
+						"STUDENT",memberName,autoCreateMemberRenew);
+			}
+		}
+		redisCache.getRedisTemplate().opsForValue().set("musicSchoolTermPush","musicSchoolTermPush",
+		23,
+		TimeUnit.HOURS);
 	}
 
 	private MusicGroupSchoolTermCourseDetail getCourseDetail(MusicGroupSchoolTermCourseDetail courseDetail){

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -758,6 +758,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		cloudTeacherOrder.setLevel(musicGroupRegCalender.getMemberRankSettingId() == null ? 1 : musicGroupRegCalender.getMemberRankSettingId());
     		cloudTeacherOrder.setAmount(cloudTeacherPrice);
     		cloudTeacherOrder.setStatus(0);
+            cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
         }
 
         if (amount.compareTo(orderAmount) != 0) {
@@ -992,6 +993,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		cloudTeacherOrder.setLevel(musicGroupRegCalender.getMemberRankSettingId() == null ? 1 : musicGroupRegCalender.getMemberRankSettingId());
     		cloudTeacherOrder.setAmount(musicGroupRegCalender.getMemberPaymentAmount() == null ? cloudTeacherPrice : musicGroupRegCalender.getMemberPaymentAmount());
     		cloudTeacherOrder.setStatus(0);
+            cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
         }
 
         if (amount.compareTo(orderAmount) != 0) {
@@ -2002,7 +2004,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
 
             }
-
+            //删除乐团会员时长
+            studentDao.cleanMusicMember(userId);
             if(isRefundMemberFee){
                 //退云教练费用
                 if (cloudTeacherAmount != null) {
@@ -2275,6 +2278,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             //统计变更学员数
             groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.QUIT, new ArrayList<>(Arrays.asList(userId)));
         }
+        //删除乐团会员时长
+        studentDao.cleanMusicMember(userId);
         if (isRefundMemberFee){
             //退云教练费用
             if (cloudTeacherAmount != null) {
@@ -2443,6 +2448,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     		cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
     		cloudTeacherOrder.setCreateTime(date);
     		cloudTeacherOrder.setUpdateTime(date);
+            cloudTeacherOrder.setMusicGroupId(calender.getMusicGroupId());
     		cloudTeacherOrderService.insert(cloudTeacherOrder);
         }
 
@@ -2616,7 +2622,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
 				cloudTeacherOrderService.update(cloudTeacherOrder);
 				// 添加会员有效时长
-				studentService.updateMemberRank(userId,cloudTeacherOrder.getLevel(), periodEnum, cloudTeacherOrder.getTime());
+				studentService.updateMemberRank(cloudTeacherOrder, periodEnum);
 				
 				//添加订单明细
 				StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();

+ 58 - 87
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,37 +1,11 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.ibatis.annotations.Param;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.PracticeGroupDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
 import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
 import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
-import com.ym.mec.biz.dal.enums.GradeTypeEnum;
-import com.ym.mec.biz.dal.enums.PeriodEnum;
-import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -40,14 +14,20 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implements StudentService {
 
     @Autowired
     private StudentDao studentDao;
-    @Autowired
-    private CourseScheduleDao courseScheduleDao;
 
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -279,25 +259,25 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateMemberRank(Integer userId, Integer rankSettingId, PeriodEnum periodEnum, int quantityPerPeriod) {
+    public void updateMemberRank(CloudTeacherOrder cloudTeacherOrder, PeriodEnum periodEnum) {
         // 添加会员有效时长
-        Student student = this.get(userId);
+        Student student = this.get(cloudTeacherOrder.getStudentId());
         if (student == null) {
             throw new BizException("学员信息不存在");
         }
-        
+
         Date nowDate = new Date();
         if (student.getMemberRankSettingId() == null || nowDate.after(student.getMembershipEndTime())) {
         	switch (periodEnum) {
     		case DAY:
-                student.setMembershipEndTime(DateUtil.addDays(nowDate, quantityPerPeriod));
+                student.setMembershipEndTime(DateUtil.addDays(nowDate, cloudTeacherOrder.getTime()));
     			break;
     		case MONTH:
     		case YEAR_HALF:
-                student.setMembershipEndTime(DateUtil.addMonths(nowDate, quantityPerPeriod));
+                student.setMembershipEndTime(DateUtil.addMonths(nowDate, cloudTeacherOrder.getTime()));
     			break;
     		case YEAR:
-                student.setMembershipEndTime(DateUtil.addYears(nowDate, quantityPerPeriod));
+                student.setMembershipEndTime(DateUtil.addYears(nowDate, cloudTeacherOrder.getTime()));
     			break;
 
     		default:
@@ -307,69 +287,60 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         } else {
         	switch (periodEnum) {
     		case DAY:
-            	student.setMembershipEndTime(DateUtil.addDays(student.getMembershipEndTime(), quantityPerPeriod));
+            	student.setMembershipEndTime(DateUtil.addDays(student.getMembershipEndTime(), cloudTeacherOrder.getTime()));
     			break;
     		case MONTH:
     		case YEAR_HALF:
-            	student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), quantityPerPeriod));
+            	student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), cloudTeacherOrder.getTime()));
     			break;
     		case YEAR:
-            	student.setMembershipEndTime(DateUtil.addYears(student.getMembershipEndTime(), quantityPerPeriod));
+            	student.setMembershipEndTime(DateUtil.addYears(student.getMembershipEndTime(), cloudTeacherOrder.getTime()));
     			break;
-
     		default:
     			break;
     		}
         }
-        student.setMemberRankSettingId(rankSettingId);
-        student.setUpdateTime(nowDate);
-        this.update(student);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void batchUpdateMemberRank(List<Integer> studentIds, Integer rankSettingId, PeriodEnum periodEnum, int quantityPerPeriod) {
-        // 添加会员有效时长
-        List<Student> studentList = studentDao.findByStudentIds(studentIds);
-        Date nowDate = new Date();
-        for (Student student : studentList) {
-            if (student.getMemberRankSettingId() == null || nowDate.after(student.getMembershipEndTime())) {
-                switch (periodEnum) {
-                    case DAY:
-                        student.setMembershipEndTime(DateUtil.addDays(nowDate, quantityPerPeriod));
-                        break;
-                    case MONTH:
-                    case YEAR_HALF:
-                        student.setMembershipEndTime(DateUtil.addMonths(nowDate, quantityPerPeriod));
-                        break;
-                    case YEAR:
-                        student.setMembershipEndTime(DateUtil.addYears(nowDate, quantityPerPeriod));
-                        break;
-                    default:
-                        break;
-                }
-                student.setMembershipStartTime(nowDate);
-            } else {
-                switch (periodEnum) {
-                    case DAY:
-                        student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), quantityPerPeriod));
-                        break;
-                    case MONTH:
-                    case YEAR_HALF:
-                        student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), quantityPerPeriod));
-                        break;
-                    case YEAR:
-                        student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), quantityPerPeriod));
-                        break;
-
-                    default:
-                        break;
+        if(StringUtils.isNotEmpty(cloudTeacherOrder.getMusicGroupId())){
+            StudentRegistration registration = studentRegistrationDao.getByUserIdAndMusicGroupId(cloudTeacherOrder.getMusicGroupId(), cloudTeacherOrder.getStudentId());
+            if(registration != null && registration.getMusicGroupStatus() == StudentMusicGroupStatusEnum.NORMAL){
+                student.setMemberMusicGroupId(cloudTeacherOrder.getMusicGroupId());
+                if (student.getMusicMembershipEndTime() == null || nowDate.after(student.getMusicMembershipEndTime())) {
+                    switch (periodEnum) {
+                        case DAY:
+                            student.setMusicMembershipEndTime(DateUtil.addDays(nowDate, cloudTeacherOrder.getTime()));
+                            break;
+                        case MONTH:
+                        case YEAR_HALF:
+                            student.setMusicMembershipEndTime(DateUtil.addMonths(nowDate, cloudTeacherOrder.getTime()));
+                            break;
+                        case YEAR:
+                            student.setMusicMembershipEndTime(DateUtil.addYears(nowDate, cloudTeacherOrder.getTime()));
+                            break;
+                        default:
+                            break;
+                    }
+                } else {
+                    switch (periodEnum) {
+                        case DAY:
+                            student.setMusicMembershipEndTime(DateUtil.addDays(student.getMusicMembershipEndTime(), cloudTeacherOrder.getTime()));
+                            break;
+                        case MONTH:
+                        case YEAR_HALF:
+                            student.setMusicMembershipEndTime(DateUtil.addMonths(student.getMusicMembershipEndTime(), cloudTeacherOrder.getTime()));
+                            break;
+                        case YEAR:
+                            student.setMusicMembershipEndTime(DateUtil.addYears(student.getMusicMembershipEndTime(), cloudTeacherOrder.getTime()));
+                            break;
+                        default:
+                            break;
+                    }
                 }
             }
-            student.setMemberRankSettingId(rankSettingId);
-            student.setUpdateTime(nowDate);
         }
-        studentDao.batchUpdate(studentList);
+
+        student.setMemberRankSettingId(cloudTeacherOrder.getLevel());
+        student.setUpdateTime(nowDate);
+        this.update(student);
     }
 
     @Override

+ 10 - 6
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -38,8 +38,10 @@
         <result column="order_id_" property="cloudTeacherOrder.orderId"/>
         <result column="trans_status_" property="studentPaymentOrder.status"/>
         <result column="expect_amount_" property="studentPaymentOrder.expectAmount"/>
+        <result column="pay_time_" property="studentPaymentOrder.payTime"/>
         <result column="name_" property="memberRankSetting.name"/>
         <result column="icon_" property="memberRankSetting.icon"/>
+        <result column="music_group_id_" property="studentPaymentOrder.musicGroupId"/>
     </resultMap>
 
     <select id="get" resultMap="CloudTeacherOrder">
@@ -55,15 +57,17 @@
             useGeneratedKeys="true">
         <!--@mbg.generated-->
         insert into cloud_teacher_order (organ_id_,student_id_, type_, level_, time_, amount_, refund_amount_, status_,
-        order_id_,start_time_,end_time_,
-        remark_, create_time_, update_time_)
+        order_id_,start_time_,end_time_,remark_, create_time_, update_time_,music_group_id_)
         values (#{organId},#{studentId}, #{type},#{level}, #{time}, #{amount}, #{refundAmount},
-        #{status},#{orderId},#{startTime},#{endTime}, #{remark}, NOW(), NOW())
+        #{status},#{orderId},#{startTime},#{endTime}, #{remark}, NOW(), NOW(),#{musicGroupId})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.CloudTeacherOrder">
         <!--@mbg.generated-->
         update cloud_teacher_order
         <set>
+            <if test="musicGroupId != null">
+                music_group_id_ = #{musicGroupId},
+            </if>
             <if test="organId != null">
                 organ_id_ = #{organId},
             </if>
@@ -117,7 +121,7 @@
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="CloudTeacherOrderDto" parameterType="map">
-        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto 
+        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,spo.pay_time_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
         left join student_payment_order spo on cto.order_id_ = spo.id_
         left join member_rank_setting mrs on mrs.id_ = cto.level_
         where spo.type_ = 'MEMBER'
@@ -185,9 +189,9 @@
         SELECT cto.* FROM cloud_teacher_order cto
         WHERE order_id_ = #{orderId}
     </select>
-    
+
     <select id="queryOrderInfoByOrderId" resultMap="CloudTeacherOrderDto">
-        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto 
+        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
         left join student_payment_order spo on cto.order_id_ = spo.id_
         left join member_rank_setting mrs on mrs.id_ = cto.level_
         where spo.type_ = 'MEMBER' and order_id_ = #{orderId}

+ 6 - 3
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -795,17 +795,20 @@
 			COUNT(DISTINCT mgpc.music_group_id_,mgpcd.user_id_)
 		FROM
 		music_group_payment_calender_detail mgpcd
+		LEFT JOIN student s ON s.user_id_ = mgpcd.user_id_
 		LEFT JOIN music_group_payment_calender mgpc ON mgpcd.music_group_payment_calender_id_ = mgpc.id_
 		LEFT JOIN music_group mg ON mgpc.music_group_id_ = mg.id_
 		WHERE
 		mg.status_ = 'PROGRESS'
+		AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(s.music_membership_end_time_,NOW()) &lt; 0 OR s.music_membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 		<if test="noPaymentType==null or noPaymentType==0">
-			AND DATE_FORMAT(NOW(),'%Y-%m-%d') > mgpc.deadline_payment_date_
+			AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 		</if>
 		<if test="noPaymentType!=null and noPaymentType==1">
-			AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN mgpc.start_payment_date_ AND mgpc.deadline_payment_date_
+			AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN DATE_FORMAT(mgpc.start_payment_date_,'%Y-%m-%d') AND DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 		</if>
-		AND mgpcd.payment_status_ = 'NON_PAYMENT' AND mgpcd.expect_amount_ > 0 AND mgpc.batch_no_ IS NOT NULL AND mgpc.pay_user_type_ = 'STUDENT'
+		AND mgpcd.payment_status_ = 'NON_PAYMENT' AND mgpc.batch_no_ IS NOT NULL AND mgpc.pay_user_type_ = 'STUDENT'
+		AND (mgpcd.expect_amount_ + mgpcd.expect_member_amount_) > 0
 		<if test="educationUserId != null">
 			AND mg.educational_teacher_id_ = #{educationUserId}
 		</if>

+ 10 - 2
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml

@@ -400,8 +400,10 @@
 	<select id="queryNoPaymentTotalAmount" resultType="java.util.Map">
 		SELECT mgpcd.user_id_ 'key',SUM(mgpcd.expect_amount_ + mgpcd.expect_member_amount_) 'value' FROM music_group_payment_calender_detail mgpcd
 		LEFT JOIN music_group_payment_calender mgpc ON mgpcd.music_group_payment_calender_id_ = mgpc.id_
+		LEFT JOIN student s ON s.user_id_ = mgpcd.user_id_
 		WHERE mgpc.batch_no_ IS NOT NULL AND mgpcd.payment_status_ = 'NON_PAYMENT' AND (mgpcd.expect_amount_ + mgpcd.expect_member_amount_) > 0
 		AND mgpc.music_group_id_ = #{musicGroupId} AND mgpc.status_ IN ('OPEN','OVER','PAID') AND mgpc.pay_user_type_ = 'STUDENT'
+		AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(s.music_membership_end_time_,NOW()) &lt; 0 OR s.music_membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 		GROUP BY mgpcd.user_id_
 	</select>
 
@@ -437,11 +439,12 @@
 	<sql id="queryArrearageStudentsCondition">
 		<where>
 			mg.status_ = 'PROGRESS'
+			AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(s.music_membership_end_time_,NOW()) &lt; 0 OR s.music_membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 			<if test="noPaymentType==null or noPaymentType==0">
-				AND DATE_FORMAT(NOW(),'%Y-%m-%d') > mgpc.deadline_payment_date_
+				AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 			</if>
 			<if test="noPaymentType!=null and noPaymentType==1">
-				AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN mgpc.start_payment_date_ AND mgpc.deadline_payment_date_
+				AND DATE_FORMAT(NOW(),'%Y-%m-%d') BETWEEN DATE_FORMAT(mgpc.start_payment_date_,'%Y-%m-%d') AND DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 			</if>
 			AND mgpcd.payment_status_ = 'NON_PAYMENT' AND mgpc.batch_no_ IS NOT NULL AND mgpc.pay_user_type_ = 'STUDENT'
 			AND (mgpcd.expect_amount_ + mgpcd.expect_member_amount_) > 0
@@ -454,6 +457,9 @@
 			<if test="musicGroupId!=null and musicGroupId!=''">
 				AND mgpc.music_group_id_ = #{musicGroupId}
 			</if>
+			<if test="courseViewType != null">
+				AND mg.course_view_type_ = #{courseViewType}
+			</if>
 			<if test="cooperationOrganId!=null">
 				AND mg.cooperation_organ_id_ = #{cooperationOrganId}
 			</if>
@@ -482,6 +488,7 @@
 			su.phone_ phone_
 		FROM
 			music_group_payment_calender_detail mgpcd
+			LEFT JOIN student s ON s.user_id_ = mgpcd.user_id_
 			LEFT JOIN music_group_payment_calender mgpc ON mgpcd.music_group_payment_calender_id_ = mgpc.id_
 			LEFT JOIN music_group mg ON mgpc.music_group_id_ = mg.id_
 			LEFT JOIN student_registration sr ON sr.music_group_id_ = mgpc.music_group_id_
@@ -503,6 +510,7 @@
 			COUNT(DISTINCT mgpc.music_group_id_,mgpcd.user_id_)
 		FROM
 			music_group_payment_calender_detail mgpcd
+			LEFT JOIN student s ON s.user_id_ = mgpcd.user_id_
 			LEFT JOIN music_group_payment_calender mgpc ON mgpcd.music_group_payment_calender_id_ = mgpc.id_
 			LEFT JOIN music_group mg ON mgpc.music_group_id_ = mg.id_
 			<if test="search!=null and search!=''">

+ 17 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -29,6 +29,8 @@
         <result column="organ_name_" property="organName"/>
         <result column="phone_" property="phone"/>
         <result column="username_" property="username"/>
+        <result column="music_membership_end_time_" property="musicMembershipEndTime"/>
+        <result column="member_music_group_id_" property="memberMusicGroupId"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -96,6 +98,12 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.Student">
         UPDATE student
         <set>
+            <if test="musicMembershipEndTime != null">
+                music_membership_end_time_ = #{musicMembershipEndTime},
+            </if>
+            <if test="memberMusicGroupId != null">
+                member_music_group_id_ = #{memberMusicGroupId},
+            </if>
             <if test="subjectIdList != null">
                 subject_id_list_ = #{subjectIdList},
             </if>
@@ -761,6 +769,11 @@
         GROUP BY s.user_id_ HAVING (MAX(cto.id_) IS NULL OR MIN(cto.status_) > 1)
         AND DATEDIFF(MAX(cto.end_time_),NOW()) = #{pushMemberRenew}
     </select>
+    <select id="queryAutoCreateStudentMap" resultType="java.util.Map">
+        SELECT GROUP_CONCAT(s.user_id_) 'value',s.member_music_group_id_ 'key' FROM student s
+        WHERE DATEDIFF(s.music_membership_end_time_,NOW()) + 1 = #{pushMemberRenew}
+        GROUP BY s.member_music_group_id_
+    </select>
 
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
@@ -784,4 +797,8 @@
         UPDATE student SET member_rank_setting_id_ = NULL,membership_start_time_ = NULL,membership_end_time_ = NULL
         WHERE user_id_ = #{userId}
     </update>
+    <update id="cleanMusicMember">
+        UPDATE student SET member_music_group_id_ = NULL,music_membership_end_time_ = NULL
+        WHERE user_id_ = #{userId}
+    </update>
 </mapper>

+ 7 - 1
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.io.File;
 import java.net.URL;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @RequestMapping("task")
@@ -471,7 +472,12 @@ public class TaskController extends BaseController {
 	@ApiOperation("每天10点推送排课、续费提醒")
 	@GetMapping(value = "/musicSchoolTermPush")
 	public void musicSchoolTermPush() {
-		musicGroupSchoolTermCourseDetailService.musicSchoolTermPush();
+//		Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("musicSchoolTermPush","musicSchoolTermPush",
+//				23,
+//				TimeUnit.HOURS);
+//		if(success){
+			musicGroupSchoolTermCourseDetailService.musicSchoolTermPush();
+//		}
 	}
 
 	@ApiOperation("会员到期后清空会员信息")