From fd3dda9bb29b37d420ed41e34b39c7c274572daa Mon Sep 17 00:00:00 2001 From: "@jyuhsin" <729757837@qq.com> Date: Thu, 24 Apr 2025 16:06:36 +0800 Subject: [PATCH] commit --- .../v/nutz/base/utils/CommonDownloadUtil.java | 92 ++++++++++++++++++ .../qsv/controller/QsvActivityController.java | 7 ++ .../qsv/controller/QsvQuizRankController.java | 2 +- .../qsv/h5controller/H5QsvController.java | 3 +- .../qsv/h5controller/H5QsvQuizController.java | 52 +++++++--- .../h5controller/H5QsvSurveyController.java | 2 +- .../v/nutz/zhgh/qsv/models/QsvActivity.java | 29 +++++- .../service/impl/QsvQuizRankServiceImpl.java | 4 +- .../service/impl/QsvSurveyServiceImpl.java | 16 +-- .../impl/QsvUserAnswerRecordServiceImpl.java | 8 +- .../assets/mobile/img/commonActivity.png | Bin 0 -> 348991 bytes .../static/components/plugins/OpenQRCode.vue | 10 +- src/main/resources/views/mobile/home.html | 7 +- .../resources/views/mobile/qsv/index.html | 11 +++ .../views/mobile/qsv/quiz/index.html | 78 +++++++++------ .../views/mobile/qsv/quiz/result.html | 53 ++++++++-- .../views/mobile/qsv/survey/index.html | 11 +++ .../platform/member/change/manage/index.html | 8 +- .../views/platform/qsv/activity/basicForm.js | 2 +- .../platform/qsv/activity/subjectForm.js | 3 +- .../views/platform/qsv/quiz/rank.html | 2 +- .../views/platform/qsv/survey/answer.js | 6 +- .../views/platform/qsv/survey/index.html | 6 +- .../views/platform/qsv/survey/report.js | 56 +++++++++-- .../views/platform/sys/home/activity.js | 4 +- 25 files changed, 377 insertions(+), 95 deletions(-) create mode 100644 src/main/java/io/v/nutz/base/utils/CommonDownloadUtil.java create mode 100644 src/main/resources/static/assets/mobile/img/commonActivity.png diff --git a/src/main/java/io/v/nutz/base/utils/CommonDownloadUtil.java b/src/main/java/io/v/nutz/base/utils/CommonDownloadUtil.java new file mode 100644 index 0000000..fd153c5 --- /dev/null +++ b/src/main/java/io/v/nutz/base/utils/CommonDownloadUtil.java @@ -0,0 +1,92 @@ +/* + * Copyright [2022] [https://www.xiaonuo.vip] + * + * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Snowy源码头部的版权声明。 + * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip + * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。 + * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip + */ +package io.v.nutz.base.utils; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.URLUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; + +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; + +/** + * 文件下载工具类,使用本类前,对参数校验的异常使用CommonResponseUtil.renderError()方法进行渲染 + * + * @author xuyuxiang + * @date 2020/8/5 21:45 + */ +@Slf4j +public class CommonDownloadUtil { + + /** + * 下载文件 + * + * @param file 要下载的文件 + * @param response 响应 + * @author xuyuxiang + * @date 2020/8/5 21:46 + */ + public static void download(File file, HttpServletResponse response) { + download(file.getName(), FileUtil.readBytes(file), response); + } + + /** + * 下载文件 + * + * @param fileName + * @param workbook + * @param response + */ + public static void download(String fileName, Workbook workbook, HttpServletResponse response) { + ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); + try { + workbook.write(byteOs); + } catch (IOException e) { + e.printStackTrace(); + log.error(">>> 文件下载异常:", e); + } finally { + try { + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + IoUtil.close(byteOs); + } + download(fileName, byteOs.toByteArray(), response); + } + + /** + * 下载文件 + * + * @author xuyuxiang + * @date 2022/7/31 10:57 + */ + public static void download(String fileName, byte[] fileBytes, HttpServletResponse response) { + try { + response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode(fileName)); + response.addHeader("Content-Length", "" + fileBytes.length); + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setContentType("application/octet-stream;charset=UTF-8"); + IoUtil.write(response.getOutputStream(), true, fileBytes); + } catch (IOException e) { + log.error(">>> 文件下载异常:", e); + } + } + + +} diff --git a/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvActivityController.java b/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvActivityController.java index af0476a..b5f866d 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvActivityController.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvActivityController.java @@ -3,6 +3,7 @@ package io.v.nutz.zhgh.qsv.controller; import cn.wizzer.framework.base.Result; import io.v.nutz.base.page.Pagination; import io.v.nutz.base.query.PageForm; +import io.v.nutz.sys.models.Sys_home_activity; import io.v.nutz.zhgh.qsv.models.QsvActivity; import io.v.nutz.zhgh.qsv.models.QsvOption; import io.v.nutz.zhgh.qsv.models.QsvSubject; @@ -64,6 +65,12 @@ public class QsvActivityController { } } dao.insertOrUpdate(qsvActivity); + if (!qsvActivity.getDelFlag()) { + Sys_home_activity sysHomeActivity = qsvActivity.covertToSysHomeActivity(); + dao.insertOrUpdate(sysHomeActivity); + } else { + dao.delete(Sys_home_activity.class, qsvActivity.getId()); + } return Result.success(); } diff --git a/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvQuizRankController.java b/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvQuizRankController.java index d13c12c..034d4b2 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvQuizRankController.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/controller/QsvQuizRankController.java @@ -55,7 +55,7 @@ public class QsvQuizRankController { @At @Ok("void") @RequiresPermissions("qsv.quiz.rank") - public void exportXlsx(@Valid QsvQuizRankPageForm pageForm, HttpServletResponse response) { + public void exportXlsx(QsvQuizRankPageForm pageForm, HttpServletResponse response) { qsvQuizRankService.exportXlsx(pageForm, response); } diff --git a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvController.java b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvController.java index f8c3204..28d342a 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvController.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvController.java @@ -34,9 +34,10 @@ public class H5QsvController { // 分页查询 @At @RequiresAuthentication - public Result pageData(@Valid PageForm pageForm, @Valid String category) { + public Result pageData(@Valid PageForm pageForm, @Valid String category, String queryId) { Cnd cnd = Cnd.NEW(); cnd.andEX("category", "=", category); + cnd.andEX("id", "=", queryId); cnd.desc("startTime"); Pagination pagination = qsvActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd); return Result.success(pagination); diff --git a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvQuizController.java b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvQuizController.java index 493220a..5dba281 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvQuizController.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvQuizController.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONObject; import cn.wizzer.framework.base.Result; import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.activity.models.ActivityUserScope; import io.v.nutz.zhgh.qsv.dto.QsvCheckAnswerResult; import io.v.nutz.zhgh.qsv.models.QsvActivity; import io.v.nutz.zhgh.qsv.models.QsvSubject; @@ -60,6 +61,12 @@ public class H5QsvQuizController { @RequiresAuthentication public Result subjects(@Valid String activityId) { QsvActivity activity = dao.fetch(QsvActivity.class, activityId); + + int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getGroupId()).and("userId", "=", ShiroUtil.getUserId())); + if (count != 1) { + return Result.error("您无需参加此次答题,感谢您的关注!"); + } + String mode = activity.getMode(); //能否重复答题 Boolean repeatable = activity.getRepeatable(); @@ -69,6 +76,8 @@ public class H5QsvQuizController { Integer maxAttempts = activity.getMaxAttempts(); //题目显示模式 String displayMode = activity.getDisplayMode(); + // 重复答题,显示提示 + Boolean repeatTips = false; //最终返回的题目数据 List resultSubjects = new ArrayList<>(); @@ -78,7 +87,7 @@ public class H5QsvQuizController { List answerRecords = dao.query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) .and("userId", "=", ShiroUtil.getUserId())); - if (activity.getEndTime().after(new Date())) { + if (activity.getEndTime().before(new Date())) { //已结束 查询最新一次的答题记录 Optional lastRecordOptional = answerRecords.stream().max(Comparator.comparing(QsvUserAnswerRecord::getAnswerTime)); if (lastRecordOptional.isPresent()) { @@ -102,13 +111,13 @@ public class H5QsvQuizController { } } else { - if (mode.equals("REGULAR")) { + if ("REGULAR".equals(mode)) { if (ObjectUtil.isEmpty(answerRecords)) { //首次进来生成答题记录 - if (displayMode.equals("ALL")) { - resultSubjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId)); + if ("ALL".equals(displayMode)) { + resultSubjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId).asc("sortNum")); answerRecordId = qsvUserAnswerRecordService.insertRecord(activityId, resultSubjects.stream().map(QsvSubject::getId).collect(Collectors.toList())).getId(); - } else if (displayMode.equals("RANDOM")) { + } else if ("RANDOM".equals(displayMode)) { //单次随机抽取题目数量 Integer randomCount = activity.getRandomCount(); @@ -130,21 +139,31 @@ public class H5QsvQuizController { resultSubjects = dao.query(QsvSubject.class, cnd); } } else { - if (displayMode.equals("ALL")) { + if ("ALL".equals(displayMode)) { //判断能否重复答题 如果可重复要根据次数判断是否再次生成记录 不能重复直接返回最新的一次记录 if (repeatable) { //已回答次数 if (answerRecords.size() < maxAttempts) { //生成答题记录 - List subjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId)); - answerRecordId = qsvUserAnswerRecordService.insertRecord(activityId, subjects.stream().map(QsvSubject::getId).collect(Collectors.toList())).getId(); - QsvUserAnswerRecord answerRecord = dao.fetch(QsvUserAnswerRecord.class, answerRecordId); + QsvUserAnswerRecord fetch = dao.fetch(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) + .and("userId", "=", ShiroUtil.getUserId()).and("isFinish", "=", false) + .desc("randomNumber")); + List subjectIds = new ArrayList<>(); + if (fetch == null) { + List subjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId).asc("sortNum")); + answerRecordId = qsvUserAnswerRecordService.insertRecord(activityId, subjects.stream().map(QsvSubject::getId).collect(Collectors.toList())).getId(); + QsvUserAnswerRecord answerRecord = dao.fetch(QsvUserAnswerRecord.class, answerRecordId); + subjectIds = answerRecord.getSubjectIds(); - List subjectIds = answerRecord.getSubjectIds(); + } else { + subjectIds = fetch.getSubjectIds(); + answerRecordId = fetch.getId(); + } Cnd cnd = Cnd.where("id", "in", subjectIds); String dynamic = subjectIds.stream().map(id -> "'" + id + "'").collect(Collectors.joining(",")); cnd.and(new Static("1=1 ORDER BY FIELD (id," + dynamic + ")")); resultSubjects = dao.query(QsvSubject.class, cnd); + repeatTips = true; } else { //已达到最大次数 返回最新一次记录 Optional maxAnswerRecordOptional = answerRecords.stream().max(Comparator.comparingLong(QsvUserAnswerRecord::getRandomNumber)); @@ -172,7 +191,7 @@ public class H5QsvQuizController { throw new RuntimeException("业务异常"); } } - } else if (displayMode.equals("RANDOM")) { + } else if ("RANDOM".equals(displayMode)) { //判断是否有未答完的记录 Optional notFinishRecordOptional = answerRecords.stream().filter(r -> !r.getIsFinish()).findFirst(); if (notFinishRecordOptional.isPresent()) { @@ -200,7 +219,7 @@ public class H5QsvQuizController { //进行下一次抽取 List subjectIds = answerRecords.stream().map(QsvUserAnswerRecord::getSubjectIds).flatMap(Collection::stream).toList(); List subjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId) - .and("id", "not in", subjectIds)); + .and("id", "not in", subjectIds).asc("sortNum")); if (subjects.size() < randomCount) { throw new RuntimeException("题目数不够,无法生成题目"); @@ -230,7 +249,7 @@ public class H5QsvQuizController { } } } - } else if (mode.equals("SCHEDULED")) { + } else if ("SCHEDULED".equals(mode)) { //定时定题 //查询今天的题目 @@ -246,7 +265,7 @@ public class H5QsvQuizController { if (todayAllFinish && todayRecords.size() < maxAttempts) { //生成今天的记录 List subjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId) - .and("displayDate", "=", DateUtil.today())); + .and("displayDate", "=", DateUtil.today()).asc("sortNum")); QsvUserAnswerRecord answerRecord = qsvUserAnswerRecordService.insertRecord(activityId, subjects.stream().map(QsvSubject::getId).collect(Collectors.toList())); answerRecordId = answerRecord.getId(); @@ -273,7 +292,7 @@ public class H5QsvQuizController { } else { //生成今天的记录 List subjects = dao.query(QsvSubject.class, Cnd.where("activityId", "=", activityId) - .and("displayDate", "=", DateUtil.today())); + .and("displayDate", "=", DateUtil.today()).asc("sortNum")); QsvUserAnswerRecord answerRecord = qsvUserAnswerRecordService.insertRecord(activityId, subjects.stream().map(QsvSubject::getId).collect(Collectors.toList())); answerRecordId = answerRecord.getId(); @@ -290,7 +309,8 @@ public class H5QsvQuizController { resultSubjects.forEach(v -> v.setUserSelectOptionIds(new ArrayList<>())); - NutMap result = NutMap.NEW().addv("subjects", resultSubjects).addv("answerRecordId", answerRecordId).addv("activity", activity); + NutMap result = NutMap.NEW().addv("subjects", resultSubjects).addv("answerRecordId", answerRecordId) + .addv("activity", activity).addv("repeatTips", repeatTips); return Result.success(result); } diff --git a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvSurveyController.java b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvSurveyController.java index e28a6e1..8032c2c 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvSurveyController.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/h5controller/H5QsvSurveyController.java @@ -66,7 +66,7 @@ public class H5QsvSurveyController { answerRecordId = answerRecord2.getId(); - List subjects = dao.query(QsvSubject.class, Cnd.where("id", "in", answerRecord2.getSubjectIds())); + List subjects = dao.query(QsvSubject.class, Cnd.where("id", "in", answerRecord2.getSubjectIds()).asc("sortNum")); dao.fetchLinks(subjects, "options", Cnd.NEW().asc("sortNum")); for (QsvSubject subject : subjects) { diff --git a/src/main/java/io/v/nutz/zhgh/qsv/models/QsvActivity.java b/src/main/java/io/v/nutz/zhgh/qsv/models/QsvActivity.java index 35c2cb8..f7af550 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/models/QsvActivity.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/models/QsvActivity.java @@ -1,10 +1,16 @@ package io.v.nutz.zhgh.qsv.models; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import io.v.nutz.base.model.BaseModel; +import io.v.nutz.base.utils.DateUtil; +import io.v.nutz.sys.models.Sys_home_activity; +import io.v.nutz.sys.services.SysHomeConvert; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; import org.nutz.dao.interceptor.annotation.PrevInsert; +import org.nutz.lang.Lang; import java.util.Date; @@ -13,7 +19,8 @@ import java.util.Date; @Table("qsv_activity") @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("问卷调查投票活动表") -public class QsvActivity extends BaseModel { +public class QsvActivity extends BaseModel implements SysHomeConvert { + @Name @Comment("ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -106,4 +113,24 @@ public class QsvActivity extends BaseModel { @Comment("封面图片") @ColDefine(type = ColType.VARCHAR, width = 255) private String cover; + + @Override + public Sys_home_activity covertToSysHomeActivity() { + Sys_home_activity sysHomeActivity = new Sys_home_activity(); + sysHomeActivity.setId(this.getId()); + sysHomeActivity.setName(this.getTitle()); + if(StrUtil.isNotEmpty(this.getCover())){ + sysHomeActivity.setCover(this.getCover()); + } + sysHomeActivity.setUrl(null); + sysHomeActivity.setH5Url("/platform/h5/qsv?category=" + this.getCategory() + "&id=" + this.getId()); + if (Lang.isNotEmpty(this.getStartTime())) { + sysHomeActivity.setStartDate(this.getStartTime()); + sysHomeActivity.setEndDate(this.getEndTime()); + } + sysHomeActivity.setAllowUserGroupId(this.getGroupId()); + sysHomeActivity.setEnable(!this.getDelFlag()); + sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName()); + return sysHomeActivity; + } } diff --git a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvQuizRankServiceImpl.java b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvQuizRankServiceImpl.java index b23fdee..04a3117 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvQuizRankServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvQuizRankServiceImpl.java @@ -7,6 +7,7 @@ import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.hutool.core.util.StrUtil; import io.v.nutz.base.page.Pagination; import io.v.nutz.base.service.impl.BaseServiceImpl; +import io.v.nutz.base.utils.CommonDownloadUtil; import io.v.nutz.zhgh.qsv.models.QsvActivity; import io.v.nutz.zhgh.qsv.models.QsvUserAnswerRecord; import io.v.nutz.zhgh.qsv.param.QsvQuizRankPageForm; @@ -83,7 +84,7 @@ public class QsvQuizRankServiceImpl extends BaseServiceImpl ExportParams exportParams = new ExportParams(); exportParams.setType(ExcelType.XSSF); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); -// CommonDownloadUtil.download(activity.getTitle() + "得分名单" + ".xlsx", workbook, response); + CommonDownloadUtil.download(activity.getTitle() + "得分名单" + ".xlsx", workbook, response); } private Sql buildQuerySql(String activityId, String mode, String scoreStatisticsMode, QsvQuizRankPageForm pageForm) { @@ -92,6 +93,7 @@ public class QsvQuizRankServiceImpl extends BaseServiceImpl t1.userId, t1.userName, t1.loginName, + u.sex, t1.unitName, t1.unionName, u.mobile, diff --git a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java index 4ee0ebc..84b20ce 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java @@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import io.v.nutz.base.service.impl.BaseServiceImpl; +import io.v.nutz.base.utils.CommonDownloadUtil; import io.v.nutz.zhgh.qsv.models.QsvActivity; import io.v.nutz.zhgh.qsv.models.QsvOption; import io.v.nutz.zhgh.qsv.models.QsvSubject; @@ -45,7 +46,8 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i try { // 查询用户答题记录 - List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId)); + List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) + .and("isFinish", "=", true)); // 将答题记录的扩展JSON转换为JSONObject列表 List answerExtList = answerRecords.stream().map(QsvUserAnswerRecord::getExtJson).toList(); @@ -122,7 +124,8 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i } // 查询用户答题记录 - List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId)); + List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) + .and("isFinish", "=", true)); // 将答题记录的扩展JSON转换为JSONObject列表 List answerExtList = answerRecords.stream().map(QsvUserAnswerRecord::getExtJson).toList(); @@ -148,7 +151,7 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i exportParams.setType(ExcelType.XSSF); // 导出Excel并下载 try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelExportEntities, list)) { -// CommonDownloadUtil.download(activity.getTitle() + "答题记录" + ".xlsx", workbook, response); + CommonDownloadUtil.download(activity.getTitle() + "答题记录" + ".xlsx", workbook, response); } } catch (Exception e) { log.error("导出Excel失败", e); @@ -165,9 +168,10 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i try { // 查询用户答题记录 - List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId)); + List answerRecords = dao().query(QsvUserAnswerRecord.class, Cnd.where("activityId", "=", activityId) + .and("isFinish", "=", true)); // 将答题记录的扩展JSON转换为JSONObject列表 - List answerExtList = answerRecords.stream().map(QsvUserAnswerRecord::getExtJson).toList(); +// List answerExtList = answerRecords.stream().map(QsvUserAnswerRecord::getExtJson).toList(); // 查询活动题目列表 List subjects = dao().query(QsvSubject.class, Cnd.where("activityId", "=", activityId)); @@ -248,7 +252,7 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i } else if (type.equals("radio") || type.equals("checkbox")) { JSONArray optionIds = jsonVal.getJSONArray("optionIds"); String selectOptionTexts = options.stream().filter(option -> optionIds.contains(option.getId())) - .map(QsvOption::getText).collect(Collectors.joining(";")); + .map(QsvOption::getText).collect(Collectors.joining(";")); map.addv(k, selectOptionTexts); } }); diff --git a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java index 9a84f1d..c47cedb 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java @@ -36,7 +36,7 @@ public class QsvUserAnswerRecordServiceImpl extends BaseServiceImpl + width="40%" + top="2%">
@@ -27,7 +28,7 @@ module.exports = { data() { return { codeDialogVisible: false, - + title: '', } }, methods: { @@ -47,7 +48,8 @@ module.exports = { var filename = name + '_' + (new Date()).getTime() + '.' + type; this.saveFile(dataurl, filename); }, - openCode(url) { + openCode(url, title) { + this.title = title this.codeDialogVisible = true this.$nextTick(() => { $("#qrcode").html("") diff --git a/src/main/resources/views/mobile/home.html b/src/main/resources/views/mobile/home.html index cf44926..d6fad6c 100644 --- a/src/main/resources/views/mobile/home.html +++ b/src/main/resources/views/mobile/home.html @@ -223,10 +223,11 @@ layout("/mobile/platform.html"){ + - - - +
diff --git a/src/main/resources/views/mobile/qsv/index.html b/src/main/resources/views/mobile/qsv/index.html index 98fe562..0c732ec 100644 --- a/src/main/resources/views/mobile/qsv/index.html +++ b/src/main/resources/views/mobile/qsv/index.html @@ -110,9 +110,20 @@ layout("/mobile/platform.html"){ if (path) { pjaxReplace(path + "?id=" + item.id) } + }, + init() { + const queryId = GetQueryString('id') + const category = GetQueryString('category') + if(category) { + this.pageForm.category = category + } + if(queryId) { + this.pageForm.queryId = queryId + } } }, created() { + this.init() this.onLoad() } }) diff --git a/src/main/resources/views/mobile/qsv/quiz/index.html b/src/main/resources/views/mobile/qsv/quiz/index.html index ec13eef..1bf6927 100644 --- a/src/main/resources/views/mobile/qsv/quiz/index.html +++ b/src/main/resources/views/mobile/qsv/quiz/index.html @@ -11,8 +11,8 @@ layout("/mobile/platform.html"){ text-align: center; padding: 20px; background: #ffffff; - /*margin: 10px 0;*/ - margin-bottom: 10px; + margin: 0 0 10px 0 !important; + /*margin-bottom: 10px;*/ color: var(--color-primary); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } @@ -80,7 +80,7 @@ layout("/mobile/platform.html"){

{{ activity.title }}

-
+

{{index+1}}、{{ subject.title }}

@@ -125,6 +125,7 @@ layout("/mobile/platform.html"){ return { list: [], id: GetQueryString("id"), + H5JumpTo: GetQueryString("H5JumpTo"), subjects: [], activity: {}, // remainingTime: 0, @@ -161,8 +162,30 @@ layout("/mobile/platform.html"){ this.activity = res.data.activity this.subjects = res.data.subjects this.answerRecordId = res.data.answerRecordId - this.checkGroupPermission() - this.getAnswerRecord() + // this.checkGroupPermission() + if (!this.H5JumpTo && this.activity.repeatable && res.data.repeatTips){ + // 如果是可重复答题,第二次答题进来弹出提示 + vant.Dialog.confirm({ + title: '温馨提示', + message: '您已完成本次答题,是否要重新答题?', + confirmButtonText: '重新答题', + cancelButtonText: '查看答题记录', + }).then(() => { + this.getAnswerRecord() + }).catch(() => { + pjaxReplace("/platform/h5/qsv/quiz/result?answerRecordId=" + this.answerRecordId) + // pjaxReplace("/mobile/index") + }); + } else { + this.getAnswerRecord() + } + } else { + vant.Dialog.alert({ + title: '温馨提示', + message: res.msg, + }).then(() => { + pjaxReplace("/mobile/index") + }) } }) }, @@ -174,7 +197,7 @@ layout("/mobile/platform.html"){ this.answerRecord = res.data if (this.answerRecord.isFinish || this.$moment().unix() > this.$moment(this.activity.endTime)) { - this.$pjaxReplace("/platform/h5/qsv/quiz/result?answerRecordId=" + this.answerRecordId) + pjaxReplace("/platform/h5/qsv/quiz/result?answerRecordId=" + this.answerRecordId) } this.initAnswer() @@ -307,8 +330,7 @@ layout("/mobile/platform.html"){ //自动提交 autoSubmit(loading = null) { - $ - .post("/platform/h5/qsv/quiz/submitAnswer", { + $.post("/platform/h5/qsv/quiz/submitAnswer", { answer: JSON.stringify({ activityId: this.id, answerRecordId: this.answerRecordId, @@ -324,35 +346,35 @@ layout("/mobile/platform.html"){ .then((res) => { if (res.code === 0) { this.$toast.success(res.msg) - this.$pjaxReplace("/platform/h5/qsv/quiz/result?answerRecordId=" + this.answerRecordId) + pjaxReplace("/platform/h5/qsv/quiz/result?answerRecordId=" + this.answerRecordId) // this.getAnswerRecord() } }) - .finally(() => { + .always(() => { if (loading) { loading.clear() } }) }, - async checkGroupPermission() { - const groupId = this.activity.groupId - if (groupId) { - const { code, data } = await $.post("/open/common/checkGroupPermission", { groupId }) - if (code === 0) { - if (!data) { - this.$dialog - .alert({ - title: "提示", - message: "您没有权限参与" - }) - .then(() => { - location.back() - }) - } - } - } - } + // async checkGroupPermission() { + // const groupId = this.activity.groupId + // if (groupId) { + // const { code, data } = await $.post("/open/common/checkGroupPermission", { groupId }) + // if (code === 0) { + // if (!data) { + // this.$dialog + // .alert({ + // title: "提示", + // message: "您没有权限参与" + // }) + // .then(() => { + // location.back() + // }) + // } + // } + // } + // } }, created() { if (this.timerInterval) { diff --git a/src/main/resources/views/mobile/qsv/quiz/result.html b/src/main/resources/views/mobile/qsv/quiz/result.html index 6300015..0647e92 100644 --- a/src/main/resources/views/mobile/qsv/quiz/result.html +++ b/src/main/resources/views/mobile/qsv/quiz/result.html @@ -10,6 +10,7 @@ layout("/mobile/platform.html"){ .container .title { text-align: center; padding: 20px; + margin: 0 !important; background: #ffffff; color: var(--color-primary); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); @@ -168,7 +169,7 @@ layout("/mobile/platform.html"){
-
+

{{index+1}}、{{ subject.title }}

@@ -208,11 +209,14 @@ layout("/mobile/platform.html"){
+ 重新答题 + + 纪念品选择 查看全部答题记录
- +
@@ -239,7 +243,9 @@ layout("/mobile/platform.html"){ activity: {}, list: [], historyShow: false, - historyList: [] + historyList: [], + + canAgainQuestion: false } }, computed: { @@ -268,12 +274,44 @@ layout("/mobile/platform.html"){ } }, methods: { + /** + * 福利选择 + */ + goWelfareChoose(){ + // 女性答题的福利 + pjaxReplace('/mobile/welfare/list/receive?projectId=8799d66b0bb640078f50feb029e506ed') + }, + /** + * 重新答题 + */ + againQuestion() { + vant.Dialog.confirm({ + title: '温馨提示', + message: '确定要重新答题吗?', + }).then(() => { + pjaxReplace('/platform/h5/qsv/quiz?id=' + this.activity.id + "&H5JumpTo=true") + }).catch(() => { + // on cancel + }); + }, getAnswerResult() { $.post("/platform/h5/qsv/quiz/answerResult", { answerRecordId: this.answerRecordId }).then((res) => { if (res.code === 0) { this.subjects = res.data.subjects this.activity = res.data.activity - this.getAnswerRecord() + + if (this.activity.id === 'c3372eb3ee774e86b373fcacf8eb89c7') { + vant.Dialog.alert({ + title: '温馨提示', + message: "感谢您参与女性健康知识竞赛。请选取活动纪念品", + }).then(() => { + this.getAnswerRecord() + this.getHistoryQuestion() + }) + } else { + this.getAnswerRecord() + this.getHistoryQuestion() + } } }) }, @@ -305,16 +343,19 @@ layout("/mobile/platform.html"){ } }) }, - historyBack() { pjaxReplace('/platform/h5/qsv') }, - openHistory() { this.historyShow = true + }, + getHistoryQuestion() { $.post("/platform/h5/qsv/quiz/historyScore", { activityId: this.activity.id }).then((res) => { if (res.code === 0) { this.historyList = res.data + if (this.activity.maxAttempts > res.data.length) { + this.canAgainQuestion = true + } } }) } diff --git a/src/main/resources/views/mobile/qsv/survey/index.html b/src/main/resources/views/mobile/qsv/survey/index.html index 5b7c426..115aacd 100644 --- a/src/main/resources/views/mobile/qsv/survey/index.html +++ b/src/main/resources/views/mobile/qsv/survey/index.html @@ -90,6 +90,16 @@ layout("/mobile/platform.html"){ max-width: 100%!important; } + .desc { + background: #ffffff; + margin: 0 0 10px 0; + padding: 10px; + line-height: 22px; + } + + .desc p{ + margin: 0; + } @@ -97,6 +107,7 @@ layout("/mobile/platform.html"){

{{ activity.title }}

+

{{index+1}}、{{ subject.title }}

diff --git a/src/main/resources/views/platform/member/change/manage/index.html b/src/main/resources/views/platform/member/change/manage/index.html index 8d3ccbc..578a712 100644 --- a/src/main/resources/views/platform/member/change/manage/index.html +++ b/src/main/resources/views/platform/member/change/manage/index.html @@ -97,7 +97,7 @@ layout("/layouts/platform.html"){ code="PREPARED_BY">
- +
费用类型:
@@ -108,7 +108,7 @@ layout("/layouts/platform.html"){ code="USER_PERSONAL_STATUS">
- +
变更类型:
@@ -178,9 +178,9 @@ layout("/layouts/platform.html"){ - + - +
- +
- 最大选择数: - + 最大选择数:
diff --git a/src/main/resources/views/platform/qsv/quiz/rank.html b/src/main/resources/views/platform/qsv/quiz/rank.html index 4290941..cf69a5c 100644 --- a/src/main/resources/views/platform/qsv/quiz/rank.html +++ b/src/main/resources/views/platform/qsv/quiz/rank.html @@ -127,7 +127,7 @@ layout("/layouts/platform.html"){ }) }, exportXlsx() { - // this.$downLoad("/platform/qsv/quizRank/exportXlsx", this.pageForm) + this.$downLoad("/platform/qsv/quizRank/exportXlsx", this.pageForm) } }, async created() { diff --git a/src/main/resources/views/platform/qsv/survey/answer.js b/src/main/resources/views/platform/qsv/survey/answer.js index 2b7e5a3..78d771d 100644 --- a/src/main/resources/views/platform/qsv/survey/answer.js +++ b/src/main/resources/views/platform/qsv/survey/answer.js @@ -1,13 +1,13 @@ const answer = { /*language=HTML*/ template: ` - + 导出xlsx - +