Forráskód Böngészése

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

dzx 3 hónapja
szülő
commit
0473b0b907
43 módosított fájl, 3675 hozzáadás és 90 törlés
  1. 12 0
      src/main/java/com/xjrsoft/common/annotation/Required.java
  2. 125 0
      src/main/java/com/xjrsoft/module/base/controller/CourseSubjectDetailController.java
  3. 123 0
      src/main/java/com/xjrsoft/module/base/dto/AddCourseSubjectDetailDto.java
  4. 26 0
      src/main/java/com/xjrsoft/module/base/dto/CourseSubjectDetailPageDto.java
  5. 32 0
      src/main/java/com/xjrsoft/module/base/dto/UpdateCourseSubjectDetailDto.java
  6. 31 6
      src/main/java/com/xjrsoft/module/base/entity/BaseCourseSubject.java
  7. 173 0
      src/main/java/com/xjrsoft/module/base/entity/CourseSubjectDetail.java
  8. 17 0
      src/main/java/com/xjrsoft/module/base/mapper/CourseSubjectDetailMapper.java
  9. 17 0
      src/main/java/com/xjrsoft/module/base/service/ICourseSubjectDetailService.java
  10. 25 0
      src/main/java/com/xjrsoft/module/base/service/impl/CourseSubjectDetailServiceImpl.java
  11. 209 0
      src/main/java/com/xjrsoft/module/base/vo/CourseSubjectDetailPageVo.java
  12. 124 0
      src/main/java/com/xjrsoft/module/base/vo/CourseSubjectDetailVo.java
  13. 1 12
      src/main/java/com/xjrsoft/module/form/controller/FormExecuteController.java
  14. 17 4
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  15. 15 0
      src/main/java/com/xjrsoft/module/system/dto/AddDictionaryDetailDto.java
  16. 13 0
      src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailChangeStatusDto.java
  17. 15 0
      src/main/java/com/xjrsoft/module/system/dto/UpdateDictionaryDetailDto.java
  18. 14 0
      src/main/java/com/xjrsoft/module/system/entity/DictionaryDetail.java
  19. 15 0
      src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailListVo.java
  20. 15 0
      src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailPageVo.java
  21. 1 28
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java
  22. 2 1
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookService.java
  23. 44 6
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java
  24. 189 0
      src/main/java/com/xjrsoft/module/veb/controller/ImportRubAndHandController.java
  25. 156 0
      src/main/java/com/xjrsoft/module/veb/entity/CompanyCoop.java
  26. 165 0
      src/main/java/com/xjrsoft/module/veb/entity/InternshipPlanManage.java
  27. 115 0
      src/main/java/com/xjrsoft/module/veb/entity/InternshipPlanManageParticipant.java
  28. 128 0
      src/main/java/com/xjrsoft/module/veb/entity/TrainingOutside.java
  29. 153 0
      src/main/java/com/xjrsoft/module/veb/entity/TrainingSchool.java
  30. 16 0
      src/main/java/com/xjrsoft/module/veb/mapper/CompanyCoopMapper.java
  31. 16 0
      src/main/java/com/xjrsoft/module/veb/mapper/InternshipPlanManageMapper.java
  32. 16 0
      src/main/java/com/xjrsoft/module/veb/mapper/InternshipPlanManageParticipantMapper.java
  33. 17 0
      src/main/java/com/xjrsoft/module/veb/mapper/TrainingOutsideMapper.java
  34. 17 0
      src/main/java/com/xjrsoft/module/veb/mapper/TrainingSchoolMapper.java
  35. 15 0
      src/main/java/com/xjrsoft/module/veb/service/ImportRubAndHandService.java
  36. 583 0
      src/main/java/com/xjrsoft/module/veb/service/impl/ImportRubAndHandServiceImpl.java
  37. 169 0
      src/main/java/com/xjrsoft/module/veb/vo/BaseCourseSubjectImportVo.java
  38. 136 0
      src/main/java/com/xjrsoft/module/veb/vo/CompanyCoopImportVo.java
  39. 195 0
      src/main/java/com/xjrsoft/module/veb/vo/InternshipPlanImportVo.java
  40. 1 1
      src/main/resources/mapper/textbook/TextbookMapper.xml
  41. 52 32
      src/main/resources/sqlScript/all_sql.sql
  42. 295 0
      src/main/resources/sqlScript/veb_sql.sql
  43. 175 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 12 - 0
src/main/java/com/xjrsoft/common/annotation/Required.java

@@ -0,0 +1,12 @@
+package com.xjrsoft.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Required {
+    boolean value() default true; // 默认为必填
+}

+ 125 - 0
src/main/java/com/xjrsoft/module/base/controller/CourseSubjectDetailController.java

