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] =?UTF-8?q?=E5=9B=9B=E5=85=AD=E7=BA=A7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=8E=A5=E5=8F=A3=E4=BB=A5=E5=8F=8A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E7=89=88=E4=B8=8B=E8=BD=BD=E6=8E=A5=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); } }