소스 검색

Merge remote-tracking branch 'origin/dev' into dev

phoenix 1 년 전
부모
커밋
616bdcc975
25개의 변경된 파일2269개의 추가작업 그리고 289개의 파일을 삭제
  1. 95 0
      src/main/java/com/xjrsoft/module/job/JianyuekbBaseDataTask.java
  2. 95 0
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  3. 122 0
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  4. 57 0
      src/main/java/com/xjrsoft/module/schedule/entity/JianyueData.java
  5. 15 0
      src/main/java/com/xjrsoft/module/schedule/mapper/JianyueMapper.java
  6. 512 0
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  7. 167 0
      src/main/java/com/xjrsoft/module/schedule/util/ScheduleUtil.java
  8. 1 1
      src/main/java/com/xjrsoft/module/schedule/vo/ClassroomJianyuekbVo.java
  9. 1 1
      src/main/java/com/xjrsoft/module/schedule/vo/StudentJianyuekbVo.java
  10. 118 0
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentGraduateController.java
  11. 63 0
      src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentGraduateDto.java
  12. 39 0
      src/main/java/com/xjrsoft/module/student/dto/BaseStudentGraduatePageDto.java
  13. 32 0
      src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentGraduateDto.java
  14. 113 0
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentGraduate.java
  15. 27 0
      src/main/java/com/xjrsoft/module/student/mapper/BaseStudentGraduateMapper.java
  16. 25 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentGraduateService.java
  17. 36 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentGraduateServiceImpl.java
  18. 115 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentGraduatePageVo.java
  19. 64 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentGraduateVo.java
  20. 14 14
      src/main/java/com/xjrsoft/module/system/controller/DatabaselinkController.java
  21. 1 0
      src/main/resources/application-dev.yml
  22. 34 0
      src/main/resources/mapper/student/BaseStudentGraduateMapper.xml
  23. 28 0
      src/main/resources/sqlScript/20240125_sql.sql
  24. 26 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java
  25. 469 273
      src/test/java/com/xjrsoft/xjrsoftboot/ScheduleFlowTest.java

+ 95 - 0
src/main/java/com/xjrsoft/module/job/JianyuekbBaseDataTask.java

