浏览代码

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

dzx 6 月之前
父节点
当前提交
b75fd82f63
共有 18 个文件被更改,包括 435 次插入97 次删除
  1. 3 0
      src/main/java/com/xjrsoft/module/banding/mapper/BandingTaskClassStudentMapper.java
  2. 3 0
      src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassStudentService.java
  3. 51 14
      src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java
  4. 31 0
      src/main/java/com/xjrsoft/module/banding/vo/SyncStudentDataListVo.java
  5. 11 0
      src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java
  6. 46 3
      src/main/java/com/xjrsoft/module/base/controller/BaseCourseSubjectController.java
  7. 0 2
      src/main/java/com/xjrsoft/module/base/entity/CourseSubjectDetail.java
  8. 8 1
      src/main/java/com/xjrsoft/module/base/service/impl/BaseCourseSubjectServiceImpl.java
  9. 101 43
      src/main/java/com/xjrsoft/module/base/vo/BaseCourseSubjectPageVo.java
  10. 5 1
      src/main/java/com/xjrsoft/module/organization/service/impl/WeChatServiceImgl.java
  11. 5 0
      src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java
  12. 0 1
      src/main/java/com/xjrsoft/module/veb/controller/ImportRubAndHandController.java
  13. 15 0
      src/main/java/com/xjrsoft/module/veb/entity/InternshipPlanManage.java
  14. 63 26
      src/main/java/com/xjrsoft/module/veb/service/impl/ImportRubAndHandServiceImpl.java
  15. 34 0
      src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java
  16. 6 6
      src/main/java/com/xjrsoft/module/veb/vo/BaseCourseSubjectImportVo.java
  17. 10 0
      src/main/resources/mapper/banding/BandingTaskClassStudentMapper.xml
  18. 43 0
      src/main/resources/sqlScript/鸿合提供数据视图.sql

+ 3 - 0
src/main/java/com/xjrsoft/module/banding/mapper/BandingTaskClassStudentMapper.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.banding.mapper;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.banding.dto.StudentDto;
 import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
+import com.xjrsoft.module.banding.vo.SyncStudentDataListVo;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -25,4 +26,6 @@ public interface BandingTaskClassStudentMapper extends MPJBaseMapper<BandingTask
     List<BaseNewStudentPageDto> surplusStudent(@Param("dto") StudentDto dto);
 
     List<BaseNewStudentPageDto> surplusStudentSure(@Param("dto") StudentDto dto);
+
+    List<SyncStudentDataListVo> getSyncStudentDataList(@Param("studentReportPlanId") Long studentReportPlanId);
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/banding/service/IBandingTaskClassStudentService.java

@@ -5,6 +5,7 @@ import com.xjrsoft.module.banding.dto.ChangeClassDto;
 import com.xjrsoft.module.banding.dto.StudentDto;
 import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
+import com.xjrsoft.module.student.entity.StudentReportPlan;
 
 import java.util.List;
 
@@ -54,4 +55,6 @@ public interface IBandingTaskClassStudentService extends MPJBaseService<BandingT
 
 
     Boolean insertStudent(ChangeClassDto dto);
+
+    Boolean syncStudentData(StudentReportPlan studentReportPlan);
 }

+ 51 - 14
src/main/java/com/xjrsoft/module/banding/service/impl/BandingTaskClassStudentServiceImpl.java

@@ -1,21 +1,16 @@
 package com.xjrsoft.module.banding.service.impl;
 
-import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
-import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
-import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.utils.LocalDateUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.banding.dto.ChangeClassDto;
 import com.xjrsoft.module.banding.dto.StudentDto;
 import com.xjrsoft.module.banding.entity.BandingTask;
@@ -25,6 +20,7 @@ import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
 import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
 import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
 import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
+import com.xjrsoft.module.banding.vo.SyncStudentDataListVo;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -35,27 +31,18 @@ import com.xjrsoft.module.organization.service.IUserRoleRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
 import com.xjrsoft.module.student.entity.BaseNewStudent;
-import com.xjrsoft.module.student.entity.BaseStudent;
-import com.xjrsoft.module.student.entity.BaseStudentFamily;
-import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.StudentReportPlan;
 import com.xjrsoft.module.student.entity.StudentReportRecord;
 import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
 import com.xjrsoft.module.student.service.IBaseNewStudentService;
-import com.xjrsoft.module.student.service.IBaseStudentFamilyService;
-import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
-import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.service.IStudentReportPlanService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -388,4 +375,54 @@ public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<Bandi
         return true;
     }
 
+    /**
+     * 同步修改学生的班级信息
+     */
+    @Override
+    @Transactional
+    public Boolean syncStudentData(StudentReportPlan studentReportPlan) {
+        List<SyncStudentDataListVo> syncStudentDataList = this.baseMapper.getSyncStudentDataList(studentReportPlan.getId());
+        List<Long> newStudentIds = syncStudentDataList.stream().map(SyncStudentDataListVo::getNewStudentId).collect(Collectors.toList());
+
+        //修改新生基本信息
+        Map<Long, String> stduyStatusMap = syncStudentDataList.stream().collect(Collectors.toMap(SyncStudentDataListVo::getNewStudentId, SyncStudentDataListVo::getStduyStatus));
+        List<BaseNewStudent> studentList = newStudentService.listByIds(newStudentIds);
+        for (BaseNewStudent student : studentList) {
+            student.setStduyStatus(stduyStatusMap.get(student.getId()));
+        }
+        newStudentService.updateBatchById(studentList);
+
+        //修改班级信息
+        Map<Long, Long> bandingTaskClassMap = syncStudentDataList.stream().filter(x -> x.getBandingTaskClassId() != null).collect(Collectors.toMap(SyncStudentDataListVo::getNewStudentId, SyncStudentDataListVo::getBandingTaskClassId));
+
+        List<BandingTaskClass> taskClassList = taskClassMapper.selectList(
+                new QueryWrapper<BandingTaskClass>().lambda()
+                        .eq(BandingTaskClass::getBandingTaskId, studentReportPlan.getBandingTaskId())
+        );
+        Map<Long, Long> taskClassMap = taskClassList.stream().collect(Collectors.toMap(BandingTaskClass::getBaseClassId, BandingTaskClass::getId));
+
+        List<BandingTaskClassStudent> insertList = new ArrayList<>();
+        for (BaseNewStudent student : studentList) {
+            Long bandingTaskClassId = bandingTaskClassMap.get(student.getId());
+            if(bandingTaskClassId == null){
+                continue;
+            }
+            insertList.add(new BandingTaskClassStudent(){{
+                setBandingTaskClassId(taskClassMap.get(bandingTaskClassId));
+                setNewStudentId(student.getId());
+                setCreateDate(new Date());
+                setStatus(1);
+            }});
+        }
+
+        if(!insertList.isEmpty()){
+            this.remove(
+                    new QueryWrapper<BandingTaskClassStudent>().lambda()
+                            .in(BandingTaskClassStudent::getNewStudentId, newStudentIds)
+            );
+            this.saveBatch(insertList);
+        }
+        return true;
+    }
+
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/banding/vo/SyncStudentDataListVo.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.banding.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @title: 分班后的学生导出
+ * @Author dzx
+ * @Date: 2024-07-01
+ * @Version 1.0
+ */
+@Data
+public class SyncStudentDataListVo {
+
+    @ApiModelProperty("新生id")
+    private Long newStudentId;
+
+    @ApiModelProperty("班级id")
+    private String classId;
+
+    @ApiModelProperty("就读方式")
+    private String stduyStatus;
+
+    @ApiModelProperty("分班班级id")
+    private Long bandingTaskClassId;
+
+}

+ 11 - 0
src/main/java/com/xjrsoft/module/base/controller/BaseClassCourseController.java