@@ -0,0 +1,125 @@
+package com.xjrsoft.module.base.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.dto.AddCourseSubjectDetailDto;
+import com.xjrsoft.module.base.dto.UpdateCourseSubjectDetailDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.EasyExcel;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.IOException;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.springframework.http.ResponseEntity;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import com.xjrsoft.module.base.dto.CourseSubjectDetailPageDto;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
+import com.xjrsoft.module.base.service.ICourseSubjectDetailService;
+import com.xjrsoft.module.base.vo.CourseSubjectDetailPageVo;
+
+import com.xjrsoft.module.base.vo.CourseSubjectDetailVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 课程学科管理详情表
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/base" + "/courseSubjectDetail")
+@Api(value = "/base"  + "/courseSubjectDetail",tags = "课程学科管理详情表代码")
+@AllArgsConstructor
+public class CourseSubjectDetailController {
+
+
+    private final ICourseSubjectDetailService courseSubjectDetailService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="课程学科管理详情表列表(分页)")
+    @SaCheckPermission("coursesubjectdetail:detail")
+    public RT<PageOutput<CourseSubjectDetailPageVo>> page(@Valid CourseSubjectDetailPageDto dto){
+
+        LambdaQueryWrapper<CourseSubjectDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(CourseSubjectDetail::getId)
+                .select(CourseSubjectDetail.class,x -> VoToColumnUtil.fieldsToColumns(CourseSubjectDetailPageVo.class).contains(x.getProperty()));
+        IPage<CourseSubjectDetail> page = courseSubjectDetailService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<CourseSubjectDetailPageVo> pageOutput = ConventPage.getPageOutput(page, CourseSubjectDetailPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询课程学科管理详情表信息")
+    @SaCheckPermission("coursesubjectdetail:detail")
+    public RT<CourseSubjectDetailVo> info(@RequestParam Long id){
+        CourseSubjectDetail courseSubjectDetail = courseSubjectDetailService.getById(id);
+        if (courseSubjectDetail == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(courseSubjectDetail, CourseSubjectDetailVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增课程学科管理详情表")
+    @SaCheckPermission("coursesubjectdetail:add")
+    public RT<Boolean> add(@Valid @RequestBody AddCourseSubjectDetailDto dto){
+        CourseSubjectDetail courseSubjectDetail = BeanUtil.toBean(dto, CourseSubjectDetail.class);
+        boolean isSuccess = courseSubjectDetailService.save(courseSubjectDetail);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改课程学科管理详情表")
+    @SaCheckPermission("coursesubjectdetail:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateCourseSubjectDetailDto dto){
+
+        CourseSubjectDetail courseSubjectDetail = BeanUtil.toBean(dto, CourseSubjectDetail.class);
+        return RT.ok(courseSubjectDetailService.updateById(courseSubjectDetail));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除课程学科管理详情表")
+    @SaCheckPermission("coursesubjectdetail:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(courseSubjectDetailService.removeBatchByIds(ids));
+
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam MultipartFile file) throws IOException {
+        List<CourseSubjectDetailPageVo> savedDataList = EasyExcel.read(file.getInputStream()).head(CourseSubjectDetailPageVo.class).sheet().doReadSync();
+        Boolean result = courseSubjectDetailService.saveBatch(BeanUtil.copyToList(savedDataList, CourseSubjectDetail.class));
+        return RT.ok(result);
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid CourseSubjectDetailPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<CourseSubjectDetailPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<CourseSubjectDetailPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, CourseSubjectDetailPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "CourseSubjectDetail" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 123 - 0
src/main/java/com/xjrsoft/module/base/dto/AddCourseSubjectDetailDto.java

@@ -0,0 +1,123 @@
+package com.xjrsoft.module.base.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-11-26
+* @Version 1.0
+*/
+@Data
+public class AddCourseSubjectDetailDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 课程学科管理主表id
+    */
+    @ApiModelProperty("课程学科管理主表id")
+    private Long baseCourseSubjectId;
+    /**
+    * 课程类别
+    */
+    @ApiModelProperty("课程类别")
+    private String courseCategory;
+    /**
+    * 课程性质
+    */
+    @ApiModelProperty("课程性质")
+    private String courseNature;
+    /**
+    * 课程属性
+    */
+    @ApiModelProperty("课程属性")
+    private String courseAttribute;
+    /**
+    * 课程分类
+    */
+    @ApiModelProperty("课程分类")
+    private String courseType;
+    /**
+    * 学科类别
+    */
+    @ApiModelProperty("学科类别")
+    private String subjectQuality;
+    /**
+    * 是否专业核心课程
+    */
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourse;
+    /**
+    * 理论教学时数
+    */
+    @ApiModelProperty("理论教学时数")
+    private Integer theoryTime;
+    /**
+    * 实践教学时数
+    */
+    @ApiModelProperty("实践教学时数")
+    private Integer practiceTime;
+    /**
+    * 是否有线上课程
+    */
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourse;
+    /**
+    * 线上课程网址
+    */
+    @ApiModelProperty("线上课程网址")
+    private String courseUrl;
+    /**
+    * 是否思政示范课程
+    */
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemo;
+    /**
+    * 课堂教学设计主要选用课程资源
+    */
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    private String courseResource;
+    /**
+    * 虚拟仿真实训课时数
+    */
+    @ApiModelProperty("虚拟仿真实训课时数")
+    private Integer emulationTime;
+    /**
+    * 主要开设虚拟仿真实训项目名称
+    */
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    private String emulationName;
+    /**
+    * 主要开设实验项目名称
+    */
+    @ApiModelProperty("主要开设实验项目名称")
+    private String experimentName;
+    /**
+    * 主要开设实训项目名称
+    */
+    @ApiModelProperty("主要开设实训项目名称")
+    private String trainingName;
+    /**
+    * 主要开设实习项目名称
+    */
+    @ApiModelProperty("主要开设实习项目名称")
+    private String internshipName;
+
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/base/dto/CourseSubjectDetailPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.base.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-11-26
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class CourseSubjectDetailPageDto extends PageInput {
+
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/base/dto/UpdateCourseSubjectDetailDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.base.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-11-26
+* @Version 1.0
+*/
+@Data
+public class UpdateCourseSubjectDetailDto extends AddCourseSubjectDetailDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 31 - 6
src/main/java/com/xjrsoft/module/base/entity/BaseCourseSubject.java

@@ -1,6 +1,6 @@
 package com.xjrsoft.module.base.entity;
 
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -23,25 +23,50 @@ public class BaseCourseSubject implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty("主键")
+    /**
+     * 主键编号
+     */
+    @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("课程学科名称")

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

@@ -0,0 +1,173 @@
+package com.xjrsoft.module.base.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-11-26
+* @Version 1.0
+*/
+@Data
+@TableName("course_subject_detail")
+@ApiModel(value = "course_subject_detail", description = "课程学科管理详情表")
+public class CourseSubjectDetail 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;
+    /**
+    * 课程学科管理主表id
+    */
+    @ApiModelProperty("课程学科管理主表id")
+    private Long baseCourseSubjectId;
+    /**
+    * 课程类别
+    */
+    @ApiModelProperty("课程类别")
+    private String courseCategory;
+    /**
+    * 课程性质
+    */
+    @ApiModelProperty("课程性质")
+    private String courseNature;
+    /**
+    * 课程属性
+    */
+    @ApiModelProperty("课程属性")
+    private String courseAttribute;
+    /**
+    * 课程分类
+    */
+    @ApiModelProperty("课程分类")
+    private String courseType;
+    /**
+    * 学科类别
+    */
+    @ApiModelProperty("学科类别")
+    private String subjectQuality;
+    /**
+    * 是否专业核心课程
+    */
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourse;
+    /**
+    * 理论教学时数
+    */
+    @ApiModelProperty("理论教学时数")
+    private Integer theoryTime;
+    /**
+    * 实践教学时数
+    */
+    @ApiModelProperty("实践教学时数")
+    private Integer practiceTime;
+    /**
+    * 是否有线上课程
+    */
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourse;
+    /**
+    * 线上课程网址
+    */
+    @ApiModelProperty("线上课程网址")
+    private String courseUrl;
+    /**
+    * 是否思政示范课程
+    */
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemo;
+    /**
+    * 课堂教学设计主要选用课程资源
+    */
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    private String courseResource;
+    /**
+    * 虚拟仿真实训课时数
+    */
+    @ApiModelProperty("虚拟仿真实训课时数")
+    private Integer emulationTime;
+    /**
+    * 主要开设虚拟仿真实训项目名称
+    */
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    private String emulationName;
+    /**
+    * 主要开设实验项目名称
+    */
+    @ApiModelProperty("主要开设实验项目名称")
+    private String experimentName;
+    /**
+    * 主要开设实训项目名称
+    */
+    @ApiModelProperty("主要开设实训项目名称")
+    private String trainingName;
+    /**
+    * 主要开设实习项目名称
+    */
+    @ApiModelProperty("主要开设实习项目名称")
+    private String internshipName;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/base/mapper/CourseSubjectDetailMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 课程学科管理详情表
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@Mapper
+public interface CourseSubjectDetailMapper extends MPJBaseMapper<CourseSubjectDetail> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/base/service/ICourseSubjectDetailService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 课程学科管理详情表
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+
+public interface ICourseSubjectDetailService extends MPJBaseService<CourseSubjectDetail> {
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/base/service/impl/CourseSubjectDetailServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.base.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.base.entity.CourseSubjectDetail;
+import com.xjrsoft.module.base.mapper.CourseSubjectDetailMapper;
+import com.xjrsoft.module.base.service.ICourseSubjectDetailService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 课程学科管理详情表
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class CourseSubjectDetailServiceImpl extends MPJBaseServiceImpl<CourseSubjectDetailMapper, CourseSubjectDetail> implements ICourseSubjectDetailService {
+}

+ 209 - 0
src/main/java/com/xjrsoft/module/base/vo/CourseSubjectDetailPageVo.java

@@ -0,0 +1,209 @@
+package com.xjrsoft.module.base.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 课程学科管理详情表分页列表出参
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@Data
+public class CourseSubjectDetailPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号")
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建人")
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @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;
+    /**
+    * 序号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("序号")
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 课程学科管理主表id
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程学科管理主表id")
+    @ApiModelProperty("课程学科管理主表id")
+    private Long baseCourseSubjectId;
+    /**
+    * 课程类别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程类别")
+    @ApiModelProperty("课程类别")
+    private String courseCategory;
+    /**
+    * 课程性质
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程性质")
+    @ApiModelProperty("课程性质")
+    private String courseNature;
+    /**
+    * 课程属性
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程属性")
+    @ApiModelProperty("课程属性")
+    private String courseAttribute;
+    /**
+    * 课程分类
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程分类")
+    @ApiModelProperty("课程分类")
+    private String courseType;
+    /**
+    * 学科类别
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学科类别")
+    @ApiModelProperty("学科类别")
+    private String subjectQuality;
+    /**
+    * 是否专业核心课程
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否专业核心课程")
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourse;
+    /**
+    * 理论教学时数
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("理论教学时数")
+    @ApiModelProperty("理论教学时数")
+    private Integer theoryTime;
+    /**
+    * 实践教学时数
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实践教学时数")
+    @ApiModelProperty("实践教学时数")
+    private Integer practiceTime;
+    /**
+    * 是否有线上课程
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否有线上课程")
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourse;
+    /**
+    * 线上课程网址
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("线上课程网址")
+    @ApiModelProperty("线上课程网址")
+    private String courseUrl;
+    /**
+    * 是否思政示范课程
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否思政示范课程")
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemo;
+    /**
+    * 课堂教学设计主要选用课程资源
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课堂教学设计主要选用课程资源")
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    private String courseResource;
+    /**
+    * 虚拟仿真实训课时数
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("虚拟仿真实训课时数")
+    @ApiModelProperty("虚拟仿真实训课时数")
+    private Integer emulationTime;
+    /**
+    * 主要开设虚拟仿真实训项目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设虚拟仿真实训项目名称")
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    private String emulationName;
+    /**
+    * 主要开设实验项目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实验项目名称")
+    @ApiModelProperty("主要开设实验项目名称")
+    private String experimentName;
+    /**
+    * 主要开设实训项目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实训项目名称")
+    @ApiModelProperty("主要开设实训项目名称")
+    private String trainingName;
+    /**
+    * 主要开设实习项目名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实习项目名称")
+    @ApiModelProperty("主要开设实习项目名称")
+    private String internshipName;
+
+}

+ 124 - 0
src/main/java/com/xjrsoft/module/base/vo/CourseSubjectDetailVo.java

@@ -0,0 +1,124 @@
+package com.xjrsoft.module.base.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-11-26
+* @Version 1.0
+*/
+@Data
+public class CourseSubjectDetailVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 课程学科管理主表id
+    */
+    @ApiModelProperty("课程学科管理主表id")
+    private Long baseCourseSubjectId;
+    /**
+    * 课程类别
+    */
+    @ApiModelProperty("课程类别")
+    private String courseCategory;
+    /**
+    * 课程性质
+    */
+    @ApiModelProperty("课程性质")
+    private String courseNature;
+    /**
+    * 课程属性
+    */
+    @ApiModelProperty("课程属性")
+    private String courseAttribute;
+    /**
+    * 课程分类
+    */
+    @ApiModelProperty("课程分类")
+    private String courseType;
+    /**
+    * 学科类别
+    */
+    @ApiModelProperty("学科类别")
+    private String subjectQuality;
+    /**
+    * 是否专业核心课程
+    */
+    @ApiModelProperty("是否专业核心课程")
+    private String coreCourse;
+    /**
+    * 理论教学时数
+    */
+    @ApiModelProperty("理论教学时数")
+    private Integer theoryTime;
+    /**
+    * 实践教学时数
+    */
+    @ApiModelProperty("实践教学时数")
+    private Integer practiceTime;
+    /**
+    * 是否有线上课程
+    */
+    @ApiModelProperty("是否有线上课程")
+    private String onlineCourse;
+    /**
+    * 线上课程网址
+    */
+    @ApiModelProperty("线上课程网址")
+    private String courseUrl;
+    /**
+    * 是否思政示范课程
+    */
+    @ApiModelProperty("是否思政示范课程")
+    private String ideologyDemo;
+    /**
+    * 课堂教学设计主要选用课程资源
+    */
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    private String courseResource;
+    /**
+    * 虚拟仿真实训课时数
+    */
+    @ApiModelProperty("虚拟仿真实训课时数")
+    private Integer emulationTime;
+    /**
+    * 主要开设虚拟仿真实训项目名称
+    */
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    private String emulationName;
+    /**
+    * 主要开设实验项目名称
+    */
+    @ApiModelProperty("主要开设实验项目名称")
+    private String experimentName;
+    /**
+    * 主要开设实训项目名称
+    */
+    @ApiModelProperty("主要开设实训项目名称")
+    private String trainingName;
+    /**
+    * 主要开设实习项目名称
+    */
+    @ApiModelProperty("主要开设实习项目名称")
+    private String internshipName;
+
+
+
+}

+ 1 - 12
src/main/java/com/xjrsoft/module/form/controller/FormExecuteController.java

@@ -6,17 +6,13 @@ import cn.hutool.db.Entity;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.handler.FormContentStyleStrategy;
 import com.xjrsoft.common.model.result.R;
-import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.DatasourceUtil;
 import com.xjrsoft.common.utils.LocalDateTimeUtil;
-import com.xjrsoft.module.attendance.entity.AttendanceStatistics;
 import com.xjrsoft.module.authority.dto.BatchSetDataAuthDto;
 import com.xjrsoft.module.form.dto.*;
 import com.xjrsoft.module.form.entity.FormDesignConfig;
@@ -31,7 +27,6 @@ import com.xjrsoft.module.generator.entity.ColumnConfig;
 import com.xjrsoft.module.generator.entity.ImportConfig;
 import com.xjrsoft.module.generator.entity.TableConfig;
 import com.xjrsoft.module.student.service.IStudentConsumeDateService;
-import com.xjrsoft.module.system.entity.XjrTipsMessage;
 import com.xjrsoft.module.system.service.IXjrTipsMessageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -56,13 +51,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**

+ 17 - 4
src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java

@@ -1,20 +1,22 @@
 package com.xjrsoft.module.system.controller;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.system.dto.AddDictionaryDetailDto;
-import com.xjrsoft.module.system.dto.DictionaryDetailListDto;
-import com.xjrsoft.module.system.dto.DictionaryDetailPageDto;
-import com.xjrsoft.module.system.dto.UpdateDictionaryDetailDto;
+import com.xjrsoft.module.organization.dto.UserChangeStatusDto;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.system.dto.*;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
 import com.xjrsoft.module.system.vo.DictionaryDetailListVo;
@@ -168,4 +170,15 @@ public class DictionarydetailController {
     public R delete(@RequestBody List<Long> ids) {
         return R.ok(dictionarydetailService.removeBatchByIds(ids));
     }
+
+    @PostMapping(value = "/change-status")
+    @ApiOperation(value="修改状态")
+    public RT<Boolean> changeStatus(@Valid @RequestBody DictionaryDetailChangeStatusDto dto) throws Exception {
+        DictionaryDetail  dictionaryDetail= dictionarydetailService.getById(dto.getId());
+        if(dictionaryDetail!=null){
+            dictionaryDetail.setEnabledMark(dto.getStatus());
+            dictionarydetailService.updateById(dictionaryDetail);
+        }
+        return RT.ok(true);
+    }
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/dto/AddDictionaryDetailDto.java

@@ -42,5 +42,20 @@ public class AddDictionaryDetailDto {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
+
 
 }

+ 13 - 0
src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailChangeStatusDto.java

@@ -0,0 +1,13 @@
+package com.xjrsoft.module.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+@Data
+public class DictionaryDetailChangeStatusDto {
+
+    @ApiModelProperty("字典明细")
+    private Long id;
+
+    @ApiModelProperty("启用状态(0:停用 1:启用)")
+    private Integer status;
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/system/dto/UpdateDictionaryDetailDto.java

@@ -42,4 +42,19 @@ public class UpdateDictionaryDetailDto {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
+
 }

+ 14 - 0
src/main/java/com/xjrsoft/module/system/entity/DictionaryDetail.java

@@ -48,4 +48,18 @@ public class DictionaryDetail extends AuditEntity implements Serializable {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailListVo.java

@@ -35,4 +35,19 @@ public class DictionaryDetailListVo {
 
     @ApiModelProperty("是否有效,0-无效,1-有效")
     private Integer enabledMark;
+
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailPageVo.java

@@ -31,4 +31,19 @@ public class DictionaryDetailPageVo {
 
     @ApiModelProperty("备注")
     private String remark;
+
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 1 - 28
src/main/java/com/xjrsoft/module/textbook/controller/TextbookController.java

@@ -79,34 +79,7 @@ public class TextbookController {
     @ApiOperation(value="教材管理列表(分页,教材征订用)")
     @SaCheckPermission("textbook:detail")
     public RT<PageOutput<TextbookSubscriptionListVo>> pageSubscription(@Valid TextbookSubscriptionListDto dto){
-        List<String> classIdList = new ArrayList<>();
-        if(dto.getClassIds() != null && !"".equals(dto.getClassIds())){
-            String[] classIdArr =  dto.getClassIds().split(",");
-            classIdList = Arrays.asList(classIdArr);
-        }
-        dto.setClassIdList(classIdList);
-        IPage<TextbookSubscriptionListVo> page = textbookService.getSubscriptionPageByClass(new Page<>(dto.getLimit(), dto.getSize()), dto);
-
-        //获取所有班级的总人数
-        LambdaQueryWrapper<BaseClassMajorSet> baseClassMajorSetLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        baseClassMajorSetLambdaQueryWrapper
-                .in(!classIdList.isEmpty(), BaseClassMajorSet::getClassId, classIdList)
-                .eq(BaseClassMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
-                ;
-        List<BaseClassMajorSet> baseClassMajorSetList = baseClassMajorSetService.list(baseClassMajorSetLambdaQueryWrapper);
-
-        int studentSubscriptionNumber = 0;
-        for (BaseClassMajorSet baseClassMajorSet : baseClassMajorSetList){
-            studentSubscriptionNumber += baseClassMajorSet.getTotalStudent();
-        }
-
-        for(TextbookSubscriptionListVo t : page.getRecords()){
-            t.setClassIds(dto.getClassIds());
-            if(t.getTextbookType() != null && !("").equals(t.getTextbookType())){
-                t.setTextbookTypeCn(TextbookTypeEnum.getValue(t.getTextbookType()));
-            }
-            t.setStudentSubscriptionNumber(studentSubscriptionNumber);
-        }
+        IPage<TextbookSubscriptionListVo> page = textbookService.getSubscriptionPageByClass(dto);
         PageOutput<TextbookSubscriptionListVo> pageOutput = ConventPage.getPageOutput(page, TextbookSubscriptionListVo.class);
         return RT.ok(pageOutput);
     }

+ 2 - 1
src/main/java/com/xjrsoft/module/textbook/service/ITextbookService.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.textbook.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
@@ -140,5 +141,5 @@ public interface ITextbookService extends MPJBaseService<Textbook> {
 
     Boolean excelImport(InputStream inputStream);
 
-    Page<TextbookSubscriptionListVo> getSubscriptionPageByClass(Page<TextbookSubscriptionListVo> page, TextbookSubscriptionListDto dto);
+    IPage<TextbookSubscriptionListVo> getSubscriptionPageByClass(TextbookSubscriptionListDto dto);
 }

+ 44 - 6
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.textbook.service.impl;
 
+import camundajar.impl.scala.concurrent.impl.FutureConvertersImpl;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -15,24 +16,28 @@ import com.alibaba.excel.write.metadata.style.WriteFont;
 import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.xjrsoft.common.enums.ExerciseBookeTypeEnum;
-import com.xjrsoft.common.enums.TextbookTypeEnum;
-import com.xjrsoft.common.enums.UseSemesterTypeEnum;
-import com.xjrsoft.common.enums.WarehouseModeEnum;
+import com.xjrsoft.common.enums.*;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
 import com.xjrsoft.common.utils.excel.ExcelMergeUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassCourse;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
 import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.base.mapper.BaseClassCourseMapper;
 import com.xjrsoft.module.base.mapper.BaseCourseSubjectMapper;
+import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
 import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.student.entity.BaseClassMajorSet;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.mapper.BaseClassMajorSetMapper;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.*;
@@ -91,6 +96,9 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
 
     private final TextbookCoreAttributeMapper textbookCoreAttributeMapper;
 
+    private final BaseClassMajorSetMapper baseClassMajorSetMapper;
+    private final BaseClassCourseMapper baseClassCourseMapper;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(Textbook textbook) {
@@ -899,8 +907,38 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     }
 
     @Override
-    public Page<TextbookSubscriptionListVo> getSubscriptionPageByClass(Page<TextbookSubscriptionListVo> page, TextbookSubscriptionListDto dto) {
-        return this.baseMapper.getSubscriptionPageByClass(page, dto);
+    public IPage<TextbookSubscriptionListVo> getSubscriptionPageByClass(TextbookSubscriptionListDto dto) {
+        List<String> classIdList = new ArrayList<>();
+        if(dto.getClassIds() != null && !"".equals(dto.getClassIds())){
+            String[] classIdArr =  dto.getClassIds().split(",");
+            classIdList = Arrays.asList(classIdArr);
+        }
+        dto.setClassIdList(classIdList);
+
+        IPage<TextbookSubscriptionListVo> page = this.baseMapper.getSubscriptionPageByClass(new Page<>(dto.getLimit(), dto.getSize()), dto);
+
+        // 处理每本教材使用的人数
+        if(!classIdList.isEmpty()) {
+            for(TextbookSubscriptionListVo t : page.getRecords()){
+                MPJLambdaWrapper<BaseClassCourse> baseClassCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
+                baseClassCourseMPJLambdaWrapper
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getClassId, BaseClassCourse::getClassId)
+                        .in(BaseClassCourse::getClassId, classIdList)
+                        .eq(BaseClassCourse::getTextbookId, t.getId())
+                        .eq(BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
+                        .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
+                ;
+                Long num = baseClassCourseMapper.selectCount(baseClassCourseMPJLambdaWrapper);
+                t.setStudentSubscriptionNumber(num.intValue());
+
+                t.setClassIds(dto.getClassIds());
+                if(t.getTextbookType() != null && !t.getTextbookType().isEmpty()){
+                    t.setTextbookTypeCn(TextbookTypeEnum.getValue(t.getTextbookType()));
+                }
+            }
+        }
+
+        return page;
     }
 
     private void saveData(List<TextbookImportDto> dataList) {

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

@@ -0,0 +1,189 @@
+package com.xjrsoft.module.veb.controller;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.xjrsoft.common.annotation.Required;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.generator.entity.ImportConfig;
+import com.xjrsoft.module.veb.service.ImportRubAndHandService;
+import com.xjrsoft.module.veb.vo.BaseCourseSubjectImportVo;
+import com.xjrsoft.module.veb.vo.CompanyCoopImportVo;
+import com.xjrsoft.module.veb.vo.InternshipPlanImportVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 手搓导入接口
+ */
+@RestController
+@RequestMapping("/ImportRubAndHand")
+@Api(value = "/ImportRubAndHand", tags = "手搓导入接口")
+@AllArgsConstructor
+public class ImportRubAndHandController {
+
+    private final ImportRubAndHandService importRubAndHandService;
+
+    @PostMapping("/course-subject")
+    @ApiOperation(value = "课程信息导入")
+    public RT<Boolean> courseSubject(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = importRubAndHandService.courseSubject(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/course-subject-template")
+    @ApiOperation(value = "课程信息模板下载")
+    public ResponseEntity<byte[]> courseSubjectTemplate() throws IOException {
+        BaseCourseSubjectImportVo obj = new BaseCourseSubjectImportVo();
+        ByteArrayOutputStream bot = writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    @PostMapping("/internship_plan")
+    @ApiOperation(value = "实习信息导入")
+    public RT<Boolean> internshipPlan(@RequestParam MultipartFile file) throws IOException, IllegalAccessException {
+        String result = importRubAndHandService.internshipPlan(file);
+        if (!result.isEmpty()) {
+            throw new MyException(result);
+        }
+        return RT.ok("全部成功", true);
+    }
+
+    @PostMapping("/internship_plan-template")
+    @ApiOperation(value = "实习信息模板下载")
+    public ResponseEntity<byte[]> internshipPlanTemplate() throws IOException {
+//    @GetMapping("/internship_plan-template")
+//    @ApiOperation(value = "实习信息模板下载")
+//    public ResponseEntity<byte[]> internshipPlanTemplate() throws IOException {
+        InternshipPlanImportVo obj = new InternshipPlanImportVo();
+        ByteArrayOutputStream bot = writeTemplateSheet(obj);
+        return R.fileStream(bot.toByteArray(), System.currentTimeMillis() + ExcelTypeEnum.XLSX.getValue());
+    }
+
+    private ByteArrayOutputStream writeTemplateSheet(Object obj) throws IOException {
+        // 开始写入
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "sheet1";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        List<ImportConfig> importConfigs = allFields(obj);
+
+        // 表头
+        createHead(workbook, sheet, importConfigs);
+
+        // 提示必填
+        createCautionHead(workbook, sheet);
+
+        //写入文件
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
+        return bot;
+    }
+
+    private List<ImportConfig> allFields(Object obj) {
+        List<ImportConfig> importConfigs = new ArrayList<>();
+        if (obj == null) {
+            return importConfigs;
+        }
+
+        Class<?> clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (int i = 0; i < fields.length; i++) {
+            Field field = fields[i];
+            ImportConfig importConfig = new ImportConfig();
+            field.setAccessible(true); // 访问私有字段
+            if (field.isAnnotationPresent(Required.class)) {
+                Required required = field.getAnnotation(Required.class);
+                Boolean value = required.value();
+                importConfig.setRequired(value);
+            }
+
+            if (field.isAnnotationPresent(ExcelProperty.class)) {
+                ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+                String[] annotationValues = excelProperty.value();
+                importConfig.setLabel(annotationValues.length > 0 ? annotationValues[0] : "");
+            }
+            importConfig.setFieldName(field.getName());
+            importConfig.setSortCode(i);
+            importConfig.setWidth(0);
+            importConfigs.add(importConfig);
+        }
+
+        return importConfigs;
+    }
+
+    private void createHead(Workbook workbook, Sheet sheet, List<ImportConfig> importConfigs) {
+        int rowNumber = 0;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+
+        // 正常样式
+        CellStyle normalCellStyle = workbook.createCellStyle();
+        normalCellStyle.setFont(font); // 将字体应用到样式
+        normalCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        normalCellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        // 必填样式
+        CellStyle requiredCellStyle = workbook.createCellStyle();
+        requiredCellStyle.setFont(font); // 将字体应用到样式
+        requiredCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        requiredCellStyle.setAlignment(HorizontalAlignment.CENTER);
+        requiredCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());//设置背景颜色
+        requiredCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置填充模式
+
+        // 所在行
+        Row row = sheet.createRow(rowNumber);
+
+        // 每一列
+        for (ImportConfig importConfig : importConfigs){
+            Cell cell = row.createCell(importConfig.getSortCode());
+            String content = importConfig.getLabel();
+            cell.setCellValue(content);
+            if(ObjectUtils.isNotEmpty(importConfig.getRequired()) && importConfig.getRequired()){
+                cell.setCellStyle(requiredCellStyle);
+            }
+            if(ObjectUtils.isEmpty(importConfig.getRequired()) || !importConfig.getRequired()) {
+                cell.setCellStyle(normalCellStyle);
+            }
+        }
+    }
+
+    private void createCautionHead(Workbook workbook, Sheet sheet) {
+        int rowNumber = 1;
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)12);
+        font.setColor(IndexedColors.RED.getIndex());
+
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+
+        Row row = sheet.createRow(rowNumber);
+        Cell cell = row.createCell(0);
+        String content = "红色背景为必填项,导入时请删除本行。";
+        cell.setCellValue(content);
+        cell.setCellStyle(cellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 5));
+    }
+}

+ 156 - 0
src/main/java/com/xjrsoft/module/veb/entity/CompanyCoop.java

@@ -0,0 +1,156 @@
+package com.xjrsoft.module.veb.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-12-05
+* @Version 1.0
+*/
+@Data
+@TableName("company_coop")
+@ApiModel(value = "company_coop", description = "合作企业表")
+public class CompanyCoop 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;
+    /**
+    * 企业名称
+    */
+    @ApiModelProperty("企业名称")
+    private String companyName;
+    /**
+    * 企业性质(企业性质字典编号)
+    */
+    @ApiModelProperty("企业性质(企业性质字典编号)")
+    private String companyType;
+    /**
+    * 企业规模(企业规模字典标号)
+    */
+    @ApiModelProperty("企业规模(企业规模字典标号)")
+    private String companySize;
+    /**
+    * 法人代表
+    */
+    @ApiModelProperty("法人代表")
+    private String companyPerson;
+    /**
+    * 企业地址
+    */
+    @ApiModelProperty("企业地址")
+    private String companyPosition;
+    /**
+    * 联系人
+    */
+    @ApiModelProperty("联系人")
+    private String contact;
+    /**
+    * 联系电话
+    */
+    @ApiModelProperty("联系电话")
+    private String phone;
+    /**
+    * 合作状态(状态类型字典编号)
+    */
+    @ApiModelProperty("合作状态(状态类型字典编号)")
+    private String partnerType;
+    /**
+    * 所属行业(行业类型字典编号)
+    */
+    @ApiModelProperty("所属行业(行业类型字典编号)")
+    private String sector;
+    /**
+    * 所属产业(产业类型字典编号)
+    */
+    @ApiModelProperty("所属产业(产业类型字典编号)")
+    private String industry;
+    /**
+    * 企业邮箱
+    */
+    @ApiModelProperty("企业邮箱")
+    private String companyEmail;
+    /**
+    * 联系人邮箱
+    */
+    @ApiModelProperty("联系人邮箱")
+    private String contactEmail;
+    /**
+    * 企业传真
+    */
+    @ApiModelProperty("企业传真")
+    private String companyFax;
+    /**
+    * 企业注册号
+    */
+    @ApiModelProperty("企业注册号")
+    private String companyRegister;
+    /**
+    * 企业网址
+    */
+    @ApiModelProperty("企业网址")
+    private String companyWebsite;
+}

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

@@ -0,0 +1,165 @@
+package com.xjrsoft.module.veb.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+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-12-11
+* @Version 1.0
+*/
+@Data
+@TableName("internship_plan_manage")
+@ApiModel(value = "internship_plan_manage", description = "实习计划管理表")
+public class InternshipPlanManage 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;
+    /**
+    * 学期主键id(base_semester)
+    */
+    @ApiModelProperty("学期主键id(base_semester)")
+    private Long baseSemesterId;
+    /**
+    * 实习计划名称
+    */
+    @ApiModelProperty("实习计划名称")
+    private String internshipPlanName;
+    /**
+    * 实习计划类型
+    */
+    @ApiModelProperty("实习计划类型")
+    private String internshipPlanType;
+    /**
+    * 实训基地主键id(school_training_base and outside_training_base)
+    */
+    @ApiModelProperty("实训基地主键id(school_training_base and outside_training_base)")
+    private Long trainingBaseId;
+    /**
+    * 实习去向
+    */
+    @ApiModelProperty("实习去向")
+    private String internshipWhereabouts;
+    /**
+    * 保险购买方
+    */
+    @ApiModelProperty("保险购买方")
+    private String insurancePurchaser;
+    /**
+    * 购买保险种类
+    */
+    @ApiModelProperty("购买保险种类")
+    private String insuranceType;
+    /**
+    * 实习开始时间
+    */
+    @ApiModelProperty("实习开始时间")
+    private Date startTime;
+    /**
+    * 实习结束时间
+    */
+    @ApiModelProperty("实习结束时间")
+    private Date endTime;
+    /**
+    * 企业所属行业
+    */
+    @ApiModelProperty("企业所属行业")
+    private String enterpriseIndustry;
+    /**
+    * 实习单位名称
+    */
+    @ApiModelProperty("实习单位名称")
+    private String internshipUnitName;
+    /**
+    * 实习单位地址
+    */
+    @ApiModelProperty("实习单位地址")
+    private String internshipUnitAddress;
+    /**
+    * 实习单位来源
+    */
+    @ApiModelProperty("实习单位来源")
+    private String internshipUnitSource;
+    /**
+    * 实习岗位名称
+    */
+    @ApiModelProperty("实习岗位名称")
+    private String internshipJobName;
+    /**
+    * 专业对口程度
+    */
+    @ApiModelProperty("专业对口程度")
+    private String professionalRelevanceEnterprise;
+    /**
+    * 住宿安排
+    */
+    @ApiModelProperty("住宿安排")
+    private String lodgingPlan;
+    /**
+    * 实习场所类型
+    */
+    @ApiModelProperty("实习场所类型")
+    private String internshipSiteType;
+    /**
+    * 学年
+    */
+    @ApiModelProperty("学年")
+    private String academicYear;
+
+
+}

+ 115 - 0
src/main/java/com/xjrsoft/module/veb/entity/InternshipPlanManageParticipant.java

@@ -0,0 +1,115 @@
+package com.xjrsoft.module.veb.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+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-12-11
+* @Version 1.0
+*/
+@Data
+@TableName("internship_plan_manage_participant")
+@ApiModel(value = "internship_plan_manage_participant", description = "实习计划参与人表")
+public class InternshipPlanManageParticipant 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;
+    /**
+    * 实习计划id
+    */
+    @ApiModelProperty("实习计划id")
+    private Long internshipPlanManageId;
+    /**
+    * 实习参与人id
+    */
+    @ApiModelProperty("实习参与人id")
+    private Long participantUserId;
+    /**
+    * 实习参与人学号
+    */
+    @ApiModelProperty("实习参与人学号")
+    private String participantUserStudentId;
+    /**
+    * 实习参与人姓名
+    */
+    @ApiModelProperty("实习参与人姓名")
+    private String participantUserName;
+    /**
+    * 所属专业id(base_major)
+    */
+    @ApiModelProperty("所属专业id(base_major)")
+    private Long baseMajorId;
+    /**
+    * 所属专业名称
+    */
+    @ApiModelProperty("所属专业名称")
+    private String baseMajorName;
+    /**
+    * 班级id(base_class)
+    */
+    @ApiModelProperty("班级id(base_class)")
+    private Long classId;
+    /**
+    * 班级名称
+    */
+    @ApiModelProperty("班级名称")
+    private String className;
+
+
+}

+ 128 - 0
src/main/java/com/xjrsoft/module/veb/entity/TrainingOutside.java

@@ -0,0 +1,128 @@
+package com.xjrsoft.module.veb.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-12-11
+* @Version 1.0
+*/
+@Data
+@TableName("training_outside")
+@ApiModel(value = "training_outside", description = "校外实训基地数据表")
+public class TrainingOutside 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;
+    /**
+    * 实训基地名称
+    */
+    @ApiModelProperty("实训基地名称")
+    private String trainingName;
+    /**
+    * 实训基地编号
+    */
+    @ApiModelProperty("实训基地编号")
+    private String trainingNumber;
+    /**
+    * 所属合作企业(company_coop)
+    */
+    @ApiModelProperty("所属合作企业(company_coop)")
+    private Long companyCoopId;
+    /**
+    * 所属合作企业
+    */
+    @ApiModelProperty("所属合作企业")
+    private String companyCoopName;
+    /**
+    * 基地成立年月,格式:YYYYMMDD,如:2006-04-12
+    */
+    @ApiModelProperty("基地成立年月,格式:YYYYMMDD,如:2006-04-12")
+    private Date establishDate;
+    /**
+    * 合作状态
+    */
+    @ApiModelProperty("合作状态")
+    private String teamStatus;
+    /**
+    * 合作协议签署状态
+    */
+    @ApiModelProperty("合作协议签署状态")
+    private String protocolState;
+    /**
+    * 合作开始时间
+    */
+    @ApiModelProperty("合作开始时间")
+    private Date teamBeganDate;
+    /**
+    * 合作结束时间
+    */
+    @ApiModelProperty("合作结束时间")
+    private Date teamEndDate;
+
+
+}

+ 153 - 0
src/main/java/com/xjrsoft/module/veb/entity/TrainingSchool.java

@@ -0,0 +1,153 @@
+package com.xjrsoft.module.veb.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-12-11
+* @Version 1.0
+*/
+@Data
+@TableName("training_school")
+@ApiModel(value = "training_school", description = "校内实训基地数据表")
+public class TrainingSchool 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;
+    /**
+    * 实训基地名称
+    */
+    @ApiModelProperty("实训基地名称")
+    private String trainingName;
+    /**
+    * 实训基地编号
+    */
+    @ApiModelProperty("实训基地编号")
+    private String trainingNumber;
+    /**
+    * 实训室数,数字标识,例:22
+    */
+    @ApiModelProperty("实训室数,数字标识,例:22")
+    private Integer trainingRoomsNumber;
+    /**
+    * 实训项目总数,数字标识,例:33
+    */
+    @ApiModelProperty("实训项目总数,数字标识,例:33")
+    private Integer trainingProjectTotal;
+    /**
+    * 基地类别代码(SXJDLBDM)
+    */
+    @ApiModelProperty("基地类别代码(SXJDLBDM)")
+    private String baseCategory;
+    /**
+    * 批准日期,格式:YYYYMMDD,如:2006-04-12
+    */
+    @ApiModelProperty("批准日期,格式:YYYYMMDD,如:2006-04-12")
+    private Date approveDate;
+    /**
+    * 成立年度,格式:YYYY,如:2006
+    */
+    @ApiModelProperty("成立年度,格式:YYYY,如:2006")
+    private String setupYear;
+    /**
+    * 面向专业
+    */
+    @ApiModelProperty("面向专业")
+    private Long baseMajorId;
+    /**
+    * 被列为实训基地项目支持部门
+    */
+    @ApiModelProperty("被列为实训基地项目支持部门")
+    private String supportDepartment;
+    /**
+    * 建筑面积
+    */
+    @ApiModelProperty("建筑面积")
+    private Double buildArea;
+    /**
+    * 仪器设备总数,数字标识,例:33
+    */
+    @ApiModelProperty("仪器设备总数,数字标识,例:33")
+    private Integer instrumentTotal;
+    /**
+    * 实践教学工位数,数字标识,例:33
+    */
+    @ApiModelProperty("实践教学工位数,数字标识,例:33")
+    private Integer stationNumber;
+    /**
+    * 管理人员数(专职)
+    */
+    @ApiModelProperty("管理人员数(专职)")
+    private Integer managerNumberAllied;
+    /**
+    * 管理人员数(兼职)
+    */
+    @ApiModelProperty("管理人员数(兼职)")
+    private Integer managerNumberPart;
+
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/veb/mapper/CompanyCoopMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.veb.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.veb.entity.CompanyCoop;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 合作企业表
+* @Author dzx
+* @Date: 2024-12-05
+* @Version 1.0
+*/
+@Mapper
+public interface CompanyCoopMapper extends MPJBaseMapper<CompanyCoop> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/veb/mapper/InternshipPlanManageMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.veb.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.veb.entity.InternshipPlanManage;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 实习计划管理表
+* @Author dzx
+* @Date: 2024-12-11
+* @Version 1.0
+*/
+@Mapper
+public interface InternshipPlanManageMapper extends MPJBaseMapper<InternshipPlanManage> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/veb/mapper/InternshipPlanManageParticipantMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.veb.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.veb.entity.InternshipPlanManageParticipant;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 实习计划参与人表
+* @Author dzx
+* @Date: 2024-12-11
+* @Version 1.0
+*/
+@Mapper
+public interface InternshipPlanManageParticipantMapper extends MPJBaseMapper<InternshipPlanManageParticipant> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/veb/mapper/TrainingOutsideMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.veb.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.veb.entity.TrainingOutside;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 校外实训基地数据表
+* @Author dzx
+* @Date: 2024-12-11
+* @Version 1.0
+*/
+@Mapper
+public interface TrainingOutsideMapper extends MPJBaseMapper<TrainingOutside> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/veb/mapper/TrainingSchoolMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.veb.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.veb.entity.TrainingSchool;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 校内实训基地数据表
+* @Author dzx
+* @Date: 2024-12-11
+* @Version 1.0
+*/
+@Mapper
+public interface TrainingSchoolMapper extends MPJBaseMapper<TrainingSchool> {
+
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/veb/service/ImportRubAndHandService.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.veb.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * 手搓导入
+ */
+public interface ImportRubAndHandService {
+    String courseSubject(MultipartFile file) throws IOException, IllegalAccessException;
+
+    String internshipPlan(MultipartFile file) throws IOException, IllegalAccessException;
+
+}

+ 583 - 0
src/main/java/com/xjrsoft/module/veb/service/impl/ImportRubAndHandServiceImpl.java

@@ -0,0 +1,583 @@
+package com.xjrsoft.module.veb.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.annotation.Required;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.YesOrNoEnum;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.*;
+import com.xjrsoft.module.base.mapper.*;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.mapper.UserMapper;
+import com.xjrsoft.module.student.entity.BaseMajor;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.system.entity.DictionaryItem;
+import com.xjrsoft.module.system.mapper.DictionarydetailMapper;
+import com.xjrsoft.module.system.mapper.DictionaryitemMapper;
+import com.xjrsoft.module.veb.entity.InternshipPlanManage;
+import com.xjrsoft.module.veb.entity.InternshipPlanManageParticipant;
+import com.xjrsoft.module.veb.entity.TrainingOutside;
+import com.xjrsoft.module.veb.entity.TrainingSchool;
+import com.xjrsoft.module.veb.mapper.InternshipPlanManageMapper;
+import com.xjrsoft.module.veb.mapper.InternshipPlanManageParticipantMapper;
+import com.xjrsoft.module.veb.mapper.TrainingOutsideMapper;
+import com.xjrsoft.module.veb.mapper.TrainingSchoolMapper;
+import com.xjrsoft.module.veb.service.ImportRubAndHandService;
+import com.xjrsoft.module.veb.vo.BaseCourseSubjectImportVo;
+import com.xjrsoft.module.veb.vo.InternshipPlanImportVo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+/**
+ * 手搓导入
+ */
+@Service
+@AllArgsConstructor
+public class ImportRubAndHandServiceImpl implements ImportRubAndHandService {
+
+    private final DictionarydetailMapper dictionarydetailMapper;
+
+    private final DictionaryitemMapper dictionaryitemMapper;
+
+    private final BaseSemesterMapper baseSemesterMapper;
+
+    private final BaseCourseSubjectMapper baseCourseSubjectMapper;
+
+    private final CourseSubjectDetailMapper courseSubjectDetailMapper;
+
+    private final TrainingSchoolMapper trainingSchoolMapper;
+
+    private final TrainingOutsideMapper trainingOutsideMapper;
+
+    private final InternshipPlanManageMapper internshipPlanManageMapper;
+
+    private final InternshipPlanManageParticipantMapper internshipPlanManageParticipantMapper;
+
+    private final UserMapper userMapper;
+
+    private final BaseMajorSetMapper baseMajorSetMapper;
+
+    private final BaseClassMapper baseClassMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String courseSubject(MultipartFile file) throws IOException, IllegalAccessException {
+        List<BaseCourseSubjectImportVo> excelDataList = EasyExcel.read(file.getInputStream()).headRowNumber(1).head(BaseCourseSubjectImportVo.class).sheet().doReadSync();
+        StringBuilder sb = new StringBuilder();
+
+        List<String> codeList = new ArrayList<>();
+        codeList.add("course_category");
+        codeList.add("course_nature");
+        codeList.add("course_attribute");
+        codeList.add("course_type");
+        codeList.add("subject_quality");
+        codeList.add("course_resource");
+
+        Map<String, String> dictionary = initDictionary(codeList);
+
+        List<BaseCourseSubject> baseCourseSubjects = new ArrayList<>();
+        List<CourseSubjectDetail> courseSubjectDetails = new ArrayList<>();
+        for (int i = 0; i < excelDataList.size(); i++) {
+            BaseCourseSubjectImportVo dto = excelDataList.get(i);
+            if (isRequiredFieldsFilled(dto,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            BaseCourseSubject courseSubject = new BaseCourseSubject();
+            Long id = IdUtil.getSnowflakeNextId();
+            courseSubject.setId(id);
+            courseSubject.setName(dto.getName());
+            courseSubject.setCode(dto.getCode());
+            baseCourseSubjects.add(courseSubject);
+
+            CourseSubjectDetail courseSubjectDetail = BeanUtil.toBean(dto, CourseSubjectDetail.class);
+            courseSubjectDetail.setBaseCourseSubjectId(courseSubject.getId());
+
+            // 验证字段的合理性
+            // 字典类型
+            if (validateAndSetDictionaryField(dto::getCourseCategory,
+                    "course_category",
+                    "课程类别",
+                    dictionary,
+                    courseSubjectDetail::setCourseCategory,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            if (validateAndSetDictionaryField(dto::getCourseNature,
+                    "course_nature",
+                    "课程性质",
+                    dictionary,
+                    courseSubjectDetail::setCourseNature,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            if (validateAndSetDictionaryField(dto::getCourseAttribute,
+                    "course_attribute",
+                    "课程属性",
+                    dictionary,
+                    courseSubjectDetail::setCourseAttribute,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            if (validateAndSetDictionaryField(dto::getCourseType,
+                    "course_type",
+                    "课程分类",
+                    dictionary,
+                    courseSubjectDetail::setCourseType,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            if (validateAndSetDictionaryField(dto::getSubjectQuality,
+                    "subject_quality",
+                    "学科类别",
+                    dictionary,
+                    courseSubjectDetail::setSubjectQuality,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            if (validateAndSetDictionaryField(dto::getCourseResource,
+                    "course_resource",
+                    "课堂教学设计主要选用课程资源",
+                    dictionary,
+                    courseSubjectDetail::setCourseResource,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            // 布尔类型
+
+            courseSubjectDetails.add(courseSubjectDetail);
+        }
+
+        //批量新增
+        if (!baseCourseSubjects.isEmpty()) {
+            for (BaseCourseSubject baseCourseSubject : baseCourseSubjects) {
+                baseCourseSubjectMapper.insert(baseCourseSubject);
+            }
+        }
+        if (!courseSubjectDetails.isEmpty()) {
+            for (CourseSubjectDetail courseSubjectDetail : courseSubjectDetails) {
+                courseSubjectDetailMapper.insert(courseSubjectDetail);
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String internshipPlan(MultipartFile file) throws IOException, IllegalAccessException {
+        List<InternshipPlanImportVo> excelDataList = EasyExcel.read(file.getInputStream()).headRowNumber(1).head(InternshipPlanImportVo.class).sheet().doReadSync();
+        StringBuilder sb = new StringBuilder();
+
+        // 字典
+        List<String> codeList = new ArrayList<>();
+        codeList.add("ins_p_type");
+        codeList.add("insurance_type");
+        codeList.add("participant_type");
+        codeList.add("pr_ent_type");
+        codeList.add("int_where_type");
+        codeList.add("SECTOR");
+        codeList.add("lodging_plan");
+        codeList.add("internship_site_type");
+        codeList.add("unit_source");
+
+        Map<String, String> dictionary = initDictionary(codeList);
+
+        // 学期
+        List<BaseSemester> baseSemesters = baseSemesterMapper.selectList(
+                Wrappers
+                        .lambdaQuery(BaseSemester.class)
+                        .eq(BaseSemester::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        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)
+                        .eq(TrainingSchool::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, Long> trainingSchoolMap = trainingSchools.stream()
+                .collect(Collectors.toMap(TrainingSchool::getTrainingName, TrainingSchool::getId, (o1, o2) -> o1));
+
+        List<TrainingOutside> trainingOutsides = trainingOutsideMapper.selectList(
+                Wrappers
+                        .lambdaQuery(TrainingOutside.class)
+                        .eq(TrainingOutside::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, Long> trainingOutsideMap = trainingOutsides.stream()
+                .collect(Collectors.toMap(TrainingOutside::getTrainingName, TrainingOutside::getId, (o1, o2) -> o1));
+
+        List<User> users = userMapper.selectList(
+                Wrappers
+                        .lambdaQuery(User.class)
+                        .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, Long> userMap = users.stream()
+                .collect(Collectors.toMap(User::getName, User::getId, (o1, o2) -> o1));
+
+        List<BaseMajorSet> baseMajors = baseMajorSetMapper.selectList(
+                Wrappers
+                        .lambdaQuery(BaseMajorSet.class)
+                        .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, Long> baseMajorMap = baseMajors.stream()
+                .collect(Collectors.toMap(BaseMajorSet::getName, BaseMajorSet::getId, (o1, o2) -> o1));
+
+        List<BaseClass> baseClasses = baseClassMapper.selectList(
+                Wrappers
+                        .lambdaQuery(BaseClass.class)
+                        .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, Long> baseClassMap = baseClasses.stream()
+                .collect(Collectors.toMap(BaseClass::getName, BaseClass::getId, (o1, o2) -> o1));
+
+        Map<String, InternshipPlanManage> internshipPlanManageMap = new HashMap<>();
+        List<InternshipPlanManageParticipant> internshipPlanManageParticipants = new ArrayList<>();
+
+        for (int i = 0; i < excelDataList.size(); i++) {
+            InternshipPlanImportVo vo = excelDataList.get(i);
+
+            if (isRequiredFieldsFilled(vo,
+                    sb,
+                    i)) {
+                return sb.toString();
+            }
+
+            // 处理主表
+            String key = vo.getBaseSemester() +
+                    vo.getInternshipPlanName() +
+                    vo.getTrainingBaseName() +
+                    vo.getStartTime() +
+                    vo.getInternshipUnitName();
+
+            Long id = IdUtil.getSnowflakeNextId();
+            if (!internshipPlanManageMap.containsKey(key)) {
+                InternshipPlanManage internshipPlanManage = BeanUtil.toBean(vo, InternshipPlanManage.class);
+                internshipPlanManage.setId(id);
+                if (validateAndSetString2LongField(vo::getBaseSemester,
+                        "学期",
+                        baseSemesterMap,
+                        internshipPlanManage::setBaseSemesterId,
+                        sb,
+                        i
+                )) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInternshipPlanType,
+                        "participant_type",
+                        "实习类别",
+                        dictionary,
+                        internshipPlanManage::setInternshipPlanType,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetString2LongField(vo::getTrainingBaseName,
+                        "实训基地名称",
+                        trainingSchoolMap,
+                        internshipPlanManage::setTrainingBaseId,
+                        sb,
+                        i
+                ) && (validateAndSetString2LongField(vo::getTrainingBaseName,
+                        "实训基地名称",
+                        trainingOutsideMap,
+                        internshipPlanManage::setTrainingBaseId,
+                        sb,
+                        i
+                )
+                )
+                ) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInsurancePurchaser,
+                        "ins_p_type",
+                        "保险购买方",
+                        dictionary,
+                        internshipPlanManage::setInsurancePurchaser,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInternshipWhereabouts,
+                        "int_where_type",
+                        "实习去向",
+                        dictionary,
+                        internshipPlanManage::setInternshipWhereabouts,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInsuranceType,
+                        "insurance_type",
+                        "购买保险种类",
+                        dictionary,
+                        internshipPlanManage::setInsuranceType,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getEnterpriseIndustry,
+                        "SECTOR",
+                        "企业所属行业",
+                        dictionary,
+                        internshipPlanManage::setInsuranceType,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInternshipSiteType,
+                        "internship_site_type",
+                        "实习场所类型",
+                        dictionary,
+                        internshipPlanManage::setInternshipSiteType,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getInternshipUnitSource,
+                        "unit_source",
+                        "实习单位来源",
+                        dictionary,
+                        internshipPlanManage::setInternshipUnitSource,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getLodgingPlan,
+                        "lodging_plan",
+                        "住宿安排",
+                        dictionary,
+                        internshipPlanManage::setLodgingPlan,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+
+                if (validateAndSetDictionaryField(vo::getProfessionalRelevanceEnterprise,
+                        "pr_ent_type",
+                        "专业对口程度",
+                        dictionary,
+                        internshipPlanManage::setProfessionalRelevanceEnterprise,
+                        sb,
+                        i)) {
+                    return sb.toString();
+                }
+                internshipPlanManageMap.put(key, internshipPlanManage);
+            } else {
+                InternshipPlanManage internshipPlanManage = internshipPlanManageMap.get(key);
+                id = internshipPlanManage.getId();
+            }
+
+            // 处理子表
+            InternshipPlanManageParticipant internshipPlanManageParticipant = BeanUtil.toBean(vo, InternshipPlanManageParticipant.class);
+            internshipPlanManageParticipant.setInternshipPlanManageId(id);
+            if (validateAndSetString2LongField(vo::getParticipantUserName,
+                    "实习参与人姓名",
+                    userMap,
+                    internshipPlanManageParticipant::setParticipantUserId,
+                    sb,
+                    i
+            )) {
+                return sb.toString();
+            }
+            if (validateAndSetString2LongField(vo::getBaseMajorName,
+                    "所属专业名称",
+                    baseMajorMap,
+                    internshipPlanManageParticipant::setBaseMajorId,
+                    sb,
+                    i
+            )) {
+                return sb.toString();
+            }
+            if (validateAndSetString2LongField(vo::getClassName,
+                    "班级名称",
+                    baseClassMap,
+                    internshipPlanManageParticipant::setClassId,
+                    sb,
+                    i
+            )) {
+                return sb.toString();
+            }
+            internshipPlanManageParticipants.add(internshipPlanManageParticipant);
+        }
+
+        List<InternshipPlanManage> internshipPlanManages = new ArrayList<>(internshipPlanManageMap.values());
+        //批量新增
+        if (!internshipPlanManages.isEmpty()) {
+            for (InternshipPlanManage internshipPlanManage : internshipPlanManages) {
+                internshipPlanManageMapper.insert(internshipPlanManage);
+            }
+        }
+        if (!internshipPlanManageParticipants.isEmpty()) {
+            for (InternshipPlanManageParticipant internshipPlanManageParticipant : internshipPlanManageParticipants) {
+                internshipPlanManageParticipantMapper.insert(internshipPlanManageParticipant);
+            }
+        }
+        return sb.toString();
+    }
+
+    private boolean validateAndSetString2LongField(Supplier<String> getter,
+                                                   String fieldName,
+                                                   Map<String, Long> string2Long,
+                                                   Consumer<Long> setter,
+                                                   StringBuilder sb, int i) {
+        String value = getter.get();
+        if (value != null && !value.trim().isEmpty()) {
+            Long sublistValue = string2Long.get(value);
+            if (sublistValue != null) {
+                setter.accept(sublistValue);
+                return false;
+            } else {
+                sb.append("第");
+                sb.append(i + 2);
+                sb.append("行的");
+                sb.append(fieldName);
+                sb.append("列的值不存在于系统对应基础数据中,请到基础数据维护");
+                return true;
+            }
+        }
+        return false; // 字段为空,不进行验证
+    }
+
+    private boolean validateAndSetBooleanField(Supplier<String> getter,
+                                               String fieldName,
+                                               Consumer<Integer> setter,
+                                               StringBuilder sb, int i) {
+        String value = getter.get();
+        if (value != null && !value.trim().isEmpty()) {
+            Integer booleanValue = YesOrNoEnum.getCode(value);
+            if (booleanValue != null) {
+                setter.accept(booleanValue);
+                return false;
+            } else {
+                sb.append("第");
+                sb.append(i + 2);
+                sb.append("行的");
+                sb.append(fieldName);
+                sb.append("列的值不符合,该列的值只能为是或否");
+                return true;
+            }
+        }
+        return false; // 字段为空,不进行验证
+    }
+
+    private boolean validateAndSetDictionaryField(Supplier<String> getter,
+                                                  String prefix,
+                                                  String fieldName,
+                                                  Map<String, String> dictionary,
+                                                  Consumer<String> setter,
+                                                  StringBuilder sb, int i) {
+        String value = getter.get();
+        if (value != null && !value.trim().isEmpty()) {
+            String dictValue = dictionary.get(prefix + value.trim());
+            if (dictValue != null && !dictValue.trim().isEmpty()) {
+                setter.accept(dictValue.trim());
+                return false;
+            } else {
+                sb.append("第");
+                sb.append(i + 2);
+                sb.append("行的");
+                sb.append(fieldName);
+                sb.append("列的值不存在于字典中,请到字典中维护");
+                return true;
+            }
+        }
+        return false; // 字段为空,不进行验证
+    }
+
+    private Map<String, String> initDictionary(List<String> codeList) {
+        List<DictionaryDetail> detailList = dictionarydetailMapper.selectJoinList(DictionaryDetail.class,
+                new MPJLambdaWrapper<DictionaryDetail>()
+                        .select(DictionaryDetail::getId)
+                        .select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetail.class).contains(x.getProperty()))
+                        .leftJoin(DictionaryItem.class, DictionaryItem::getId, DictionaryDetail::getItemId)
+                        .in(DictionaryItem::getCode, codeList)
+        );
+
+        List<DictionaryItem> dictionaryItemList = dictionaryitemMapper.selectList(
+                new QueryWrapper<DictionaryItem>().lambda()
+                        .eq(DictionaryItem::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<Long, String> itemMap = new HashMap<>();
+        for (DictionaryItem dictionaryItem : dictionaryItemList) {
+            itemMap.put(dictionaryItem.getId(), dictionaryItem.getCode());
+        }
+
+        Map<String, String> resultMap = new HashMap<>();
+        for (DictionaryDetail dictionaryDetail : detailList) {
+            resultMap.put(itemMap.get(dictionaryDetail.getItemId()) + dictionaryDetail.getName(), dictionaryDetail.getCode());
+        }
+        return resultMap;
+    }
+
+    private boolean isRequiredFieldsFilled(Object instance,
+                                           StringBuilder sb,
+                                           int i)
+            throws IllegalAccessException {
+        if (instance == null) {
+            return true; // 如果对象本身为 null,则认为没有通过验证
+        }
+
+        for (Field field : instance.getClass().getDeclaredFields()) {
+            Required required = field.getAnnotation(Required.class);
+            if (required != null) { // 如果字段被 @Required 标记
+                field.setAccessible(true); // 允许访问私有字段
+                Object value = field.get(instance); // 获取字段的值
+                if (value == null || (value instanceof String && ((String) value).trim().isEmpty())) {
+                    sb.append("第");
+                    sb.append(i + 2);
+                    sb.append("行的");
+                    if (field.isAnnotationPresent(ExcelProperty.class)) {
+                        ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+                        String[] annotationValues = excelProperty.value();
+                        sb.append(annotationValues.length > 0 ? annotationValues[0] : "");
+                    }
+                    sb.append("列的值为必填");
+                    return true; // 如果任何必需字段为空,则返回 true
+                }
+            }
+        }
+        return false; // 所有必需字段都不为空
+    }
+}

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

@@ -0,0 +1,169 @@
+package com.xjrsoft.module.veb.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 课程学科导入入参
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@Data
+public class BaseCourseSubjectImportVo {
+    /**
+    * 课程学科名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程学科名称")
+    @ApiModelProperty("课程学科名称")
+    @Required
+    private String name;
+    /**
+    * 课程学科代码
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程学科代码")
+    @ApiModelProperty("课程学科代码")
+    @Required
+    private String code;
+    /**
+     * 课程类别
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程类别")
+    @ApiModelProperty("课程类别")
+    @Required
+    private String courseCategory;
+    /**
+     * 课程性质
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程性质")
+    @ApiModelProperty("课程性质")
+    @Required
+    private String courseNature;
+    /**
+     * 课程属性
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程属性")
+    @ApiModelProperty("课程属性")
+    @Required
+    private String courseAttribute;
+    /**
+     * 课程分类
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课程分类")
+    @ApiModelProperty("课程分类")
+    @Required
+    private String courseType;
+    /**
+     * 学科类别
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学科类别")
+    @ApiModelProperty("学科类别")
+    @Required
+    private String subjectQuality;
+    /**
+     * 是否专业核心课程
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否专业核心课程")
+    @ApiModelProperty("是否专业核心课程")
+    @Required
+    private String coreCourse;
+    /**
+     * 理论教学时数
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("理论教学时数")
+    @ApiModelProperty("理论教学时数")
+    @Required
+    private Integer theoryTime;
+    /**
+     * 实践教学时数
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实践教学时数")
+    @ApiModelProperty("实践教学时数")
+    @Required
+    private Integer practiceTime;
+    /**
+     * 是否有线上课程
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否有线上课程")
+    @ApiModelProperty("是否有线上课程")
+    @Required
+    private String onlineCourse;
+    /**
+     * 线上课程网址
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("线上课程网址")
+    @ApiModelProperty("线上课程网址")
+    @Required
+    private String courseUrl;
+    /**
+     * 是否思政示范课程
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("是否思政示范课程")
+    @ApiModelProperty("是否思政示范课程")
+    @Required
+    private String ideologyDemo;
+    /**
+     * 课堂教学设计主要选用课程资源
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("课堂教学设计主要选用课程资源")
+    @ApiModelProperty("课堂教学设计主要选用课程资源")
+    @Required
+    private String courseResource;
+    /**
+     * 虚拟仿真实训课时数
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("虚拟仿真实训课时数")
+    @ApiModelProperty("虚拟仿真实训课时数")
+    @Required
+    private Integer emulationTime;
+    /**
+     * 主要开设虚拟仿真实训项目名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设虚拟仿真实训项目名称")
+    @ApiModelProperty("主要开设虚拟仿真实训项目名称")
+    @Required
+    private String emulationName;
+    /**
+     * 主要开设实验项目名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实验项目名称")
+    @ApiModelProperty("主要开设实验项目名称")
+    @Required
+    private String experimentName;
+    /**
+     * 主要开设实训项目名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实训项目名称")
+    @ApiModelProperty("主要开设实训项目名称")
+    @Required
+    private String trainingName;
+    /**
+     * 主要开设实习项目名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主要开设实习项目名称")
+    @ApiModelProperty("主要开设实习项目名称")
+    @Required
+    private String internshipName;
+}

+ 136 - 0
src/main/java/com/xjrsoft/module/veb/vo/CompanyCoopImportVo.java

@@ -0,0 +1,136 @@
+package com.xjrsoft.module.veb.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 合作企业表分页列表出参
+* @Author dzx
+* @Date: 2024-12-05
+* @Version 1.0
+*/
+@Data
+public class CompanyCoopImportVo {
+
+    /**
+    * 企业名称
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业名称")
+    @ApiModelProperty("企业名称")
+    @Required
+    private String companyName;
+    /**
+    * 企业性质(企业性质字典编号)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业性质")
+    @ApiModelProperty("企业性质(企业性质字典编号)")
+    @Required
+    private String companyType;
+    /**
+    * 企业规模(企业规模字典标号)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业规模")
+    @ApiModelProperty("企业规模(企业规模字典标号)")
+    @Required
+    private String companySize;
+    /**
+    * 法人代表
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("法人代表")
+    @ApiModelProperty("法人代表")
+    @Required
+    private String companyPerson;
+    /**
+    * 企业地址
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业地址")
+    @ApiModelProperty("企业地址")
+    @Required
+    private String companyPosition;
+    /**
+    * 联系人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("联系人")
+    @ApiModelProperty("联系人")
+    @Required
+    private String contact;
+    /**
+    * 联系电话
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("联系电话")
+    @ApiModelProperty("联系电话")
+    @Required
+    private String phone;
+    /**
+    * 合作状态(状态类型字典编号)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("合作状态")
+    @ApiModelProperty("合作状态(状态类型字典编号)")
+    @Required
+    private String partnerType;
+    /**
+    * 所属行业(行业类型字典编号)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("所属行业")
+    @ApiModelProperty("所属行业(行业类型字典编号)")
+    @Required
+    private String sector;
+    /**
+    * 所属产业(产业类型字典编号)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("所属产业")
+    @ApiModelProperty("所属产业(产业类型字典编号)")
+    @Required
+    private String industry;
+    /**
+    * 企业邮箱
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业邮箱")
+    @ApiModelProperty("企业邮箱")
+    private String companyEmail;
+    /**
+    * 联系人邮箱
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("联系人邮箱")
+    @ApiModelProperty("联系人邮箱")
+    private String contactEmail;
+    /**
+    * 企业传真
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业传真")
+    @ApiModelProperty("企业传真")
+    private String companyFax;
+    /**
+    * 企业注册号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业注册号")
+    @ApiModelProperty("企业注册号")
+    private String companyRegister;
+    /**
+    * 企业网址
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业网址")
+    @ApiModelProperty("企业网址")
+    private String companyWebsite;
+
+}

+ 195 - 0
src/main/java/com/xjrsoft/module/veb/vo/InternshipPlanImportVo.java

@@ -0,0 +1,195 @@
+package com.xjrsoft.module.veb.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 课程学科导入入参
+* @Author dzx
+* @Date: 2024-11-26
+* @Version 1.0
+*/
+@Data
+public class InternshipPlanImportVo {
+    /**
+     * 学期
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    @Required
+    private String baseSemester;
+    /**
+     * 学年
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学年")
+    @ApiModelProperty("学年")
+    @Required
+    private String academicYear;
+    /**
+     * 实习计划名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习计划名称")
+    @ApiModelProperty("实习计划名称")
+    @Required
+    private String internshipPlanName;
+    /**
+     * 实习计划类型
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习类型")
+    @ApiModelProperty("实习计划类型")
+    @Required
+    private String internshipPlanType;
+    /**
+     * 实训基地名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实训基地名称")
+    @ApiModelProperty("实训基地名称")
+    @Required
+    private String trainingBaseName;
+    /**
+     * 保险购买方
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("保险购买方")
+    @ApiModelProperty("保险购买方")
+    @Required(value = false)
+    private String insurancePurchaser;
+    /**
+     * 实习去向
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习去向")
+    @ApiModelProperty("实习去向")
+    @Required(value = false)
+    private String internshipWhereabouts;
+    /**
+     * 购买保险种类
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("购买保险种类")
+    @ApiModelProperty("购买保险种类")
+    @Required(value = false)
+    private String insuranceType;
+    /**
+     * 实习开始时间
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习开始时间")
+    @ApiModelProperty("实习开始时间")
+    @Required
+    private Date startTime;
+    /**
+     * 实习结束时间
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习结束时间")
+    @ApiModelProperty("实习结束时间")
+    @Required
+    private Date endTime;
+    /**
+     * 企业所属行业
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("企业所属行业")
+    @ApiModelProperty("企业所属行业")
+    @Required(value = false)
+    private String enterpriseIndustry;
+    /**
+     * 实习单位名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习单位名称")
+    @ApiModelProperty("实习单位名称")
+    @Required
+    private String internshipUnitName;
+    /**
+     * 实习单位地址
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习单位地址")
+    @ApiModelProperty("实习单位地址")
+    @Required(value = false)
+    private String internshipUnitAddress;
+    /**
+     * 实习场所类型
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习场所类型")
+    @ApiModelProperty("实习场所类型")
+    @Required
+    private String internshipSiteType;
+    /**
+     * 实习岗位名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习岗位名称")
+    @ApiModelProperty("实习岗位名称")
+    @Required
+    private String internshipJobName;
+    /**
+     * 实习单位来源
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习单位来源")
+    @ApiModelProperty("实习单位来源")
+    @Required
+    private String internshipUnitSource;
+    /**
+     * 住宿安排
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("住宿安排")
+    @ApiModelProperty("住宿安排")
+    @Required(value = false)
+    private String lodgingPlan;
+    /**
+     * 专业对口程度
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("专业对口程度")
+    @ApiModelProperty("专业对口程度")
+    @Required(value = false)
+    private String professionalRelevanceEnterprise;
+    /**
+     * 实习参与人学号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习参与人学号")
+    @ApiModelProperty("实习参与人学号")
+    @Required
+    private String participantUserStudentId;
+    /**
+     * 实习参与人姓名
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实习参与人姓名")
+    @ApiModelProperty("实习参与人姓名")
+    @Required
+    private String participantUserName;
+    /**
+     * 所属专业名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("所属专业名称")
+    @ApiModelProperty("所属专业名称")
+    @Required
+    private String baseMajorName;
+    /**
+     * 班级名称
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
+    @Required
+    private String className;
+}

+ 1 - 1
src/main/resources/mapper/textbook/TextbookMapper.xml

@@ -344,7 +344,7 @@
     <select id="getSubscriptionPageByClass"
             parameterType="com.xjrsoft.module.textbook.dto.TextbookSubscriptionListDto"
             resultType="com.xjrsoft.module.textbook.vo.TextbookSubscriptionListVo">
-        SELECT t3.id, t3.id AS textbookId, t2.name AS courseName, t3.issn, t3.book_name,
+        SELECT distinct t3.id, t3.id AS textbookId, t2.name AS courseName, t3.issn, t3.book_name,
         t3.publishing_house, t3.editor_in_chief, t3.course_subject_id, t3.version,
         t3.textbook_type, t3.use_type FROM base_class_course t
         LEFT JOIN base_class t1 ON (t1.id = t.class_id)

+ 52 - 32
src/main/resources/sqlScript/all_sql.sql

@@ -42,38 +42,6 @@ CREATE TABLE `wf_teacher_training_participant`
 )
     comment '教研培训参与培训人员';
 
--- 校内实训基地数据项
-DROP TABLE IF EXISTS `school_training_base`;
-CREATE TABLE school_training_base
-(
-    id                     bigint        not null comment '主键编号'
-        primary key,
-    create_user_id         bigint        null comment '创建人',
-    create_date            datetime      null comment '创建时间',
-    modify_user_id         bigint        null comment '修改人',
-    modify_date            datetime      null comment '修改时间',
-    delete_mark            int           not null comment '删除标记',
-    enabled_mark           int           not null comment '有效标志',
-    sort_code              int           null comment '序号',
-    training_base_name     VARCHAR(255)  NOT NULL COMMENT '实训基地名称',
-    training_base_number   VARCHAR(255)  null DEFAULT '0' COMMENT '实训基地编号',
-    training_rooms_number  INT           NOT NULL COMMENT '实训室数,数字标识,例:22',
-    training_project_total INT           NOT NULL COMMENT '实训项目总数,数字标识,例:33',
-    base_category          VARCHAR(255)  NOT NULL COMMENT '基地类别代码(SXJDLBDM)',
-    approve_date           date          NOT NULL COMMENT '批准日期,格式:YYYYMMDD,如:2006-04-12',
-    setup_year             VARCHAR(10)   NOT NULL COMMENT '成立年度,格式:YYYY,如:2006',
-    base_major_id          bigint        null DEFAULT null COMMENT '面向专业',
-    base_major_name        VARCHAR(256)  null DEFAULT '' COMMENT '专业名字',
-    support_department     VARCHAR(255)  null DEFAULT '' COMMENT '被列为实训基地项目支持部门',
-    build_area             DOUBLE(10, 2) null DEFAULT 0 COMMENT '建筑面积',
-    instrument_total       INT           null DEFAULT 0 COMMENT '仪器设备总数,数字标识,例:33',
-    station_number         INT           null DEFAULT 0 COMMENT '实践教学工位数,数字标识,例:33',
-    manager_number_allied  INT           null DEFAULT 0 COMMENT '管理人员数(专职)',
-    manager_number_part    INT           null DEFAULT 0 COMMENT '管理人员数(兼职)'
-) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8mb4
-    COMMENT ='校内实训基地数据表';
-
 -- 学生证书表
 DROP TABLE IF EXISTS `student_cert_table`;
 CREATE TABLE student_cert_table
@@ -197,6 +165,58 @@ CREATE TABLE IF NOT EXISTS base_digital_resources
 ) ENGINE = innodb
   DEFAULT CHARSET = utf8mb4 COMMENT '数字资源';
 
+-- 实训基地表
+DROP TABLE IF EXISTS `base_training`;
+CREATE TABLE `base_training`
+(
+    id                     bigint        not null comment '主键编号'
+        primary key,
+    create_user_id         bigint        null comment '创建人',
+    create_date            datetime      null comment '创建时间',
+    modify_user_id         bigint        null comment '修改人',
+    modify_date            datetime      null comment '修改时间',
+    delete_mark            int           not null comment '删除标记',
+    enabled_mark           int           not null comment '有效标志',
+    sort_code              int           null comment '序号',
+    base_training_name     VARCHAR(255)  NOT NULL COMMENT '实训基地名称',
+    base_training_number   VARCHAR(255)  null DEFAULT '0' COMMENT '实训基地编号',
+    base_training_type   int  null DEFAULT 1 COMMENT '实训基地类型(xjr_dictionary_item[xjrbase_training_type])'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+    COMMENT ='实训基地表';
+
+-- 校内实训基地数据项
+DROP TABLE IF EXISTS `school_training_base`;
+DROP TABLE IF EXISTS `school_training_base`;
+CREATE TABLE base_training_school
+(
+    id                     bigint        not null comment '主键编号'
+        primary key,
+    create_user_id         bigint        null comment '创建人',
+    create_date            datetime      null comment '创建时间',
+    modify_user_id         bigint        null comment '修改人',
+    modify_date            datetime      null comment '修改时间',
+    delete_mark            int           not null comment '删除标记',
+    enabled_mark           int           not null comment '有效标志',
+    sort_code              int           null comment '序号',
+    training_base_name     VARCHAR(255)  NOT NULL COMMENT '实训基地名称',
+    training_base_number   VARCHAR(255)  null DEFAULT '0' COMMENT '实训基地编号',
+    training_rooms_number  INT           NOT NULL COMMENT '实训室数,数字标识,例:22',
+    training_project_total INT           NOT NULL COMMENT '实训项目总数,数字标识,例:33',
+    base_category          VARCHAR(255)  NOT NULL COMMENT '基地类别代码(SXJDLBDM)',
+    approve_date           date          NOT NULL COMMENT '批准日期,格式:YYYYMMDD,如:2006-04-12',
+    setup_year             VARCHAR(10)   NOT NULL COMMENT '成立年度,格式:YYYY,如:2006',
+    base_major_id          bigint        null DEFAULT null COMMENT '面向专业',
+    base_major_name        VARCHAR(256)  null DEFAULT '' COMMENT '专业名字',
+    support_department     VARCHAR(255)  null DEFAULT '' COMMENT '被列为实训基地项目支持部门',
+    build_area             DOUBLE(10, 2) null DEFAULT 0 COMMENT '建筑面积',
+    instrument_total       INT           null DEFAULT 0 COMMENT '仪器设备总数,数字标识,例:33',
+    station_number         INT           null DEFAULT 0 COMMENT '实践教学工位数,数字标识,例:33',
+    manager_number_allied  INT           null DEFAULT 0 COMMENT '管理人员数(专职)',
+    manager_number_part    INT           null DEFAULT 0 COMMENT '管理人员数(兼职)'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+    COMMENT ='校内实训基地数据表';
 
   -- 校外实训基地数据项
 DROP TABLE IF EXISTS `outside_training_base`;

+ 295 - 0
src/main/resources/sqlScript/veb_sql.sql

@@ -0,0 +1,295 @@
+-- ----------------------------
+-- 2024-09-20 14:36
+-- 学校基本数据子类表
+-- ----------------------------
+DROP TABLE IF EXISTS ods_zzxxgkjcsj;
+CREATE TABLE `ods_zzxxgkjcsj`
+(
+    id                              bigint       not null
+        primary key,
+    create_user_id                  bigint       null comment '创建人',
+    create_date                     datetime     null comment '创建时间',
+    modify_user_id                  bigint       null comment '修改人',
+    modify_date                     datetime     null comment '修改日期',
+    delete_mark                     int          not null comment '删除标记',
+    enabled_mark                    int          not null comment '有效标记',
+    sort_code                       int          null comment '序号',
+    provincial_code                 varchar(6)   not null comment '省机构编码',
+    provincial_name                 varchar(60)  not null comment '省机构名称',
+    municipal_code                  varchar(6)   not null comment '市机构编码',
+    municipal_name                  varchar(60)  not null comment '市机构名称',
+    district_and_county_code        varchar(6)   not null comment '区县机构编码',
+    district_and_county_name        varchar(60)  not null comment '区县机构名称',
+    school_name                     varchar(60)  null comment '学校名称',
+    school_code                     varchar(10)  null comment '学校代码',
+    school_institution_code         varchar(18)  null comment '学校机构代码',
+    school_type                     varchar(300) null comment '学校类别',
+    supervisory_department          varchar(65)  null comment '学校主管部门',
+    organizer_name                  varchar(60)  null comment '学校举办者名称',
+    school_organizer_nature         varchar(500) null comment '学校举办者性质',
+    superintendent                  varchar(255) null comment '学校负责人姓名',
+    establish_date                  varchar(50)  null comment '建校年月',
+    existing_school_staff_num       int          not null comment '现有教职工总数',
+    existing_student_num            int          not null comment '现有学生数',
+    set_up_major_num                int          not null comment '本校开设专业数',
+    characteristic_applications_num int          not null comment '学校特色应用数',
+    exit_bandwidth                  int          not null comment '学校园出口带宽',
+    backbone_bandwidth              int          not null comment '校园主干网带宽',
+    wired_access                    int          not null comment '有线网络接入数',
+    wireless_access                 int          not null comment '无线网络接入数',
+    multimedia_classrooms           int          not null comment '多媒体教室数',
+    is_double_excellence            varchar(500) not null comment '是否双优学校'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='学校基本数据子类表';
+
+-- ----------------------------
+-- 2024-09-20 14:36
+-- 校区基本数据子类表
+-- ----------------------------
+DROP TABLE IF EXISTS ods_zzxqjcsj;
+CREATE TABLE `ods_zzxqjcsj`
+(
+    id                      bigint       not null
+        primary key,
+    create_user_id          bigint       null comment '创建人',
+    create_date             date         null comment '创建时间',
+    modify_user_id          bigint       null comment '修改人',
+    modify_date             date         null comment '修改日期',
+    delete_mark             int          null comment '删除标记',
+    enabled_mark            int          null comment '有效标记',
+    school_id               bigint       null comment '所属学校(ods_zzxxgkjcsj_id)',
+    school_number           varchar(20)  null comment '校区编号',
+    name                    varchar(255) null comment '校区名称',
+    name_s                  varchar(255) null comment '校区简称',
+    administrative_location varchar(500) null comment '校区所在地行政区域',
+    address                 varchar(500) null comment '地址',
+    phone                   bigint       null comment '校区联系电话',
+    postal_code             varchar(100) null comment '校区邮政编码',
+    build_date              date         null comment '校区成立日期',
+    director                varchar(255) null comment '校区负责人'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci comment '校区基本数据子类表';
+
+-- ----------------------------
+-- 2024-09-20 14:36
+-- 课程学科
+-- ----------------------------
+DROP TABLE IF EXISTS base_course_subject;
+CREATE TABLE `base_course_subject`
+(
+    `id`             bigint      NOT NULL COMMENT '主键',
+    `create_user_id` bigint       DEFAULT NULL COMMENT '创建人',
+    `create_date`    date         DEFAULT NULL COMMENT '创建时间',
+    `modify_user_id` bigint       DEFAULT NULL COMMENT '修改人',
+    `modify_date`    date         DEFAULT NULL COMMENT '修改时间',
+    `delete_mark`    int         NOT NULL COMMENT '删除标记',
+    `enabled_mark`   int         NOT NULL COMMENT '有效标志',
+    `name`           varchar(30) NOT NULL COMMENT '课程学科名称',
+    `code`           varchar(30)  DEFAULT NULL COMMENT '课程学科代码',
+    `remark`         varchar(250) DEFAULT NULL COMMENT '备注',
+    `base_label_id`  bigint       DEFAULT NULL COMMENT '标签id(base_label)',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='课程学科';
+
+-- ----------------------------
+-- 2024-09-20 14:36
+-- 课程学科管理详情表
+-- ----------------------------
+DROP TABLE IF EXISTS course_subject_detail;
+CREATE TABLE `course_subject_detail`
+(
+    id                     bigint        NOT NULL COMMENT '主键编号',
+    create_user_id         bigint        NULL COMMENT '创建人',
+    create_date            datetime      NULL COMMENT '创建时间',
+    modify_user_id         bigint        NULL COMMENT '修改人',
+    modify_date            datetime      NULL COMMENT '修改时间',
+    delete_mark            int           NOT NULL COMMENT '删除标记',
+    enabled_mark           int           NOT NULL COMMENT '有效标志',
+    sort_code              int           NULL COMMENT '序号',
+
+    base_course_subject_id bigint        NOT NULL COMMENT '课程学科管理主表id',
+    course_category        varchar(16)   NOT NULL COMMENT '课程类别',
+    course_nature          varchar(16)   NOT NULL COMMENT '课程性质',
+    course_attribute       varchar(16)   NOT NULL COMMENT '课程属性',
+    course_type            varchar(16)   NOT NULL COMMENT '课程分类',
+    subject_quality        varchar(16)   NOT NULL COMMENT '学科类别',
+    core_course            varchar(16)   NOT NULL COMMENT '是否专业核心课程',
+    theory_time            int           NOT NULL COMMENT '理论教学时数',
+    practice_time          int           NOT NULL COMMENT '实践教学时数',
+    online_course          varchar(20)   NOT NULL COMMENT '是否有线上课程',
+    course_url             longtext      NULL COMMENT '线上课程网址',
+    ideology_demo          varchar(20)   NOT NULL COMMENT '是否思政示范课程',
+    course_resource        varchar(10)   NULL DEFAULT '' COMMENT '课堂教学设计主要选用课程资源',
+    emulation_time         int           NOT NULL COMMENT '虚拟仿真实训课时数',
+    emulation_name         varchar(256)  NULL DEFAULT '' COMMENT '主要开设虚拟仿真实训项目名称',
+    experiment_name        varchar(256)  NULL DEFAULT '' COMMENT '主要开设实验项目名称',
+    training_name          varchar(256)  NULL DEFAULT '' COMMENT '主要开设实训项目名称',
+    internship_name        varchar(-256) NULL DEFAULT '' COMMENT '主要开设实习项目名称',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='课程学科管理详情表';
+
+-- 校内实训基地数据项
+DROP TABLE IF EXISTS `school_training_base`;
+DROP TABLE IF EXISTS `training_school`;
+CREATE TABLE training_school
+(
+    id                     bigint        not null comment '主键编号',
+    create_user_id         bigint        null comment '创建人',
+    create_date            datetime      null comment '创建时间',
+    modify_user_id         bigint        null comment '修改人',
+    modify_date            datetime      null comment '修改时间',
+    delete_mark            int           not null comment '删除标记',
+    enabled_mark           int           not null comment '有效标志',
+    sort_code              int           null comment '序号',
+
+    training_name          VARCHAR(255)  NOT NULL COMMENT '实训基地名称',
+    training_number        VARCHAR(255)  null DEFAULT '0' COMMENT '实训基地编号',
+
+    training_rooms_number  INT           null DEFAULT 0 COMMENT '实训室数,数字标识,例:22',
+    training_project_total INT           null DEFAULT 0 COMMENT '实训项目总数,数字标识,例:33',
+    base_category          VARCHAR(255)  null DEFAULT '' COMMENT '基地类别代码(SXJDLBDM)',
+    approve_date           date          null DEFAULT null COMMENT '批准日期,格式:YYYYMMDD,如:2006-04-12',
+    setup_year             VARCHAR(10)   null DEFAULT '' COMMENT '成立年度,格式:YYYY,如:2006',
+    base_major_id          bigint        null DEFAULT null COMMENT '面向专业',
+    support_department     VARCHAR(255)  null DEFAULT '' COMMENT '被列为实训基地项目支持部门',
+    build_area             DOUBLE(10, 2) null DEFAULT 0 COMMENT '建筑面积',
+    instrument_total       INT           null DEFAULT 0 COMMENT '仪器设备总数,数字标识,例:33',
+    station_number         INT           null DEFAULT 0 COMMENT '实践教学工位数,数字标识,例:33',
+    manager_number_allied  INT           null DEFAULT 0 COMMENT '管理人员数(专职)',
+    manager_number_part    INT           null DEFAULT 0 COMMENT '管理人员数(兼职)',
+
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='校内实训基地数据表';
+
+-- 校外实训基地数据项
+DROP TABLE IF EXISTS `outside_training_base`;
+DROP TABLE IF EXISTS `training_outside`;
+CREATE TABLE training_outside
+(
+    id                bigint       not null comment '主键编号',
+    create_user_id    bigint       null comment '创建人',
+    create_date       datetime     null comment '创建时间',
+    modify_user_id    bigint       null comment '修改人',
+    modify_date       datetime     null comment '修改时间',
+    delete_mark       int          not null comment '删除标记',
+    enabled_mark      int          not null comment '有效标志',
+    sort_code         int          null comment '序号',
+
+    training_name     VARCHAR(255) NOT NULL COMMENT '实训基地名称',
+    training_number   VARCHAR(255) null DEFAULT '0' COMMENT '实训基地编号',
+
+    company_coop_id   bigint       null DEFAULT null comment '所属合作企业(company_coop)',
+    company_coop_name varchar(300) null DEFAULT '' comment '所属合作企业',
+    establish_date    date         null DEFAULT null comment '基地成立年月,格式:YYYYMMDD,如:2006-04-12',
+    team_status       VARCHAR(255) null DEFAULT '' comment '合作状态',
+    protocol_state    varchar(128) null DEFAULT '' comment '合作协议签署状态',
+    team_began_date   date         null DEFAULT null comment '合作开始时间',
+    team_end_date     date         null DEFAULT null comment '合作结束时间',
+
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='校外实训基地数据表';
+
+-- 合作企业表
+DROP TABLE IF EXISTS `company_coop`;
+CREATE TABLE `company_coop`
+(
+    id                 bigint       not null comment '主键编号'
+        primary key,
+    create_user_id     bigint       null comment '创建人',
+    create_date        datetime     null comment '创建时间',
+    modify_user_id     bigint       null comment '修改人',
+    modify_date        datetime     null comment '修改时间',
+    delete_mark        int          not null comment '删除标记',
+    enabled_mark       int          not null comment '有效标志',
+    sort_code          int          null comment '序号',
+
+    `company_name`     varchar(255) NOT NULL COMMENT '企业名称',
+    `company_type`     varchar(64)  NOT NULL COMMENT '企业性质(企业性质字典编号)',
+    `company_size`     varchar(64)  NOT NULL COMMENT '企业规模(企业规模字典标号)',
+    `company_person`   varchar(255) NOT NULL COMMENT '法人代表',
+    `company_position` varchar(255) NOT NULL COMMENT '企业地址',
+    `contact`          varchar(255) NOT NULL COMMENT '联系人',
+    `phone`            varchar(32)  NOT NULL COMMENT '联系电话',
+    `partner_type`     varchar(64)  NOT NULL COMMENT '合作状态(状态类型字典编号)',
+    `sector`           varchar(64)  NOT NULL COMMENT '所属行业(行业类型字典编号)',
+    `industry`         varchar(64)  NOT NULL COMMENT '所属产业(产业类型字典编号)',
+    `company_email`    varchar(255) NULL DEFAULT NULL COMMENT '企业邮箱',
+    `contact_email`    varchar(255) NULL DEFAULT NULL COMMENT '联系人邮箱',
+    `company_fax`      varchar(255) NULL DEFAULT NULL COMMENT '企业传真',
+    `company_register` varchar(255) NULL DEFAULT NULL COMMENT '企业注册号',
+    `company_website`  varchar(512) NULL DEFAULT NULL COMMENT '企业网址'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_0900_ai_ci COMMENT ='合作企业表';
+
+-- 实习计划管理表
+DROP TABLE IF EXISTS internship_plan_manage;
+CREATE TABLE internship_plan_manage
+(
+    id                                bigint       not null comment '主键编号' primary key,
+    create_user_id                    bigint       null comment '创建人',
+    create_date                       datetime     null comment '创建时间',
+    modify_user_id                    bigint       null comment '修改人',
+    modify_date                       datetime     null comment '修改时间',
+    delete_mark                       int          not null comment '删除标记',
+    enabled_mark                      int          not null comment '有效标志',
+    sort_code                         int          null comment '序号',
+
+    base_semester_id                  bigint       not null comment '学期主键id(base_semester)',
+    internship_plan_name              varchar(256) not null comment '实习计划名称',
+    internship_plan_type              varchar(256) not null comment '实习计划类型',
+    training_base_id                  bigint       not null comment '实训基地主键id(school_training_base and outside_training_base)',
+    internship_whereabouts            varchar(256) null comment '实习去向',
+    insurance_purchaser               varchar(256) null comment '保险购买方',
+    insurance_type                    varchar(256) null comment '购买保险种类',
+    start_time                        date         not null comment '实习开始时间',
+    end_time                          date         not null comment '实习结束时间',
+    enterprise_industry               varchar(256) null comment '企业所属行业',
+    internship_unit_name              varchar(256) not null comment '实习单位名称',
+    internship_unit_address           varchar(256) null comment '实习单位地址',
+    internship_unit_source            varchar(256) not null comment '实习单位来源',
+    internship_job_name               varchar(256) not null comment '实习岗位名称',
+    professional_relevance_enterprise varchar(256) null comment '专业对口程度',
+    lodging_plan                      varchar(256) null comment '住宿安排',
+    `internship_site_type`            varchar(32)  NOT NULL COMMENT '实习场所类型',
+    `academic_year`                   VARCHAR(64) COMMENT '学年'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+    COMMENT ='实习计划管理表';
+
+-- 实习计划参与人表
+DROP TABLE IF EXISTS internship_plan_manage_participant;
+CREATE TABLE internship_plan_manage_participant
+(
+    id                          bigint       not null comment '主键编号' primary key,
+    create_user_id              bigint       null comment '创建人',
+    create_date                 datetime     null comment '创建时间',
+    modify_user_id              bigint       null comment '修改人',
+    modify_date                 datetime     null comment '修改时间',
+    delete_mark                 int          not null comment '删除标记',
+    enabled_mark                int          not null comment '有效标志',
+    sort_code                   int          null comment '序号',
+
+    internship_plan_manage_id   bigint       not null comment '实习计划id',
+    participant_user_id         bigint       null comment '实习参与人id',
+    participant_user_student_id varchar(256) null comment '实习参与人学号',
+    participant_user_name       varchar(256) null comment '实习参与人姓名',
+    base_major_id               bigint       not null comment '所属专业id(base_major)',
+    base_major_name             varchar(256)       not null comment '所属专业名称',
+    class_id                    bigint       not null comment '班级id(base_class)',
+    class_name                  varchar(256)       not null comment '班级名称'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+    COMMENT ='实习计划参与人表';
+
+

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

@@ -3862,4 +3862,179 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcBaseCourseSubject() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("base_course_subject");//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("classtime");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcCourseSubjectDetail() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("course_subject_detail");//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("base");//包名
+        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);
+    }
+
+    @Test
+    public void gcInternshipPlanManage() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("internship_plan_manage");//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("form");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcInternshipPlanManageParticipant() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("internship_plan_manage_participant");//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("form");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcCompanyCoop() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("company_coop");//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("form");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcTrainingOutside() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("training_outside");//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("veb");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcTrainingSchool() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("training_school");//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("veb");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }