package com.xjrsoft.module.job; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.gson.JsonArray; import com.xjrsoft.common.mybatis.SqlRunnerAdapter; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.service.IBaseClassService; import com.xjrsoft.module.schedule.util.DataUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * @author dzx * @date 2024/1/25 */ @Component @Slf4j public class JianyuekbScheduleTask { @Autowired private IBaseClassService classService; @Scheduled(cron = "0 */10 * * * ?") public void execute() throws Exception { RefreshConnectionPool(); } public void RefreshConnectionPool() throws Exception { String active = SpringUtil.getActiveProfile(); if(!"prod".equals(active)){ log.info("非正式环境,无法执行获取课表数据"); return; } String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback IS NULL"; List> receiveMsgs = SqlRunnerAdapter.db().selectList(sql); JsonArray allScheduleInfo = new JsonArray(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DataUtil dataUtil = new DataUtil(); //查询出传入排课系统的年级和班级 List eduYearSerialNo1 = receiveMsgs.stream().map(x -> "'" + x.get("edu_year_serial_no").toString() + "'").collect(Collectors.toList()); //查询出传入排课系统的年级和班级 sql = "SELECT * FROM jianyue_data WHERE source_id IS NOT NULL AND jianyue_id != ''" + " and table_name = 'base_grade'" + " and jianyue_id in (" + eduYearSerialNo1.toString().replace("[","").replace("]","") + ")"; List> jianyueData = SqlRunnerAdapter.db().selectList(sql); Map> gradeClassMaps = new HashMap<>();//存入对应年级的所有班级id for (Map el : jianyueData) { String gradeId = el.get("source_id").toString(); if(gradeId.contains("_")){ gradeId = el.get("source_id").toString().split("_")[1]; } List classList = classService.list(new QueryWrapper().lambda().eq(BaseClass::getGradeId, gradeId)); List classIds = classList.stream().map(BaseClass::getId).collect(Collectors.toList()); gradeClassMaps.put(el.get("jianyue_id").toString(), classIds); } for (Map receiveMsg : receiveMsgs) { String updSql = "update course_receive_msg set is_callback = 0 where id = " + receiveMsg.get("id").toString(); SqlRunnerAdapter.db().update(updSql); String eduYearSerialNo = receiveMsg.get("edu_year_serial_no").toString(); String startDateStr = receiveMsg.get("start_date").toString(); String endDateStr = receiveMsg.get("end_date").toString(); //删除课表信息 String delSql = "delete from course_table where schedule_date between '" + startDateStr + "'" + " and '" + endDateStr + "'" + " and class_id in (" + gradeClassMaps.get(eduYearSerialNo).toString().replace("[","").replace("]","")+ ")"; SqlRunnerAdapter.db().delete(delSql); LocalDate startDateObj = LocalDate.parse(startDateStr); LocalDate endDateObj = LocalDate.parse(endDateStr); long between = ChronoUnit.DAYS.between(startDateObj, endDateObj); int times = Integer.parseInt(((between / 7) + 1) + ""); for (int index = 0; index < times; index ++) { LocalDate statrTime = startDateObj.plusDays(index * 7L); String startDate = statrTime.format(formatter); LocalDate endTime = statrTime.plusDays(6L); if(endTime.isAfter(endDateObj)){ endTime = endDateObj; } String endDate = endTime.format(formatter); //获取课表并存到数据库 JsonArray scheduleInfo = dataUtil.getScheduleInfoByGrade(eduYearSerialNo, startDate, endDate); allScheduleInfo.addAll(scheduleInfo); } updSql = "update course_receive_msg set is_callback = 1 where id = " + receiveMsg.get("id").toString(); SqlRunnerAdapter.db().update(updSql); } doExecute(allScheduleInfo); } void doExecute(JsonArray scheduleInfo){ String sql = "SELECT distinct table_name FROM jianyue_data WHERE 1 = 1"; List> query = SqlRunnerAdapter.db().selectList(sql); Set tables = new HashSet<>(); for (Map jianyueData : query) { tables.add(jianyueData.get("table_name").toString()); } sql = "SELECT * FROM jianyue_data WHERE source_id IS NOT NULL AND jianyue_id != ''"; List> list = SqlRunnerAdapter.db().selectList(sql); Map> dataMap = new HashMap<>(); for (String table : tables) { Map tableData = new HashMap<>(); for (Map jianyueData : list) { if(!table.equals(jianyueData.get("table_name").toString())){ continue; } tableData.put(jianyueData.get("jianyue_id").toString(), jianyueData.get("source_id").toString()); } dataMap.put(table, tableData); } DataUtil dataUtil = new DataUtil(); //获取年级 String tableName = "base_grade"; // Map gradeMap = dataMap.get(tableName); //获取学期 tableName = "base_semester"; Map semesterMap = dataMap.get(tableName); //获取课程 tableName = "base_course_subject"; Map courseMap = dataMap.get(tableName); //获取教职工 tableName = "base_teacher"; Map teacherMap = dataMap.get(tableName); //获取行政班 tableName = "base_class"; Map classMap = dataMap.get(tableName); tableName = "base_classroom"; Map classroomMap = dataMap.get(tableName); dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap); dataUtil.insertClassTime(scheduleInfo); } }