@@ -254,6 +254,7 @@ public class BaseClassCourseController {
         List<BaseClassCourse> baseClassCourses = new ArrayList<>();
         List<String> duplicateLogs = new ArrayList<>();
         List<String> errorLogs = new ArrayList<>();
+        // 班级数据
         List<BaseClass> classList = classService.list(new QueryWrapper<BaseClass>());
         Map<String, Long> classMap = new HashMap<>();
         for (BaseClass baseClass : classList) {
@@ -262,6 +263,7 @@ public class BaseClassCourseController {
         if (ObjectUtils.isEmpty(classMap)) {
             throw new MyException("系统中还没有维护班级数据");
         }
+        // 课程数据
         List<BaseCourseSubject> courseSubjectList = subjectService.list(new QueryWrapper<BaseCourseSubject>());
         Map<String, Long> courseSubjectMap = new HashMap<>();
         for (BaseCourseSubject baseCourseSubject : courseSubjectList) {
@@ -270,6 +272,7 @@ public class BaseClassCourseController {
         if (ObjectUtils.isEmpty(courseSubjectMap)) {
             throw new MyException("系统中还没有维护课程学科数据");
         }
+        // 教材数据
         List<Textbook> textbookList = textbookService.list(new QueryWrapper<Textbook>());
         Map<String, Long> textbookMap = new HashMap<>();
         for (Textbook textbook : textbookList) {
@@ -278,6 +281,7 @@ public class BaseClassCourseController {
         if (ObjectUtils.isEmpty(textbookMap)) {
             throw new MyException("系统中还没有维护教材数据");
         }
+        //学期数据
         List<BaseSemester> semesterList = semesterService.list(new QueryWrapper<BaseSemester>());
         Map<String, Long> semesterMap = new HashMap<>();
         for (BaseSemester baseSemester : semesterList) {
@@ -342,6 +346,7 @@ public class BaseClassCourseController {
                 baseClassAdminCourse.setClassId(classId);
                 baseClassAdminCourse.setBaseSemesterId(baseSemesterId);
                 baseClassAdminCourseMapper.insert(baseClassAdminCourse);
+                classAdminCourseId = baseClassAdminCourse.getId();
                 classSemester.put(newClassSemester, baseClassAdminCourse.getId());
             }
 
@@ -351,11 +356,17 @@ public class BaseClassCourseController {
             Long textbookId = null;
             if (ObjectUtils.isNotEmpty(vo.getCourseName())) {
                 courseId = courseSubjectMap.get(vo.getCourseName());
+                if (ObjectUtils.isEmpty(courseId)) {
+                    throw new MyException("第" + (i + 4) + "行数据的课程信息不存在于系统中");
+                }
                 baseClassCourse.setCourseId(courseId);
             }
 
             if (ObjectUtils.isNotEmpty(vo.getTextbookName())) {
                 textbookId = textbookMap.get(vo.getTextbookName());
+                if (ObjectUtils.isEmpty(textbookId)) {
+                    throw new MyException("第" + (i + 4) + "行数据的教材信息不存在于系统中");
+                }
                 baseClassCourse.setTextbookId(textbookId);
             }
 

+ 46 - 3
src/main/java/com/xjrsoft/module/base/controller/BaseCourseSubjectController.java

@@ -9,6 +9,7 @@ import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -17,9 +18,11 @@ import com.xjrsoft.module.base.dto.AddBaseCourseSubjectDto;
 import com.xjrsoft.module.base.dto.BaseCourseSubjectPageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseCourseSubjectDto;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
 import com.xjrsoft.module.base.service.IBaseCourseSubjectService;
 import com.xjrsoft.module.base.vo.BaseCourseSubjectPageVo;
 import com.xjrsoft.module.base.vo.BaseCourseSubjectVo;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -64,12 +67,52 @@ public class BaseCourseSubjectController {
 
         MPJLambdaWrapper<BaseCourseSubject> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
-                .orderByDesc(BaseCourseSubject::getId)
+                .disableSubLogicDel()
                 .select(BaseCourseSubject::getId)
                 .select(BaseCourseSubject.class, x -> VoToColumnUtil.fieldsToColumns(BaseCourseSubjectPageVo.class).contains(x.getProperty()))
+                .leftJoin(CourseSubjectDetail.class, CourseSubjectDetail::getBaseCourseSubjectId, BaseCourseSubject::getId)
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCourseCategory,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCourseCategoryCn)
+                        )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCourseNature,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCourseNatureCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCourseNature,
+                wrapper -> wrapper
+                        .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCourseNatureCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCourseAttribute,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCourseAttributeCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCourseType,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCourseTypeCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getSubjectQuality,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getSubjectQualityCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getCoreCourse,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getCoreCourseCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getOnlineCourse,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getOnlineCourseCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, CourseSubjectDetail::getIdeologyDemo,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, BaseCourseSubjectPageVo::getIdeologyDemoCn)
+                )
                 .like(StrUtil.isNotEmpty(dto.getName()), BaseCourseSubject::getName, dto.getName())
-                .like(StrUtil.isNotEmpty(dto.getCode()), BaseCourseSubject::getCode, dto.getCode());
-        IPage<BaseCourseSubject> page = baseCourseSubjectService.page(ConventPage.getPage(dto), queryWrapper);
+                .like(StrUtil.isNotEmpty(dto.getCode()), BaseCourseSubject::getCode, dto.getCode())
+                .eq(BaseCourseSubject::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .orderByDesc(BaseCourseSubject::getId)
+        ;
+        IPage<BaseCourseSubjectPageVo> page = baseCourseSubjectService.selectJoinListPage(ConventPage.getPage(dto), BaseCourseSubjectPageVo.class, queryWrapper);
         PageOutput<BaseCourseSubjectPageVo> pageOutput = ConventPage.getPageOutput(page, BaseCourseSubjectPageVo.class);
         return RT.ok(pageOutput);
     }

+ 0 - 2
src/main/java/com/xjrsoft/module/base/entity/CourseSubjectDetail.java

@@ -164,6 +164,4 @@ public class CourseSubjectDetail implements Serializable {
      */
     @ApiModelProperty("主要开设实习项目名称")
     private String internshipName;
-
-
 }

+ 8 - 1
src/main/java/com/xjrsoft/module/base/service/impl/BaseCourseSubjectServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.base.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
@@ -11,6 +12,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -35,6 +37,8 @@ public class BaseCourseSubjectServiceImpl extends MPJBaseServiceImpl<BaseCourseS
         baseCourseSubjectBaseCourseSubjectMapper.insert(baseCourseSubject);
         for (CourseSubjectDetail courseSubjectDetail : baseCourseSubject.getCourseSubjectDetailList()) {
             courseSubjectDetail.setBaseCourseSubjectId(baseCourseSubject.getId());
+            courseSubjectDetail.setCreateDate(new Date());
+            courseSubjectDetail.setCreateUserId(StpUtil.getLoginIdAsLong());
             baseCourseSubjectCourseSubjectDetailMapper.insert(courseSubjectDetail);
         }
 
@@ -58,12 +62,15 @@ public class BaseCourseSubjectServiceImpl extends MPJBaseServiceImpl<BaseCourseS
             for (CourseSubjectDetail courseSubjectDetail : baseCourseSubject.getCourseSubjectDetailList()) {
                 //如果不等于空则修改
                 if (courseSubjectDetail.getId() != null) {
+                    courseSubjectDetail.setCreateDate(new Date());
+                    courseSubjectDetail.setCreateUserId(StpUtil.getLoginIdAsLong());
                     baseCourseSubjectCourseSubjectDetailMapper.updateById(courseSubjectDetail);
                 }
                 //如果等于空 则新增
                 else {
-                    //已经不存在的id 删除
                     courseSubjectDetail.setBaseCourseSubjectId(baseCourseSubject.getId());
+                    courseSubjectDetail.setCreateDate(new Date());
+                    courseSubjectDetail.setCreateUserId(StpUtil.getLoginIdAsLong());
                     baseCourseSubjectCourseSubjectDetailMapper.insert(courseSubjectDetail);
                 }
             }

+ 101 - 43
src/main/java/com/xjrsoft/module/base/vo/BaseCourseSubjectPageVo.java

@@ -23,13 +23,6 @@ public class BaseCourseSubjectPageVo {
     @ExcelProperty("主键")
     @ApiModelProperty("主键")
     private String id;
-    /**
-     * 创建人
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("创建人")
-    @ApiModelProperty("创建人")
-    private Long createUserId;
     /**
      * 创建时间
      */
@@ -37,34 +30,6 @@ public class BaseCourseSubjectPageVo {
     @ExcelProperty("创建时间")
     @ApiModelProperty("创建时间")
     private Date createDate;
-    /**
-     * 修改人
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("修改人")
-    @ApiModelProperty("修改人")
-    private Long modifyUserId;
-    /**
-     * 修改时间
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("修改时间")
-    @ApiModelProperty("修改时间")
-    private Date modifyDate;
-    /**
-     * 删除标记
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("删除标记")
-    @ApiModelProperty("删除标记")
-    private Integer deleteMark;
-    /**
-     * 有效标志
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("有效标志")
-    @ApiModelProperty("有效标志")
-    private Integer enabledMark;
     /**
      * 课程学科名称
      */
@@ -79,13 +44,6 @@ public class BaseCourseSubjectPageVo {
     @ExcelProperty("课程学科代码")
     @ApiModelProperty("课程学科代码")
     private String code;
-    /**
-     * 备注
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("备注")
-    @ApiModelProperty("备注")
-    private String remark;
     /**
      * 标签id(base_label)
      */
@@ -93,5 +51,105 @@ public class BaseCourseSubjectPageVo {
     @ExcelProperty("标签id(base_label)")
     @ApiModelProperty("标签id(base_label)")
     private Long baseLabelId;
-
+    /**
+     * 课程类别
+     */
+    @ApiModelProperty("课程类别")
+    private String courseCategory;
+    @ApiModelProperty("课程类别")
+    private String courseCategoryCn;
+    /**
+     * 课程性质
+     */
+    @ApiModelProperty("课程性质")
+    private String courseNature;
+    @ApiModelProperty("课程性质")
+    private String courseNatureCn;
+    /**
+     * 课程属性
+     */
+    @ApiModelProperty("课程属性")
+    private String courseAttribute;
+    @ApiModelProperty("课程属性")
+    private String courseAttributeCn;
+    /**
+     * 课程分类
+     */
+    @ApiModelProperty("课程分类")
+    private String courseType;
+    @ApiModelProperty("课程分类")
+    private String courseTypeCn;
+    /**
+     * 学科类别
+     */
+    @ApiModelProperty("学科类别")
+    private String subjectQuality;
+    @ApiModelProperty("学科类别")
+    private String subjectQualityCn;
+    /**
+     * 是否专业核心课程
+     */
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourse;
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourseCn;
+    /**
+     * 理论教学时数
+     */
+    @ApiModelProperty("理论教学时数")
+    private Integer theoryTime;
+    /**
+     * 实践教学时数
+     */
+    @ApiModelProperty("实践教学时数")
+    private Integer practiceTime;
+    /**
+     * 是否有线上课程
+     */
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourse;
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourseCn;
+    /**
+     * 线上课程网址
+     */
+    @ApiModelProperty("线上课程网址")
+    private String courseUrl;
+    /**
+     * 是否思政示范课程
+     */
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemo;
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemoCn;
+    /**
+     * 课堂教学设计主要选用课程资源
+     */
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    private String courseResource;
+    /**
+     * 虚拟仿真实训课时数
+     */
+    @ApiModelProperty("虚拟仿真实训课时数")
+    private Integer emulationTime;
+    /**
+     * 主要开设虚拟仿真实训项目名称
+     */
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    private String emulationName;
+    /**
+     * 主要开设实验项目名称
+     */
+    @ApiModelProperty("主要开设实验项目名称")
+    private String experimentName;
+    /**
+     * 主要开设实训项目名称
+     */
+    @ApiModelProperty("主要开设实训项目名称")
+    private String trainingName;
+    /**
+     * 主要开设实习项目名称
+     */
+    @ApiModelProperty("主要开设实习项目名称")
+    private String internshipName;
 }

+ 5 - 1
src/main/java/com/xjrsoft/module/organization/service/impl/WeChatServiceImgl.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.organization.service.impl;
 
 
 import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.enums.DeleteMark;
@@ -19,6 +20,7 @@ import com.xjrsoft.module.organization.service.IWeChatService;
 import com.xjrsoft.module.system.entity.WechatMessageSendLog;
 import com.xjrsoft.module.system.mapper.WechatMessageSendLogMapper;
 import lombok.AllArgsConstructor;
+import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -53,14 +55,16 @@ public class WeChatServiceImgl implements IWeChatService {
         object.put("url", dto.getUrl());
         object.put("client_msg_id", dto.getMsgId());
         object.put("data", dto.getContent());
+        ActiveSpan.tag("sendTemplateMessage-params", JSON.toJSONString(object));
         String result = weChatUtil.sendTemplateMessage(object);
-
+        ActiveSpan.tag("sendTemplateMessage-result", result);
         //新增微信模板消息发送记录
         wechatMessageSendLogMapper.insert(new WechatMessageSendLog(){{
             setOpenId(dto.getUserId());
             setTemplateId(dto.getTemplateId());
             setResult(result);
             setParams(object.toString());
+            setCreateDate(new Date());
         }});
     }
 

+ 5 - 0
src/main/java/com/xjrsoft/module/student/controller/StudentReportPlanController.java

@@ -17,6 +17,7 @@ import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.banding.entity.BandingTask;
+import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseSemester;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -61,6 +62,7 @@ public class StudentReportPlanController {
     private final IBaseSemesterService semesterService;
     private final IBaseClassService classService;
     private final IEnrollmentPlanService enrollmentPlanService;
+    private final IBandingTaskClassStudentService taskClassStudentService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value = "学生报到计划列表(分页)")
@@ -116,6 +118,9 @@ public class StudentReportPlanController {
         if((reportPlan.getCategory() == 2 || reportPlan.getCategory() == 3) && LocalDateTimeUtil.isDateTimeInRange(LocalDateTime.now(), reportPlan.getStartTime(), reportPlan.getEndTime())){
             reportPlan.setStatus(1);
         }
+        if(reportPlan.getCategory() == 3){
+            taskClassStudentService.syncStudentData(reportPlan);
+        }
         return RT.ok(studentReportPlanService.update(reportPlan));
     }
 

+ 0 - 1
src/main/java/com/xjrsoft/module/veb/controller/ImportRubAndHandController.java

@@ -75,5 +75,4 @@ public class ImportRubAndHandController {
         ByteArrayOutputStream bot = ImportExcelUtil.writeTemplateSheet(obj);
         return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
     }
-
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/veb/entity/InternshipPlanManage.java

@@ -75,6 +75,11 @@ public class InternshipPlanManage implements Serializable {
      */
     @ApiModelProperty("学期主键id(base_semester)")
     private Long baseSemesterId;
+    /**
+     * 学期
+     */
+    @ApiModelProperty("学期")
+    private String baseSemester;
     /**
      * 实习计划名称
      */
@@ -90,6 +95,16 @@ public class InternshipPlanManage implements Serializable {
      */
     @ApiModelProperty("实训基地主键id(school_training_base and outside_training_base)")
     private Long trainingBaseId;
+    /**
+     * 实训基地名称
+     */
+    @ApiModelProperty("实训基地名称")
+    private String trainingBaseName;
+    /**
+     * 实训基地编号
+     */
+    @ApiModelProperty("实训基地编号")
+    private String trainingBaseNumber;
     /**
      * 实习去向
      */

+ 63 - 26
src/main/java/com/xjrsoft/module/veb/service/impl/ImportRubAndHandServiceImpl.java

@@ -1,9 +1,11 @@
 package com.xjrsoft.module.veb.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.module.base.entity.*;
 import com.xjrsoft.module.base.mapper.*;
@@ -29,11 +31,9 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.xjrsoft.module.veb.util.ImportExcelUtil.*;
 
@@ -99,6 +99,8 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
             courseSubject.setId(id);
             courseSubject.setName(dto.getName());
             courseSubject.setCode(dto.getCode());
+            courseSubject.setCreateDate(new Date());
+            courseSubject.setCreateUserId(StpUtil.getLoginIdAsLong());
             baseCourseSubjects.add(courseSubject);
 
             CourseSubjectDetail courseSubjectDetail = BeanUtil.toBean(dto, CourseSubjectDetail.class);
@@ -168,6 +170,9 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
 
             // 布尔类型
 
+            courseSubjectDetail.setCreateDate(new Date());
+            courseSubjectDetail.setCreateUserId(StpUtil.getLoginIdAsLong());
+
             courseSubjectDetails.add(courseSubjectDetail);
         }
 
@@ -214,6 +219,8 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
         Map<String, Long> baseSemesterMap = baseSemesters.stream()
                 .collect(Collectors.toMap(BaseSemester::getName, BaseSemester::getId, (o1, o2) -> o1));
 
+        // 实训基地
+        // 校内实训基地
         List<TrainingSchool> trainingSchools = trainingSchoolMapper.selectList(
                 Wrappers
                         .lambdaQuery(TrainingSchool.class)
@@ -221,7 +228,10 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
         );
         Map<String, Long> trainingSchoolMap = trainingSchools.stream()
                 .collect(Collectors.toMap(TrainingSchool::getTrainingName, TrainingSchool::getId, (o1, o2) -> o1));
+        Map<String, String> trainingSchoolNumberMap = trainingSchools.stream()
+                .collect(Collectors.toMap(TrainingSchool::getTrainingName, TrainingSchool::getTrainingNumber, (o1, o2) -> o1));
 
+        // 校外实训基地
         List<TrainingOutside> trainingOutsides = trainingOutsideMapper.selectList(
                 Wrappers
                         .lambdaQuery(TrainingOutside.class)
@@ -229,6 +239,24 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
         );
         Map<String, Long> trainingOutsideMap = trainingOutsides.stream()
                 .collect(Collectors.toMap(TrainingOutside::getTrainingName, TrainingOutside::getId, (o1, o2) -> o1));
+        Map<String, String> trainingOutsideNumberMap = trainingOutsides.stream()
+                .collect(Collectors.toMap(TrainingOutside::getTrainingName, TrainingOutside::getTrainingNumber, (o1, o2) -> o1));
+        // 实训基地合集
+        Map<String, Long> trainingMap = Stream.of(trainingSchoolMap, trainingOutsideMap)
+                .flatMap(map -> map.entrySet().stream())
+                .collect(Collectors.toMap(
+                        Map.Entry::getKey,
+                        Map.Entry::getValue,
+                        (oldVal, newVal) -> newVal // 用新值覆盖旧值
+                ));
+
+        Map<String, String> trainingNumberMap = Stream.of(trainingSchoolNumberMap, trainingOutsideNumberMap)
+                .flatMap(map -> map.entrySet().stream())
+                .collect(Collectors.toMap(
+                        Map.Entry::getKey,
+                        Map.Entry::getValue,
+                        (oldVal, newVal) -> newVal // 用新值覆盖旧值
+                ));
 
         List<User> users = userMapper.selectList(
                 Wrappers
@@ -258,11 +286,12 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
         List<InternshipPlanManageParticipant> internshipPlanManageParticipants = new ArrayList<>();
 
         for (int i = 0; i < excelDataList.size(); i++) {
+            int row = i + 1;
             InternshipPlanImportVo vo = excelDataList.get(i);
 
             if (isRequiredFieldsFilled(vo,
                     sb,
-                    i)) {
+                    row)) {
                 return sb.toString();
             }
 
@@ -282,7 +311,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         baseSemesterMap,
                         internshipPlanManage::setBaseSemesterId,
                         sb,
-                        i
+                        row
                 )) {
                     return sb.toString();
                 }
@@ -293,24 +322,26 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInternshipPlanType,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
                 if (validateAndSetString2LongField(vo::getTrainingBaseName,
                         "实训基地名称",
-                        trainingSchoolMap,
+                        trainingMap,
                         internshipPlanManage::setTrainingBaseId,
                         sb,
-                        i
-                ) && (validateAndSetString2LongField(vo::getTrainingBaseName,
+                        row)
+                ) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetString2StringField(vo::getTrainingBaseName,
                         "实训基地名称",
-                        trainingOutsideMap,
-                        internshipPlanManage::setTrainingBaseId,
+                        trainingNumberMap,
+                        internshipPlanManage::setTrainingBaseNumber,
                         sb,
-                        i
-                )
-                )
+                        row)
                 ) {
                     return sb.toString();
                 }
@@ -321,7 +352,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInsurancePurchaser,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -331,7 +362,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInternshipWhereabouts,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -341,7 +372,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInsuranceType,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -351,7 +382,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInsuranceType,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -361,7 +392,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInternshipSiteType,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -371,7 +402,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setInternshipUnitSource,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -381,7 +412,7 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setLodgingPlan,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
 
@@ -391,9 +422,11 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                         dictionary,
                         internshipPlanManage::setProfessionalRelevanceEnterprise,
                         sb,
-                        i)) {
+                        row)) {
                     return sb.toString();
                 }
+                internshipPlanManage.setCreateDate(new Date());
+                internshipPlanManage.setCreateUserId(StpUtil.getLoginIdAsLong());
                 internshipPlanManageMap.put(key, internshipPlanManage);
             } else {
                 InternshipPlanManage internshipPlanManage = internshipPlanManageMap.get(key);
@@ -408,28 +441,32 @@ public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
                     userMap,
                     internshipPlanManageParticipant::setParticipantUserId,
                     sb,
-                    i
+                    row
             )) {
                 return sb.toString();
             }
+
             if (validateAndSetString2LongField(vo::getBaseMajorName,
                     "所属专业名称",
                     baseMajorMap,
                     internshipPlanManageParticipant::setBaseMajorId,
                     sb,
-                    i
+                    row
             )) {
                 return sb.toString();
             }
+
             if (validateAndSetString2LongField(vo::getClassName,
                     "班级名称",
                     baseClassMap,
                     internshipPlanManageParticipant::setClassId,
                     sb,
-                    i
+                    row
             )) {
                 return sb.toString();
             }
+            internshipPlanManageParticipant.setCreateDate(new Date());
+            internshipPlanManageParticipant.setCreateUserId(StpUtil.getLoginIdAsLong());
             internshipPlanManageParticipants.add(internshipPlanManageParticipant);
         }
 

+ 34 - 0
src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

@@ -406,6 +406,40 @@ public class ImportExcelUtil {
         return false; // 字段为空,不进行验证
     }
 
+    /**
+     * 验证子表字段值的合理性并转换为对应的值
+     *
+     * @param getter
+     * @param fieldName
+     * @param string2String
+     * @param setter
+     * @param sb
+     * @param i
+     * @return
+     */
+    public static boolean validateAndSetString2StringField(Supplier<String> getter,
+                                                         String fieldName,
+                                                         Map<String, String> string2String,
+                                                         Consumer<String> setter,
+                                                         StringBuilder sb, int i) {
+        String value = getter.get();
+        if (value != null && !value.trim().isEmpty()) {
+            String sublistValue = string2String.get(value);
+            if (sublistValue != null) {
+                setter.accept(sublistValue);
+                return false;
+            } else {
+                sb.append("第");
+                sb.append(i);
+                sb.append("行的");
+                sb.append(fieldName);
+                sb.append("列的值不存在于系统对应基础数据中,请到基础数据维护");
+                return true;
+            }
+        }
+        return false; // 字段为空,不进行验证
+    }
+
     /**
      * 验证boolean值的合理性并转换为数值
      *

+ 6 - 6
src/main/java/com/xjrsoft/module/veb/vo/BaseCourseSubjectImportVo.java

@@ -108,7 +108,7 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("线上课程网址")
     @ApiModelProperty("线上课程网址")
-    @Required
+    @Required(value = false)
     private String courseUrl;
     /**
      * 是否思政示范课程
@@ -124,7 +124,7 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("课堂教学设计主要选用课程资源")
     @ApiModelProperty("课堂教学设计主要选用课程资源")
-    @Required
+    @Required(value = false)
     private String courseResource;
     /**
      * 虚拟仿真实训课时数
@@ -140,7 +140,7 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("主要开设虚拟仿真实训项目名称")
     @ApiModelProperty("主要开设虚拟仿真实训项目名称")
-    @Required
+    @Required(value = false)
     private String emulationName;
     /**
      * 主要开设实验项目名称
@@ -148,7 +148,7 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("主要开设实验项目名称")
     @ApiModelProperty("主要开设实验项目名称")
-    @Required
+    @Required(value = false)
     private String experimentName;
     /**
      * 主要开设实训项目名称
@@ -156,7 +156,7 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("主要开设实训项目名称")
     @ApiModelProperty("主要开设实训项目名称")
-    @Required
+    @Required(value = false)
     private String trainingName;
     /**
      * 主要开设实习项目名称
@@ -164,6 +164,6 @@ public class BaseCourseSubjectImportVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("主要开设实习项目名称")
     @ApiModelProperty("主要开设实习项目名称")
-    @Required
+    @Required(value = false)
     private String internshipName;
 }

+ 10 - 0
src/main/resources/mapper/banding/BandingTaskClassStudentMapper.xml

@@ -204,4 +204,14 @@
             </if>
         </if>
     </select>
+
+    <select id="getSyncStudentDataList" resultType="com.xjrsoft.module.banding.vo.SyncStudentDataListVo">
+        SELECT t2.id AS new_student_id,t4.class_id,t6.banding_task_class_id,t4.stduy_status FROM student_report_record t1
+        INNER JOIN base_new_student t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_user t3 ON t2.credential_number = t3.credential_number
+        INNER JOIN base_student_school_roll t4 ON t3.id = t4.user_id
+        LEFT JOIN banding_task_class t5 ON t4.class_id = t5.base_class_id
+        LEFT JOIN banding_task_class_student t6 ON t2.id = t6.new_student_id AND t6.delete_mark = 0
+        WHERE t1.delete_mark = 0 AND t1.student_report_plan_id = #{studentReportPlanId}
+    </select>
 </mapper>

+ 43 - 0
src/main/resources/sqlScript/鸿合提供数据视图.sql

@@ -0,0 +1,43 @@
+# 班级信息
+DROP VIEW IF EXISTS hh_class_view;
+create view hh_class_view as
+(
+select t.id         as class_id,
+       t.name       as class_name,
+       t.teacher_id as teacher_id,
+       t1.name      as teacher_name
+from base_class t
+         inner join xjr_user t1 on t1.id = t.teacher_id
+where t.delete_mark = 0
+  and t.is_graduate = 1
+    );
+
+# 教师信息
+DROP VIEW IF EXISTS hh_teacher_view;
+create view hh_teacher_view as
+(
+select t.id         as user_id,
+       t.name       as name,
+       t.mobile as mobile
+from  xjr_user t
+         inner join xjr_user_role_relation t1 on t1.user_id = t.id
+where t.delete_mark = 0
+  and t1.role_id = 2
+    );
+
+# 地点信息
+DROP VIEW IF EXISTS hh_area_view;
+create view hh_area_view as
+(
+select
+        CAST(ROW_NUMBER() OVER (ORDER BY t1.id) AS SIGNED) as id,
+       concat(t2.name,t.name) as name,
+       t1.id as class_id
+from base_classroom t
+         inner join base_class t1 on t1.classroom_id = t.id
+         inner join base_office_build t2 on t2.id = t.office_build_id
+where t.delete_mark = 0
+  and t1.delete_mark = 0
+  and t1.is_graduate = 1
+    );
+