Browse Source

Merge branch 'pre'

dzx 1 month ago
parent
commit
3379f97f62
22 changed files with 410 additions and 150 deletions
  1. 30 0
      src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java
  2. 10 135
      src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java
  3. 7 0
      src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java
  4. 3 0
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalMonthPageDto.java
  5. 3 1
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalPageDto.java
  6. 3 0
      src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalYearPageDto.java
  7. 6 0
      src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapital.java
  8. 8 0
      src/main/java/com/xjrsoft/module/personnel/service/IBasePersonnelLabourCapitalService.java
  9. 177 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/BasePersonnelLabourCapitalServiceImpl.java
  10. 3 2
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  11. 17 0
      src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java
  12. 2 1
      src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java
  13. 27 4
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  14. 8 0
      src/main/java/com/xjrsoft/module/system/vo/SystemUpdateMessageVo.java
  15. 16 0
      src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreController.java
  16. 27 1
      src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreEnterServiceImpl.java
  17. 1 1
      src/main/resources/mapper/banding/BandingTaskMajorConditionMapper.xml
  18. 7 3
      src/main/resources/mapper/personnel/BasePersonnelLabourCapitalMapper.xml
  19. 1 1
      src/main/resources/mapper/student/BaseNewStudentMapper.xml
  20. 1 1
      src/main/resources/mapper/student/EnrollmentPlanMajorSetMapper.xml
  21. 21 0
      src/main/resources/sqlScript/20241230_sql.sql
  22. 32 0
      src/main/resources/sqlScript/20250106_sql.sql

+ 30 - 0
src/main/java/com/xjrsoft/module/job/ClassGraduateTask.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.job;
+
+import com.xjrsoft.module.base.service.IBaseClassService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author dzx
+ * @date 2025/1/14
+ */
+@Component
+@Slf4j
+public class ClassGraduateTask {
+
+    @Autowired
+    private IBaseClassService classService;
+
+    @Scheduled(cron = "0 */15 23 30 6 ?")
+    public void execute() {
+        doExecute();
+    }
+
+    public void doExecute(){
+
+    }
+
+}
+

+ 10 - 135
src/main/java/com/xjrsoft/module/personnel/controller/BasePersonnelLabourCapitalController.java

@@ -3,7 +3,6 @@ package com.xjrsoft.module.personnel.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.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -17,19 +16,14 @@ import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.dto.UpdateBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
-import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalData;
-import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapitalTitle;
 import com.xjrsoft.module.personnel.service.IBasePersonnelLabourCapitalService;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
-import com.xjrsoft.module.weekly.dto.WeeklyDutySchedulePageDto;
-import com.yomahub.liteflow.util.JsonUtil;
 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;
