From 489efb0ae46e6fe1827202a7be684f6128a7c571 Mon Sep 17 00:00:00 2001 From: Cool <747682928@qq.com> Date: Fri, 11 Oct 2024 20:22:54 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=9B=9B=E5=85=AD=E7=BA=A7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AF=BC=E5=85=A5=E6=8E=A5=E5=8F=A3=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A8=A1=E7=89=88=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/modules/anno/AttributeName.java | 5 + .../controller/CetDataImportController.java | 59 ++++ .../modules/controller/Cet_6Controller.java | 237 +++++++-------- .../java/org/jeecg/modules/entity/CET.java | 47 --- .../java/org/jeecg/modules/entity/Cet_4.java | 8 + .../java/org/jeecg/modules/entity/Cet_6.java | 107 +++++-- .../org/jeecg/modules/mapper/CetMapper.java | 13 - .../jeecg/modules/service/CetDataImport.java | 276 ++++++++++++++++++ .../jeecg/modules/service/DBFImporter.java | 115 -------- .../jeecg/modules/service/ICet_6Service.java | 9 +- .../service/impl/CetMajorServiceImpl.java | 19 ++ .../service/impl/Cet_6ServiceImpl.java | 52 +++- .../org/jeecg/modules/utils/DateUtil.java | 30 ++ .../org/jeecg/modules/utils/ExportUtil.java | 67 +++++ .../template/cetDataImportTemplate.xlsx | Bin 0 -> 10620 bytes .../src/test/java/org/jeecg/modules/text.java | 1 - 16 files changed, 710 insertions(+), 335 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetDataImportController.java delete mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/CET.java delete mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/mapper/CetMapper.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/CetDataImport.java delete mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/DBFImporter.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/DateUtil.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/ExportUtil.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/template/cetDataImportTemplate.xlsx diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/anno/AttributeName.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/anno/AttributeName.java index bd9238a3..73334558 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/anno/AttributeName.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/anno/AttributeName.java @@ -3,6 +3,11 @@ package org.jeecg.modules.anno; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +/** + * @Description DBF行标识 + * @Author Cool + * @Date 13:03 2024/10/11 + **/ @Retention(RetentionPolicy.RUNTIME) public @interface AttributeName { diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetDataImportController.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetDataImportController.java new file mode 100644 index 00000000..2ed6f4c0 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetDataImportController.java @@ -0,0 +1,59 @@ +package org.jeecg.modules.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.service.CetDataImport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; + +/** + * Created with IntelliJ IDEA. + * + * @Author: Cool + * @Date: 2024/10/10/22:06 + * @Description: + */ +@RestController +@RequestMapping("cetDataImport") +@Api(value = "四六级数据导入接口") +@Slf4j +public class CetDataImportController { + + @Autowired + private CetDataImport cetDataImport; + + + /** + * @param file dbf文件 + * @param batch 考试批次 + * @param level cet等级(cet4/cet6) + * @Author Cool + * @Date 22:08 2024/10/10 + * DBF数据导入 + **/ + @RequestMapping("dbfImport") + @ApiOperation("DBF数据导入") + public Result DBFImport(@RequestParam("file") MultipartFile file, @RequestParam("batch") String batch, @RequestParam("level") String level) { + return cetDataImport.readDBF(file, batch, level); + } + + + @RequestMapping("downloadTemplate") + @ApiOperation("四六级导入数据文件模版") + public Result downloadTemplate(HttpServletResponse response) { + return cetDataImport.downloadTemplate(response); + } + +// @RequestMapping("test") +// @ApiOperation("DBF数据导入") +// public Result test() throws FileNotFoundException { +// return cetDataImport.readDBF1(); +// } + +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/Cet_6Controller.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/Cet_6Controller.java index 80c4ad69..5acf8bdd 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/Cet_6Controller.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/Cet_6Controller.java @@ -3,6 +3,7 @@ package org.jeecg.modules.controller; import java.util.Arrays; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.entity.Cet_6; @@ -22,125 +23,125 @@ import io.swagger.annotations.ApiOperation; import org.jeecg.common.aspect.annotation.AutoLog; import org.apache.shiro.authz.annotation.RequiresPermissions; - /** +/** * @Description: cet_6 * @Author: jeecg-boot - * @Date: 2024-03-26 + * @Date: 2024-03-26 * @Version: V1.0 */ -@Api(tags="cet_6") +@Api(tags = "cet_6") @RestController @RequestMapping("/cet_6") @Slf4j public class Cet_6Controller extends JeecgController { - @Autowired - private ICet_6Service cet_6Service; - - /** - * 分页列表查询 - * - * @param cet_6 - * @param pageNo - * @param pageSize - * @param req - * @return - */ - //@AutoLog(value = "cet_6-分页列表查询") - @ApiOperation(value="cet_6-分页列表查询", notes="cet_6-分页列表查询") - @GetMapping(value = "/list") - public Result> queryPageList(Cet_6 cet_6, - @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, - @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, - HttpServletRequest req) { - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(cet_6, req.getParameterMap()); - Page page = new Page(pageNo, pageSize); - IPage pageList = cet_6Service.page(page, queryWrapper); - return Result.OK(pageList); - } - - /** - * 添加 - * - * @param cet_6 - * @return - */ - @AutoLog(value = "cet_6-添加") - @ApiOperation(value="cet_6-添加", notes="cet_6-添加") - @RequiresPermissions("cet:cet_6:add") - @PostMapping(value = "/add") - public Result add(@RequestBody Cet_6 cet_6) { - cet_6Service.save(cet_6); - return Result.OK("添加成功!"); - } - - /** - * 编辑 - * - * @param cet_6 - * @return - */ - @AutoLog(value = "cet_6-编辑") - @ApiOperation(value="cet_6-编辑", notes="cet_6-编辑") - @RequiresPermissions("cet:cet_6:edit") - @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) - public Result edit(@RequestBody Cet_6 cet_6) { - cet_6Service.updateById(cet_6); - return Result.OK("编辑成功!"); - } - - /** - * 通过id删除 - * - * @param id - * @return - */ - @AutoLog(value = "cet_6-通过id删除") - @ApiOperation(value="cet_6-通过id删除", notes="cet_6-通过id删除") - @RequiresPermissions("cet:cet_6:delete") - @DeleteMapping(value = "/delete") - public Result delete(@RequestParam(name="id",required=true) String id) { - cet_6Service.removeById(id); - return Result.OK("删除成功!"); - } - - /** - * 批量删除 - * - * @param ids - * @return - */ - @AutoLog(value = "cet_6-批量删除") - @ApiOperation(value="cet_6-批量删除", notes="cet_6-批量删除") - @RequiresPermissions("cet:cet_6:deleteBatch") - @DeleteMapping(value = "/deleteBatch") - public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { - this.cet_6Service.removeByIds(Arrays.asList(ids.split(","))); - return Result.OK("批量删除成功!"); - } - - /** - * 通过id查询 - * - * @param id - * @return - */ - //@AutoLog(value = "cet_6-通过id查询") - @ApiOperation(value="cet_6-通过id查询", notes="cet_6-通过id查询") - @GetMapping(value = "/queryById") - public Result queryById(@RequestParam(name="id",required=true) String id) { - Cet_6 cet_6 = cet_6Service.getById(id); - if(cet_6==null) { - return Result.error("未找到对应数据"); - } - return Result.OK(cet_6); - } + @Autowired + private ICet_6Service cet_6Service; /** - * 导出excel - * - * @param request - * @param cet_6 - */ + * 分页列表查询 + * + * @param cet_6 + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "cet_6-分页列表查询") + @ApiOperation(value = "cet_6-分页列表查询", notes = "cet_6-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(Cet_6 cet_6, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(cet_6, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = cet_6Service.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param cet_6 + * @return + */ + @AutoLog(value = "cet_6-添加") + @ApiOperation(value = "cet_6-添加", notes = "cet_6-添加") + @RequiresPermissions("cet:cet_6:add") + @PostMapping(value = "/add") + public Result add(@RequestBody Cet_6 cet_6) { + cet_6Service.save(cet_6); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param cet_6 + * @return + */ + @AutoLog(value = "cet_6-编辑") + @ApiOperation(value = "cet_6-编辑", notes = "cet_6-编辑") + @RequiresPermissions("cet:cet_6:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) + public Result edit(@RequestBody Cet_6 cet_6) { + cet_6Service.updateById(cet_6); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "cet_6-通过id删除") + @ApiOperation(value = "cet_6-通过id删除", notes = "cet_6-通过id删除") + @RequiresPermissions("cet:cet_6:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id", required = true) String id) { + cet_6Service.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "cet_6-批量删除") + @ApiOperation(value = "cet_6-批量删除", notes = "cet_6-批量删除") + @RequiresPermissions("cet:cet_6:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + this.cet_6Service.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "cet_6-通过id查询") + @ApiOperation(value = "cet_6-通过id查询", notes = "cet_6-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + Cet_6 cet_6 = cet_6Service.getById(id); + if (cet_6 == null) { + return Result.error("未找到对应数据"); + } + return Result.OK(cet_6); + } + + /** + * 导出excel + * + * @param request + * @param cet_6 + */ @RequiresPermissions("cet:cet_6:exportXls") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, Cet_6 cet_6) { @@ -148,16 +149,22 @@ public class Cet_6Controller extends JeecgController { } /** - * 通过excel导入数据 - * - * @param request - * @param response - * @return - */ + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ @RequiresPermissions("cet:cet_6:importExcel") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, Cet_6.class); } + + @RequestMapping("getRate") + public Result getRate() { + return cet_6Service.getGrateRate(); + } + } diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/CET.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/CET.java deleted file mode 100644 index c5bbdba5..00000000 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/CET.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.jeecg.modules.entity; - - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import org.jeecg.modules.anno.AttributeName; - -import java.io.Serializable; -import java.util.Date; - -@Data -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = false) -@ApiModel(value = "cet_english对象", description = "四六级英语") -public class CET implements Serializable { - private static final long serialVersionUID = 1L; - @AttributeName(4) - @ApiModelProperty(value = "学生姓名") - private String name; - @AttributeName(11) - @ApiModelProperty(value = "学生所在学院") - private String college; - @AttributeName(15) - @ApiModelProperty(value = "学生成绩") - private Integer result; - @AttributeName(19) - @ApiModelProperty(value = "学生学号") - private String id; - - @ApiModelProperty(value = "考试批次") - private Date batch; - @ApiModelProperty(value = "学生入学时间") - private String entrydate; - @AttributeName(12) - @ApiModelProperty(value = "学生听力成绩") - private Integer listen; - @AttributeName(13) - @ApiModelProperty(value = "阅读成绩") - private Integer reading; - @AttributeName(14) - @ApiModelProperty(value = "写作成绩") - private Integer writing; - -} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_4.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_4.java index eb9b12fe..156b16e5 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_4.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_4.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; +import org.jeecg.modules.anno.AttributeName; import org.springframework.format.annotation.DateTimeFormat; import org.jeecgframework.poi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; @@ -32,17 +33,21 @@ public class Cet_4 implements Serializable { /**学生姓名*/ @Excel(name = "学生姓名", width = 15) + @AttributeName(4) @ApiModelProperty(value = "学生姓名") private String name; /**学生所在学院*/ @Excel(name = "学生所在学院", width = 15) + @AttributeName(11) @ApiModelProperty(value = "学生所在学院") private String college; /**学生成绩*/ @Excel(name = "学生成绩", width = 15) + @AttributeName(15) @ApiModelProperty(value = "学生成绩") private Integer result; /**学生学号*/ + @AttributeName(19) @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "学生学号") private String id; @@ -58,14 +63,17 @@ public class Cet_4 implements Serializable { private String entrydate; /**听力成绩*/ @Excel(name = "听力成绩", width = 15) + @AttributeName(12) @ApiModelProperty(value = "听力成绩") private Integer listen; /**阅读成绩*/ @Excel(name = "阅读成绩", width = 15) + @AttributeName(13) @ApiModelProperty(value = "阅读成绩") private Integer reading; /**作文成绩*/ @Excel(name = "作文成绩", width = 15) + @AttributeName(14) @ApiModelProperty(value = "作文成绩") private Integer writing; /**专业名字*/ diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_6.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_6.java index 812bd1ff..879c0771 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_6.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/entity/Cet_6.java @@ -1,12 +1,14 @@ package org.jeecg.modules.entity; import java.io.Serializable; +import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; +import org.jeecg.modules.anno.AttributeName; import org.springframework.format.annotation.DateTimeFormat; import org.jeecgframework.poi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; @@ -17,53 +19,96 @@ import lombok.experimental.Accessors; /** * @Description: cet_6 * @Author: jeecg-boot - * @Date: 2024-03-26 + * @Date: 2024-03-26 * @Version: V1.0 */ @Data @TableName("cet_6") @Accessors(chain = true) @EqualsAndHashCode(callSuper = false) -@ApiModel(value="cet_6对象", description="cet_6") +@ApiModel(value = "cet_6对象", description = "cet_6") public class Cet_6 implements Serializable { private static final long serialVersionUID = 1L; - /**学生姓名*/ - @Excel(name = "学生姓名", width = 15) + /** + * 学生姓名 + */ + @Excel(name = "学生姓名", width = 15) + @AttributeName(4) @ApiModelProperty(value = "学生姓名") - private java.lang.String name; - /**学生所在学院*/ - @Excel(name = "学生所在学院", width = 15) + private String name; + /** + * 学生所在学院 + */ + @Excel(name = "学生所在学院", width = 15) + @AttributeName(11) @ApiModelProperty(value = "学生所在学院") - private java.lang.String college; - /**学生成绩*/ - @Excel(name = "学生成绩", width = 15) + private String college; + /** + * 学生成绩 + */ + @Excel(name = "学生成绩", width = 15) + @AttributeName(15) @ApiModelProperty(value = "学生成绩") - private java.lang.Integer result; - /**学生学号*/ - @TableId(type = IdType.ASSIGN_ID) + private Integer result; + /** + * 学生学号 + */ + @AttributeName(19) + @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "学生学号") - private java.lang.String id; - /**考试批次*/ - @Excel(name = "考试批次", width = 15, format = "yyyy-MM-dd") - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") - @DateTimeFormat(pattern="yyyy-MM-dd") + private String id; + /** + * 考试批次 + */ + @Excel(name = "考试批次", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "考试批次") - private java.util.Date batch; - /**入学时间*/ - @Excel(name = "入学时间", width = 15) + private Date batch; + /** + * 入学时间 + */ + @Excel(name = "入学时间", width = 15) @ApiModelProperty(value = "入学时间") - private java.lang.String entrydate; - /**听力成绩*/ - @Excel(name = "听力成绩", width = 15) + private String entrydate; + /** + * 听力成绩 + */ + @Excel(name = "听力成绩", width = 15) + @AttributeName(12) @ApiModelProperty(value = "听力成绩") - private java.lang.Integer listen; - /**阅读成绩*/ - @Excel(name = "阅读成绩", width = 15) + private Integer listen; + /** + * 阅读成绩 + */ + @Excel(name = "阅读成绩", width = 15) + @AttributeName(13) @ApiModelProperty(value = "阅读成绩") - private java.lang.Integer reading; - /**作文成绩*/ - @Excel(name = "作文成绩", width = 15) + private Integer reading; + /** + * 作文成绩 + */ + @Excel(name = "作文成绩", width = 15) + @AttributeName(14) @ApiModelProperty(value = "作文成绩") - private java.lang.Integer writing; + private Integer writing; + /** + * 专业名字 + */ + @Excel(name = "专业名称", width = 15) + @ApiModelProperty(value = "专业名称") + private String majorname; + /** + * 培养层次 + */ + @Excel(name = "培养层次", width = 15) + @ApiModelProperty(value = "培养层次") + private String level; + /** + * 在校状态 + */ + @Excel(name = "在校状态", width = 15) + @ApiModelProperty(value = "在校状态") + private String state; } diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/mapper/CetMapper.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/mapper/CetMapper.java deleted file mode 100644 index 2fb91dda..00000000 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/mapper/CetMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.jeecg.modules.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Insert; -import org.jeecg.modules.entity.CET; - -public interface CetMapper extends BaseMapper { - @Insert("insert into cet_4 (name, college, result, id, batch, entrydate, listen, reading, writing) values (#{name}, #{college}, #{result}, #{id},#{batch}, #{entrydate}, #{listen}, #{reading}, #{writing})") - void insertCET_4(CET cet); - @Insert("insert into cet_6 (name, college, result, id, batch, entrydate, listen, reading, writing)values (#{name}, #{college}, #{result}, #{id},#{batch}, #{entrydate}, #{listen}, #{reading}, #{writing})") - void insertCET_6(CET cet); - -} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/CetDataImport.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/CetDataImport.java new file mode 100644 index 00000000..d4cff8ce --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/CetDataImport.java @@ -0,0 +1,276 @@ +package org.jeecg.modules.service; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.linuxense.javadbf.DBFField; +import com.linuxense.javadbf.DBFReader; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.anno.AttributeName; +import org.jeecg.modules.entity.Cet_4; +import org.jeecg.modules.entity.Cet_6; +import org.jeecg.modules.utils.DateUtil; +import org.jeecg.modules.utils.ExportUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.nio.charset.Charset; + +import java.sql.Timestamp; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class CetDataImport { + + private final String CET_DATA_IMPORT_TEMPLATE="template/cetDataImportTemplate.xlsx"; + private final String CET_DATE_FILE_TEMPLATE_NAME = "四六级数据导入模版.xlsx"; + +// @Autowired +// CetMapper_6 cetMapper6; + + @Autowired + ICet_4Service cet4Service; + + @Autowired + ICet_6Service cet6Service; + + /** + * @Author Cool + * @Date 12:58 2024/10/11 + **/ + @Transactional(rollbackFor = Exception.class) + public Result readDBF(MultipartFile file, String batchStr, String level) { + if (!(level.equals("cet4") || level.equals("cet6"))) { + return Result.error("请选择正确的考试水平"); + } + Set collegeSet = getColleges(); + Date batch = DateUtil.formatDateToDay(batchStr); + boolean isCet4 = level.equals("cet4"); + try { + List cet6List = new ArrayList<>(); + List cet4List = new ArrayList<>(); + DBFReader dbfReader = new DBFReader(file.getInputStream(), Charset.forName("GBK")); + if (!checkFileFormat(dbfReader)) { + return Result.error("上传文件格式错误"); + } + Object[] rowValues; + while ((rowValues = dbfReader.nextRecord()) != null) { + Cet_6 cet6 = new Cet_6(); + Cet_4 cet4 = new Cet_4(); + Class cetClass; + if (isCet4) { + cetClass = cet4.getClass(); + } else { + cetClass = cet6.getClass(); + } + Field[] fields = cetClass.getDeclaredFields(); + //对单个学生对象进行属性注入 + for (Field field : fields) { + if (field.getDeclaredAnnotation(AttributeName.class) == null) continue; + int fieldIndex = field.getDeclaredAnnotation(AttributeName.class).value(); + field.setAccessible(true); + // 获取字段的类型 + Class fieldType = field.getType(); + //进行类型区分 + if (fieldType == String.class) { + Object value = rowValues[fieldIndex - 1]; + if (isCet4) { + field.set(cet4, String.valueOf(value)); + } else { + field.set(cet6, String.valueOf(value)); + } + if (field.getName().equals("college")) { + if (!collegeSet.contains(String.valueOf(value))) { + break; + } + } + if (field.getName().equals("id")) { +// System.out.println(field.getName()); + String entryDate = String.valueOf(value); + //对学生信息进行检查 + entryDate = entryDate.substring(0, 4); + int entry = Integer.parseInt(entryDate); + int year = DateUtils.getYear(); + if (entry < 2010 || entry > year + 1 || Pattern.compile("[a-zA-Z]").matcher(entryDate).find()) + continue; + if (isCet4) { + cet4.setEntrydate(entryDate); + } else { + cet6.setEntrydate(entryDate); + } + } + } else if (fieldType == int.class || fieldType == Integer.class) { + Object value = rowValues[fieldIndex - 1]; + if (isCet4) { + field.set(cet4, (int) Double.parseDouble(String.valueOf(value))); + } else { + field.set(cet6, (int) Double.parseDouble(String.valueOf(value))); + } + } else if (fieldType == Date.class) { + Object value = rowValues[fieldIndex - 1]; + if (isCet4) { + field.set(cet4, new Date(((Timestamp) value).getTime())); + } else { + field.set(cet6, new Date(((Timestamp) value).getTime())); + } + } + } + cet6.setBatch(batch); + cet4.setBatch(batch); + if (isCet4) { + if (collegeSet.contains(cet4.getCollege())) { + cet4List.add(cet4); + } + if (cet4List.size() >= 500) { + cet4Service.save(cet4); + cet4Service.saveBatch(cet4List); + log.info("Cet学生{}", cet4); + cet4List.clear(); + } + } else { + if (collegeSet.contains(cet6.getCollege())) { + cet6List.add(cet6); + } + if (cet6List.size() >= 500) { + cet6Service.save(cet6); + cet6Service.saveBatch(cet6List); + cet6List.clear(); + } + } + + } + if (isCet4) { + cet4Service.saveBatch(cet4List); + } else { + cet6Service.saveBatch(cet6List); + } + return Result.ok(); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("出现异常,请联系管理员"); + } + + } + + + public Set getColleges() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.groupBy(Cet_4::getCollege); + List list = cet4Service.list(wrapper); + return list.stream().map(Cet_4::getCollege).collect(Collectors.toSet()); + } + + private boolean checkFileFormat(DBFReader dbfReader) { + if (!"ks_xm".equals(dbfReader.getField(3).getName())) { + return false; + } + if (!"ks_xy_dm".equals(dbfReader.getField(10).getName())) { + return false; + } + if (!"tl".equals(dbfReader.getField(11).getName())) { + return false; + } + if (!"yd".equals(dbfReader.getField(12).getName())) { + return false; + } + if (!"xz".equals(dbfReader.getField(13).getName())) { + return false; + } + if (!"zf".equals(dbfReader.getField(14).getName())) { + return false; + } + if (!"Ks_xh".equals(dbfReader.getField(18).getName())) { + return false; + } + return true; + } + + /** + * 测试用 + * + * @Author Cool + * @Date 19:03 2024/10/11 + **/ + @Transactional(rollbackFor = Exception.class) + public Result readDBF1() throws FileNotFoundException { + + Set collegeSet = getColleges(); + String batchStr = "2020-12-01"; + String level = ""; + File file = new File("C:\\Users\\86183\\Desktop\\202012-202406六级成绩\\2021下半年英语六级成绩.dbf"); + InputStream inputStream = new FileInputStream(file); + Date batch = DateUtil.formatDateToDay(batchStr); + try { + List cet6List = new ArrayList<>(); + DBFReader dbfReader = new DBFReader(inputStream, Charset.forName("GBK")); + DBFField field1 = dbfReader.getField(0); + Object[] rowValues = dbfReader.nextRecord(); + while ((rowValues = dbfReader.nextRecord()) != null) { + Cet_6 cet6 = new Cet_6(); + Class cetClass = cet6.getClass(); + Field[] fields = cetClass.getDeclaredFields(); + //对单个学生对象进行属性注入 + for (Field field : fields) { + if (field.getDeclaredAnnotation(AttributeName.class) == null) continue; + int fieldIndex = field.getDeclaredAnnotation(AttributeName.class).value(); + field.setAccessible(true); + // 获取字段的类型 + Class fieldType = field.getType(); + //进行类型区分 + if (fieldType == String.class) { + Object value = rowValues[fieldIndex - 1]; + field.set(cet6, String.valueOf(value)); + if (field.getName().equals("college")) { + if (!collegeSet.contains(String.valueOf(value))) { + break; + } + } + if (field.getName().equals("id")) { +// System.out.println(field.getName()); + String entryDate = String.valueOf(value); + //对学生信息进行检查 + entryDate = entryDate.substring(0, 4); + int entry = Integer.parseInt(entryDate); + int year = DateUtils.getYear(); + if (entry < 2010 || entry > year + 1 || Pattern.compile("[a-zA-Z]").matcher(entryDate).find()) + continue; + + cet6.setEntrydate(entryDate); + } + } else if (fieldType == int.class || fieldType == Integer.class) { + Object value = rowValues[fieldIndex - 1]; + + field.set(cet6, (int) Double.parseDouble(String.valueOf(value))); + } else if (fieldType == Date.class) { + Object value = rowValues[fieldIndex - 1]; + field.set(cet6, new Date(((Timestamp) value).getTime())); + } + } + } + + return Result.ok(); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("出现异常,请联系管理员"); + } + + } + + public Result downloadTemplate(HttpServletResponse response) { + try { + ExportUtil.downloadExcelTemplate(response, CET_DATE_FILE_TEMPLATE_NAME, CET_DATA_IMPORT_TEMPLATE); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/DBFImporter.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/DBFImporter.java deleted file mode 100644 index 2c6dbf8a..00000000 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/DBFImporter.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.jeecg.modules.service; - - -import com.linuxense.javadbf.DBFReader; -import org.jeecg.common.util.DateUtils; -import org.jeecg.modules.anno.AttributeName; -import org.jeecg.modules.entity.CET; -import org.jeecg.modules.mapper.CetMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.nio.charset.Charset; - -import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.regex.Pattern; - -@Service -public class DBFImporter { - @Resource - CetMapper cetMapper; -// @Autowired -// CetMapper_6 cetMapper6; - - public void readDBF(InputStream inputStream, Date batch, String level, String charsetName) { - try { -// List cetList = new ArrayList<>(); - DBFReader dbfReader = new DBFReader(inputStream, Charset.forName(charsetName)); - Object[] rowValues; - - while ((rowValues = dbfReader.nextRecord()) != null) { - CET cet = new CET(); - Class cetClass = cet.getClass(); - Field[] fields = cetClass.getDeclaredFields(); - //对单个学生对象进行属性注入 - for (Field field : fields) { - if (field.getDeclaredAnnotation(AttributeName.class) == null) continue; - int fieldIndex = field.getDeclaredAnnotation(AttributeName.class).value(); - field.setAccessible(true); - // 获取字段的类型 - Class fieldType = field.getType(); - //进行类型区分 - if (fieldType == String.class) { - Object value = rowValues[fieldIndex - 1]; - field.set(cet, String.valueOf(value)); - if (field.getName().equals("id")) { -// System.out.println(field.getName()); - String entryDate = String.valueOf(value); - //对学生信息进行检查 - int entry = Integer.parseInt(entryDate); - int year = DateUtils.getYear(); - if (entry<2010||entry>year+1||Pattern.compile("[a-zA-Z]").matcher(entryDate).find()) continue; - - cet.setEntrydate(entryDate.substring(0, 4)); - } - } else if (fieldType == int.class || fieldType == Integer.class) { - Object value = rowValues[fieldIndex - 1]; - - field.set(cet, (int) Double.parseDouble(String.valueOf(value))); - } else if (fieldType == Date.class) { - Object value = rowValues[fieldIndex - 1]; - field.set(cet, new Date(((Timestamp) value).getTime())); - } - } - cet.setBatch(batch); -// System.out.println(cet); -// cetList.add(cet); - System.out.println(cet); - if (level.equals("英语四级")) { - cetMapper.insertCET_4(cet); - } - if (level.equals("英语六级")) { - cetMapper.insertCET_6(cet); - } - - - } -// System.out.println(cetList.size()); - } catch (Exception e) { - e.printStackTrace(); - } - - } - -// private static Date extractDateFromPath(String filePath) { -// // 在文件路径中找到日期部分的起始位置 -// String[] pathArray = filePath.split("\\\\"); -// String date = pathArray[pathArray.length - 2]; -// -// -// // 截取日期部分 -// String dateStr = date.substring(0, 7) + "-01"; -// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); -// try { -// -// return simpleDateFormat.parse(dateStr); -// } catch (ParseException e) { -// throw new RuntimeException(e); -// } -// -// } -// -// private String getLevel(String filePath) { -// String[] pathArray = filePath.split("\\\\"); -// String level = pathArray[pathArray.length - 1]; -// return level.substring(0, 4); -// } - - -} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/ICet_6Service.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/ICet_6Service.java index e31d15d3..a45b0784 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/ICet_6Service.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/ICet_6Service.java @@ -1,20 +1,19 @@ package org.jeecg.modules.service; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.entity.Cet_6; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.Date; - /** * @Description: cet_6 * @Author: jeecg-boot - * @Date: 2024-03-26 + * @Date: 2024-03-26 * @Version: V1.0 */ public interface ICet_6Service extends IService { - public Result getRate(Cet_6 data); + Result getRate(Cet_6 data); + + Result getGrateRate(); } diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java new file mode 100644 index 00000000..3a4ab99a --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.entity.Cet4_major; +import org.jeecg.modules.mapper.Cet4_majorMapper; +import org.springframework.stereotype.Service; + +/** + * Created with IntelliJ IDEA. + * + * @Author: Cool + * @Date: 2024/10/11/15:52 + * @Description: + */ +@Service +@Slf4j +public class CetMajorServiceImpl extends ServiceImpl { +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/Cet_6ServiceImpl.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/Cet_6ServiceImpl.java index 78397c87..5acde40e 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/Cet_6ServiceImpl.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/Cet_6ServiceImpl.java @@ -1,13 +1,16 @@ package org.jeecg.modules.service.impl; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.entity.Cet4_major; +import org.jeecg.modules.entity.Cet_4; import org.jeecg.modules.entity.Cet_6; import org.jeecg.modules.mapper.Cet_6Mapper; import org.jeecg.modules.service.ICet_6Service; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -16,20 +19,27 @@ import javax.annotation.Resource; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** * @Description: cet_6 * @Author: jeecg-boot - * @Date: 2024-03-26 + * @Date: 2024-03-26 * @Version: V1.0 */ @Service +@Slf4j public class Cet_6ServiceImpl extends ServiceImpl implements ICet_6Service { @Resource Cet_6Mapper cet6Mapper; + @Autowired + Cet_4ServiceImpl cet4Service; + @Autowired + CetMajorServiceImpl cetMajorService; + @Override public Result getRate(Cet_6 cet) { JSONObject jsonObject = new JSONObject(); @@ -45,8 +55,7 @@ public class Cet_6ServiceImpl extends ServiceImpl implements double sum = (double) getNum(cet); double size = entry.getValue().size(); double passRate = sum / size; - jsonObject.put(String.valueOf(entry.getKey()), - passRate); + jsonObject.put(String.valueOf(entry.getKey()), passRate); } return Result.OK(jsonObject); @@ -60,15 +69,42 @@ public class Cet_6ServiceImpl extends ServiceImpl implements double sum = (double) getNum(cet); double size = entry.getValue().size(); double passRate = sum / size; - jsonObject.put(String.valueOf(entry.getKey()), - passRate); + jsonObject.put(String.valueOf(entry.getKey()), passRate); } return Result.OK(jsonObject); - } - else return null; + } else return null; } + @Override + public Result getGrateRate() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Cet_6::getEntrydate, "2020"); + List list1 = list(wrapper); + Set allStudent1 = list1.stream().map(Cet_6::getId).collect(Collectors.toSet()); + log.info("六级总考试人数,{}",allStudent1.size()); + wrapper.ge(Cet_6::getResult, 425); + List list = list(wrapper); + log.info("六级总通过人数,{}", list.size()); + + Set passStudent = list.stream().map(Cet_6::getId).collect(Collectors.toSet()); + log.info("六级通过人数,{}", passStudent.size()); + LambdaQueryWrapper majorWrapper = new LambdaQueryWrapper<>(); + majorWrapper.eq(Cet4_major::getEntrydate, "2020") + .eq(Cet4_major::getState, "在校"); + List majorList = cetMajorService.list(majorWrapper); + Set allStudent = majorList.stream().map(Cet4_major::getId).collect(Collectors.toSet()); + log.info("所有学生人数{}", allStudent.size()); + log.info("通过率,{}", (double) passStudent.size() / allStudent.size()); + LambdaQueryWrapper cet4Wrapper=new LambdaQueryWrapper<>(); + cet4Wrapper.eq(Cet_4::getEntrydate,"2020"); + cet4Wrapper.ge(Cet_4::getResult,425); + List cet4PassedStudent = cet4Service.list(cet4Wrapper); + Set cet4AllPassedStudent = cet4PassedStudent.stream().map(Cet_4::getId).collect(Collectors.toSet()); + log.info("四级通过人数,{}",cet4AllPassedStudent.size()); + return null; + } + private long getNum(Cet_6 cet) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/DateUtil.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/DateUtil.java new file mode 100644 index 00000000..7b64b716 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/DateUtil.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created with IntelliJ IDEA. + * + * @Author: Cool + * @Date: 2024/10/11/18:33 + * @Description: 日期工具类 + */ +@Slf4j +public class DateUtil { + + + public static Date formatDateToDay(String dateStr) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + try { + return format.parse(dateStr); + } catch (ParseException e) { + log.error("DateUtil格式化日期错误,{}", e); + return null; + } + } + +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/ExportUtil.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/ExportUtil.java new file mode 100644 index 00000000..38d43d0d --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/utils/ExportUtil.java @@ -0,0 +1,67 @@ +package org.jeecg.modules.utils; + +import org.apache.poi.util.IOUtils; +import org.springframework.core.io.ClassPathResource; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.charset.StandardCharsets; + +public class ExportUtil { + + + /** + * 下载 + * @param response + * @param fileName + * @param filePath + * @throws IOException + */ + public static void download(HttpServletResponse response, String fileName, String filePath) throws IOException { + + File file = new File(filePath); + FileInputStream in = new FileInputStream(file); + try (OutputStream os = response.getOutputStream()) { + fileName = String.format("%s", fileName); + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); + response.addHeader("Cache-Control", "no-cache"); + byte[] bs = new byte[1024]; + int count = 0; + + while ((count=in.read(bs, 0, bs.length))!=-1) { + os.write(bs,0,count); + } + in.close(); + os.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 下载Excel模板 + * @param response + * @param resourceFileName + * @param resourceFilePath + * @throws IOException + */ + public static void downloadExcelTemplate(HttpServletResponse response, String resourceFileName, String resourceFilePath) throws IOException { + ClassPathResource file = new ClassPathResource(resourceFilePath); + InputStream inputStream = file.getInputStream(); + try (OutputStream os = response.getOutputStream()) { + String fileName = String.format("%s", resourceFileName); + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); + response.addHeader("Cache-Control", "no-cache"); + IOUtils.copy(inputStream, os); + inputStream.close(); + os.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/template/cetDataImportTemplate.xlsx b/jeecg-module-system/jeecg-system-start/src/main/resources/template/cetDataImportTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e9802d1f35b15c8b9f0b22120c61a862abaeb8ce GIT binary patch literal 10620 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 result = cet_4Controller.getDataByStudent(2023011559, "余映婵"); - System.out.println(result); } } From a6aba8250101b3611e8cc3e0e1136818488d4af3 Mon Sep 17 00:00:00 2001 From: Cool <747682928@qq.com> Date: Wed, 16 Oct 2024 18:12:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=9B=9B=E5=85=AD=E7=BA=A7=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CetStudentController.java | 67 ++++++++++++++++++ .../service/impl/CetMajorServiceImpl.java | 16 +++++ .../template/cetStudentImportTemplate.xls | Bin 0 -> 22016 bytes 3 files changed, 83 insertions(+) create mode 100644 jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetStudentController.java create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/template/cetStudentImportTemplate.xls diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetStudentController.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetStudentController.java new file mode 100644 index 00000000..83fb15a4 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/controller/CetStudentController.java @@ -0,0 +1,67 @@ +package org.jeecg.modules.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.modules.entity.Cet4_major; +import org.jeecg.modules.entity.Cet_4; +import org.jeecg.modules.service.impl.CetMajorServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created with IntelliJ IDEA. + * + * @Author: Cool + * @Date: 2024/10/16/17:58 + * @Description: 学生信息Controller + */ +@Api(tags = "cetStudent") +@RestController +@RequestMapping("/cetStudent") +@Slf4j +public class CetStudentController extends JeecgController { + + @Autowired + private CetMajorServiceImpl cetMajorService; + + /** + * 导出excel + * + * @param request + * @param + */ + @RequiresPermissions("cet:cetStudent:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, Cet4_major major) { + return super.exportXls(request, major, Cet4_major.class, "cet_4"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("cet:cetStudent:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, Cet4_major.class); + } + + @RequestMapping("downloadTemplate") + @ApiOperation("四六级导入数据文件模版") + public Result downloadTemplate(HttpServletResponse response) { + return cetMajorService.downloadTemplate(response); + } +} diff --git a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java index 3a4ab99a..b307c4a8 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java +++ b/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/modules/service/impl/CetMajorServiceImpl.java @@ -2,10 +2,15 @@ package org.jeecg.modules.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; import org.jeecg.modules.entity.Cet4_major; import org.jeecg.modules.mapper.Cet4_majorMapper; +import org.jeecg.modules.utils.ExportUtil; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + /** * Created with IntelliJ IDEA. * @@ -16,4 +21,15 @@ import org.springframework.stereotype.Service; @Service @Slf4j public class CetMajorServiceImpl extends ServiceImpl { + private final String CET_STUDENT_IMPORT_TEMPLATE = "template/cetStudentImportTemplate.xls"; + private final String CET_STUDENT_FILE_TEMPLATE_NAME = "四六级学生信息导入模版.xlsx"; + + public Result downloadTemplate(HttpServletResponse response) { + try { + ExportUtil.downloadExcelTemplate(response, CET_STUDENT_FILE_TEMPLATE_NAME, CET_STUDENT_IMPORT_TEMPLATE); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/template/cetStudentImportTemplate.xls b/jeecg-module-system/jeecg-system-start/src/main/resources/template/cetStudentImportTemplate.xls new file mode 100644 index 0000000000000000000000000000000000000000..ffdd03590f326af22f220c787e27e6710f94a832 GIT binary patch literal 22016 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