@@ -0,0 +1,95 @@
+package com.xjrsoft.module.job;
+
+import cn.hutool.db.Db;
+import com.google.gson.JsonArray;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.schedule.entity.JianyueData;
+import com.xjrsoft.module.schedule.util.DataUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author dzx
+ * @date 2024/1/12
+ */
+@Component
+@Slf4j
+public class JianyuekbBaseDataTask {
+
+
+    @Scheduled(cron = "0 */15 * * * ?")
+    public void RefreshConnectionPool() {
+        log.info("开始推送课表基础数据");
+        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        try {
+            Db use = Db.use(datasource);
+            String sql = "SELECT distinct table_name FROM jianyue_data WHERE 1 = 1";
+            List<JianyueData> query = use.query(sql, JianyueData.class);
+            Set<String> tables = new HashSet<>();
+            for (JianyueData jianyueData : query) {
+                tables.add(jianyueData.getTableName());
+            }
+            sql = "SELECT * FROM jianyue_data WHERE 0 = 0";
+            List<JianyueData> list = use.query(sql, JianyueData.class);
+            Map<String, Map<Long, String>> dataMap = new HashMap<>();
+            for (String table : tables) {
+                Map<Long, String> tableData = new HashMap<>();
+                for (JianyueData jianyueData : list) {
+                    if(!table.equals(jianyueData.getTableName())){
+                        continue;
+                    }
+                    tableData.put(jianyueData.getSourceId(), jianyueData.getJianyueId());
+                }
+                dataMap.put(table, tableData);
+            }
+            DataUtil dataUtil = new DataUtil();
+            //查询校区
+            JsonArray schoolDistrictData = dataUtil.getSchoolDistrictData();
+            //推送年级
+            String tableName = "base_grade";
+            Map<Long, String> grade = dataUtil.insertGrade(use, tableName, schoolDistrictData.get(0).getAsString(), dataMap.get(tableName));
+            if(grade.isEmpty() && dataMap.get(tableName) != null){
+                grade = dataMap.get(tableName);
+            }
+
+            //推送学期
+            tableName = "base_semester";
+            dataUtil.insertSemester(use, tableName, dataMap.get(tableName));
+            //推送课程
+            tableName = "base_course_subject";
+            dataUtil.insertCourse(use, tableName, dataMap.get(tableName));
+            //推送教职工
+            tableName = "base_teacher";
+            Map<Long, String> teacherMap = dataUtil.insertTeacher(use, tableName, dataMap.get(tableName));
+            if(teacherMap.isEmpty() && dataMap.get(tableName) != null){
+                teacherMap = dataMap.get(tableName);
+            }
+            //推送学生
+            tableName = "base_student";
+            dataUtil.insertStudent(use, tableName, grade, dataMap.get(tableName));
+            //推送教室
+            tableName = "base_classroom";
+            Map<Long, String> classroomMap = dataUtil.insertClassRoom(use, tableName, schoolDistrictData.get(0).getAsString(), dataMap.get(tableName));
+            if(classroomMap.isEmpty() && dataMap.get(tableName) != null){
+                classroomMap = dataMap.get(tableName);
+            }
+            //推送行政班,先查询当前学期id
+            String currenSemeter = dataUtil.getCurrenSemeter();
+            tableName = "base_class";
+            dataUtil.insertClass(use, tableName, grade, teacherMap, currenSemeter, dataMap.get(tableName), classroomMap);
+
+            log.info("数据推送完成");
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+}

+ 95 - 0
src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java

@@ -0,0 +1,95 @@
+package com.xjrsoft.module.job;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
+import com.google.gson.JsonArray;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.schedule.entity.JianyueData;
+import com.xjrsoft.module.schedule.util.DataUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author dzx
+ * @date 2024/1/25
+ */
+@Component
+@Slf4j
+public class JianyuekbScheduleTask {
+
+    @Scheduled(cron = "0 */5 * * * ?")
+    public void RefreshConnectionPool() {
+        log.info("开始获取课表数据");
+        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        try {
+            Db use = Db.use(datasource);
+            String sql = "SELECT distinct table_name FROM jianyue_data WHERE 1 = 1";
+            List<JianyueData> query = use.query(sql, JianyueData.class);
+            Set<String> tables = new HashSet<>();
+            for (JianyueData jianyueData : query) {
+                tables.add(jianyueData.getTableName());
+            }
+            sql = "SELECT * FROM jianyue_data WHERE 0 = 0";
+            List<JianyueData> list = use.query(sql, JianyueData.class);
+            Map<String, Map<String, Long>> dataMap = new HashMap<>();
+            for (String table : tables) {
+                Map<String, Long> tableData = new HashMap<>();
+                for (JianyueData jianyueData : list) {
+                    if(!table.equals(jianyueData.getTableName())){
+                        continue;
+                    }
+                    tableData.put(jianyueData.getJianyueId(), jianyueData.getSourceId());
+                }
+                dataMap.put(table, tableData);
+            }
+            DataUtil dataUtil = new DataUtil();
+            //获取年级
+            String tableName = "base_grade";
+            Map<String, Long> gradeMap = dataMap.get(tableName);
+            //获取学期
+            tableName = "base_semester";
+            Map<String, Long> semesterMap = dataMap.get(tableName);
+            //获取课程
+            tableName = "base_course_subject";
+            Map<String, Long> courseMap = dataMap.get(tableName);
+            //获取教职工
+            tableName = "base_teacher";
+            Map<String, Long> teacherMap = dataMap.get(tableName);
+            //获取行政班
+            tableName = "base_class";
+            Map<String, Long> classMap = dataMap.get(tableName);
+
+            tableName = "base_classroom";
+            Map<String, Long> classroomMap = dataMap.get(tableName);
+
+            //查询当前学期id
+            String currenSemeter = dataUtil.getCurrenSemeter();
+            if(StrUtil.isEmpty(currenSemeter)){
+                return;
+            }
+            sql = "SELECT * FROM base_semester WHERE id = " + currenSemeter;
+            List<BaseSemester> semesters = use.query(sql, BaseSemester.class);
+            if(semesters.isEmpty()){
+                return;
+            }
+            BaseSemester baseSemester = semesters.get(0);
+            //获取课表并存到数据库
+            Map<Long, JsonArray> scheduleInfo = dataUtil.getScheduleInfo(classMap, baseSemester.getStartDate(), baseSemester.getEndDate());
+            dataUtil.insertCourseTable(use, scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap);
+            dataUtil.insertClassTime(use, scheduleInfo, baseSemester);
+            log.info("课表数据获取完成");
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+}

+ 122 - 0
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -0,0 +1,122 @@
+package com.xjrsoft.module.schedule.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.room.dto.AddRoomDto;
+import com.xjrsoft.module.room.dto.RoomPageDto;
+import com.xjrsoft.module.room.dto.UpdateRoomDto;
+import com.xjrsoft.module.room.entity.Room;
+import com.xjrsoft.module.room.service.IRoomService;
+import com.xjrsoft.module.room.vo.RoomExcelVo;
+import com.xjrsoft.module.room.vo.RoomPageVo;
+import com.xjrsoft.module.room.vo.RoomVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+/**
+* @title: 寝室
+* @Author dzx
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/schedule" + "/schedule")
+@Api(value = "/schedule"  + "/schedule",tags = "课表代码")
+@AllArgsConstructor
+public class ScheduleController {
+
+
+    private final IRoomService roomService;
+
+    @GetMapping(value = "/receive-msg")
+    @ApiOperation(value="接收消息")
+    @SaCheckPermission("room:detail")
+    public RT<Boolean> receiveMsg(@RequestParam String schoolId, @RequestParam String eduYearSerialNo, @RequestParam String startDate, @RequestParam String endDate){
+
+        return RT.ok(true);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询寝室信息")
+    @SaCheckPermission("room:detail")
+    public RT<RoomVo> info(@RequestParam Long id){
+        Room room = roomService.getById(id);
+        if (room == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(room, RoomVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增寝室")
+    @SaCheckPermission("room:add")
+    public RT<String> add(@Valid @RequestBody AddRoomDto dto){
+        String message = roomService.saveBatch(dto);
+        if("ok".equals(message)){
+            return RT.ok("true");
+        }
+        return RT.ok(message);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改寝室")
+    @SaCheckPermission("room:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateRoomDto dto){
+
+        Room room = BeanUtil.toBean(dto, Room.class);
+        return RT.ok(roomService.updateById(room));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除寝室")
+    @SaCheckPermission("room:delete")
+    public RT<Boolean> delete(@Valid @RequestBody Long id){
+        String result = roomService.deleteReachBed(id);
+        if("ok".equals(result)){
+            return RT.ok(true);
+        }
+        return RT.error(result);
+
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam MultipartFile file) throws IOException {
+        List<RoomPageVo> savedDataList = EasyExcel.read(file.getInputStream()).head(RoomPageVo.class).sheet().doReadSync();
+        Boolean result = roomService.saveBatch(BeanUtil.copyToList(savedDataList, Room.class));
+        return RT.ok(result);
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid RoomPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<RoomExcelVo> customerList = roomService.getList(dto);
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, RoomExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "Room" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/schedule/entity/JianyueData.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.schedule.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 简约系统对照表
+* @Author dzx
+* @Date: 2024-01-23
+* @Version 1.0
+*/
+@Data
+@TableName("jianyue_data")
+@ApiModel(value = "简约系统对照表对象", description = "简约系统对照表")
+public class JianyueData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("首次推送时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 表名
+    */
+    @ApiModelProperty("表名")
+    private String tableName;
+    /**
+    * 英文姓名
+    */
+    @ApiModelProperty("数据id")
+    private Long sourceId;
+    /**
+    * 姓名拼音
+    */
+    @ApiModelProperty("简约系统id")
+    private String jianyueId;
+
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/schedule/mapper/JianyueMapper.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.schedule.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.schedule.entity.JianyueData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 寝室
+* @Author dzx
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Mapper
+public interface JianyueMapper extends MPJBaseMapper<JianyueData> {
+}

+ 512 - 0
src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java

@@ -0,0 +1,512 @@
+package com.xjrsoft.module.schedule.util;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.schedule.vo.ClassroomJianyuekbVo;
+import com.xjrsoft.module.schedule.vo.StudentJianyuekbVo;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author dzx
+ * @date 2024/1/23
+ */
+public class DataUtil {
+
+    public Map<Long, String> insertClass(Db db, String tableName, Map<Long, String> gradeMap,
+    Map<Long, String> teacherMap, String semesterSerialNo, Map<Long, String> ids, Map<Long, String> classroomMap) throws Exception {
+        String sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0";
+        List<BaseClass> dataList = db.query(sql, BaseClass.class);
+        String url  = ScheduleUtil.apiUrl + "class/create";
+        Map<Long, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        for (BaseClass baseClass : dataList) {
+            if(ids != null && ids.get(baseClass.getId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("teacherSerialNo", teacherMap.get(baseClass.getTeacherId()));
+            paramJson.addProperty("name", baseClass.getName());
+
+            paramJson.addProperty("semesterSerialNo", semesterSerialNo);
+            paramJson.addProperty("eduYearSerialNo", gradeMap.get(baseClass.getGradeId()));
+            paramJson.addProperty("extendId", baseClass.getId());
+            paramJson.addProperty("classRoomSerialNo", classroomMap.get(baseClass.getClassroomId()));
+
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+            if(result == null){
+                continue;
+            }
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(baseClass.getId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    public Map<Long, String> insertClassRoom(Db db, String tableName, String schoolDistrictId, Map<Long, String> ids) throws Exception {
+        String sql = "SELECT t1.name, t1.capacity AS people_count,t2.address AS location, t1.floor_num AS floor, t1.id AS extendId FROM " + tableName + " t1" +
+                " INNER JOIN base_office_build t2 ON t1.office_build_id = t2.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0";
+        List<ClassroomJianyuekbVo> dataList = db.query(sql, ClassroomJianyuekbVo.class);
+        String url  = ScheduleUtil.apiUrl + "classroom/create";
+        JsonParser jsonParser = new JsonParser();
+        Map<Long, String> idMap = new HashMap<>();
+        for (ClassroomJianyuekbVo classroom : dataList) {
+            if(ids != null && ids.get(classroom.getExtendId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
+            paramJson.addProperty("name", classroom.getName());
+
+            paramJson.addProperty("peopleCount", 50);
+            paramJson.addProperty("location", "无");
+            paramJson.addProperty("extendId", classroom.getExtendId());
+            paramJson.addProperty("floor", classroom.getFloor());
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+            if(result == null){
+                continue;
+            }
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(classroom.getExtendId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    public Map<Long, String> insertStudent(Db db, String tableName, Map<Long, String> gradeMap, Map<Long, String> ids) throws Exception {
+        String sql = "SELECT t1.id AS registerNo, t2.name AS realName,t3.grade_id AS gradeSerialNo," +
+                " t2.name AS alias,t2.gender,t2.id AS extendId FROM " + tableName + " t1" +
+                " INNER JOIN xjr_user t2 ON t1.user_id = t2.id" +
+                " INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0" +
+                " AND t1.student_id IS NOT NULL AND t1.student_id != ''" +
+                " AND t3.archives_status = 'FB2901'";
+        List<StudentJianyuekbVo> dataList = db.query(sql, StudentJianyuekbVo.class);
+        String url  = ScheduleUtil.apiUrl + "student/create";
+        JsonParser jsonParser = new JsonParser();
+        Map<Long, String> idMap = new HashMap<>();
+        for (StudentJianyuekbVo student : dataList) {
+            if(ids != null && ids.get(student.getExtendId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("registerNo", student.getRegisterNo());
+            paramJson.addProperty("gender", student.getGender());
+
+            paramJson.addProperty("realName", student.getRealName());
+            paramJson.addProperty("alias", student.getAlias());
+            paramJson.addProperty("extendId", student.getExtendId());
+            paramJson.addProperty("gradeSerialNo", gradeMap.get(student.getGradeSerialNo()));
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+            if(result == null){
+                continue;
+            }
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(student.getExtendId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+    /**
+     * 新增教职工
+     * @param db
+     * @param tableName
+     * @return
+     */
+    public Map<Long, String> insertTeacher(Db db, String tableName, Map<Long, String> ids) throws Exception {
+        String sql = "select t1.* from xjr_user t1" +
+                " inner join xjr_user_role_relation t2 on t1.id = t2.user_id" +
+                " inner join " + tableName + " t3 on t1.id = t3.user_id" +
+                " where t1.delete_mark = 0 and t2.role_id = 2";
+        List<XjrUser> xjrUsers = db.query(sql, XjrUser.class);
+        String url  = ScheduleUtil.apiUrl + "teacher/create";
+        JsonParser jsonParser = new JsonParser();
+
+        Map<Long, String> idMap = new HashMap<>();
+        for (XjrUser user : xjrUsers) {
+            if(ids != null && ids.get(user.getId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("jobNumber", user.getUserName());
+            paramJson.addProperty("gender", user.getGender());
+
+            paramJson.addProperty("name", user.getName());
+            paramJson.addProperty("alias", user.getNickName());
+            paramJson.addProperty("extendId", user.getId().toString());
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+            if(result == null){
+                continue;
+            }
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(user.getId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+    /**
+     *  新增课程
+     */
+    public Map<Long, String> insertCourse(Db db, String tableName, Map<Long, String> ids) throws Exception {
+        String sql = "select * from " + tableName + " where delete_mark = 0";
+        List<BaseCourseSubject> list = db.query(sql, BaseCourseSubject.class);
+        String url  = ScheduleUtil.apiUrl + "courseclass/Create";
+        Map<Long, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        for (BaseCourseSubject courseSubject : list) {
+            if(ids != null && ids.get(courseSubject.getId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("name", courseSubject.getName() + courseSubject.getCode());
+            paramJson.addProperty("code", courseSubject.getCode());
+            paramJson.addProperty("extendId", courseSubject.getId().toString());
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+            if(result == null){
+                continue;
+            }
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(courseSubject.getId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+
+        return idMap;
+    }
+
+    /**
+     * 新增学期
+     */
+    public Map<Long, String> insertSemester(Db db, String tableName, Map<Long, String> ids) throws Exception {
+        String sql = "select * from " + tableName + " where delete_mark = 0";
+        List<BaseSemester> list = db.query(sql, BaseSemester.class);
+        String url  = ScheduleUtil.apiUrl + "semester/Create";
+        Map<Long, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String spring = "春";
+        String autumn = "秋";
+
+        for (BaseSemester semester : list) {
+            if(ids != null && ids.get(semester.getId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+
+            paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())));
+            Integer period = null;
+            if(semester.getName().contains(spring)){
+                period = 1;
+            }else if(semester.getName().contains(autumn)){
+                period = 2;
+            }
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            paramJson.addProperty("period", period);
+            paramJson.addProperty("startDate", sdf.format(semester.getStartDate()));
+            paramJson.addProperty("endDate", sdf.format(semester.getEndDate()));
+            paramJson.addProperty("extendId", semester.getId().toString());
+
+            if(semester.getStartDate() != null && semester.getEndDate() != null && semester.getEndDate().getTime() > timestamp && semester.getStartDate().getTime() < timestamp){
+                paramJson.addProperty("isCurrent", Boolean.TRUE);
+            }else{
+                paramJson.addProperty("isCurrent", Boolean.FALSE);
+            }
+
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            idMap.put(semester.getId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+
+        return idMap;
+    }
+
+    /**
+     * 插入年级
+     * @param db 数据库链接
+     * @param tableName 表名字
+     * @param schoolDistrictId 校区id
+     * @param ids 数据库id和jianyue的对应关系
+     * @return 返回数据库和jianyue的对应关系
+     */
+    public Map<Long, String> insertGrade(Db db, String tableName, String schoolDistrictId, Map<Long, String> ids) throws Exception {
+        String sql = "select * from " + tableName + " where delete_mark = 0";
+        List<BaseGrade> list = db.query(sql, BaseGrade.class);
+        String url = ScheduleUtil.apiUrl + "eduyear/create";
+        JsonParser jsonParser = new JsonParser();
+        Map<Long, String> idMap = new HashMap<>();
+        for (BaseGrade baseGrade : list) {
+            if(ids !=null && ids.get(baseGrade.getId()) != null){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
+            paramJson.addProperty("period", 4);
+            paramJson.addProperty("startYear", baseGrade.getTitle().replaceAll("年", ""));
+            paramJson.addProperty("extendId", baseGrade.getId().toString());
+            paramJson.addProperty("year", 3);
+
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+
+            String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+
+            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+
+            idMap.put(baseGrade.getId(), resultJson.get("data").getAsString());
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    /**
+     * 查询校区id
+     */
+    public JsonArray getSchoolDistrictData() throws Exception {
+        JsonParser jsonParser = new JsonParser();
+
+        String url  = ScheduleUtil.apiUrl + "SchoolDistrict/page";
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("pageSize", "15");
+        jsonObject.addProperty("pageIndex", "1");
+
+        //获取时间戳
+        long timestamp = System.currentTimeMillis();
+        //生成签名
+        String sign = ScheduleUtil.createSign(timestamp);
+        String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
+        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+
+        JsonArray jsonArray = resultJson.get("data").getAsJsonObject().get("dataList").getAsJsonArray();
+        JsonArray resultArray = new JsonArray();
+        for (JsonElement jsonElement : jsonArray) {
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            resultArray.add(asJsonObject.get("id").getAsString());
+        }
+        return resultArray;
+    }
+
+    /**
+     * 查询当前学期的id
+     * @return 返回当前学期的id
+     */
+    public String getCurrenSemeter() throws Exception {
+        JsonParser jsonParser = new JsonParser();
+
+        String url  = ScheduleUtil.apiUrl + "Semester/Page";
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("pageSize", "15");
+        jsonObject.addProperty("pageIndex", "1");
+
+        //获取时间戳
+        long timestamp = System.currentTimeMillis();
+        //生成签名
+        String sign = ScheduleUtil.createSign(timestamp);
+        String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
+        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+
+        JsonArray jsonArray = resultJson.get("data").getAsJsonObject().get("dataList").getAsJsonArray();
+        String currentSemeterId = null;
+        for (JsonElement jsonElement : jsonArray) {
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            if(asJsonObject.get("isCurrent").getAsBoolean()){
+                currentSemeterId = asJsonObject.get("serialNo").getAsString();
+            }
+        }
+        return currentSemeterId;
+    }
+
+    public Map<Long, JsonArray> getScheduleInfo(Map<String, Long> classMap, Date startDate, Date endDate) throws Exception {
+        JsonParser jsonParser = new JsonParser();
+        String url  = ScheduleUtil.apiUrl + "TimeTable/List";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Map<Long, JsonArray> dataMap = new HashMap<>();
+        for (String classId : classMap.keySet()) {
+            //获取时间戳
+            long timestamp = System.currentTimeMillis();
+            //生成签名
+            String sign = ScheduleUtil.createSign(timestamp);
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("classSerialNo", classId);
+            jsonObject.addProperty("startDate", sdf.format(startDate));
+            jsonObject.addProperty("endDate", sdf.format(endDate));
+            String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
+
+            JsonObject asJsonObject = jsonParser.parse(result).getAsJsonObject();
+            dataMap.put(classMap.get(classId), asJsonObject.get("data").getAsJsonArray());
+        }
+        return dataMap;
+    }
+
+    /**
+     *
+     * @param db 数据库链接
+     * @param data 接口数据
+     * @param classroomMap 教室对应关系
+     * @param coureseMap 课程对应关系
+     * @param semesterMap 学期对应关系
+     * @param teacherMap 教师对应关系
+     */
+    public void insertCourseTable(Db db, Map<Long, JsonArray> data, Map<String, Long> classroomMap, Map<String, Long> coureseMap,Map<String, Long> semesterMap, Map<String, Long> teacherMap) throws SQLException {
+        List<String> sqls = new ArrayList<>();
+        Map<Integer, String> week = ScheduleUtil.getWeek();
+        Map<Integer, Integer> tmePeriod = ScheduleUtil.getTmePeriod();
+        int count = 1;
+        for (Long classId : data.keySet()) {
+            JsonArray jsonArray = data.get(classId);
+            for (JsonElement jsonElement : jsonArray) {
+                JsonObject asJsonObject = jsonElement.getAsJsonObject();
+                long id = System.currentTimeMillis();
+                JsonArray teachers = asJsonObject.get("teachers").getAsJsonArray();
+
+                String numberOfDayName = asJsonObject.get("numberOfDayName").getAsString();
+                Integer timeNumber = 0;//节次
+                if(!StrUtil.isEmpty(numberOfDayName)){
+                    timeNumber = Integer.parseInt(numberOfDayName.substring(numberOfDayName.length() - 1));
+                }
+                String sql = "INSERT INTO course_table(id,base_semester_id,teacher_id,teacher_name,course_id,course_name," +
+                        "class_id, class_name,weeks,weeks_cn,time_period,time_number,site_id,site_name,status," +
+                        "create_date,jianyue_id) select " + id + String.format("%04d", count) + ","
+                        + semesterMap.get(asJsonObject.get("semesterSerialNo").getAsString()) + ",";
+                if(teachers.size() > 0){
+                    JsonObject teacherJson = teachers.get(0).getAsJsonObject();
+                    sql += teacherMap.get(teacherJson.get("teacherSerialNo").getAsString()) + ","
+                        + "'" + teacherJson.get("name").getAsString() + "',";
+                }else{
+                    sql += "0,'',";
+                }
+                sql += coureseMap.get(asJsonObject.get("courseClassId").getAsString()) + ","
+                    + "'" + asJsonObject.get("courseClassName").getAsString() + "',"
+                    + classId + ","
+                    + "'" + asJsonObject.get("className").getAsString() + "',"
+                    + asJsonObject.get("dayOfWeek").getAsInt() + ","
+                    + "'" + week.get(asJsonObject.get("dayOfWeek").getAsInt()) + "',"
+                    + tmePeriod.get(asJsonObject.get("timeOption").getAsInt()) + ","
+                    + timeNumber + ","
+                    + (classroomMap.get(asJsonObject.get("classRoomSerialNo").getAsString()) == null ? 0 : classroomMap.get(asJsonObject.get("classRoomSerialNo").getAsString())) + ","
+                    + "'" + asJsonObject.get("classRoomName").getAsString() + "',1,now(),"
+                    + "'" + asJsonObject.get("id").getAsString() + "' FROM DUAL"
+                    + " WHERE NOT EXISTS(SELECT * FROM course_table WHERE jianyue_id = '" + asJsonObject.get("id").getAsString() +"' )";
+                sqls.add(sql);
+                count ++;
+            }
+            db.executeBatch(sqls);
+        }
+    }
+
+    /**
+     * 提取课时相关信息
+     * @param db
+     * @param data
+     */
+    public void insertClassTime(Db db, Map<Long, JsonArray> data, BaseSemester baseSemester) throws SQLException {
+
+        Map<String, JsonObject> infoMap = new HashMap<>();
+        Map<Integer, Integer> tmePeriod = ScheduleUtil.getTmePeriod();
+        for (JsonArray value : data.values()) {
+            for (JsonElement jsonElement : value) {
+                JsonObject asJsonObject = jsonElement.getAsJsonObject();
+                String numberOfDayName = asJsonObject.get("numberOfDayName").getAsString();
+                JsonObject json = new JsonObject();
+                json.add("startTime", asJsonObject.get("startTime"));
+                json.add("endTime", asJsonObject.get("endTime"));
+                json.addProperty("tmePeriod", tmePeriod.get(asJsonObject.get("timeOption").getAsInt()));
+                infoMap.put(numberOfDayName, json);
+            }
+        }
+        List<String> sqls = new ArrayList<>();
+        int count = 1;
+        for (String number : infoMap.keySet()) {
+            String substring = number.substring(0);
+            String substring1 = number.substring(number.length() - 1);
+            JsonObject jsonObject = infoMap.get(number);
+            long id = System.currentTimeMillis();
+            String fullName = substring + "午第" +substring1 + "节课";
+            String sql = "INSERT INTO class_time(id,time_period,number,full_name,short_name,create_date,summer_start_time"
+                    + ",summer_end_time,winter_start_time,winter_end_time) select " + id + String.format("%04d", count) + ","
+                    + jsonObject.get("tmePeriod").getAsInt() + ","
+                    + substring1 + ","
+                    + "'" + fullName + "',"
+                    + "'" + fullName + "',now(),"
+                    + "'" + jsonObject.get("endTime").getAsString() + "',"
+                    + "'" + jsonObject.get("startTime").getAsString() + "',"
+                    + "'" + jsonObject.get("endTime").getAsString() + "',"
+                    + "'" + jsonObject.get("startTime").getAsString() + "' FROM DUAL"
+                    + " WHERE NOT EXISTS(SELECT * FROM class_time WHERE time_period = "
+                    + jsonObject.get("tmePeriod").getAsInt()
+                    + " and number = " + jsonObject.get("tmePeriod").getAsInt() + ")";
+            sqls.add(sql);
+            count ++;
+        }
+        db.executeBatch(sqls);
+    }
+
+    /**
+     * 插入记录表
+     * @param db 数据库链接工具
+     * @param tableName 表名字
+     * @param idsMap id对应关系
+     */
+    public void insertRecord(Db db, String tableName, Map<Long, String> idsMap) throws SQLException {
+        if(idsMap.isEmpty()){
+            return;
+        }
+        List<String> sqls = new ArrayList<>();
+        for (Long sourceId : idsMap.keySet()) {
+            String sql = "INSERT INTO jianyue_data(create_date,table_name,source_id,jianyue_id) value(now(),'"
+                    + tableName + "'," + sourceId + ",'" + idsMap.get(sourceId) + "')";
+            sqls.add(sql);
+        }
+        db.executeBatch(sqls);
+    }
+}

+ 167 - 0
src/main/java/com/xjrsoft/module/schedule/util/ScheduleUtil.java

@@ -0,0 +1,167 @@
+package com.xjrsoft.module.schedule.util;
+
+import cn.dev33.satoken.secure.SaSecureUtil;
+import com.xjrsoft.config.JianyuekbConfig;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author dzx
+ * @date 2024/1/9
+ */
+@Slf4j
+public class ScheduleUtil {
+    public static final String ALGORITHM = "HmacSHA256";
+    public static final String apiUrl = "https://live.jianyuekb.com/api/v1/ScheduleFlowV2/OpenApi/";
+    public static final String password = "Jh&NAbn6Rm#p@6ZZ";
+    public static final String secert = "UUFM5TID45X";
+    private static JianyuekbConfig jianyuekbConfig;
+
+    public ScheduleUtil(JianyuekbConfig jianyuekbConfig){
+        this.jianyuekbConfig = jianyuekbConfig;
+    }
+    private static String calculateHMac(String key, String data) throws Exception {
+        Mac sha256_HMAC = Mac.getInstance(ALGORITHM);
+
+        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
+        sha256_HMAC.init(secret_key);
+
+        return byteArrayToHex(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
+    }
+
+    public static String byteArrayToHex(byte[] a) {
+        StringBuilder sb = new StringBuilder(a.length * 2);
+        for (byte b : a)
+            sb.append(String.format("%02x", b));
+        return sb.toString();
+    }
+
+    public static String createSign(Long timestamp) throws Exception {
+        String md5Str = SaSecureUtil.md5(ScheduleUtil.password + timestamp);
+        return calculateHMac(ScheduleUtil.secert, md5Str);
+    }
+
+    public static String doPost(String httpUrl, String param, String sign, Long timestamp) {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        OutputStreamWriter writer = null;
+        try {
+            URL url = new URL(httpUrl);
+            // 通过远程url连接对象打开连接
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestProperty("schoolId","UUFM5TID45X");
+            connection.setRequestProperty("sign",sign);
+            connection.setRequestProperty("timestamp",String.format("%d",timestamp));
+            // 设置连接请求方式
+            connection.setRequestMethod("POST");
+            // 设置连接主机服务器超时时间:15000毫秒
+            connection.setConnectTimeout(15000);
+            // 设置读取主机服务器返回数据超时时间:60000毫秒
+            connection.setReadTimeout(60000);
+            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
+            connection.setDoOutput(true);
+            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
+            connection.setDoInput(true);
+            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
+            connection.setRequestProperty("Content-Type", "application/json");
+            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
+//            connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
+            writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
+            //body参数放这里
+            writer.write(param);
+            writer.flush();
+
+            writer.close();
+
+            if (connection.getResponseCode() == 200) {
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            }else{
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                log.error(sbf.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            // 断开与远程地址url的连接
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    public static Map<Integer, String> getWeek(){
+        Map<Integer, String> weekMap = new HashMap<>();
+        weekMap.put(1, "周一");
+        weekMap.put(2, "周二");
+        weekMap.put(3, "周三");
+        weekMap.put(4, "周四");
+        weekMap.put(5, "周五");
+        weekMap.put(6, "周六");
+        weekMap.put(7, "周日");
+        return weekMap;
+    }
+
+    public static Map<Integer, Integer> getTmePeriod(){
+        Map<Integer, Integer> map = new HashMap<>();
+        map.put(2, 1);
+        map.put(3, 2);
+        map.put(5, 3);
+        return map;
+    }
+
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/schedule/vo/ClassroomJianyuekbVo.java

@@ -29,6 +29,6 @@ public class ClassroomJianyuekbVo {
 
 
     @ApiModelProperty("创建扩展id")
-    private String extendId;
+    private Long extendId;
 
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/schedule/vo/StudentJianyuekbVo.java

@@ -43,6 +43,6 @@ public class StudentJianyuekbVo {
     * 职责描述
     */
     @ApiModelProperty("创建扩展id")
-    private String extendId;
+    private Long extendId;
 
 }

+ 118 - 0
src/main/java/com/xjrsoft/module/student/controller/BaseStudentGraduateController.java

@@ -0,0 +1,118 @@
+package com.xjrsoft.module.student.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.module.student.dto.AddBaseStudentGraduateDto;
+import com.xjrsoft.module.student.dto.BaseStudentGraduatePageDto;
+import com.xjrsoft.module.student.dto.UpdateBaseStudentGraduateDto;
+import com.xjrsoft.module.student.entity.BaseStudentGraduate;
+import com.xjrsoft.module.student.service.IBaseStudentGraduateService;
+import com.xjrsoft.module.student.vo.BaseStudentGraduatePageVo;
+import com.xjrsoft.module.student.vo.BaseStudentGraduateVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/student" + "/baseStudentGraduate")
+@Api(value = "/student"  + "/baseStudentGraduate",tags = "学生毕业管理代码")
+@AllArgsConstructor
+public class BaseStudentGraduateController {
+
+
+    private final IBaseStudentGraduateService baseStudentGraduateService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="学生毕业管理列表(分页)")
+    @SaCheckPermission("basestudentgraduate:detail")
+    public RT<PageOutput<BaseStudentGraduatePageVo>> page(@Valid BaseStudentGraduatePageDto dto){
+
+        Page<BaseStudentGraduatePageVo> page = baseStudentGraduateService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        PageOutput<BaseStudentGraduatePageVo> pageOutput = ConventPage.getPageOutput(page, BaseStudentGraduatePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询学生毕业管理信息")
+    @SaCheckPermission("basestudentgraduate:detail")
+    public RT<BaseStudentGraduateVo> info(@RequestParam Long id){
+        BaseStudentGraduate baseStudentGraduate = baseStudentGraduateService.getById(id);
+        if (baseStudentGraduate == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(baseStudentGraduate, BaseStudentGraduateVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增学生毕业管理")
+    @SaCheckPermission("basestudentgraduate:add")
+    public RT<Boolean> add(@Valid @RequestBody AddBaseStudentGraduateDto dto){
+        BaseStudentGraduate baseStudentGraduate = BeanUtil.toBean(dto, BaseStudentGraduate.class);
+        boolean isSuccess = baseStudentGraduateService.save(baseStudentGraduate);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改学生毕业管理")
+    @SaCheckPermission("basestudentgraduate:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateBaseStudentGraduateDto dto){
+
+        BaseStudentGraduate baseStudentGraduate = BeanUtil.toBean(dto, BaseStudentGraduate.class);
+        return RT.ok(baseStudentGraduateService.updateById(baseStudentGraduate));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除学生毕业管理")
+    @SaCheckPermission("basestudentgraduate:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(baseStudentGraduateService.removeBatchByIds(ids));
+
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam MultipartFile file) throws IOException {
+        List<BaseStudentGraduatePageVo> savedDataList = EasyExcel.read(file.getInputStream()).head(BaseStudentGraduatePageVo.class).sheet().doReadSync();
+        Boolean result = baseStudentGraduateService.saveBatch(BeanUtil.copyToList(savedDataList, BaseStudentGraduate.class));
+        return RT.ok(result);
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid BaseStudentGraduatePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<BaseStudentGraduatePageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<BaseStudentGraduatePageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, BaseStudentGraduatePageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "BaseStudentGraduate" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 63 - 0
src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentGraduateDto.java

@@ -0,0 +1,63 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+public class AddBaseStudentGraduateDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 学生(xjr_user)
+    */
+    @ApiModelProperty("学生(xjr_user)")
+    private Long userId;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificateNumber;
+    /**
+    * 发证日期
+    */
+    @ApiModelProperty("发证日期")
+    private Date certificateDate;
+    /**
+    * 离寝日期(住读的学生才村)
+    */
+    @ApiModelProperty("离寝日期(住读的学生才村)")
+    private Date leavingBedDate;
+    /**
+    * 附件id
+    */
+    @ApiModelProperty("附件id")
+    private Long folderId;
+    /**
+    * 证书发放状态(0:未发放 1:已发放)
+    */
+    @ApiModelProperty("证书发放状态(0:未发放 1:已发放)")
+    private Integer status;
+
+}

+ 39 - 0
src/main/java/com/xjrsoft/module/student/dto/BaseStudentGraduatePageDto.java

@@ -0,0 +1,39 @@
+package com.xjrsoft.module.student.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 学生毕业管理分页查询入参
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseStudentGraduatePageDto extends PageInput {
+
+    @ApiModelProperty("学籍状态")
+    public String archivesStatus;
+
+    @ApiModelProperty("姓名")
+    public String name;
+
+    @ApiModelProperty("学号")
+    public String studentId;
+
+    @ApiModelProperty("是否发放毕业证(0:未发放 1:已发放)")
+    public Integer status;
+
+    @ApiModelProperty("证书编号")
+    public String certificateNumber;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/student/dto/UpdateBaseStudentGraduateDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+public class UpdateBaseStudentGraduateDto extends AddBaseStudentGraduateDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 113 - 0
src/main/java/com/xjrsoft/module/student/entity/BaseStudentGraduate.java

@@ -0,0 +1,113 @@
+package com.xjrsoft.module.student.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+@TableName("base_student_graduate")
+@ApiModel(value = "base_student_graduate", description = "学生毕业管理")
+public class BaseStudentGraduate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 学生(xjr_user)
+    */
+    @ApiModelProperty("学生(xjr_user)")
+    private Long userId;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificateNumber;
+    /**
+    * 发证日期
+    */
+    @ApiModelProperty("发证日期")
+    private Date certificateDate;
+    /**
+    * 离寝日期(住读的学生才村)
+    */
+    @ApiModelProperty("离寝日期(住读的学生才村)")
+    private Date leavingBedDate;
+    /**
+    * 附件id
+    */
+    @ApiModelProperty("附件id")
+    private Long folderId;
+    /**
+    * 证书发放状态(0:未发放 1:已发放)
+    */
+    @ApiModelProperty("证书发放状态(0:未发放 1:已发放)")
+    private Integer status;
+
+
+}

+ 27 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentGraduateMapper.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.student.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.student.dto.BaseStudentGraduatePageDto;
+import com.xjrsoft.module.student.entity.BaseStudentGraduate;
+import com.xjrsoft.module.student.vo.BaseStudentGraduatePageVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Mapper
+public interface BaseStudentGraduateMapper extends MPJBaseMapper<BaseStudentGraduate> {
+
+    /**
+     * 分页查询
+     * @param page
+     * @param dto
+     * @return
+     */
+    Page<BaseStudentGraduatePageVo> getPage(Page<BaseStudentGraduatePageDto> page, BaseStudentGraduatePageDto dto);
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseStudentGraduateService.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.student.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.student.dto.BaseStudentGraduatePageDto;
+import com.xjrsoft.module.student.entity.BaseStudentGraduate;
+import com.xjrsoft.module.student.vo.BaseStudentGraduatePageVo;
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+
+public interface IBaseStudentGraduateService extends MPJBaseService<BaseStudentGraduate> {
+
+    /**
+     * 分页查询
+     * @param page
+     * @param dto
+     * @return
+     */
+    Page<BaseStudentGraduatePageVo> getPage(Page<BaseStudentGraduatePageDto> page, BaseStudentGraduatePageDto dto);
+}

+ 36 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentGraduateServiceImpl.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.student.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.student.dto.BaseStudentGraduatePageDto;
+import com.xjrsoft.module.student.entity.BaseStudentGraduate;
+import com.xjrsoft.module.student.mapper.BaseStudentGraduateMapper;
+import com.xjrsoft.module.student.service.IBaseStudentGraduateService;
+import com.xjrsoft.module.student.vo.BaseStudentGraduatePageVo;
+import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 学生毕业管理
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class BaseStudentGraduateServiceImpl extends MPJBaseServiceImpl<BaseStudentGraduateMapper, BaseStudentGraduate> implements IBaseStudentGraduateService {
+    private final BaseStudentGraduateMapper baseStudentGraduateMapper;
+
+    private final IFileService fileService;
+    @Override
+    public Page<BaseStudentGraduatePageVo> getPage(Page<BaseStudentGraduatePageDto> page, BaseStudentGraduatePageDto dto) {
+        Page<BaseStudentGraduatePageVo> voPage = baseStudentGraduateMapper.getPage(page, dto);
+        for (BaseStudentGraduatePageVo record : voPage.getRecords()) {
+            record.setFileInfos(fileService.list(Wrappers.<File>query().lambda().eq(File::getFolderId,record.getFolderId())));
+        }
+        return voPage;
+    }
+}

+ 115 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentGraduatePageVo.java

@@ -0,0 +1,115 @@
+package com.xjrsoft.module.student.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.module.system.entity.File;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 学生毕业管理分页列表出参
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+public class BaseStudentGraduatePageVo {
+
+    /**
+    * 毕业证id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号(null时为毕业登记,有值时为修改)")
+    @ApiModelProperty("主键编号(null时为毕业登记,有值时为修改)")
+    private String id;
+    /**
+     * 学生user_id
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学生user_id")
+    @ApiModelProperty("学生user_id")
+    private String userId;
+    /**
+    * 学籍号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学籍号")
+    @ApiModelProperty("学籍号")
+    private String studentId;
+    /**
+    * 学生姓名
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学生姓名")
+    @ApiModelProperty("学生姓名")
+    private String name;
+    /**
+    * 专业
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("专业")
+    @ApiModelProperty("专业")
+    private String majorName;
+    /**
+    * 修改时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("就读方式")
+    @ApiModelProperty("就读方式")
+    private String stduyStatusCn;
+    /**
+    * 删除标记
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书发放状态(0:未发放 1:已发放)")
+    @ApiModelProperty("证书发放状态(0:未发放 1:已发放)")
+    private Integer status;
+    /**
+    * 证书编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("证书编号")
+    @ApiModelProperty("证书编号")
+    private String certificateNumber;
+    /**
+    * 发证日期
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("发证日期")
+    @ApiModelProperty("发证日期")
+    private Date certificateDate;
+
+    /**
+     * 班级名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    private String className;
+
+    /**
+     * 年级名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("年级名称")
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+
+    /**
+     * 附件id
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("附件id")
+    @ApiModelProperty("附件id")
+    private Long folderId;
+
+    /**
+     * 公文附件列表
+     */
+    @ApiModelProperty("公文附件列表")
+    private List<File> fileInfos;
+}

+ 64 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentGraduateVo.java

@@ -0,0 +1,64 @@
+package com.xjrsoft.module.student.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 学生毕业管理表单出参
+* @Author dzx
+* @Date: 2024-01-26
+* @Version 1.0
+*/
+@Data
+public class BaseStudentGraduateVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 学生(xjr_user)
+    */
+    @ApiModelProperty("学生(xjr_user)")
+    private Long userId;
+    /**
+    * 证书编号
+    */
+    @ApiModelProperty("证书编号")
+    private String certificateNumber;
+    /**
+    * 发证日期
+    */
+    @ApiModelProperty("发证日期")
+    private Date certificateDate;
+    /**
+    * 离寝日期(住读的学生才村)
+    */
+    @ApiModelProperty("离寝日期(住读的学生才村)")
+    private Date leavingBedDate;
+    /**
+    * 附件id
+    */
+    @ApiModelProperty("附件id")
+    private Long folderId;
+    /**
+    * 证书发放状态(0:未发放 1:已发放)
+    */
+    @ApiModelProperty("证书发放状态(0:未发放 1:已发放)")
+    private Integer status;
+
+
+
+}

+ 14 - 14
src/main/java/com/xjrsoft/module/system/controller/DatabaselinkController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.db.meta.Column;
 import cn.hutool.db.meta.MetaUtil;
 import cn.hutool.db.meta.Table;
+import com.alibaba.druid.pool.DruidDataSource;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -102,20 +103,19 @@ public class DatabaselinkController {
     }
 
 
-//    @GetMapping("/master-info")
-//    @ApiOperation(value = "查询主数据库链接详情")
-//    public R masterInfo() {
-//        DatabaseLinkVo vo = new DatabaseLinkVo();
-//        String primary = dataSourceProperties.getPrimary();
-//        vo.setId(primary);
-//        vo.setDbName("默认数据库");
-//        DataSourceProperty dataSourceProperty = dataSourceProperties.getDatasource().get(primary);
-//        vo.setDbType(JdbcUtils.getDbType(dataSourceProperty.getUrl()).getDb());
-//        vo.setHost(dataSourceProperty.getUrl());
-//        vo.setUsername(dataSourceProperty.getUsername());
-//        vo.setDriver(dataSourceProperty.getDriverClassName());
-//        return R.ok(vo);
-//    }
+    @GetMapping("/master-info")
+    @ApiOperation(value = "查询主数据库链接详情")
+    public R masterInfo() {
+        DatabaseLinkVo vo = new DatabaseLinkVo();
+        vo.setId(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        vo.setDbName("默认数据库");
+        DruidDataSource druidDataSource = DatasourceUtil.getDruidDataSource();
+        vo.setDbType(JdbcUtils.getDbType(druidDataSource.getUrl()).getDb());
+        vo.setHost(druidDataSource.getUrl());
+        vo.setUsername(druidDataSource.getUsername());
+        vo.setDriver(druidDataSource.getDriverClassName());
+        return R.ok(vo);
+    }
 
     @GetMapping("/info")
     @ApiOperation(value = "查询数据库链接详情")

+ 1 - 0
src/main/resources/application-dev.yml

@@ -97,6 +97,7 @@ xjrsoft:
       - /organization/user/register # 注册
       - /oauth2/* # oauth2
       - /system/bindOpenid # 绑定openid
+      - /schedule/schedule/receive-msg
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 34 - 0
src/main/resources/mapper/student/BaseStudentGraduateMapper.xml

@@ -0,0 +1,34 @@
+<?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.xjrsoft.module.student.mapper.BaseStudentGraduateMapper">
+    <select id="getPage" parameterType="com.xjrsoft.module.student.dto.BaseStudentGraduatePageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentGraduatePageVo">
+        SELECT t5.id,t1.user_id,t1.student_id,t2.name,t4.name AS major_name,t6.name AS stduy_status_cn,
+        IFNULL(t5.status,0) AS STATUS,t5.certificate_number,t5.certificate_date,t7.name AS class_name,t8.name AS grade_name,t5.folder_id FROM base_student t1
+        LEFT JOIN xjr_user t2 ON t1.user_id = t2.id
+        LEFT JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        LEFT JOIN base_major_set t4 ON t3.major_set_id = t4.id
+        LEFT JOIN base_student_graduate t5 ON t1.user_id = t5.user_id
+        LEFT JOIN xjr_dictionary_detail t6 ON t3.stduy_status = t6.code AND t6.item_id = 2023000000000000030
+        LEFT JOIN base_class t7 ON t7.id = t3.class_id
+        LEFT JOIN base_grade t8 ON t8.id = t3.grade_id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0
+        AND t3.delete_mark = 0
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
+            and t3.archives_status = #{dto.archivesStatus}
+        </if>
+        <if test="dto.archivesStatus != null and dto.archivesStatus != ''">
+            and t3.archives_status = #{dto.archivesStatus}
+        </if>
+    </select>
+    <!--姓名和性别,测试阶段采用姓名第一个字拼接user_id的方式脱敏-->
+    <select id="getJianyueStudentList" resultType="com.xjrsoft.module.schedule.vo.StudentJianyuekbVo">
+        SELECT t1.id AS registerNo, CONCAT(SUBSTRING(t2.name,1,1),t2.id) AS realName,t3.grade_id AS gradeSerialNo,CONCAT(SUBSTRING(t2.name,1,1),t2.id) AS alias,t2.gender,t2.id AS extendId FROM base_student t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN base_student_school_roll t3 ON t1.user_id = t3.user_id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0
+        AND t1.student_id IS NOT NULL AND t1.student_id != ''
+        AND t3.archives_status = 'FB2901';
+    </select>
+</mapper>

+ 28 - 0
src/main/resources/sqlScript/20240125_sql.sql

@@ -0,0 +1,28 @@
+-- ------------------------------------------------------------------毕业--------------------------------------------------------------------
+
+-- ----------------------------
+-- 学生毕业管理
+-- ----------------------------
+DROP TABLE IF EXISTS base_student_graduate;
+CREATE TABLE base_student_graduate
+(
+    id BIGINT NOT NULL COMMENT '主键编号',
+    `create_user_id` BIGINT NULL DEFAULT NULL COMMENT '创建人',
+    `create_date` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
+    `modify_user_id` BIGINT NULL DEFAULT NULL COMMENT '修改人',
+    `modify_date` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
+    `delete_mark` INT NOT NULL COMMENT '删除标记',
+    `enabled_mark` INT NOT NULL COMMENT '有效标志',
+    `sort_code` INT NULL DEFAULT NULL COMMENT '序号',
+    `user_id`  BIGINT NULL DEFAULT NULL COMMENT '学生(xjr_user)',
+    `certificate_number` VARCHAR(50) NULL DEFAULT NULL COMMENT '证书编号',
+    `certificate_date` DATE NULL DEFAULT NULL COMMENT '发证日期',
+    `leaving_bed_date` DATE NULL DEFAULT NULL COMMENT '离寝日期',
+    `appendix_id` BIGINT NULL DEFAULT NULL COMMENT '附件id',
+    `status` INT NOT NULL DEFAULT 0 COMMENT '证书发放状态(0:未发放 1:已发放)',
+    PRIMARY KEY (`id`)
+) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '学生毕业管理';
+
+
+
+-- ------------------------------------------------------------------毕业--------------------------------------------------------------------

+ 26 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -2073,4 +2073,30 @@ public class FreeMarkerGeneratorTest {
         apiGeneratorService.generateCodes(params);
 
     }
+
+    @Test
+    public void gcBaseStudentGraduate() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("base_student_graduate");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("student");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+
+    }
 }

+ 469 - 273
src/test/java/com/xjrsoft/xjrsoftboot/ScheduleFlowTest.java

@@ -2,23 +2,14 @@ package com.xjrsoft.xjrsoftboot;
 
 import cn.dev33.satoken.secure.SaSecureUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.xjrsoft.XjrSoftApplication;
-import com.xjrsoft.common.enums.DeleteMark;
-import com.xjrsoft.module.base.entity.BaseCourseSubject;
-import com.xjrsoft.module.base.entity.BaseGrade;
-import com.xjrsoft.module.base.entity.BaseSemester;
-import com.xjrsoft.module.base.mapper.BaseClassroomMapper;
-import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
-import com.xjrsoft.module.base.service.IBaseGradeService;
-import com.xjrsoft.module.base.service.IBaseSemesterService;
-import com.xjrsoft.module.schedule.vo.ClassroomJianyuekbVo;
-import com.xjrsoft.module.schedule.vo.StudentJianyuekbVo;
-import com.xjrsoft.module.student.mapper.BaseStudentMapper;
-import com.xjrsoft.module.teacher.entity.XjrUser;
-import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
+import com.xjrsoft.config.JianyuekbConfig;
+import com.xjrsoft.module.schedule.entity.JianyueData;
+import com.xjrsoft.module.schedule.mapper.JianyueMapper;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +19,9 @@ import org.springframework.test.context.junit4.SpringRunner;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -36,11 +30,8 @@ import java.io.OutputStreamWriter;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 // 简约课表测试
 @RunWith(SpringRunner.class)
@@ -50,22 +41,7 @@ public class ScheduleFlowTest {
     public static final String ALGORITHM = "HmacSHA256";
     public static final String apiUrl = "https://live.jianyuekb.com/api/v1/ScheduleFlowV2/OpenApi/";
     @Autowired
-    private IBaseGradeService baseGradeService;
-    @Autowired
-    private IBaseSemesterService baseSemesterService;
-    
-    @Autowired
-    private IBaseCourseSubjectService baseCourseSubjectService;
-
-    @Autowired
-    private XjrUserMapper xjrUserMapper;
-
-    @Autowired
-    private BaseStudentMapper baseStudentMapper;
-    @Autowired
-    private BaseClassroomMapper baseClassroomMapper;
-
-
+    private JianyueMapper jianyueMapper;
 
     public static String calculateHMac(String key, String data) throws Exception {
         Mac sha256_HMAC = Mac.getInstance(ALGORITHM);
@@ -111,124 +87,292 @@ public class ScheduleFlowTest {
     @Test
     public void ScheduleFlowTest() throws Exception {
         long timestamp = System.currentTimeMillis();
-
+        System.out.println("timestamp:" + timestamp);
         String md5Str = SaSecureUtil.md5("Jh&NAbn6Rm#p@6ZZ" + timestamp);
 
+
         String sign = calculateHMac("UUFM5TID45X", md5Str);
+        System.out.println("sign:" + sign);
+
         //查询校区id
-        String schoolDistrictId = insertSchoolDistrictData(sign, timestamp);
-        System.out.println("schoolDistrictId:" + schoolDistrictId);
+//        String schoolDistrictId = insertSchoolDistrictData(sign, timestamp);
+//        System.out.println("schoolDistrictId:" + schoolDistrictId);
 //        //新增年级,并返回添加好的年级id
 //        Map<Long, String> gradeMap = insertGrade(sign, timestamp, schoolDistrictId);
         //新增年级,并返回添加好的年级id
-        insertSemester(sign, timestamp);
-        //新增课程
+//        insertSemester(sign, timestamp);
+//        //新增课程
 //        insertCourse(sign, timestamp);
-        //新增教师
+//        //新增教师
 //        insertTeacher(sign, timestamp);
 
 //        insertStudent(sign, timestamp, gradeMap);
-
+//
 //        insertClassRoom(sign, timestamp,schoolDistrictId);
 
-    }
-
-    List<String> insertClass(String sign, Long timestamp, String schoolDistrictId) throws InterruptedException {
-        List<ClassroomJianyuekbVo> dataList = baseClassroomMapper.getJianyueList();
-        String url  = apiUrl + "class/create";
-        List<String> idList = new ArrayList<>();
-        JsonParser jsonParser = new JsonParser();
+        //先查寻出年级序列号
+//        JsonArray schoolDistrictData = getSchoolDistrictData(sign, timestamp);
+//        List<String> gradeInfo = getGradeInfo(sign, timestamp, schoolDistrictData);
+//
+//        //班级信息
+//        List<String> classInfo = getClassInfo(sign, timestamp);
+//
+//        //查询课表信息
+        List<JianyueData> baseClass = jianyueMapper.selectList(new QueryWrapper<JianyueData>().lambda().eq(JianyueData::getTableName, "base_class"));
+        List<String> classInfo = new ArrayList<>();
+        for (JianyueData aClass : baseClass) {
+            classInfo.add(aClass.getJianyueId());
+        }
+        JsonArray scheduleInfo = getScheduleInfo(sign, timestamp, classInfo);
+        System.out.println(scheduleInfo);
 
-        String findUrl = apiUrl + "class/page";
+//
 
-        for (ClassroomJianyuekbVo classroom : dataList) {
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
-            paramJson.addProperty("name", classroom.getName());
+    }
 
-//            paramJson.addProperty("peopleCount", classroom.getPeopleCount());
-//            paramJson.addProperty("location", classroom.getLocation());
-            paramJson.addProperty("peopleCount", 50);
-            paramJson.addProperty("location", "无");
-            paramJson.addProperty("extendId", classroom.getExtendId());
-            paramJson.addProperty("floor", classroom.getFloor());
-//            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
-//            if(findResult != null){
-//                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
-//                JsonObject data = resultJson.get("data").getAsJsonObject();
-//                if(data.get("total").getAsInt() != 0){
-//                    //调用update
-//                }
-//            }
+    @Test
+    void test(){
+        System.out.println();
+    }
 
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-            if(result == null){
-                System.out.println(paramJson.toString());
-                continue;
-            }
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            idList.add(resultJson.get("data").getAsString());
+    List<String> getClassInfo(String sign, Long timestamp){
+        JsonParser jsonParser = new JsonParser();
+        String url  = apiUrl + "Class/page";
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("pageSize", "200");
+        jsonObject.addProperty("pageIndex", "1");
+        String result = doPost(url, jsonObject.toString(), sign, timestamp);
+        System.out.println("ClassInfo:" + result);
+        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+        JsonArray jsonArray = resultJson.get("data").getAsJsonObject().get("dataList").getAsJsonArray();
+        List<String> resultArray = new ArrayList<>();
+        for (JsonElement jsonElement : jsonArray) {
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            resultArray.add(asJsonObject.get("serialNo").getAsString());
         }
-        return idList;
+        return resultArray;
     }
-
-    List<String> insertClassRoom(String sign, Long timestamp, String schoolDistrictId) throws InterruptedException {
-        List<ClassroomJianyuekbVo> dataList = baseClassroomMapper.getJianyueList();
-        String url  = apiUrl + "classroom/create";
-        List<String> idList = new ArrayList<>();
+    JsonArray getSchoolDistrictData(String sign, Long timestamp){
         JsonParser jsonParser = new JsonParser();
+//        String url  = apiUrl + "SchoolDistrict/Create";
+//        JsonObject jsonObject = new JsonObject();
+//        jsonObject.addProperty("name", "test1");
+//        jsonObject.addProperty("shortName", "本部112");
+//        jsonObject.addProperty("note", "本部211");
+//        jsonObject.addProperty("sort", "2");
+//        String result = doPost(url, jsonObject.toString(), sign, timestamp);
+//        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
 
-        String findUrl = apiUrl + "ClassRoom/page";
-
-        for (ClassroomJianyuekbVo classroom : dataList) {
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
-            paramJson.addProperty("name", classroom.getName());
-
-//            paramJson.addProperty("peopleCount", classroom.getPeopleCount());
-//            paramJson.addProperty("location", classroom.getLocation());
-            paramJson.addProperty("peopleCount", 50);
-            paramJson.addProperty("location", "无");
-            paramJson.addProperty("extendId", classroom.getExtendId());
-            paramJson.addProperty("floor", classroom.getFloor());
-//            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
-//            if(findResult != null){
-//                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
-//                JsonObject data = resultJson.get("data").getAsJsonObject();
-//                if(data.get("total").getAsInt() != 0){
-//                    //调用update
-//                }
-//            }
+        String url  = apiUrl + "SchoolDistrict/page";
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("pageSize", "15");
+        jsonObject.addProperty("pageIndex", "1");
+        String result = doPost(url, jsonObject.toString(), sign, timestamp);
+        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
 
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-            if(result == null){
-                System.out.println(paramJson.toString());
-                continue;
-            }
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            idList.add(resultJson.get("data").getAsString());
+        JsonArray jsonArray = resultJson.get("data").getAsJsonObject().get("dataList").getAsJsonArray();
+        JsonArray resultArray = new JsonArray();
+        for (JsonElement jsonElement : jsonArray) {
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            resultArray.add(asJsonObject.get("id").getAsString());
         }
-        return idList;
+        return resultArray;
     }
 
-    List<String> insertStudent(String sign, Long timestamp, Map<Long, String> gradeMap) throws InterruptedException {
-
-        List<StudentJianyuekbVo> dataList = baseStudentMapper.getJianyueStudentList();
-        String url  = apiUrl + "student/create";
-        List<String> idList = new ArrayList<>();
+    List<String> getGradeInfo(String sign, Long timestamp, JsonArray schoolDistrictIds){
         JsonParser jsonParser = new JsonParser();
+        String url  = apiUrl + "TimeTable/List";
+        JsonObject jsonObject = new JsonObject();
+//        jsonObject.addProperty("schoolDistrictIds", schoolDistrictIds.toString());
+        jsonObject.addProperty("pageSize", "15");
+        jsonObject.addProperty("pageIndex", "1");
+        String result = doPost(url, jsonObject.toString(), sign, timestamp);
+        System.out.println("grade:" + result);
+        JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+        JsonArray data = resultJson.get("data").getAsJsonArray();
+        if(data.size() == 0){
+            return new ArrayList<>();
+        }
+        JsonArray gradeArray = resultJson.get("data").getAsJsonObject().get("dataList").getAsJsonArray();
+        List<String> gradeIds = new ArrayList<>();
+        for (JsonElement jsonElement : gradeArray) {
+            JsonObject asJsonObject = jsonElement.getAsJsonObject();
+            gradeIds.add(asJsonObject.get("serialNo").getAsString());
+        }
+        
+        return gradeIds;
+    }
 
-        String findUrl = apiUrl + "Student/page";
+    JsonArray getScheduleInfo(String sign, Long timestamp, List<String> ids) throws IOException {
+        JsonParser jsonParser = new JsonParser();
+        String url  = apiUrl + "TimeTable/List";
+        if(ids.isEmpty()){
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("startDate", "2024-01-01 00:00:00");
+            jsonObject.addProperty("endDate", "2024-02-21 23:59:59");
+            String result = doPost(url, jsonObject.toString(), sign, timestamp);
+            File file = new File("D:\\workspace\\其他\\课表\\file.txt");
+            BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+            writer.write(result); // 写入字符串内容
+            writer.close();
+            return null;
+        }
+        for (String id : ids) {
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("classSerialNo", id);
+            jsonObject.addProperty("startDate", "2024-01-01 00:00:00");
+            jsonObject.addProperty("endDate", "2024-02-21 23:59:59");
+            String result = doPost(url, jsonObject.toString(), sign, timestamp);
+            System.out.println(id + ":" + result);
+        }
 
-        for (StudentJianyuekbVo student : dataList) {
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("registerNo", student.getRegisterNo());
-            paramJson.addProperty("gender", student.getGender());
+        return null;
+    }
 
-            paramJson.addProperty("realName", student.getRealName());
-            paramJson.addProperty("alias", student.getAlias());
-            paramJson.addProperty("extendId", student.getExtendId());
-            paramJson.addProperty("gradeSerialNo", gradeMap.get(student.getGradeSerialNo()));
+//    List<String> insertClass(String sign, Long timestamp, String schoolDistrictId) throws InterruptedException {
+//        List<ClassroomJianyuekbVo> dataList = baseClassroomMapper.getJianyueList();
+//        String url  = apiUrl + "class/create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//
+//        String findUrl = apiUrl + "class/page";
+//
+//        for (ClassroomJianyuekbVo classroom : dataList) {
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
+//            paramJson.addProperty("name", classroom.getName());
+//
+////            paramJson.addProperty("peopleCount", classroom.getPeopleCount());
+////            paramJson.addProperty("location", classroom.getLocation());
+//            paramJson.addProperty("peopleCount", 50);
+//            paramJson.addProperty("location", "无");
+//            paramJson.addProperty("extendId", classroom.getExtendId());
+//            paramJson.addProperty("floor", classroom.getFloor());
+////            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
+////            if(findResult != null){
+////                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
+////                JsonObject data = resultJson.get("data").getAsJsonObject();
+////                if(data.get("total").getAsInt() != 0){
+////                    //调用update
+////                }
+////            }
+//
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//            if(result == null){
+//                System.out.println(paramJson.toString());
+//                continue;
+//            }
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//        return idList;
+//    }
+//
+//    List<String> insertClassRoom(String sign, Long timestamp, String schoolDistrictId) throws InterruptedException {
+//        List<ClassroomJianyuekbVo> dataList = baseClassroomMapper.getJianyueList();
+//        String url  = apiUrl + "classroom/create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//
+//        String findUrl = apiUrl + "ClassRoom/page";
+//
+//        for (ClassroomJianyuekbVo classroom : dataList) {
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
+//            paramJson.addProperty("name", classroom.getName());
+//
+////            paramJson.addProperty("peopleCount", classroom.getPeopleCount());
+////            paramJson.addProperty("location", classroom.getLocation());
+//            paramJson.addProperty("peopleCount", 50);
+//            paramJson.addProperty("location", "无");
+//            paramJson.addProperty("extendId", classroom.getExtendId());
+//            paramJson.addProperty("floor", classroom.getFloor());
+////            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
+////            if(findResult != null){
+////                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
+////                JsonObject data = resultJson.get("data").getAsJsonObject();
+////                if(data.get("total").getAsInt() != 0){
+////                    //调用update
+////                }
+////            }
+//
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//            if(result == null){
+//                System.out.println(paramJson.toString());
+//                continue;
+//            }
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//        return idList;
+//    }
+//
+//    List<String> insertStudent(String sign, Long timestamp, Map<Long, String> gradeMap) throws Exception {
+//
+//        List<StudentJianyuekbVo> dataList = baseStudentMapper.getJianyueStudentList();
+//        String url  = apiUrl + "student/create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//
+//        String findUrl = apiUrl + "Student/page";
+//
+//        for (StudentJianyuekbVo student : dataList) {
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("registerNo", student.getRegisterNo());
+//            paramJson.addProperty("gender", student.getGender());
+//
+//            paramJson.addProperty("realName", student.getRealName());
+//            paramJson.addProperty("alias", student.getAlias());
+//            paramJson.addProperty("extendId", student.getExtendId());
+//            paramJson.addProperty("gradeSerialNo", gradeMap.get(student.getGradeSerialNo()));
+////            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
+////            if(findResult != null){
+////                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
+////                JsonObject data = resultJson.get("data").getAsJsonObject();
+////                if(data.get("total").getAsInt() != 0){
+////                    //调用update
+////                }
+////            }
+//            timestamp = System.currentTimeMillis();
+//            System.out.println("timestamp:" + timestamp);
+//            String md5Str = SaSecureUtil.md5("Jh&NAbn6Rm#p@6ZZ" + timestamp);
+//
+//
+//            sign = calculateHMac("UUFM5TID45X", md5Str);
+//            System.out.println("sign:" + sign);
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//            if(result == null){
+//                System.out.println(paramJson.toString());
+//                continue;
+//            }
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//        return idList;
+//    }
+//
+//    List<String> insertTeacher(String sign, Long timestamp) throws InterruptedException {
+//        List<XjrUser> xjrUsers = xjrUserMapper.selectJoinList(
+//            XjrUser.class, new MPJLambdaWrapper<XjrUser>()
+//            .innerJoin("xjr_user_role_relation t2 on t.id = t2.user_id")
+//            .eq("t2.role_id", 2)
+//        );
+//        String url  = apiUrl + "teacher/create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//
+//        String findUrl = apiUrl + "/Teacher/Page";
+//
+//        for (XjrUser user : xjrUsers) {
+//            Thread.sleep(1000);
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("jobNumber", user.getUserName());
+//            paramJson.addProperty("gender", user.getGender());
+//
+//            String name = user.getName().substring(0, 1) + user.getUserName();
+//            paramJson.addProperty("name", name);
+//            paramJson.addProperty("alias", name);
+//            paramJson.addProperty("extendId", user.getId().toString());
 //            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
 //            if(findResult != null){
 //                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
@@ -237,132 +381,90 @@ public class ScheduleFlowTest {
 //                    //调用update
 //                }
 //            }
-
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-            if(result == null){
-                System.out.println(paramJson.toString());
-                continue;
-            }
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            idList.add(resultJson.get("data").getAsString());
-        }
-        return idList;
-    }
-
-    List<String> insertTeacher(String sign, Long timestamp) throws InterruptedException {
-        List<XjrUser> xjrUsers = xjrUserMapper.selectJoinList(
-            XjrUser.class, new MPJLambdaWrapper<XjrUser>()
-            .innerJoin("xjr_user_role_relation t2 on t.id = t2.user_id")
-            .eq("t2.role_id", 2)
-        );
-        String url  = apiUrl + "teacher/create";
-        List<String> idList = new ArrayList<>();
-        JsonParser jsonParser = new JsonParser();
-
-        String findUrl = apiUrl + "/Teacher/Page";
-
-        for (XjrUser user : xjrUsers) {
-            Thread.sleep(1000);
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("jobNumber", user.getUserName());
-            paramJson.addProperty("gender", user.getGender());
-
-            String name = user.getName().substring(0, 1) + user.getUserName();
-            paramJson.addProperty("name", name);
-            paramJson.addProperty("alias", name);
-            paramJson.addProperty("extendId", user.getId().toString());
-            String findResult = doPost(findUrl, paramJson.toString(), sign, timestamp);
-            if(findResult != null){
-                JsonObject resultJson = jsonParser.parse(findResult).getAsJsonObject();
-                JsonObject data = resultJson.get("data").getAsJsonObject();
-                if(data.get("total").getAsInt() != 0){
-                    //调用update
-                }
-            }
-
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-            if(result == null){
-                System.out.println(paramJson.toString());
-                continue;
-            }
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            idList.add(resultJson.get("data").getAsString());
-        }
-        return idList;
-    }
-
-    List<String> insertCourse(String sign, Long timestamp){
-        List<BaseCourseSubject> list = baseCourseSubjectService.list(
-                new QueryWrapper<BaseCourseSubject>().lambda()
-                        .eq(BaseCourseSubject::getDeleteMark, DeleteMark.NODELETE.getCode())
-        );
-        String url  = apiUrl + "courseclass/Create";
-        List<String> idList = new ArrayList<>();
-        JsonParser jsonParser = new JsonParser();
-        for (BaseCourseSubject courseSubject : list) {
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("name", courseSubject.getName() + courseSubject.getCode());
-            paramJson.addProperty("code", courseSubject.getCode());
-            paramJson.addProperty("extendId", courseSubject.getId().toString());
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-            if(result == null){
-                System.out.println("result is null, paramJson: " + paramJson.toString());
-                continue;
-            }
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            if(resultJson.get("code").getAsInt() == -1){
-                System.out.println("paramJson: " + paramJson.toString() + ", 返回结果:" + result);
-            }
-            idList.add(resultJson.get("data").getAsString());
-        }
-
-        return idList;
-    }
-
-
-
-    List<String> insertSemester(String sign, Long timestamp){
-        List<BaseSemester> list = baseSemesterService.list(
-            new QueryWrapper<BaseSemester>().lambda()
-            .eq(BaseSemester::getDeleteMark, DeleteMark.NODELETE.getCode())
-        );
-        String url  = apiUrl + "semester/Create";
-        List<String> idList = new ArrayList<>();
-        JsonParser jsonParser = new JsonParser();
-        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String spring = "春";
-        String autumn = "秋";
-
-        for (BaseSemester semester : list) {
-            JsonObject paramJson = new JsonObject();
-
-            paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())));
-            Integer period = null;
-            if(semester.getName().contains(String.valueOf(spring))){
-                period = 1;
-            }else if(semester.getName().contains(autumn)){
-                period = 2;
-            }
-            paramJson.addProperty("period", period);
-            paramJson.addProperty("startDate", sdf.format(semester.getStartDate()));
-            paramJson.addProperty("endDate", sdf.format(semester.getEndDate()));
-            paramJson.addProperty("extendId", semester.getId().toString());
-
-            if(semester.getStartDate() != null && semester.getEndDate() != null && semester.getEndDate().getTime() > timestamp && semester.getStartDate().getTime() < timestamp){
-                paramJson.addProperty("isCurrent", Boolean.TRUE);
-            }else{
-                paramJson.addProperty("isCurrent", Boolean.FALSE);
-            }
-            System.out.println(paramJson.toString());
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-            idList.add(resultJson.get("data").getAsString());
-        }
-
-        return idList;
-    }
+//
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//            if(result == null){
+//                System.out.println(paramJson.toString());
+//                continue;
+//            }
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//        return idList;
+//    }
+//
+//    List<String> insertCourse(String sign, Long timestamp){
+//        List<BaseCourseSubject> list = baseCourseSubjectService.list(
+//                new QueryWrapper<BaseCourseSubject>().lambda()
+//                        .eq(BaseCourseSubject::getDeleteMark, DeleteMark.NODELETE.getCode())
+//        );
+//        String url  = apiUrl + "courseclass/Create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//        for (BaseCourseSubject courseSubject : list) {
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("name", courseSubject.getName() + courseSubject.getCode());
+//            paramJson.addProperty("code", courseSubject.getCode());
+//            paramJson.addProperty("extendId", courseSubject.getId().toString());
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//            if(result == null){
+//                System.out.println("result is null, paramJson: " + paramJson.toString());
+//                continue;
+//            }
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            if(resultJson.get("code").getAsInt() == -1){
+//                System.out.println("paramJson: " + paramJson.toString() + ", 返回结果:" + result);
+//            }
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//
+//        return idList;
+//    }
+//
+//
+//
+//    List<String> insertSemester(String sign, Long timestamp){
+//        List<BaseSemester> list = baseSemesterService.list(
+//            new QueryWrapper<BaseSemester>().lambda()
+//            .eq(BaseSemester::getDeleteMark, DeleteMark.NODELETE.getCode())
+//        );
+//        String url  = apiUrl + "semester/Create";
+//        List<String> idList = new ArrayList<>();
+//        JsonParser jsonParser = new JsonParser();
+//        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String spring = "春";
+//        String autumn = "秋";
+//
+//        for (BaseSemester semester : list) {
+//            JsonObject paramJson = new JsonObject();
+//
+//            paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())));
+//            Integer period = null;
+//            if(semester.getName().contains(String.valueOf(spring))){
+//                period = 1;
+//            }else if(semester.getName().contains(autumn)){
+//                period = 2;
+//            }
+//            paramJson.addProperty("period", period);
+//            paramJson.addProperty("startDate", sdf.format(semester.getStartDate()));
+//            paramJson.addProperty("endDate", sdf.format(semester.getEndDate()));
+//            paramJson.addProperty("extendId", semester.getId().toString());
+//
+//            if(semester.getStartDate() != null && semester.getEndDate() != null && semester.getEndDate().getTime() > timestamp && semester.getStartDate().getTime() < timestamp){
+//                paramJson.addProperty("isCurrent", Boolean.TRUE);
+//            }else{
+//                paramJson.addProperty("isCurrent", Boolean.FALSE);
+//            }
+//            System.out.println(paramJson.toString());
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//            idList.add(resultJson.get("data").getAsString());
+//        }
+//
+//        return idList;
+//    }
 
     /**
      *  由于简约中校区中的本部不能删除,如果没有多的校区,就只查询本部的id即可
@@ -393,31 +495,31 @@ public class ScheduleFlowTest {
         return id;
     }
 
-    Map<Long, String> insertGrade(String sign, Long timestamp, String schoolDistrictId){
-        List<BaseGrade> list = baseGradeService.list(
-            new QueryWrapper<BaseGrade>().lambda()
-            .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
-        );
-        String url = apiUrl + "eduyear/create";
-        JsonParser jsonParser = new JsonParser();
-        Map<Long, String> idMap = new HashMap<>();
-        for (BaseGrade baseGrade : list) {
-            JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
-            paramJson.addProperty("period", 4);
-            paramJson.addProperty("startYear", baseGrade.getTitle().replaceAll("年", ""));
-            paramJson.addProperty("extendId", baseGrade.getId().toString());
-            paramJson.addProperty("year", 3);
-
-            String result = doPost(url, paramJson.toString(), sign, timestamp);
-
-            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
-
-            idMap.put(baseGrade.getId(), resultJson.get("data").getAsString());
-        }
-
-        return idMap;
-    }
+//    Map<Long, String> insertGrade(String sign, Long timestamp, String schoolDistrictId){
+//        List<BaseGrade> list = baseGradeService.list(
+//            new QueryWrapper<BaseGrade>().lambda()
+//            .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+//        );
+//        String url = apiUrl + "eduyear/create";
+//        JsonParser jsonParser = new JsonParser();
+//        Map<Long, String> idMap = new HashMap<>();
+//        for (BaseGrade baseGrade : list) {
+//            JsonObject paramJson = new JsonObject();
+//            paramJson.addProperty("schoolDistrictId", schoolDistrictId);
+//            paramJson.addProperty("period", 4);
+//            paramJson.addProperty("startYear", baseGrade.getTitle().replaceAll("年", ""));
+//            paramJson.addProperty("extendId", baseGrade.getId().toString());
+//            paramJson.addProperty("year", 3);
+//
+//            String result = doPost(url, paramJson.toString(), sign, timestamp);
+//
+//            JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+//
+//            idMap.put(baseGrade.getId(), resultJson.get("data").getAsString());
+//        }
+//
+//        return idMap;
+//    }
 
 
 
@@ -531,6 +633,100 @@ public class ScheduleFlowTest {
             // 通过连接对象获取一个输出流
 //            os = connection.getOutputStream();
 //            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
+//            os.write(param.getBytes());
+            // 通过连接对象获取一个输入流,向远程读取
+            if (connection.getResponseCode() == 200) {
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            }else{
+                is = connection.getInputStream();
+                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuffer sbf = new StringBuffer();
+                String temp = null;
+                // 循环遍历一行一行读取数据
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                System.out.println(sbf.toString());
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            // 断开与远程地址url的连接
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    public static String doPost(String httpUrl) {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        OutputStreamWriter writer = null;
+        try {
+            URL url = new URL(httpUrl);
+            // 通过远程url连接对象打开连接
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestProperty("schoolId","UUFM5TID45X");
+            // 设置连接请求方式
+            connection.setRequestMethod("POST");
+            // 设置连接主机服务器超时时间:15000毫秒
+            connection.setConnectTimeout(15000);
+            // 设置读取主机服务器返回数据超时时间:60000毫秒
+            connection.setReadTimeout(60000);
+            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
+            connection.setDoOutput(true);
+            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
+            connection.setDoInput(true);
+            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
+            connection.setRequestProperty("Content-Type", "application/json");
+            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
+//            connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
+            writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
+            //body参数放这里
+            writer.flush();
+
+            writer.close();
+            // 通过连接对象获取一个输出流
+//            os = connection.getOutputStream();
+//            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
 //            os.write(param.getBytes());
             // 通过连接对象获取一个输入流,向远程读取
             if (connection.getResponseCode() == 200) {