@@ -41,11 +35,8 @@ 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.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -71,7 +62,8 @@ public class BasePersonnelLabourCapitalController {
 
         LambdaQueryWrapper<BasePersonnelLabourCapital> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper
-                    .orderByDesc(BasePersonnelLabourCapital::getId)
+                .orderByDesc(BasePersonnelLabourCapital::getId)
+                .eq(BasePersonnelLabourCapital::getCategory, dto.getCategory())
                 .select(BasePersonnelLabourCapital.class,x -> VoToColumnUtil.fieldsToColumns(BasePersonnelLabourCapitalPageVo.class).contains(x.getProperty()));
         IPage<BasePersonnelLabourCapital> page = basePersonnelLabourCapitalService.page(ConventPage.getPage(dto), queryWrapper);
         PageOutput<BasePersonnelLabourCapitalPageVo> pageOutput = ConventPage.getPageOutput(page, BasePersonnelLabourCapitalPageVo.class);
@@ -136,135 +128,18 @@ public class BasePersonnelLabourCapitalController {
     @PostMapping("/import")
     @ApiOperation(value = "导入")
     public RT<Boolean> importData(@Valid AddBasePersonnelLabourCapitalDto dto, @RequestParam("file") MultipartFile file) throws IOException, ParseException {
+        if(dto.getCategory() == null){
+            return RT.error("类别不能为空");
+        }
         List<Map<Integer, Object>> excelDataList = EasyExcel.read(file.getInputStream()).sheet().headRowNumber(4 - 1).doReadSync();
         //验证数据
 
-        //构造数据
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
-        basePersonnelLabourCapital.setDataRow(4);
-        basePersonnelLabourCapital.setPersonnelNameColumn(3);
-        basePersonnelLabourCapital.setAmountToColumn(4);
-        basePersonnelLabourCapital.setIdTypeColumn(0);
-        basePersonnelLabourCapital.setIdNumberColumn(1);
-        basePersonnelLabourCapital.setJobNumberColumn(2);
-        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
-
-        //处理表头数据,目前只支持2行表头
-        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), excelDataList.get(1), basePersonnelLabourCapital);
-        //读取表内容数据
-        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList);
-
-        //添加表头数据
-        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
-        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
-
-        Boolean result = basePersonnelLabourCapitalService.add(basePersonnelLabourCapital);
-        return RT.ok(result);
-    }
-
-    /**
-     * 处理教师工资数据
-     * @param excelDataList 表格数据
-     * @return 返回集合
-     */
-    List<BasePersonnelLabourCapitalData> initDataList(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList){
-        List<BasePersonnelLabourCapitalData> resultList = new ArrayList<>();
-        for (int i = 0; i < excelDataList.size(); i ++){
-            //跳过表头
-            if(i < 2){
-                continue;
-            }
-            Map<Integer, Object> datatMap = excelDataList.get(i);
-            BasePersonnelLabourCapitalData data = new BasePersonnelLabourCapitalData();
-            data.setName(datatMap.get(3) == null?null:datatMap.get(3).toString());
-            data.setIdNumber(datatMap.get(1) == null?null:datatMap.get(1).toString());
-            data.setIdType(datatMap.get(0) == null?null:datatMap.get(0).toString());
-            data.setAmountTo(datatMap.get(4) == null?null:datatMap.get(4).toString());
-            data.setJobNumber(datatMap.get(2) == null?null:datatMap.get(2).toString());
-            for (Integer integer : datatMap.keySet()) {
-                Object o = datatMap.get(integer);
-                if(o != null && o.toString().startsWith("(") && o.toString().endsWith(")")){
-                    datatMap.put(integer, "-" + o.toString().replace("(", "").replace(")", ""));
-                }
-            }
-            String jsonString = JsonUtil.toJsonString(datatMap);
-            jsonString = jsonString.replaceAll("- 0", "-");
-            data.setExtendJson(jsonString);
-            resultList.add(data);
+        if(dto.getCategory() == 1){
+            basePersonnelLabourCapitalService.importLabourCapitalData(dto, excelDataList);
+        }else if(dto.getCategory() == 2){
+            basePersonnelLabourCapitalService.importSocialSecurityData(dto, excelDataList);
         }
-
-        return resultList;
-    }
-
-    /**
-     * 处理表头数据
-     * @param titleRow1 第一行数据
-     * @param titleRow2 第二行数据
-     * @return 返回集合
-     */
-    List<BasePersonnelLabourCapitalTitle> initTitleList(Map<Integer, Object> titleRow1, Map<Integer, Object> titleRow2, BasePersonnelLabourCapital capital){
-        List<BasePersonnelLabourCapitalTitle> resultList = new ArrayList<>();
-        //识别第一行
-        int mergeColumns = 0, mergeRows = 0;
-        for (Integer column : titleRow1.keySet()) {
-            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
-            Object value = titleRow1.get(column);
-            if(value == null){
-                mergeColumns = 0;
-                continue;
-            }
-            for (int i = column + 1; i < titleRow1.size(); i ++){
-                Object mergeValue = titleRow1.get(i);
-                if(mergeValue != null){
-                    break;
-                }
-                mergeColumns ++;
-            }
-
-            Object value2 = titleRow2.get(column);
-            if(value2 == null){
-                mergeRows = 2;
-            }
-
-            title.setName(value.toString());
-            title.setColumnNumber(column);
-            title.setRowsNumber(capital.getDataRow() - 1);
-            title.setMergeColumns(mergeColumns);
-            title.setMergeRows(mergeRows);
-            resultList.add(title);
-
-            mergeColumns = 0;
-            mergeRows = 0;
-        }
-
-        //识别第二行
-        for (Integer column : titleRow2.keySet()) {
-            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
-            Object value = titleRow2.get(column);
-            if(value == null){
-                continue;
-            }
-
-            title.setName(value.toString());
-            title.setColumnNumber(column);
-            title.setRowsNumber(capital.getDataRow());
-            title.setMergeColumns(mergeColumns);
-            title.setMergeRows(mergeRows);
-            resultList.add(title);
-        }
-
-        return resultList;
-    }
-
-    @GetMapping("/export")
-    @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid WeeklyDutySchedulePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<BasePersonnelLabourCapital> list = basePersonnelLabourCapitalService.list();
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, BasePersonnelLabourCapital.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
-
-        return RT.fileStream(bot.toByteArray(), "BasePersonnelLabourCapital" + ExcelTypeEnum.XLSX.getValue());
+        return RT.ok(true);
     }
 
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/personnel/dto/AddBasePersonnelLabourCapitalDto.java

