Browse Source

定时任务执行优化,没有测试,可能存在问题

zouxuan 2 years ago
parent
commit
f1710f3fe6

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

@@ -24,7 +24,7 @@ public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMo
     List<DecimalMapDto> indexCoop(String organId, String startTime, String endTime);
 
 
-    void indexBaseDataTask(Integer tenantId, String month, Set<IndexDataType> dataTypes);
+    void indexBaseDataTask(Integer tenantId);
 
     Map<String, Object> getIndexErrData(String organId, IndexErrorType errorType);
 

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

@@ -17,6 +17,7 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Transactional;
 
 public interface StudentService extends BaseService<Integer, Student> {
 
@@ -57,6 +58,11 @@ public interface StudentService extends BaseService<Integer, Student> {
      */
     String getStudentGrade(GradeTypeEnum gradeType,Integer gradeNum);
 
+
+    void updateNewStudentStatus();
+
+    void updateStudentSubject();
+
     /**
      * @describe 更新学员指导老师和声部信息
      * @author Joburgess

+ 185 - 221
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -72,7 +72,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private SysEmployeePositionService employeePositionService;
 	@Autowired
 	private MusicGroupCalenderRefundPeriodDao musicGroupCalenderRefundPeriodDao;
-	private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
+	private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(20);
 	private static final Logger businessLogger = LoggerFactory.getLogger(IndexBaseMonthDataServiceImpl.class);
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
@@ -501,263 +501,227 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		});
 	}
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void indexBaseDataTask(Integer tenantId, String dayStr, Set<IndexDataType> dataTypes) {
-		LocalDate nowDate = LocalDate.now();
-
-		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
-		this.organIds.get().clear();
-		this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
-
-		if(StringUtils.isBlank(dayStr)){
-			dayStr = nowDate.plusDays(-1).toString();
-		}
 
-		LocalDate day = LocalDate.parse(dayStr, DateUtil.dateFormatter);
-		LocalDate monday = day.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+	public void runByBewTransactional(List<Runnable> tasks) {
+		List<CompletableFuture<Void>> futures = tasks.stream()
+				.map(task -> CompletableFuture.runAsync(() -> {
+					try {
+						task.run();
+					} catch (Exception e) {
+						businessLogger.error("indexBaseDataTask error:{}", e.getMessage());
+					}
+				}, exportExecutorService))
+				.collect(Collectors.toList());
 
-		//学员数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.STUDENT_REGISTRATION_NUM)){
-			saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CHARGE_STUDENT_CHANGE_RATE)) {
-			saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr,tenantId), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ACTIVATION_RATE)) {
-			saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr, nowDate.plusMonths(-6).toString(),tenantId), dayStr, IndexDataType.ACTIVATION_RATE, tenantId);
-		}
+		CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]))
+				.thenRun(exportExecutorService::shutdown)
+				.join();
+	}
 
-		//运营数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SCHOOL)) {
-			saveData(indexBaseMonthDataDao.getSchoolData(dayStr,tenantId), dayStr, IndexDataType.SCHOOL, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PROGRESS_MUSIC_GROUP_NUM)) {
-			saveData(indexBaseMonthDataDao.getMusicData(dayStr,tenantId), dayStr, IndexDataType.PROGRESS_MUSIC_GROUP_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(TRANSACTION_TEACHER_NUM)) {
-			Map<String, List<SimpleUserDto>> organPosition = employeePositionService.findOrganPosition(null, tenantId);
-			List<SimpleUserDto> transactionTeachers = organPosition.get(SysUserRoleEnum.JOIN_TEACHER.name());
-			Map<Integer, Integer> organTeacherNumMap = new HashMap<>();
-			if (transactionTeachers != null) {
-				for (SimpleUserDto transactionTeacher : transactionTeachers) {
-					Set<Integer> organIds = Arrays.stream(transactionTeacher.getOrganIds().split(","))
-							.map(s -> Integer.valueOf(s))
-							.collect(Collectors.toSet());
-					for (Integer organId : organIds) {
-						if (organTeacherNumMap.containsKey(organId)) {
-							organTeacherNumMap.put(organId, organTeacherNumMap.get(organId) + 1);
-						} else {
-							organTeacherNumMap.put(organId, 1);
-						}
+	//学员数据
+	public void studentData(String dayStr,Integer tenantId,LocalDate nowDate){
+		saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr,tenantId), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr, nowDate.plusMonths(-6).toString(),tenantId), dayStr, IndexDataType.ACTIVATION_RATE, tenantId);
+	}
+	//运营数据
+	public void operateData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getSchoolData(dayStr,tenantId), dayStr, IndexDataType.SCHOOL, tenantId);
+		saveData(indexBaseMonthDataDao.getMusicData(dayStr,tenantId), dayStr, IndexDataType.PROGRESS_MUSIC_GROUP_NUM, tenantId);
+		Map<String, List<SimpleUserDto>> organPosition = employeePositionService.findOrganPosition(null, tenantId);
+		List<SimpleUserDto> transactionTeachers = organPosition.get(SysUserRoleEnum.JOIN_TEACHER.name());
+		Map<Integer, Integer> organTeacherNumMap = new HashMap<>();
+		if (transactionTeachers != null) {
+			for (SimpleUserDto transactionTeacher : transactionTeachers) {
+				Set<Integer> organIds = Arrays.stream(transactionTeacher.getOrganIds().split(","))
+						.map(s -> Integer.valueOf(s))
+						.collect(Collectors.toSet());
+				for (Integer organId : organIds) {
+					if (organTeacherNumMap.containsKey(organId)) {
+						organTeacherNumMap.put(organId, organTeacherNumMap.get(organId) + 1);
+					} else {
+						organTeacherNumMap.put(organId, 1);
 					}
 				}
 			}
-			List<IndexBaseMonthData> datas = new ArrayList<>();
-			Date month = DateUtil.stringToDate(dayStr, "yyyy-MM-dd");
-			for (Map.Entry<Integer, Integer> organTeacherNumMapEntry : organTeacherNumMap.entrySet()) {
-				IndexBaseMonthData data = new IndexBaseMonthData();
-				data.setOrganId(organTeacherNumMapEntry.getKey());
-				data.setMonth(month);
-				BigDecimal num = new BigDecimal(organTeacherNumMapEntry.getValue());
-				data.setTotalNum(num);
-				data.setActivateNum(num);
-				data.setPercent(num);
-				datas.add(data);
-			}
-			saveData(datas, dayStr, IndexDataType.TRANSACTION_TEACHER_NUM, tenantId);
-		}
-
-		//人事数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.TEACHER_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, null,tenantId), dayStr, IndexDataType.TEACHER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.FULL_TIME_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.FULL_TIME, null,tenantId), dayStr, IndexDataType.FULL_TIME_NUM, tenantId);
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PART_TIME_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.PART_TIME, null,tenantId), dayStr, IndexDataType.PART_TIME_NUM, tenantId);
+		List<IndexBaseMonthData> datas = new ArrayList<>();
+		Date month = DateUtil.stringToDate(dayStr, "yyyy-MM-dd");
+		for (Map.Entry<Integer, Integer> organTeacherNumMapEntry : organTeacherNumMap.entrySet()) {
+			IndexBaseMonthData data = new IndexBaseMonthData();
+			data.setOrganId(organTeacherNumMapEntry.getKey());
+			data.setMonth(month);
+			BigDecimal num = new BigDecimal(organTeacherNumMapEntry.getValue());
+			data.setTotalNum(num);
+			data.setActivateNum(num);
+			data.setPercent(num);
+			datas.add(data);
 		}
-//		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, true), dayStr, IndexDataType.DIMISSION_NUM);
+		saveData(datas, dayStr, IndexDataType.TRANSACTION_TEACHER_NUM, tenantId);
+	}
 
-		//剩余课时
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, null, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_COURSE_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_MUSIC_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_MUSIC_COURSE_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_VIP_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.VIP, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_VIP_COURSE_NUM, tenantId);
+	//人事数据
+	public void personnelData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, null,tenantId), dayStr, IndexDataType.TEACHER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.FULL_TIME, null,tenantId), dayStr, IndexDataType.FULL_TIME_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.PART_TIME, null,tenantId), dayStr, IndexDataType.PART_TIME_NUM, tenantId);
+	}
+
+	//剩余课时
+	public void subCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, null, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_MUSIC_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.VIP, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_VIP_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_PRACTICE_COURSE_NUM, tenantId);
+	}
+
+	//已消耗课时
+	public void consumeCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, null, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_MUSIC_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.VIP, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_VIP_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_PRACTICE_COURSE_NUM, tenantId);
+	}
+
+	//业务数据
+	public void businessData(String dayStr,Integer tenantId,LocalDate monday){
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, null,tenantId), monday.toString(), IndexDataType.HOMEWORK_CREATE_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "submit",tenantId), monday.toString(), IndexDataType.HOMEWORK_SUBMIT_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "comment",tenantId), monday.toString(), IndexDataType.HOMEWORK_COMMENT_RATE, tenantId);
+	}
+
+	//课程数据
+	public void courseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.MUSIC, null, null, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_COURSE, tenantId);
+
+		List<IndexBaseMonthData> vipCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
+		Map<Integer, Map<String, Integer>> organCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupCategoryCourseData)) {
+			organCategoryCourseMap = vipGroupCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_PRACTICE_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_PRACTICE_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipCourseData) {
+			if (organCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
+		saveData(vipCourseData, dayStr, IndexDataType.VIP_GROUP_COURSE, tenantId);
 
-		//已消耗课时
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, null, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_COURSE_NUM, tenantId);
+		List<IndexBaseMonthData> vipOnlineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupOnlineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
+		Map<Integer, Map<String, Integer>> organOnlineCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupOnlineCategoryCourseData)) {
+			organOnlineCategoryCourseMap = vipGroupOnlineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_MUSIC_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_MUSIC_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipOnlineCourseData) {
+			if (organOnlineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organOnlineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_VIP_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.VIP, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_VIP_COURSE_NUM, tenantId);
+		saveData(vipOnlineCourseData, dayStr, IndexDataType.VIP_GROUP_ONLINE_COURSE, tenantId);
+
+		List<IndexBaseMonthData> vipOfflineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupOfflineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
+		Map<Integer, Map<String, Integer>> organOfflineCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupOfflineCategoryCourseData)) {
+			organOfflineCategoryCourseMap = vipGroupOfflineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_PRACTICE_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_PRACTICE_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipOfflineCourseData) {
+			if (organOfflineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organOfflineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
+		saveData(vipOfflineCourseData, dayStr, IndexDataType.VIP_GROUP_OFFLINE_COURSE, tenantId);
 
-		//经营数据
+		saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.PRACTICE, null, null, null,tenantId), dayStr, IndexDataType.PRACTICE_GROUP_COURSE, tenantId);
+	}
 
-//		List<IndexBaseMonthData> financePayData = indexBaseMonthDataDao.getFinancePayData(dayStr);
-//		List<IndexBaseMonthData> financeBalanceData = indexBaseMonthDataDao.getFinanceBalanceData(dayStr);
-//		List<IndexBaseMonthData> financeActualData = indexBaseMonthDataDao.getFinanceActualData(dayStr);
-//
-//		saveData(financePayData,dayStr,IndexDataType.FINANCE_PAY);
-//		saveData(financeBalanceData,dayStr,IndexDataType.FINANCE_BALANCE_AMOUNT);
-//		saveData(financeActualData,dayStr,IndexDataType.FINANCE_AMOUNT);
-//		saveData(totalAmountData,dayStr,IndexDataType.TOTAL_AMOUNT);
+	//小课数据统计
+	public void smallCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getStudentVipOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_VIP_ORDER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentTheoryOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_THEORY_ORDER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentPracticeOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_ORDER_NUM, tenantId);
+	}
 
-		//业务数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_CREATE_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, null,tenantId), monday.toString(), IndexDataType.HOMEWORK_CREATE_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_SUBMIT_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "submit",tenantId), monday.toString(), IndexDataType.HOMEWORK_SUBMIT_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_COMMENT_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "comment",tenantId), monday.toString(), IndexDataType.HOMEWORK_COMMENT_RATE, tenantId);
-		}
+	//学员变动
+	public void studentChangeData(String dayStr,Integer tenantId,LocalDate nowDate){
+		saveData(indexBaseMonthDataDao.getAddStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.ADD_STUDENT_REGISTRATION_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getMusicStudentData(dayStr, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_STUDENT, tenantId);
+		saveData(null, nowDate.toString(), IndexDataType.NEWLY_STUDENT_NUM, tenantId);
+		saveData(null, nowDate.toString(), IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getOtherStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_STUDENT_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM, tenantId);
+	}
 
-		//课程数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MUSIC_GROUP_COURSE)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.MUSIC, null, null, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_COURSE, tenantId);
+	//云教练相关
+	public void cloudTeacherData(String dayStr,Integer tenantId){
+		//分部学员质量
+		saveData(indexBaseMonthDataDao.getOrgansStudentNumData(dayStr,tenantId), dayStr, IndexDataType.ORGAN_TOTAL_STUDENT_NUM, tenantId);
+		//会员数量
+		saveData(indexBaseMonthDataDao.getMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.MEMBER_STUDENT_NUM, tenantId);
+		//新增会员数量
+		saveData(indexBaseMonthDataDao.getNewMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.NEW_MEMBER_STUDENT_NUM, tenantId);
+		//试用会员数量
+		saveData(indexBaseMonthDataDao.getExperienceMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM, tenantId);
+		//云教练使用用户
+		saveData(indexBaseMonthDataDao.getCloudStudyDayUseStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM, tenantId);
+		//活跃用户
+		saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM, tenantId);
+		//云教练新增人数
+		saveData(indexBaseMonthDataDao.getCloudStudyNewStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM, tenantId);
+		//云教练新用户人数
+		List<Integer> studentIdList = studentRegistrationDao.findStudentIds(tenantId);
+		if(!CollectionUtils.isEmpty(studentIdList)){
+			saveData(studentDao.groupOrganId(null,studentIdList),LocalDate.now().toString(),IndexDataType.CLOUD_NEW_STUDENT_NUM, tenantId);
 		}
+	}
 
-		//小课数据统计
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_VIP_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentVipOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_VIP_ORDER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_THEORY_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentTheoryOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_THEORY_ORDER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_PRACTICE_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentPracticeOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_ORDER_NUM, tenantId);
-		}
+	@Override
+	public void indexBaseDataTask(Integer tenantId) {
+		LocalDate nowDate = LocalDate.now();
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_COURSE)) {
-			List<IndexBaseMonthData> vipCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
-			Map<Integer, Map<String, Integer>> organCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupCategoryCourseData)) {
-				organCategoryCourseMap = vipGroupCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipCourseData) {
-				if (organCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipCourseData, dayStr, IndexDataType.VIP_GROUP_COURSE, tenantId);
-		}
+		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
+		this.organIds.get().clear();
+		this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_ONLINE_COURSE)) {
-			List<IndexBaseMonthData> vipOnlineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupOnlineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
-			Map<Integer, Map<String, Integer>> organOnlineCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupOnlineCategoryCourseData)) {
-				organOnlineCategoryCourseMap = vipGroupOnlineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipOnlineCourseData) {
-				if (organOnlineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organOnlineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipOnlineCourseData, dayStr, IndexDataType.VIP_GROUP_ONLINE_COURSE, tenantId);
-		}
+		String dayStr = nowDate.plusDays(-1).toString();
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_OFFLINE_COURSE)) {
-			List<IndexBaseMonthData> vipOfflineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupOfflineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
-			Map<Integer, Map<String, Integer>> organOfflineCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupOfflineCategoryCourseData)) {
-				organOfflineCategoryCourseMap = vipGroupOfflineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipOfflineCourseData) {
-				if (organOfflineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organOfflineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipOfflineCourseData, dayStr, IndexDataType.VIP_GROUP_OFFLINE_COURSE, tenantId);
-		}
+		LocalDate day = LocalDate.parse(dayStr, DateUtil.dateFormatter);
+		LocalDate monday = day.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PRACTICE_GROUP_COURSE)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.PRACTICE, null, null, null,tenantId), dayStr, IndexDataType.PRACTICE_GROUP_COURSE, tenantId);
-		}
+		List<Runnable> tasks = new ArrayList<>();
 
 		//学员变动
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ADD_STUDENT_REGISTRATION_NUM)) {
-			saveData(indexBaseMonthDataDao.getAddStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.ADD_STUDENT_REGISTRATION_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MUSIC_GROUP_STUDENT)) {
-			saveData(indexBaseMonthDataDao.getMusicStudentData(dayStr, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_STUDENT, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.NEWLY_STUDENT_NUM)) {
-			saveData(null, nowDate.toString(), IndexDataType.NEWLY_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM)) {
-			saveData(null, nowDate.toString(), IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getOtherStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM, tenantId);
-		}
+		tasks.add(() -> this.studentChangeData(dayStr, tenantId, nowDate));
+
+		//小课数据统计
+		tasks.add(() -> this.smallCourseData(dayStr, tenantId));
 
 		//云教练相关
-		//分部学员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ORGAN_TOTAL_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getOrgansStudentNumData(dayStr,tenantId), dayStr, IndexDataType.ORGAN_TOTAL_STUDENT_NUM, tenantId);
-		}
+		tasks.add(() -> this.cloudTeacherData(dayStr, tenantId));
 
-		//会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.MEMBER_STUDENT_NUM, tenantId);
-		}
+		//课程数据
+		tasks.add(() -> this.courseData(dayStr, tenantId));
 
-		//新增会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.NEW_MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getNewMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.NEW_MEMBER_STUDENT_NUM, tenantId);
-		}
+		//业务数据
+		tasks.add(() -> this.businessData(dayStr, tenantId, monday));
 
-		//试用会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getExperienceMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM, tenantId);
-		}
+		//学员数据
+		tasks.add(() -> this.studentData(dayStr, tenantId, nowDate));
 
-		//云教练使用用户
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyDayUseStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM, tenantId);
-		}
+		//运营数据
+		tasks.add(() -> this.operateData(dayStr, tenantId));
 
-		//活跃用户
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM, tenantId);
-		}
+		//人事数据
+		tasks.add(() -> this.personnelData(dayStr, tenantId));
 
-		//云教练新增人数
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyNewStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM, tenantId);
-		}
+		//剩余课时
+		tasks.add(() -> this.subCourseData(dayStr, tenantId));
 
-		//云教练新用户人数
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_NEW_STUDENT_NUM)) {
-			List<Integer> studentIdList = studentRegistrationDao.findStudentIds(tenantId);
-			if(!CollectionUtils.isEmpty(studentIdList)){
-				saveData(studentDao.groupOrganId(null,studentIdList),LocalDate.now().toString(),IndexDataType.CLOUD_NEW_STUDENT_NUM, tenantId);
-			}
-		}
+		//已消耗课时
+		tasks.add(() -> this.consumeCourseData(dayStr, tenantId));
+
+		this.runByBewTransactional(tasks);
 	}
 
 	/**

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

@@ -337,13 +337,17 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateStudentTeacherAndSubject() {
+    public void updateNewStudentStatus() {
         //更新新学员状态
         List<Integer> newStudentIds = studentDao.getHasVipCourseStudentIdsFromNewStudents();
-        if(!CollectionUtils.isEmpty(newStudentIds)){
+        if (!CollectionUtils.isEmpty(newStudentIds)) {
             studentDao.updateNewStudentsToOld(newStudentIds);
         }
+    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStudentSubject() {
         List<Student> noTeacherOrNoSubjectStudent = studentDao.getNoTeacherOrNoSubjectStudent();
         if (CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)) {
             return;
@@ -362,9 +366,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             }
             List<StudentClassInfoDto> studentClassInfoDtos = scm.get(student.getUserId());
             StudentClassInfoDto studentClassInfoDto = studentClassInfoDtos.stream().max(Comparator.comparing(StudentClassInfoDto::getClassGroupId)).get();
-//            if (Objects.isNull(student.getTeacherId())) {
-//                student.setTeacherId(studentClassInfoDto.getMainTeacherId());
-//            }
             if (StringUtils.isBlank(student.getSubjectIdList())) {
                 student.setSubjectIdList(studentClassInfoDto.getSubjectId().toString());
             }
@@ -378,6 +379,15 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
     }
 
+
+    @Override
+    public void updateStudentTeacherAndSubject() {
+        //更新新学员状态
+        this.updateNewStudentStatus();
+        //更新学员声部
+        this.updateStudentSubject();
+    }
+
     @Override
     public CooperationOrgan getStudentEduTeacher(Integer userId) {
         CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(userId);

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

@@ -469,16 +469,11 @@ public class TaskController extends BaseController {
 	}
 
 	@GetMapping("/countIndexBaseData")
-	public void countIndexBaseData(String month, String dataTypes){
-		Set<IndexDataType> dataTypeSet = new HashSet<>();
-		if(StringUtils.isNotBlank(dataTypes)){
-			dataTypeSet = Arrays.stream(dataTypes.split(",")).map(s->IndexDataType.valueOf(s)).collect(Collectors.toSet());
-		}
-
+	public void countIndexBaseData(){
 		List<TenantInfo> tenantInfos = tenantInfoService.list(new QueryWrapper<TenantInfo>().eq("state_",1));
 		if(tenantInfos != null && tenantInfos.size() > 0){
 			for (TenantInfo tenantInfo : tenantInfos) {
-				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId(), month, dataTypeSet);
+				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId());
 			}
 		}
 	}