From ae3738c098b4852a3c23b1bacdec6052b75ceae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E6=88=90?= <2847920761@qq.com> Date: Thu, 4 Sep 2025 19:57:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0iText=207=20=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 4 +- .../ruoyi-modules/ruoyi-system/pom.xml | 10 +- .../safety/bo/res/WgzAppGetTestPaperRes.java | 31 + .../WgzQuestionCategoryController.java | 2 +- .../safety/controller/app/WgzShiJuan.java | 112 +++ .../impl/WgzQuestionSaveServiceImpl.java | 860 +++++++++--------- .../mapper/out/OutMonthPlanMapper.xml | 2 +- 7 files changed, 567 insertions(+), 454 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/bo/res/WgzAppGetTestPaperRes.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/app/WgzShiJuan.java diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml index afc775a5..4fd2abd9 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml @@ -250,8 +250,8 @@ springdoc: packages-to-scan: org.dromara.design - group: 13.工作流模块 packages-to-scan: org.dromara.workflow - - group: 14.罗成模块 - packages-to-scan: org.dromara.cory +# - group: 14.罗成模块 +# packages-to-scan: org.dromara.cory - group: 15.无人机模块 packages-to-scan: org.dromara.drone - group: 20.代码生成模块 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/pom.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/pom.xml index 724d57da..8b4e1935 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/pom.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/pom.xml @@ -88,8 +88,16 @@ layout 7.2.5 + + + com.itextpdf + kernel + 7.2.5 + - + + + diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/bo/res/WgzAppGetTestPaperRes.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/bo/res/WgzAppGetTestPaperRes.java new file mode 100644 index 00000000..ddc4b74b --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/bo/res/WgzAppGetTestPaperRes.java @@ -0,0 +1,31 @@ +package org.dromara.safety.bo.res; + + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.dromara.safety.bo.rests.WgzAppGetTestPaperTwo; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class WgzAppGetTestPaperRes implements Serializable { + /** + * 最大考试时间(分钟) + */ + private int maximum; + /** + * 单选题 + */ + private WgzAppGetTestPaperTwo singleList; + /** + * 多选题 + */ + private WgzAppGetTestPaperTwo multipleList; + /** + * 判断题 + */ + private WgzAppGetTestPaperTwo estimateList; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/WgzQuestionCategoryController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/WgzQuestionCategoryController.java index ed1c011e..29016b08 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/WgzQuestionCategoryController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/WgzQuestionCategoryController.java @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; /** - * 题库_题库类别 + * 题库_题库类别Controller * * @author Lion Li * @date 2025-09-03 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/app/WgzShiJuan.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/app/WgzShiJuan.java new file mode 100644 index 00000000..4c303b37 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/controller/app/WgzShiJuan.java @@ -0,0 +1,112 @@ +package org.dromara.safety.controller.app; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.safety.bo.req.WgzAppSubmitATestPaperReq; +import org.dromara.safety.bo.res.WgzAppGetTestPaperRes; +import org.dromara.safety.bo.res.WgzAppSubmitATestPaperRes; +import org.dromara.safety.bo.res.WgzAppUserScoreQuery; +import org.dromara.safety.bo.rests.WgzAppGetTestPaperThree; +import org.dromara.safety.bo.rests.WgzAppGetTestPaperTwo; +import org.dromara.safety.domain.WgzQuestionsConfiguration; +import org.dromara.safety.service.IWgzQuestionBankService; +import org.dromara.safety.service.IWgzQuestionSaveService; +import org.dromara.safety.service.IWgzQuestionsConfigurationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Author app 岗前培训 试卷 + * @Date 2025/9/4 18:31 + * @Version 1.0 + */ + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/safety/wgzShiJuan") +public class WgzShiJuan extends BaseController { + @Autowired + private IWgzQuestionsConfigurationService iWgzQuestionsConfigurationService; + @Autowired + private IWgzQuestionBankService iWgzQuestionBankService; + @Autowired + private IWgzQuestionSaveService iWgzQuestionSaveService; + + /** + * 岗前培训·获取随机试卷 + */ +// @SaCheckPermission("@ss.hasPermi('safety:wgzShiJuan:userGetTestPaper')") + @GetMapping("/WgzUserGetTestPaper") + public R userGetTestPaper() { + //1、获取配置信息 + WgzQuestionsConfiguration configuration = iWgzQuestionsConfigurationService.appQueryLimitOne(); + if (configuration == null) { + throw new RuntimeException("未查询到配置信息"); + } + //2、随机获取数据,返回id和score + Integer s = configuration.getSingleChoice(); + Integer m = configuration.getMultipleChoice(); + Integer e = configuration.getEstimate(); + List sEntity = iWgzQuestionBankService.appQueryList(1, s); + List mEntity = iWgzQuestionBankService.appQueryList(2, m); + List eEntity = iWgzQuestionBankService.appQueryList(3, e); + //3、组装数据 + WgzAppGetTestPaperRes res = new WgzAppGetTestPaperRes(); + res.setSingleList(createQuestionSection("一、单选题", sEntity, configuration.getSingleScore(), s)); + res.setMultipleList(createQuestionSection("二、多选题", mEntity, configuration.getMultipleScore(), m)); + res.setEstimateList(createQuestionSection("三、判断题", eEntity, configuration.getEstimateScore(), e)); + //4、设置最大考试时间 + res.setMaximum(configuration.getAnswerTime()); + return R.ok(res); + } + + /** + * 【我的】【岗前培训】提交用户的试卷(只保存最高分的试卷信息) + */ +// @SaCheckPermission("safety:wzgQuestionCategory:WgzUserSubmitATestPaper") + @Log(title = "提交用户的试卷", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/WgzUserSubmitATestPaper") + public R userSubmitATestPaper(@Validated @RequestBody WgzAppSubmitATestPaperReq req) { + return R.ok(iWgzQuestionSaveService.userSubmitATestPaper(req)); + } + + /** + * 【我的】【岗前培训】分数查询 + */ +// @SaCheckPermission("safety:wzgQuestionCategory:WgzUserScoreQuery") + @GetMapping("/WgzUserScoreQuery") + public R userScoreQuery() { + Long userId = LoginHelper.getLoginUser().getUserId(); + return R.ok(iWgzQuestionSaveService.userScoreQuery(userId)); + } + + /** + * 创建题目板块 + * @param topicPrefix 板块标题前缀 + * @param questions 题目列表 + * @param score 每题分数 + * @param questionCount 题目数量 + * @return 题目板块实体 + */ + private WgzAppGetTestPaperTwo createQuestionSection(String topicPrefix, List questions, Float score, int questionCount) { + WgzAppGetTestPaperTwo section = new WgzAppGetTestPaperTwo(); + section.setTopic(String.format("%s,共%d道题,每小题%.2f分,共计%.2f分", topicPrefix, questionCount, score, questionCount * score)); + questions.forEach(item -> item.setScore(score)); + section.setList(questions); + return section; + } + + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/WgzQuestionSaveServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/WgzQuestionSaveServiceImpl.java index 8e69935e..8e0690ba 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/WgzQuestionSaveServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/WgzQuestionSaveServiceImpl.java @@ -60,492 +60,454 @@ import java.util.regex.Pattern; */ @Service public class WgzQuestionSaveServiceImpl extends ServiceImpl implements IWgzQuestionSaveService { + + + + @Autowired + private IWgzQuestionsConfigurationService iWgzQuestionsConfigurationService; + + @Autowired + private IWgzQuestionBankService iWgzQuestionBankService; + + @Autowired + private IWgzQuestionSavePdfService wgzQuestionSavePdfService; + + @Resource + private ISysOssService ossService; + @Override public WgzQuestionSave queryById(Long id) { - return null; + return getById(id); } @Override public TableDataInfo queryPageList(WgzQuestionSaveBo bo, PageQuery pageQuery) { - return null; + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); } @Override public List queryList(WgzQuestionSaveBo bo) { - return List.of(); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WgzQuestionSaveBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByDesc(WgzQuestionSave::getId); + lqw.eq(bo.getUserId() != null, WgzQuestionSave::getUserId, bo.getUserId()); + lqw.eq(bo.getBankId() != null, WgzQuestionSave::getBankId, bo.getBankId()); + lqw.eq(StringUtils.isNotBlank(bo.getAnswer()), WgzQuestionSave::getAnswer, bo.getAnswer()); + lqw.eq(StringUtils.isNotBlank(bo.getCorrect()), WgzQuestionSave::getCorrect, bo.getCorrect()); + lqw.eq(bo.getScore() != null, WgzQuestionSave::getScore, bo.getScore()); + lqw.eq(StringUtils.isNotBlank(bo.getSign()), WgzQuestionSave::getSign, bo.getSign()); + lqw.eq(bo.getTakeTime() != null, WgzQuestionSave::getTakeTime, bo.getTakeTime()); + lqw.eq(bo.getTimeOut() != null, WgzQuestionSave::getTimeOut, bo.getTimeOut()); + lqw.eq(StringUtils.isNotBlank(bo.getPass()), WgzQuestionSave::getPass, bo.getPass()); + return lqw; } @Override public Boolean insert(WgzQuestionSave bo) { - return null; + WgzQuestionSave add = BeanUtil.toBean(bo, WgzQuestionSave.class); + validEntityBeforeSave(add); + return save(add); } @Override public Boolean update(WgzQuestionSave bo) { - return null; + WgzQuestionSave update = BeanUtil.toBean(bo, WgzQuestionSave.class); + validEntityBeforeSave(update); + return updateById(update); + } + + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(WgzQuestionSave entity) { + //TODO 做一些数据校验,如唯一约束 } @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - return null; + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return removeByIds(ids); } + /** + * APP相关 + * ================================================================================================================= + * ================================================================================================================= + * ================================================================================================================= + */ + @Override + @Transactional(rollbackFor = Exception.class) public WgzAppSubmitATestPaperRes userSubmitATestPaper(WgzAppSubmitATestPaperReq req) { - return null; + String coryPass = ""; + int coryTimeOut = 0; + Long coryTakeTime = 0L; + Double corySumScore = 0.00; + /** + * 第一部分:计算并保存最高分试卷 + */ + // 初始化第一次分数和当前考试的分数 + double scoreOne = 0.00; + double scoreTwo = 0.00; + //1、获取上次考试的分数 + Map spMap = baseMapper.getSumScoreAndPassAndSign(req.getUserId()); + if (spMap != null) { + String pass = (String) spMap.get("pass"); + if (pass != null && !pass.isEmpty()) { + String[] split = pass.split(","); + double float1 = Double.parseDouble(split[1]); + double sumScore = (double) spMap.get("sumScore"); + scoreOne = 100.00 / float1 * sumScore; + } + } + //2、获取配置信息 + WgzQuestionsConfiguration configuration = iWgzQuestionsConfigurationService.appQueryLimitOne(); + //3、计算这次用户提交的试卷信息所得到的分数 + List bqs = new ArrayList<>(); + Double fenshu = 0.0; + Integer number = 0; + Integer index = 0; + List list = req.getList(); + for (WgzAppSubmitATestPaperTwo data : list) { + String correct = ""; + String pass = ""; + // 获取题库的正确答案,然后和用户的答案作对比 + WgzQuestionBank bqb = iWgzQuestionBankService.selectById(data.getBankId()); + if (bqb == null) { + throw new RuntimeException("您的试卷被外星人卷走了!"); + } else { + if (StringUtils.isEmpty(data.getAnswer())) { + throw new RuntimeException("您还有题未答完!"); + } + if (bqb.getCorrectAnswer().toLowerCase().contains(data.getAnswer().toLowerCase())) { + correct = "1"; + fenshu = fenshu + data.getScore(); + number = number + 1; + } else { + correct = "2"; + } + } + // 记录这次的及格线和总分 + pass = configuration.getPassingScore().toString() + "," + configuration.getFullMark().toString(); + WgzQuestionSave bqsTwo = new WgzQuestionSave(); + bqsTwo.setUserId(req.getUserId()); + bqsTwo.setBankId(data.getBankId()); + bqsTwo.setAnswer(data.getAnswer()); + bqsTwo.setCorrect(correct); + bqsTwo.setScore(data.getScore()); + //这几条数据只在每张试卷的第一条数据中存储(重复的没必要每条都存储) + if (index == 0) { + bqsTwo.setTakeTime(req.getTakeTime()); + bqsTwo.setTimeOut(configuration.getAnswerTime()); + bqsTwo.setPass(pass); + + coryTakeTime = req.getTakeTime(); + coryTimeOut = configuration.getAnswerTime(); + coryPass = pass; + } + bqs.add(bqsTwo); + index = index + 1; + } + Double fullMark = configuration.getFullMark(); + scoreTwo = 100.00 / fullMark * fenshu; + WgzAppSubmitATestPaperRes res = new WgzAppSubmitATestPaperRes(); + res.setAnswerTime(configuration.getAnswerTime()); + res.setTakeTime(req.getTakeTime()); + res.setFullMark(fullMark); + res.setPassingScore(configuration.getPassingScore()); + res.setScore(fenshu); + res.setNumber(number); + //4、两次卷子的分数对比,第一次的分数比第二次大那么第二次只返回结果;第二次的分数比第一次大那么删除第一次的数据再重新插入 + if (scoreOne > scoreTwo) { + return res; + } else { + corySumScore = scoreTwo; + if (scoreOne == 0) { + // 插入新数据 + super.saveBatch(bqs); + } + // 先查询当前用户是否有答题,有就把之前的删除(真删) + int deleteResult = baseMapper.delete(new LambdaQueryWrapper().eq(WgzQuestionSave::getUserId, req.getUserId())); + if (deleteResult > 0) { + // 删除pdf + wgzQuestionSavePdfService.deleteByUserId(req.getUserId()); + // 插入新数据 + super.saveBatch(bqs); + } + } + /** + * 第二部分:分离出试卷信息 + */ + ExaminationPaper examinationPaper = separateTestInformation(req.getUserId(), configuration); + /** + * 第三部分:生成pdf并存储到数据库中 + */ + try { + String xdPath = generateExamPaper(examinationPaper); + res.setPdfStr(xdPath); + WgzQuestionSavePdf wgzQuestionSavePdf = new WgzQuestionSavePdf() + .setType("1") + .setUserId(req.getUserId()) + .setPath(xdPath) + .setPass(coryPass) + .setTimeOut(coryTimeOut) + .setTakeTime(coryTakeTime) + .setSumScore(corySumScore); + wgzQuestionSavePdfService.insert(wgzQuestionSavePdf); + } catch (Exception e1) { + throw new RuntimeException("生成PDF试卷出现了意外,请重新提交!"); + } + return res; + } + + // 分离试卷信息 + private ExaminationPaper separateTestInformation(Long userId, WgzQuestionsConfiguration configurationEntity) { + //1、组装数据 + List we = baseMapper.pdfSc(userId); + if (!we.isEmpty()) { + String sumScore = baseMapper.pdfSumScore(userId); + Integer s = configurationEntity.getSingleChoice(); + Integer m = configurationEntity.getMultipleChoice(); + Integer e = configurationEntity.getEstimate(); + ExaminationPaper rs = new ExaminationPaper() + .setPass(we.get(0).getPass()) + .setSumScore(sumScore) + .setSign(we.get(0).getSign()) + .setUserId(userId.toString()) + .setUserName(we.get(0).getUserName()); + ExaminationPaperOne one = new ExaminationPaperOne(); + ExaminationPaperOne two = new ExaminationPaperOne(); + ExaminationPaperOne three = new ExaminationPaperOne(); + one.setTopic("一、单选题,共" + s + "道题,每小题" + configurationEntity.getSingleScore() + "分,共计" + configurationEntity.getSingleScore() * s + "分"); + two.setTopic("二、多选题,共" + m + "道题,每小题" + configurationEntity.getMultipleScore() + "分,共计" + configurationEntity.getMultipleScore() * m + "分"); + three.setTopic("三、判断题,共" + e + "道题,每小题" + configurationEntity.getEstimateScore() + "分,共计" + configurationEntity.getEstimateScore() * e + "分"); + List sEntity = new ArrayList<>(); + List mEntity = new ArrayList<>(); + List eEntity = new ArrayList<>(); + for (PdfEntity data : we) { + ExaminationPaperTwo sy = new ExaminationPaperTwo(); + sy.setQuestionText(data.getQuestionText()); + sy.setOptions(data.getOptions()); + sy.setAnswer(data.getAnswer()); + sy.setCorrectAnswer(data.getCorrectAnswer()); + sy.setCorrect(data.getCorrect()); + sy.setScore(data.getScore()); + if (data.getQuestionType().equals("1")) { + sEntity.add(sy); + } + if (data.getQuestionType().equals("2")) { + mEntity.add(sy); + } + if (data.getQuestionType().equals("3")) { + eEntity.add(sy); + } + } + one.setList(sEntity); + two.setList(mEntity); + three.setList(eEntity); + rs.setSingle(one); + rs.setMultiple(two); + rs.setEstimate(three); + return rs; + } + throw new RuntimeException("未获取到试卷信息!"); + } + + // pdf生成 + private String generateExamPaper(ExaminationPaper rs) throws IOException { + String fileName = DateUtils.datePath() + File.separator + rs.getUserId() + IdUtil.fastUUID() + ".pdf"; + File desc = new File("file" + File.separator + "exam" + File.separator + fileName); + // 创建PDF文档 + PdfWriter writer = new PdfWriter(desc); + PdfDocument pdfDoc = new PdfDocument(writer); + Document document = new Document(pdfDoc, PageSize.A4); + + // 加载字体(确保 simhei.ttf 可用) + String fontPath = "fonts/simhei.ttf"; + PdfFont simhei = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H); + PdfFont simheiBold = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H); + + // 标题 + document.setFont(simheiBold).setFontSize(36); + + document.add(new Paragraph("《灵活用工岗前培训》") + .setTextAlignment(TextAlignment.CENTER)); + + document.add(new Paragraph("\n")); + + // 考生信息 + document.setFont(simhei).setFontSize(16); + document.add(new Paragraph("姓名: " + rs.getUserName())); + document.add(new Paragraph("及格线/总分: " + rs.getPass())); + document.add(new Paragraph("实际得分: " + rs.getSumScore())); + document.add(new Paragraph("\n")); + + // 处理单选、多选、判断题 + for (int i = 1; i <= 3; i++) { + ExaminationPaperOne ep; + if (i == 1) { + ep = rs.getSingle(); + } else if (i == 2) { + ep = rs.getMultiple(); + } else { + ep = rs.getEstimate(); + } + + document.setFont(simhei).setFontSize(20); + document.add(new Paragraph(ep.getTopic())); + + document.setFont(simhei).setFontSize(12); + List questionList = ep.getList(); + for (int qIndex = 0; qIndex < questionList.size(); qIndex++) { + ExaminationPaperTwo data = questionList.get(qIndex); + String questionText = (i == 3) ? + (qIndex + 1) + "、" + data.getQuestionText() + "( " + data.getAnswer() + " )" + : (qIndex + 1) + "、" + replaceBrackets(data.getQuestionText(), data.getAnswer()); + + document.add(new Paragraph(questionText)); + + // 选项 + String[] options = data.getOptions().split("@"); + for (String option : options) { + document.add(new Paragraph(" " + option)); + } + + // 标记错误答案 + if ("2".equals(data.getCorrect())) { + document.add(new Paragraph("正确答案为:" + data.getCorrectAnswer()) + .setFontColor(ColorConstants.RED)); + } + + document.add(new Paragraph("\n")); + } + } + +// // 签名部分 +// document.add(new Paragraph("\n\n\n")); +// document.setFont(simheiBold).setFontSize(16); +// document.add(new Paragraph("签字:").setTextAlignment(TextAlignment.RIGHT)); +// // 嵌入签名图片 +// if (rs.getSign() != null && !rs.getSign().isEmpty()) { +// String signPath = Paths.get(System.getProperty("user.dir"), rs.getSign()).toString(); +// File signFile = new File(signPath); +// if (signFile.exists()) { +// ImageData imageData = ImageDataFactory.create(signPath); +// Image image = new Image(imageData).scaleToFit(100, 50); +// document.add(image.setRotationAngle(Math.PI / 2)); +// } +// } + + document.close(); + SysOssVo upload = ossService.upload(desc); + // 刪除本地文件 + try { + boolean delete = desc.delete(); + if (!delete) { + log.error("删除本地文件失败"); + } + } catch (Exception e) { + log.error("删除本地文件失败", e); + } + return upload.getOssId().toString(); + } + + // 括号填充 + private String replaceBrackets(String text, String replacement) { + Pattern pattern = Pattern.compile("\\s*(\\s*)\\s*"); + Matcher matcher = pattern.matcher(text); + return matcher.replaceAll("( " + replacement + " )"); } @Override public WgzAppUserScoreQuery userScoreQuery(long userId) { - return null; + WgzAppUserScoreQuery res = new WgzAppUserScoreQuery(); + //1、查询及格分和满分,为空表示暂无记录 + LambdaQueryWrapper wra = new LambdaQueryWrapper() + .eq(WgzQuestionSave::getUserId, userId); + List savaList = baseMapper.selectList(wra); + if (savaList.isEmpty()) { + res.setIsPass("3"); + return res; + } + //2、查询用户答对的分数 + float sumScore = baseMapper.getSumScore(userId); + //3、计算上次分数是否及格 + String pass = savaList.get(0).getPass(); + if (pass != null && !pass.isEmpty()) { + String[] split = pass.split(","); + float fullMark = Float.parseFloat(split[1]); + float passingGrade = Float.parseFloat(split[0]); +// // 100分 / 满分 * 答对的分数 = 当前分数 +// double score = 100.00 / fullMark * sumScore; +// // 使用 DecimalFormat 保证分数最多1位小数 +// DecimalFormat df = new DecimalFormat("#.#"); +// score = Double.parseDouble(df.format(score)); + // 当前分数 >= 及格线 = 及格 否则 不及格 + if (sumScore >= passingGrade) { + res.setIsPass("1"); + } else { + res.setIsPass("2"); + } + res.setFullMark(fullMark); + res.setPassingScore(passingGrade); + } + res.setCurrentMinute(sumScore); + //4、获取pdf试卷信息 + WgzQuestionSavePdf wgzQuestionSavePdf = wgzQuestionSavePdfService.queryByUserId(userId); + if (wgzQuestionSavePdf != null) { + res.setPdfStr(wgzQuestionSavePdf.getPath()); + } + return res; } +// @Override +// public BgtQuestionResult getResult(Long userId) { // -// @Autowired -// private IWgzQuestionsConfigurationService iWgzQuestionsConfigurationService; +// BgtQuestionResult bgtQuestionResult = new BgtQuestionResult(); // -// @Autowired -// private IWgzQuestionBankService iWgzQuestionBankService; +// WgzUser byUserId = wgzUserService.findByUserId(userId); +// if(byUserId == null){ +// throw new BaseException("用户不存在"); +// } +// bgtQuestionResult.setAvatarName(byUserId.getAvatarName()); // -// @Autowired -// private IWgzQuestionSavePdfService wgzQuestionSavePdfService; +// LambdaQueryWrapper wra = new LambdaQueryWrapper() +// .eq(WgzQuestionSave::getUserId, userId); +// List savaList = baseMapper.selectList(wra); // -// @Resource -// private ISysOssService ossService; +// double score= 0d; +// int successNum = 0; +// int errorNum= 0; +// long time= 0L; // -// @Override -// public WgzQuestionSave queryById(Long id) { -// return getById(id); -// } +// for (WgzQuestionSave wgzQuestionSave : savaList){ +// if(wgzQuestionSave.getCorrect().equals("1")){ +// score += wgzQuestionSave.getScore(); +// successNum++; +// }else{ +// errorNum++; +// } +// if(wgzQuestionSave.getTakeTime() != null){ +// time += wgzQuestionSave.getTakeTime(); +// } +// } // -// @Override -// public TableDataInfo queryPageList(WgzQuestionSaveBo bo, PageQuery pageQuery) { -// LambdaQueryWrapper lqw = buildQueryWrapper(bo); -// Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); -// return TableDataInfo.build(result); -// } -// -// @Override -// public List queryList(WgzQuestionSaveBo bo) { -// LambdaQueryWrapper lqw = buildQueryWrapper(bo); -// return baseMapper.selectVoList(lqw); -// } -// -// private LambdaQueryWrapper buildQueryWrapper(WgzQuestionSaveBo bo) { -// Map params = bo.getParams(); -// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); -// lqw.orderByDesc(WgzQuestionSave::getId); -// lqw.eq(bo.getUserId() != null, WgzQuestionSave::getUserId, bo.getUserId()); -// lqw.eq(bo.getBankId() != null, WgzQuestionSave::getBankId, bo.getBankId()); -// lqw.eq(StringUtils.isNotBlank(bo.getAnswer()), WgzQuestionSave::getAnswer, bo.getAnswer()); -// lqw.eq(StringUtils.isNotBlank(bo.getCorrect()), WgzQuestionSave::getCorrect, bo.getCorrect()); -// lqw.eq(bo.getScore() != null, WgzQuestionSave::getScore, bo.getScore()); -// lqw.eq(StringUtils.isNotBlank(bo.getSign()), WgzQuestionSave::getSign, bo.getSign()); -// lqw.eq(bo.getTakeTime() != null, WgzQuestionSave::getTakeTime, bo.getTakeTime()); -// lqw.eq(bo.getTimeOut() != null, WgzQuestionSave::getTimeOut, bo.getTimeOut()); -// lqw.eq(StringUtils.isNotBlank(bo.getPass()), WgzQuestionSave::getPass, bo.getPass()); -// return lqw; -// } -// -// @Override -// public Boolean insert(WgzQuestionSave bo) { -// WgzQuestionSave add = BeanUtil.toBean(bo, WgzQuestionSave.class); -// validEntityBeforeSave(add); -// return save(add); -// } -// -// @Override -// public Boolean update(WgzQuestionSave bo) { -// WgzQuestionSave update = BeanUtil.toBean(bo, WgzQuestionSave.class); -// validEntityBeforeSave(update); -// return updateById(update); -// } -// -// /** -// * 保存前的数据校验 -// * -// * @param entity 实体类数据 -// */ -// private void validEntityBeforeSave(WgzQuestionSave entity) { -// //TODO 做一些数据校验,如唯一约束 -// } -// -// @Override -// public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { -// if (isValid) { -// //TODO 做一些业务上的校验,判断是否需要校验 -// } -// return removeByIds(ids); -// } -// -// /** -// * APP相关 -// * ================================================================================================================= -// * ================================================================================================================= -// * ================================================================================================================= -// */ -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public WgzAppSubmitATestPaperRes userSubmitATestPaper(WgzAppSubmitATestPaperReq req) { -// String coryPass = ""; -// int coryTimeOut = 0; -// Long coryTakeTime = 0L; -// Double corySumScore = 0.00; -// /** -// * 第一部分:计算并保存最高分试卷 -// */ -// // 初始化第一次分数和当前考试的分数 -// double scoreOne = 0.00; -// double scoreTwo = 0.00; -// //1、获取上次考试的分数 -// Map spMap = baseMapper.getSumScoreAndPassAndSign(req.getUserId()); -// if (spMap != null) { -// String pass = (String) spMap.get("pass"); -// if (pass != null && !pass.isEmpty()) { -// String[] split = pass.split(","); -// double float1 = Double.parseDouble(split[1]); -// double sumScore = (double) spMap.get("sumScore"); -// scoreOne = 100.00 / float1 * sumScore; -// } -// } -// //2、获取配置信息 -// WgzQuestionsConfiguration configuration = iWgzQuestionsConfigurationService.appQueryLimitOne(); -// //3、计算这次用户提交的试卷信息所得到的分数 -// List bqs = new ArrayList<>(); -// Double fenshu = 0.0; -// Integer number = 0; -// Integer index = 0; -// List list = req.getList(); -// for (WgzAppSubmitATestPaperTwo data : list) { -// String correct = ""; -// String pass = ""; -// // 获取题库的正确答案,然后和用户的答案作对比 -// WgzQuestionBank bqb = iWgzQuestionBankService.selectById(data.getBankId()); -// if (bqb == null) { -// throw new RuntimeException("您的试卷被外星人卷走了!"); -// } else { -// if (StringUtils.isEmpty(data.getAnswer())) { -// throw new RuntimeException("您还有题未答完!"); -// } -// if (bqb.getCorrectAnswer().toLowerCase().contains(data.getAnswer().toLowerCase())) { -// correct = "1"; -// fenshu = fenshu + data.getScore(); -// number = number + 1; -// } else { -// correct = "2"; -// } -// } -// // 记录这次的及格线和总分 -// pass = configuration.getPassingScore().toString() + "," + configuration.getFullMark().toString(); -// WgzQuestionSave bqsTwo = new WgzQuestionSave(); -// bqsTwo.setUserId(req.getUserId()); -// bqsTwo.setBankId(data.getBankId()); -// bqsTwo.setAnswer(data.getAnswer()); -// bqsTwo.setCorrect(correct); -// bqsTwo.setScore(data.getScore()); -// //这几条数据只在每张试卷的第一条数据中存储(重复的没必要每条都存储) -// if (index == 0) { -// bqsTwo.setTakeTime(req.getTakeTime()); -// bqsTwo.setTimeOut(configuration.getAnswerTime()); -// bqsTwo.setPass(pass); -// -// coryTakeTime = req.getTakeTime(); -// coryTimeOut = configuration.getAnswerTime(); -// coryPass = pass; -// } -// bqs.add(bqsTwo); -// index = index + 1; -// } -// Double fullMark = configuration.getFullMark(); -// scoreTwo = 100.00 / fullMark * fenshu; -// WgzAppSubmitATestPaperRes res = new WgzAppSubmitATestPaperRes(); -// res.setAnswerTime(configuration.getAnswerTime()); -// res.setTakeTime(req.getTakeTime()); -// res.setFullMark(fullMark); -// res.setPassingScore(configuration.getPassingScore()); -// res.setScore(fenshu); -// res.setNumber(number); -// //4、两次卷子的分数对比,第一次的分数比第二次大那么第二次只返回结果;第二次的分数比第一次大那么删除第一次的数据再重新插入 -// if (scoreOne > scoreTwo) { -// return res; -// } else { -// corySumScore = scoreTwo; -// if (scoreOne == 0) { -// // 插入新数据 -// super.saveBatch(bqs); -// } -// // 先查询当前用户是否有答题,有就把之前的删除(真删) -// int deleteResult = baseMapper.delete(new LambdaQueryWrapper().eq(WgzQuestionSave::getUserId, req.getUserId())); -// if (deleteResult > 0) { -// // 删除pdf -// wgzQuestionSavePdfService.deleteByUserId(req.getUserId()); -// // 插入新数据 -// super.saveBatch(bqs); -// } -// } -// /** -// * 第二部分:分离出试卷信息 -// */ -// ExaminationPaper examinationPaper = separateTestInformation(req.getUserId(), configuration); -// /** -// * 第三部分:生成pdf并存储到数据库中 -// */ -// try { -// String xdPath = generateExamPaper(examinationPaper); -// res.setPdfStr(xdPath); -// WgzQuestionSavePdf wgzQuestionSavePdf = new WgzQuestionSavePdf() -// .setType("1") -// .setUserId(req.getUserId()) -// .setPath(xdPath) -// .setPass(coryPass) -// .setTimeOut(coryTimeOut) -// .setTakeTime(coryTakeTime) -// .setSumScore(corySumScore); -// wgzQuestionSavePdfService.insert(wgzQuestionSavePdf); -// } catch (Exception e1) { -// throw new RuntimeException("生成PDF试卷出现了意外,请重新提交!"); -// } -// return res; -// } -// -// // 分离试卷信息 -// private ExaminationPaper separateTestInformation(Long userId, WgzQuestionsConfiguration configurationEntity) { -// //1、组装数据 -// List we = baseMapper.pdfSc(userId); -// if (!we.isEmpty()) { -// String sumScore = baseMapper.pdfSumScore(userId); -// Integer s = configurationEntity.getSingleChoice(); -// Integer m = configurationEntity.getMultipleChoice(); -// Integer e = configurationEntity.getEstimate(); -// ExaminationPaper rs = new ExaminationPaper() -// .setPass(we.get(0).getPass()) -// .setSumScore(sumScore) -// .setSign(we.get(0).getSign()) -// .setUserId(userId.toString()) -// .setUserName(we.get(0).getUserName()); -// ExaminationPaperOne one = new ExaminationPaperOne(); -// ExaminationPaperOne two = new ExaminationPaperOne(); -// ExaminationPaperOne three = new ExaminationPaperOne(); -// one.setTopic("一、单选题,共" + s + "道题,每小题" + configurationEntity.getSingleScore() + "分,共计" + configurationEntity.getSingleScore() * s + "分"); -// two.setTopic("二、多选题,共" + m + "道题,每小题" + configurationEntity.getMultipleScore() + "分,共计" + configurationEntity.getMultipleScore() * m + "分"); -// three.setTopic("三、判断题,共" + e + "道题,每小题" + configurationEntity.getEstimateScore() + "分,共计" + configurationEntity.getEstimateScore() * e + "分"); -// List sEntity = new ArrayList<>(); -// List mEntity = new ArrayList<>(); -// List eEntity = new ArrayList<>(); -// for (PdfEntity data : we) { -// ExaminationPaperTwo sy = new ExaminationPaperTwo(); -// sy.setQuestionText(data.getQuestionText()); -// sy.setOptions(data.getOptions()); -// sy.setAnswer(data.getAnswer()); -// sy.setCorrectAnswer(data.getCorrectAnswer()); -// sy.setCorrect(data.getCorrect()); -// sy.setScore(data.getScore()); -// if (data.getQuestionType().equals("1")) { -// sEntity.add(sy); -// } -// if (data.getQuestionType().equals("2")) { -// mEntity.add(sy); -// } -// if (data.getQuestionType().equals("3")) { -// eEntity.add(sy); -// } -// } -// one.setList(sEntity); -// two.setList(mEntity); -// three.setList(eEntity); -// rs.setSingle(one); -// rs.setMultiple(two); -// rs.setEstimate(three); -// return rs; -// } -// throw new RuntimeException("未获取到试卷信息!"); -// } -// -// // pdf生成 -// private String generateExamPaper(ExaminationPaper rs) throws IOException { -// String fileName = DateUtils.datePath() + File.separator + rs.getUserId() + IdUtil.fastUUID() + ".pdf"; -// File desc = new File("file" + File.separator + "exam" + File.separator + fileName); -// // 创建PDF文档 -// PdfWriter writer = new PdfWriter(desc); -// PdfDocument pdfDoc = new PdfDocument(writer); -// Document document = new Document(pdfDoc, PageSize.A4); -// -// // 加载字体(确保 simhei.ttf 可用) -// String fontPath = "fonts/simhei.ttf"; -// PdfFont simhei = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H); -// PdfFont simheiBold = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H); -// -// // 标题 -// document.setFont(simheiBold).setFontSize(36); -// -// document.add(new Paragraph("《灵活用工岗前培训》") -// .setTextAlignment(TextAlignment.CENTER)); -// -// document.add(new Paragraph("\n")); -// -// // 考生信息 -// document.setFont(simhei).setFontSize(16); -// document.add(new Paragraph("姓名: " + rs.getUserName())); -// document.add(new Paragraph("及格线/总分: " + rs.getPass())); -// document.add(new Paragraph("实际得分: " + rs.getSumScore())); -// document.add(new Paragraph("\n")); -// -// // 处理单选、多选、判断题 -// for (int i = 1; i <= 3; i++) { -// ExaminationPaperOne ep; -// if (i == 1) { -// ep = rs.getSingle(); -// } else if (i == 2) { -// ep = rs.getMultiple(); -// } else { -// ep = rs.getEstimate(); -// } -// -// document.setFont(simhei).setFontSize(20); -// document.add(new Paragraph(ep.getTopic())); -// -// document.setFont(simhei).setFontSize(12); -// List questionList = ep.getList(); -// for (int qIndex = 0; qIndex < questionList.size(); qIndex++) { -// ExaminationPaperTwo data = questionList.get(qIndex); -// String questionText = (i == 3) ? -// (qIndex + 1) + "、" + data.getQuestionText() + "( " + data.getAnswer() + " )" -// : (qIndex + 1) + "、" + replaceBrackets(data.getQuestionText(), data.getAnswer()); -// -// document.add(new Paragraph(questionText)); -// -// // 选项 -// String[] options = data.getOptions().split("@"); -// for (String option : options) { -// document.add(new Paragraph(" " + option)); -// } -// -// // 标记错误答案 -// if ("2".equals(data.getCorrect())) { -// document.add(new Paragraph("正确答案为:" + data.getCorrectAnswer()) -// .setFontColor(ColorConstants.RED)); -// } -// -// document.add(new Paragraph("\n")); -// } -// } -// -//// // 签名部分 -//// document.add(new Paragraph("\n\n\n")); -//// document.setFont(simheiBold).setFontSize(16); -//// document.add(new Paragraph("签字:").setTextAlignment(TextAlignment.RIGHT)); -//// // 嵌入签名图片 -//// if (rs.getSign() != null && !rs.getSign().isEmpty()) { -//// String signPath = Paths.get(System.getProperty("user.dir"), rs.getSign()).toString(); -//// File signFile = new File(signPath); -//// if (signFile.exists()) { -//// ImageData imageData = ImageDataFactory.create(signPath); -//// Image image = new Image(imageData).scaleToFit(100, 50); -//// document.add(image.setRotationAngle(Math.PI / 2)); -//// } -//// } -// -// document.close(); -// SysOssVo upload = ossService.upload(desc); -// // 刪除本地文件 -// try { -// boolean delete = desc.delete(); -// if (!delete) { -// log.error("删除本地文件失败"); -// } -// } catch (Exception e) { -// log.error("删除本地文件失败", e); -// } -// return upload.getOssId().toString(); -// } -// -// // 括号填充 -// private String replaceBrackets(String text, String replacement) { -// Pattern pattern = Pattern.compile("\\s*(\\s*)\\s*"); -// Matcher matcher = pattern.matcher(text); -// return matcher.replaceAll("( " + replacement + " )"); -// } -// -// @Override -// public WgzAppUserScoreQuery userScoreQuery(long userId) { -// WgzAppUserScoreQuery res = new WgzAppUserScoreQuery(); -// //1、查询及格分和满分,为空表示暂无记录 -// LambdaQueryWrapper wra = new LambdaQueryWrapper() -// .eq(WgzQuestionSave::getUserId, userId); -// List savaList = baseMapper.selectList(wra); -// if (savaList.isEmpty()) { -// res.setIsPass("3"); -// return res; -// } -// //2、查询用户答对的分数 -// float sumScore = baseMapper.getSumScore(userId); -// //3、计算上次分数是否及格 -// String pass = savaList.get(0).getPass(); -// if (pass != null && !pass.isEmpty()) { -// String[] split = pass.split(","); -// float fullMark = Float.parseFloat(split[1]); -// float passingGrade = Float.parseFloat(split[0]); -//// // 100分 / 满分 * 答对的分数 = 当前分数 -//// double score = 100.00 / fullMark * sumScore; -//// // 使用 DecimalFormat 保证分数最多1位小数 -//// DecimalFormat df = new DecimalFormat("#.#"); -//// score = Double.parseDouble(df.format(score)); -// // 当前分数 >= 及格线 = 及格 否则 不及格 -// if (sumScore >= passingGrade) { -// res.setIsPass("1"); -// } else { -// res.setIsPass("2"); -// } -// res.setFullMark(fullMark); -// res.setPassingScore(passingGrade); -// } -// res.setCurrentMinute(sumScore); -// //4、获取pdf试卷信息 -// WgzQuestionSavePdf wgzQuestionSavePdf = wgzQuestionSavePdfService.queryByUserId(userId); -// if (wgzQuestionSavePdf != null) { -// res.setPdfStr(wgzQuestionSavePdf.getPath()); -// } -// return res; -// } -// -//// @Override -//// public BgtQuestionResult getResult(Long userId) { -//// -//// BgtQuestionResult bgtQuestionResult = new BgtQuestionResult(); -//// -//// WgzUser byUserId = wgzUserService.findByUserId(userId); -//// if(byUserId == null){ -//// throw new BaseException("用户不存在"); -//// } -//// bgtQuestionResult.setAvatarName(byUserId.getAvatarName()); -//// -//// LambdaQueryWrapper wra = new LambdaQueryWrapper() -//// .eq(WgzQuestionSave::getUserId, userId); -//// List savaList = baseMapper.selectList(wra); -//// -//// double score= 0d; -//// int successNum = 0; -//// int errorNum= 0; -//// long time= 0L; -//// -//// for (WgzQuestionSave wgzQuestionSave : savaList){ -//// if(wgzQuestionSave.getCorrect().equals("1")){ -//// score += wgzQuestionSave.getScore(); -//// successNum++; -//// }else{ -//// errorNum++; -//// } -//// if(wgzQuestionSave.getTakeTime() != null){ -//// time += wgzQuestionSave.getTakeTime(); -//// } -//// } -//// -//// bgtQuestionResult.setScore(score); -//// bgtQuestionResult.setSuccessNum(successNum); -//// bgtQuestionResult.setErrorNum(errorNum); -//// bgtQuestionResult.setTime(time); -//// return bgtQuestionResult; -//// } +// bgtQuestionResult.setScore(score); +// bgtQuestionResult.setSuccessNum(successNum); +// bgtQuestionResult.setErrorNum(errorNum); +// bgtQuestionResult.setTime(time); +// return bgtQuestionResult; +// } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/out/OutMonthPlanMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/out/OutMonthPlanMapper.xml index 0bac7403..932da817 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/out/OutMonthPlanMapper.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/out/OutMonthPlanMapper.xml @@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM bus_bidding_limit_list AS a where - a.project_id = #{projectId} + a.project_id = #{projectId} and unit_price is not NULL and DATE_FORMAT(a.create_time,'%Y-%m') = #{planMonth}