@@ -29,4 +29,11 @@ public class AddBasePersonnelLabourCapitalDto implements Serializable {
     @ApiModelProperty("发放年月")
     private String dateOfIssue;
 
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
+
+
+    @ApiModelProperty("年份")
+    private Integer year;
+
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalMonthPageDto.java

@@ -22,4 +22,7 @@ public class BasePersonnelLabourCapitalMonthPageDto extends PageInput {
 
     @ApiModelProperty("工号")
     public String jobNumber;
+
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 3 - 1
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalPageDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.personnel.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,5 +16,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class BasePersonnelLabourCapitalPageDto extends PageInput {
 
-
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/dto/BasePersonnelLabourCapitalYearPageDto.java

@@ -25,4 +25,7 @@ public class BasePersonnelLabourCapitalYearPageDto extends PageInput {
 
     @ApiModelProperty("姓名")
     public String name;
+
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category = 1;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/personnel/entity/BasePersonnelLabourCapital.java

@@ -132,4 +132,10 @@ public class BasePersonnelLabourCapital implements Serializable {
     @EntityMapping(thisField = "id", joinField = "labourCapitalId")
     private List<BasePersonnelLabourCapitalTitle> basePersonnelLabourCapitalTitleList;
 
+    @ApiModelProperty("类别(1:工资 2:社保)")
+    private Integer category;
+
+    @ApiModelProperty("年份")
+    private Integer year;
+
 }

+ 8 - 0
src/main/java/com/xjrsoft/module/personnel/service/IBasePersonnelLabourCapitalService.java

@@ -2,13 +2,16 @@ package com.xjrsoft.module.personnel.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.personnel.dto.AddBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalMonthPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
 
+import java.text.ParseException;
 import java.util.List;
+import java.util.Map;
 
 /**
 * @title: 工资发放
@@ -44,4 +47,9 @@ public interface IBasePersonnelLabourCapitalService extends MPJBaseService<BaseP
 
     Page<BasePersonnelLabourCapitalMonthPageVo> getMonthPage(Page<BasePersonnelLabourCapitalMonthPageDto> page, BasePersonnelLabourCapitalMonthPageDto dto);
     Page<BasePersonnelLabourCapitalYearPageVo> getYearPage(Page<BasePersonnelLabourCapitalYearPageDto> page, BasePersonnelLabourCapitalYearPageDto dto);
+
+
+    Boolean importLabourCapitalData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException;
+
+    Boolean importSocialSecurityData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException;
 }

+ 177 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/BasePersonnelLabourCapitalServiceImpl.java

@@ -1,13 +1,18 @@
 package com.xjrsoft.module.personnel.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.personnel.dto.AddBasePersonnelLabourCapitalDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalMonthPageDto;
 import com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto;
 import com.xjrsoft.module.personnel.entity.BasePersonnelLabourCapital;
@@ -19,12 +24,24 @@ import com.xjrsoft.module.personnel.mapper.BasePersonnelLabourCapitalTitleMapper
 import com.xjrsoft.module.personnel.service.IBasePersonnelLabourCapitalService;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalMonthPageVo;
 import com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo;
+import com.xjrsoft.module.weekly.dto.WeeklyDutySchedulePageDto;
+import com.yomahub.liteflow.util.JsonUtil;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -75,6 +92,166 @@ public class BasePersonnelLabourCapitalServiceImpl extends MPJBaseServiceImpl<Ba
         return labourCapitalMapper.getYearPage(page, dto);
     }
 
+    /**
+     * 导入工资条数据
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean importLabourCapitalData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException {
+        //构造数据
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
+        basePersonnelLabourCapital.setDataRow(4);
+        basePersonnelLabourCapital.setPersonnelNameColumn(3);
+        basePersonnelLabourCapital.setAmountToColumn(4);
+        basePersonnelLabourCapital.setIdTypeColumn(0);
+        basePersonnelLabourCapital.setIdNumberColumn(1);
+        basePersonnelLabourCapital.setJobNumberColumn(2);
+        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
+
+        //处理表头数据,目前只支持2行表头
+        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), excelDataList.get(1), basePersonnelLabourCapital);
+        //读取表内容数据
+        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList, 2);
+
+        //添加表头数据
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
+
+        return this.add(basePersonnelLabourCapital);
+    }
+
+    @Override
+    public Boolean importSocialSecurityData(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList) throws ParseException {
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        BasePersonnelLabourCapital basePersonnelLabourCapital = BeanUtil.toBean(dto, BasePersonnelLabourCapital.class);
+        basePersonnelLabourCapital.setDataRow(4);
+        basePersonnelLabourCapital.setPersonnelNameColumn(3);
+        basePersonnelLabourCapital.setIdTypeColumn(0);
+        basePersonnelLabourCapital.setIdNumberColumn(1);
+        basePersonnelLabourCapital.setJobNumberColumn(2);
+        basePersonnelLabourCapital.setDateOfIssue(sdf.parse(dto.getDateOfIssue()));
+        basePersonnelLabourCapital.setYear(basePersonnelLabourCapital.getDateOfIssue().getYear());
+
+        List<BasePersonnelLabourCapitalTitle> titleList = initTitleList(excelDataList.get(0), new LinkedHashMap<>(), basePersonnelLabourCapital);
+        List<BasePersonnelLabourCapitalData> dataList = initDataList(dto, excelDataList, 1);
+
+        //添加表头数据
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalTitleList(titleList);
+        basePersonnelLabourCapital.setBasePersonnelLabourCapitalDataList(dataList);
+
+        return this.add(basePersonnelLabourCapital);
+    }
+
+
+    /**
+     * 处理教师工资数据
+     * @param excelDataList 表格数据
+     * @return 返回集合
+     */
+    List<BasePersonnelLabourCapitalData> initDataList(AddBasePersonnelLabourCapitalDto dto, List<Map<Integer, Object>> excelDataList, int titleRowNumber){
+        List<BasePersonnelLabourCapitalData> resultList = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i ++){
+            //跳过表头
+            if(i < titleRowNumber){
+                continue;
+            }
+            Map<Integer, Object> datatMap = excelDataList.get(i);
+            BasePersonnelLabourCapitalData data = new BasePersonnelLabourCapitalData();
+            data.setName(datatMap.get(3) == null?null:datatMap.get(3).toString());
+            data.setIdNumber(datatMap.get(1) == null?null:datatMap.get(1).toString());
+            data.setIdType(datatMap.get(0) == null?null:datatMap.get(0).toString());
+            data.setAmountTo(datatMap.get(4) == null?null:datatMap.get(4).toString());
+            data.setJobNumber(datatMap.get(2) == null?null:datatMap.get(2).toString());
+            for (Integer integer : datatMap.keySet()) {
+                Object o = datatMap.get(integer);
+                if(o != null && o.toString().startsWith("(") && o.toString().endsWith(")")){
+                    datatMap.put(integer, "-" + o.toString().replace("(", "").replace(")", ""));
+                }
+            }
+            String jsonString = JsonUtil.toJsonString(datatMap);
+            jsonString = jsonString.replaceAll("- 0", "-");
+            data.setExtendJson(jsonString);
+            resultList.add(data);
+        }
+
+        return resultList;
+    }
+
+    /**
+     * 处理表头数据
+     * @param titleRow1 第一行数据
+     * @param titleRow2 第二行数据
+     * @return 返回集合
+     */
+    List<BasePersonnelLabourCapitalTitle> initTitleList(Map<Integer, Object> titleRow1, Map<Integer, Object> titleRow2, BasePersonnelLabourCapital capital){
+        List<BasePersonnelLabourCapitalTitle> resultList = new ArrayList<>();
+        //识别第一行
+        int mergeColumns = 0, mergeRows = 0;
+        for (Integer column : titleRow1.keySet()) {
+            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
+            Object value = titleRow1.get(column);
+            if(value == null){
+                mergeColumns = 0;
+                continue;
+            }
+            for (int i = column + 1; i < titleRow1.size(); i ++){
+                Object mergeValue = titleRow1.get(i);
+                if(mergeValue != null){
+                    break;
+                }
+                mergeColumns ++;
+            }
+
+            Object value2 = titleRow2.get(column);
+            if(value2 == null){
+                mergeRows = 2;
+            }
+
+            title.setName(value.toString());
+            title.setColumnNumber(column);
+            title.setRowsNumber(capital.getDataRow() - 1);
+            title.setMergeColumns(mergeColumns);
+            title.setMergeRows(mergeRows);
+            resultList.add(title);
+
+            mergeColumns = 0;
+            mergeRows = 0;
+        }
+
+        //识别第二行
+        for (Integer column : titleRow2.keySet()) {
+            BasePersonnelLabourCapitalTitle title = new BasePersonnelLabourCapitalTitle();
+            Object value = titleRow2.get(column);
+            if(value == null){
+                continue;
+            }
+
+            title.setName(value.toString());
+            title.setColumnNumber(column);
+            title.setRowsNumber(capital.getDataRow());
+            title.setMergeColumns(mergeColumns);
+            title.setMergeRows(mergeRows);
+            resultList.add(title);
+        }
+
+        return resultList;
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid WeeklyDutySchedulePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<BasePersonnelLabourCapital> list = this.list();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, BasePersonnelLabourCapital.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(list);
+
+        return RT.fileStream(bot.toByteArray(), "BasePersonnelLabourCapital" + ExcelTypeEnum.XLSX.getValue());
+    }
+
+
+
+
     private String getBpName(Long labourCapitalId, String columnNumber) {
         List<BasePersonnelLabourCapitalTitle> bpTitles = capitalTitleMapper.selectList(
                 Wrappers.<BasePersonnelLabourCapitalTitle>lambdaQuery()

+ 3 - 2
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -32,6 +32,7 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.room.service.IRoomBedService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
@@ -204,8 +205,8 @@ public class StudentManagerController {
     @GetMapping(value = "/major-grade-class-tree")
     @ApiOperation(value = "学生部门专业年级班级树")
     @SaCheckPermission("studentmanager:detail")
-    public RT<List<BaseDepMajorGradeClassStudenTreeVo>> tree2() {
-        return RT.ok(studentManagerService.deptMajorGradeClassTree());
+    public RT<List<BaseDepMajorGradeClassStudenTreeVo>> tree2(@Valid MajorGradeClassDto dto) {
+        return RT.ok(studentManagerService.deptMajorGradeClassTree(dto));
     }
 
 

+ 17 - 0
src/main/java/com/xjrsoft/module/student/dto/MajorGradeClassDto.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.student.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.simpleframework.xml.Default;
+
+/**
+ * @author dzx
+ * @date 2024/7/9
+ */
+@Data
+public class MajorGradeClassDto {
+
+    @ApiModelProperty("在读状态(1: 在读 2: 毕业)")
+    private Integer isGraduate = 1;
+
+}

+ 2 - 1
src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.vo.BaseDepMajorGradeClassStudenTreeVo;
@@ -65,6 +66,6 @@ public interface IStudentManagerService extends MPJBaseService<BaseStudentUser>
 
     Boolean uploadImage(Long userId, MultipartFile file) throws IOException;
 
-     List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree();
+     List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree(MajorGradeClassDto dto);
 
 }

+ 27 - 4
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -41,6 +41,7 @@ import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
+import com.xjrsoft.module.student.dto.MajorGradeClassDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
 import com.xjrsoft.module.student.entity.BaseClassMajorSet;
 import com.xjrsoft.module.student.entity.BaseMajor;
@@ -1051,7 +1052,7 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
     }
 
     @Override
-    public List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree() {
+    public List<BaseDepMajorGradeClassStudenTreeVo> deptMajorGradeClassTree(MajorGradeClassDto dto) {
         List<BaseDepMajorGradeClassStudenTreeVo> voList = new ArrayList<>();
         MPJLambdaWrapper<BaseClass> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
         baseClassMPJLambdaWrapper
@@ -1061,20 +1062,37 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
                 .selectAs(BaseClass::getGradeId, BaseClassMajorSetVo::getGradeId)
                 .leftJoin(BaseClassMajorSet.class, BaseClassMajorSet::getClassId, BaseClass::getId)
                 .leftJoin(BaseMajorSet.class, BaseMajorSet::getId, BaseClassMajorSet::getMajorSetId)
+                .eq(dto.getIsGraduate() != null, BaseClass::getIsGraduate, dto.getIsGraduate())
         ;
 
         List<BaseClassMajorSetVo> majorSetList = baseClassService.selectJoinList(BaseClassMajorSetVo.class, baseClassMPJLambdaWrapper);
+        if(majorSetList.isEmpty()){
+            return new ArrayList<>();
+        }
+        Set<Long> gradeIds = majorSetList.stream().map(BaseClassMajorSetVo::getGradeId).collect(Collectors.toSet());
+        Set<Long> majorSetIds = majorSetList.stream().map(BaseClassMajorSetVo::getMajorId).collect(Collectors.toSet());
 
+        Map<Long, Map<Long, List<BaseClassMajorSetVo>>> classMap = majorSetList.stream().collect(Collectors.groupingBy(BaseClassMajorSetVo::getMajorId, Collectors.groupingBy(BaseClassMajorSetVo::getGradeId)));
 
         List<BaseGrade> gradeList = baseGradeService.list(
-                new QueryWrapper<BaseGrade>().lambda().eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<BaseGrade>().lambda()
+                        .eq(BaseGrade::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .in(!gradeIds.isEmpty(), BaseGrade::getId, gradeIds)
+                        .orderByDesc(BaseGrade::getTitle)
         );
         List<BaseMajor> majorList = baseMajorService.list(
-                new QueryWrapper<BaseMajor>().lambda().eq(BaseMajor::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<BaseMajor>().lambda()
+                        .eq(BaseMajor::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .in(!majorSetIds.isEmpty(), BaseMajor::getId, majorSetIds)
         );
+
+        List<Long> deptIds = majorList.stream().map(BaseMajor::getDepartmentId).collect(Collectors.toList());
+
         List<Department> departmentList =baseDeparmentService.list(
-                new QueryWrapper<Department>().lambda().eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
+                new QueryWrapper<Department>().lambda()
+                        .eq(Department::getDeleteMark, DeleteMark.NODELETE.getCode())
                         .eq(Department::getIsMajor,1)
+                        .in(!deptIds.isEmpty(), Department::getId, deptIds)
         );
         departmentList.forEach((node) -> {
             voList.add(new BaseDepMajorGradeClassStudenTreeVo(){{
@@ -1091,7 +1109,12 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
                 setTreeType(2);
                 setParentId(node.getDepartmentId().toString());
             }});
+            Map<Long, List<BaseClassMajorSetVo>> gradeMap = classMap.get(node.getId());
             gradeList.forEach((DDD)->{
+                List<BaseClassMajorSetVo> list = gradeMap.get(DDD.getId());
+                if(list == null|| list.isEmpty() || list.size() == 0){
+                    return;
+                }
                 voList.add(new BaseDepMajorGradeClassStudenTreeVo(){{
                     setId(node.getId().toString()+"_"+DDD.getId().toString());
                     setName(DDD.getName());

+ 8 - 0
src/main/java/com/xjrsoft/module/system/vo/SystemUpdateMessageVo.java

@@ -1,8 +1,12 @@
 package com.xjrsoft.module.system.vo;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
 * @title: 系统消息表单出参
 * @Author brealinxx
@@ -47,5 +51,9 @@ public class SystemUpdateMessageVo {
     private String createUserName;
 
 
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+
 
 }

+ 16 - 0
src/main/java/com/xjrsoft/module/xycxedu/controller/ExamSubjectScoreController.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.xycxedu.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.model.result.RT;
@@ -88,6 +89,21 @@ public class ExamSubjectScoreController {
             subjectScore.setClassRanking(dto.getClassRanking());
             subjectScore.setGradeRanking(dto.getGradeRanking());
             scoreService.updateById(subjectScore);
+
+            if(dto.getScore() == null || dto.getGradeRanking() == null || dto.getClassRanking() == null){
+                UpdateWrapper<ExamSubjectScore> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.eq("id", dto.getId());
+                if(dto.getScore() == null){
+                    updateWrapper.setSql("score = null");
+                }
+                if(dto.getClassRanking() == null){
+                    updateWrapper.setSql("class_ranking = null");
+                }
+                if(dto.getGradeRanking() == null){
+                    updateWrapper.setSql("grade_ranking = null");
+                }
+                scoreService.update(subjectScore, updateWrapper);
+            }
         }
 
         return RT.ok(true);

+ 27 - 1
src/main/java/com/xjrsoft/module/xycxedu/service/impl/ExamSubjectScoreEnterServiceImpl.java

@@ -12,7 +12,9 @@ import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
 import com.xjrsoft.module.generator.entity.ImportConfig;
 import com.xjrsoft.module.organization.entity.User;
@@ -72,6 +74,8 @@ public class ExamSubjectScoreEnterServiceImpl extends MPJBaseServiceImpl<ExamSub
     private final IUserService userService;
     private final IExamSubjectScoreService scoreService;
 
+    private final IBaseClassService classService;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -139,11 +143,33 @@ public class ExamSubjectScoreEnterServiceImpl extends MPJBaseServiceImpl<ExamSub
 
     @Override
     public Boolean save(AddExamSubjectScoreEnterDto dto) {
+        BaseCourseSubject courseSubject = courseSubjectService.getById(dto.getCourseSubjectId());
+
+
+        List<String> classNames = new ArrayList<>();
+        for (Long classId : dto.getClassIds()) {
+            List<ExamSubjectScoreEnter> list = this.list(
+                    new QueryWrapper<ExamSubjectScoreEnter>().lambda()
+                            .eq(ExamSubjectScoreEnter::getSemesterId, dto.getSemesterId())
+                            .eq(ExamSubjectScoreEnter::getExamPlanId, dto.getExamPlanId())
+                            .eq(ExamSubjectScoreEnter::getCourseSubjectId, dto.getCourseSubjectId())
+                            .like(ExamSubjectScoreEnter::getClassIds, classId)
+                            .eq(ExamSubjectScoreEnter::getDeleteMark, DeleteMark.NODELETE.getCode())
+            );
+            if(!list.isEmpty()){
+                User user = userService.getById(list.get(0).getCreateUserId());
+                BaseClass aClass = classService.getById(classId);
+                classNames.add(aClass.getName() + "的" + courseSubject.getName() + "已被" + user.getName() + "添加");
+            }
+        }
+        if(!classNames.isEmpty()){
+            String messgae = classNames.toString().replace("[", "").replace("]", "").replace(", ", ";");
+            throw new MyException(messgae + ",不能重复添加");
+        }
         ExamSubjectScoreEnter examSubjectScoreEnter = BeanUtil.toBean(dto, ExamSubjectScoreEnter.class);
         examSubjectScoreEnter.setCreateDate(new Date());
         String classIds = dto.getClassIds().toString().replace("[", "").replace("]", "").replace(" ", "");
         examSubjectScoreEnter.setClassIds(classIds);
-        BaseCourseSubject courseSubject = courseSubjectService.getById(examSubjectScoreEnter.getCourseSubjectId());
         examSubjectScoreEnter.setCoursename(courseSubject.getName());
         boolean isSuccess = this.save(examSubjectScoreEnter);
         List<User> userList = userService.list(

+ 1 - 1
src/main/resources/mapper/banding/BandingTaskMajorConditionMapper.xml

@@ -7,7 +7,7 @@
             resultType="com.xjrsoft.module.banding.vo.BandingTaskMajorConditionListVo">
         SELECT t1.id, t.id AS major_set_id, t.name AS major_set_name,t1.banding_task_id,t1.height,t1.score, t1.sort_code FROM base_major_set t
         LEFT JOIN banding_task_major_condition t1 ON t1.major_set_id = t.id and t1.banding_task_id = #{dto.bandingTaskId} and t1.delete_mark = 0
-        WHERE t.delete_mark = 0
+        WHERE t.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.majorIds != null and !dto.majorIds.isEmpty()">
             and t.id in
             <foreach item="id" index="index" collection="dto.majorIds" open="(" close=")" separator=",">

+ 7 - 3
src/main/resources/mapper/personnel/BasePersonnelLabourCapitalMapper.xml

@@ -19,12 +19,16 @@
                 LEFT JOIN xjr_user u ON t1.job_number = u.user_name
                 LEFT JOIN xjr_user_dept_relation w ON u.id = w.user_id
                 LEFT JOIN xjr_department d ON w.dept_id = d.id
-        WHERE t.delete_mark = 0
-        <if test="dto.year != null and dto.month != null">
+        WHERE t.delete_mark = 0 and t.category = #{dto.category}
+        <if test="dto.category == 1 and dto.year != null and dto.month != null">
             and YEAR(t.date_of_issue) = #{dto.year}
             and MONTH(t.date_of_issue) = #{dto.month}
             and t1.job_number = #{dto.jobNumber}
         </if>
+        <if test="dto.category == 2 and dto.year != null">
+            and year = #{dto.year}
+            and t1.job_number = #{dto.jobNumber}
+        </if>
     </select>
 
     <select id="getYearPage" parameterType="com.xjrsoft.module.personnel.dto.BasePersonnelLabourCapitalYearPageDto" resultType="com.xjrsoft.module.personnel.vo.BasePersonnelLabourCapitalYearPageVo">
@@ -44,7 +48,7 @@
                  LEFT JOIN xjr_department d ON w.dept_id = d.id
                  LEFT JOIN base_personnel_labour_capital_title bp ON bp.labour_capital_id = t.id
         WHERE
-            t.delete_mark = 0
+            t.delete_mark = 0 and t1.category = #{dto.category}
         and YEAR(t1.date_of_issue) = #{dto.year}
         and t.job_number = #{dto.jobNumber}
     </select>

+ 1 - 1
src/main/resources/mapper/student/BaseNewStudentMapper.xml

@@ -300,7 +300,7 @@
         ) AS female_count FROM base_major_set t1
         LEFT JOIN banding_task_major_condition t2 ON t1.id = t2.major_set_id AND t2.banding_task_id = #{id}
         AND t2.delete_mark = 0
-        WHERE t1.delete_mark = 0
+        WHERE t1.delete_mark = 0 and t1.enabled_mark = 1
     </select>
 
 </mapper>

+ 1 - 1
src/main/resources/mapper/student/EnrollmentPlanMajorSetMapper.xml

@@ -23,7 +23,7 @@
         from base_major_set t
         left join base_major_gradation t3 on t3.id = t.major_gradation_id
         left join xjr_department t4 on t4.id = t.department_id
-        where t.delete_mark = 0
+        where t.delete_mark = 0 and t.enabled_mark = 1
         <if test="dto.name != null and dto.name != ''">
             and t.name like concat('%', #{dto.name}, '%')
         </if>

+ 21 - 0
src/main/resources/sqlScript/20241230_sql.sql

@@ -0,0 +1,21 @@
+ALTER TABLE `base_student_assessment_inspection`   
+  CHANGE `class_ids` `class_ids` VARCHAR(30) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '班级Ids(多选)';
+
+-- 增加菜单地址字段长度
+ALTER TABLE `base_student_assessment_student_relation`   
+  ADD COLUMN `delete_mark` INT DEFAULT 0  NULL AFTER `score`,
+  ADD COLUMN `enabled_mark` INT DEFAULT 1  NULL AFTER `delete_mark`;
+
+-- 增加菜单地址字段长度
+ALTER TABLE `xjr_menu`   
+  CHANGE `path` `path` VARCHAR(500) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '地址',
+  CHANGE `iframe_src` `iframe_src` VARCHAR(500) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL   COMMENT '外链地址';
+
+
+ALTER TABLE `wf_teacher_course_time`   
+  ADD COLUMN `file_id` BIGINT NULL   COMMENT '上传的文件(xjr_file[floder_id])' AFTER `create_date`;
+
+ALTER TABLE `base_student_assessment_student_relation`   
+  ADD COLUMN `modify_date` DATETIME DEFAULT NULL;
+  
+  

+ 32 - 0
src/main/resources/sqlScript/20250106_sql.sql

@@ -0,0 +1,32 @@
+
+DROP TABLE IF EXISTS exam_subject_score_enter;
+CREATE TABLE `exam_subject_score_enter`  (
+  `id` BIGINT NOT NULL COMMENT '主键',
+  `create_user_id` BIGINT NULL DEFAULT NULL COMMENT '创建人',
+  `create_date` DATETIME(3) NULL DEFAULT NULL COMMENT '创建时间',
+  `modify_user_id` BIGINT NULL DEFAULT NULL COMMENT '修改人id',
+  `modify_date` DATETIME(3) NULL DEFAULT NULL COMMENT '修改日期',
+  `delete_mark` INT NULL DEFAULT NULL COMMENT '删除标记',
+  `enabled_mark` INT NULL DEFAULT NULL COMMENT '有效标记',
+  `course_subject_id` BIGINT NULL DEFAULT NULL COMMENT '科目id',
+  `coursename` VARCHAR(50) NULL DEFAULT NULL COMMENT '科目名称',
+  `exam_plan_id` BIGINT NULL DEFAULT NULL COMMENT '考试计划id',
+  `semester_id` BIGINT NULL DEFAULT NULL COMMENT '学期id',
+  `class_ids` LONGTEXT NULL DEFAULT NULL COMMENT '班级id',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '成绩录入';
+
+
+ALTER TABLE `exam_subject_score`   
+  ADD COLUMN `exam_subject_score_enter_id` BIGINT NULL   COMMENT '成绩录入id';
+ALTER TABLE `exam_subject_score`   
+  CHANGE `score` `score` FLOAT(5,2) NULL   COMMENT '分数';
+
+ALTER TABLE `exam_subject_score`   
+  ADD INDEX (`exam_subject_score_enter_id`),
+  ADD INDEX (`course_subject_id`),
+  ADD INDEX (`user_id`),
+  ADD INDEX (`semester_id`),
+  ADD INDEX (`milexamid`);
+ALTER TABLE `exam_subject_score`   
+  ADD COLUMN `exam_plan_id` BIGINT NULL   COMMENT '考试计划id' AFTER `exam_subject_score_enter_id`;