diff --git a/src/main/java/io/v/nutz/fitnessWalk/model/FitnessWalkPunchLottery.java b/src/main/java/io/v/nutz/fitnessWalk/model/FitnessWalkPunchLottery.java new file mode 100644 index 0000000..2721550 --- /dev/null +++ b/src/main/java/io/v/nutz/fitnessWalk/model/FitnessWalkPunchLottery.java @@ -0,0 +1,53 @@ +package io.v.nutz.fitnessWalk.model; + +import io.v.nutz.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; + +@EqualsAndHashCode(callSuper = true) +@Table +@Data +@Comment("打卡模式抽奖记录") +public class FitnessWalkPunchLottery extends BaseModel { + + @Column + @Name + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("活动") + private String activityId; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 50) + @Comment("中奖用户") + private String userName; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("奖品名称") + private String prizeName; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + @Comment("奖品") + private String prizeId; + + @Column + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否中奖") + private Boolean isWin; + + @Column + @ColDefine(type = ColType.DATETIME) + @Comment("是否中奖") + private Date winDate; + +} diff --git a/src/main/java/io/v/nutz/jsz/controller/pc/JszCommonCon.java b/src/main/java/io/v/nutz/jsz/controller/pc/JszCommonCon.java index 00f5c4c..253e8f1 100644 --- a/src/main/java/io/v/nutz/jsz/controller/pc/JszCommonCon.java +++ b/src/main/java/io/v/nutz/jsz/controller/pc/JszCommonCon.java @@ -5,14 +5,14 @@ import io.v.nutz.annontation.ViReturn; import io.v.nutz.base.utils.DateUtil; import io.v.nutz.base.utils.WxHttpUtil; import io.v.nutz.jsz.services.JszTypeService; -import io.v.nutz.question.model.Question_issue; -import io.v.nutz.question.model.Question_reply; -import io.v.nutz.question.service.QuestionIssueService; -import io.v.nutz.question.service.QuestionReplyService; -import io.v.nutz.question.service.QuestionService; -import io.v.nutz.question.service.QuestionWorService; import io.v.nutz.util.ShiroUtil; import io.v.nutz.web.commons.base.Globals; +import io.v.nutz.zhgh.question.model.Question_issue; +import io.v.nutz.zhgh.question.model.Question_reply; +import io.v.nutz.zhgh.question.service.QuestionIssueService; +import io.v.nutz.zhgh.question.service.QuestionReplyService; +import io.v.nutz.zhgh.question.service.QuestionService; +import io.v.nutz.zhgh.question.service.QuestionWorService; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.nutz.dao.Cnd; import org.nutz.ioc.loader.annotation.Inject; diff --git a/src/main/java/io/v/nutz/question/controller/QuestionH5Controller.java b/src/main/java/io/v/nutz/question/controller/QuestionH5Controller.java deleted file mode 100644 index d07ba0f..0000000 --- a/src/main/java/io/v/nutz/question/controller/QuestionH5Controller.java +++ /dev/null @@ -1,375 +0,0 @@ -package io.v.nutz.question.controller; - -import cn.hutool.core.date.DateUtil; -import cn.wizzer.framework.base.Result; -import cn.wizzer.framework.page.Pagination; -import io.v.nutz.activity.models.ActivityUserScope; -import io.v.nutz.modules.models.PageForm; -import io.v.nutz.question.model.*; -import io.v.nutz.question.service.QuestionService; -import io.v.nutz.web.commons.utils.ShiroUtil; -import org.nutz.aop.interceptor.async.Async; -import org.nutz.dao.Chain; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.Daos; -import org.nutz.ioc.loader.annotation.Inject; -import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.Lang; -import org.nutz.lang.util.NutMap; -import org.nutz.mvc.annotation.At; -import org.nutz.mvc.annotation.Ok; -import org.nutz.mvc.annotation.Param; -import org.springframework.web.bind.annotation.PathVariable; - -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -/** - * 问卷H5 - * - * @author jug - * @date 2023/04/24 - */ -@IocBean -@At("/mobile/question/h5") -@Ok("json:full") -public class QuestionH5Controller { - - @Inject - private QuestionService questionService; - - @Inject - private Dao dao; - - @At("/list") - @Ok("beetl:/mobile/question/list.html") - public void list() { - - } - - @At("/poll/index") - @Ok("beetl:/mobile/question/poll.html") - public void pollIndex() { - - } - - @At("/shop/index") - @Ok("beetl:/mobile/question/shop.html") - public void shopIndex() { - - } - - @At("/cake/index") - @Ok("beetl:/mobile/question/cake.html") - public void cakeIndex() { - - } - - @At("/answer/index") - @Ok("beetl:/mobile/question/answer.html") - public void answerIndex() { - - } - - - /** - * 页面数据 - * - * @param pageForm 页面形式 - * @param status 状态 进行中1 已结束2 - * @param type 类型 问卷类型 - * @return {@link Object} - */ - @At("/pageData") - public Object pageData(PageForm pageForm, int status, int type) { - Sql sql = Sqls.create(""" - select - q.*, - (select count(1) from question_issue where iqid = q.qid and displayDate = @today) as topicTotal - from - question q - $condition - """); - sql.setParam("today", DateUtil.today()); - Cnd cnd = Cnd.NEW(); - long now = System.currentTimeMillis(); - if (status == 1) { - cnd.and("q.startTime", "<", now); - cnd.and("q.endTime", ">", now); - } else { - cnd.and("q.endTime", "<", now); - } - cnd.and("q.qlx", "=", type); - cnd.and("q.qflag", "=", 2); - cnd.desc("q.startTime"); - sql.setCondition(cnd); - - Pagination pagination = questionService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); - } - - /** - * 检查参加权限 - * - * @param activityUserScopeId 活动用户范围id - * @return {@link Object} - */ - @At("/checkPermission/?") - public Object checkPermission(String activityUserScopeId) { - boolean exists = questionService.dao().count(ActivityUserScope.class, Cnd.where("groupId", "=", activityUserScopeId).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))) > 0; - return Result.success(exists); - } - - - /** - * 问卷信息 - * - * @param id id - * @return {@link Object} - */ - @At("/questionInfo/{id}") - public Object questionInfo(@PathVariable String id) { - Question question = questionService.fetch(id); - - Cnd issueCnd = Cnd.NEW(); - - //出题模式 - // mode==1 定时定题 直接查询 - // mode==2 先查询今天的随机题目有没有设置好 设置好了直接查询今天的题目 没有的话查询displayDate为null的题目然后取题目再设置时间进行查询 - Integer ctMode = question.getCtMode(); - if (ctMode == 2) { - //单次出题的数量 - Integer ctNum = question.getCtNum(); - int todayIssueCount = dao.count(Question_issue.class, Cnd.where("displayDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd")) - .and("iqid", "=", id)); - if (todayIssueCount == 0) { - Sql randIssueSql = Sqls.create("SELECT iid FROM question_issue WHERE iqid = @qid AND displayDate IS NULL ORDER BY RAND() LIMIT @ctNum"); - randIssueSql.setParam("qid", id); - randIssueSql.setParam("ctNum", ctNum); - String[] randIssueIds = (String[]) Daos.query(dao, randIssueSql.toString(), Sqls.callback.strs()); - dao.update(Question_issue.class, Chain.make("displayDate", new Date()), Cnd.where("iid", "in", randIssueIds)); - } -// issueCnd.and("displayDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd")); - } - - issueCnd.asc("ipxbh"); - questionService.fetchLinks(question, "issues", issueCnd); - for (Question_issue issue : question.getIssues()) { - questionService.fetchLinks(issue, "wors", Cnd.NEW().asc("wpxbh")); - } - return Result.success(question); - } - - /** - * 保存答案 - * - * @param repliesArray 回复 - * @return {@link Object} - */ - @At("/saveAnswer") - public Object saveAnswer(@Param("repliesArray") Question_reply[] repliesArray) { - if (Lang.isNotEmpty(repliesArray)) { - List replies = Arrays.asList(repliesArray); - if (Lang.isNotEmpty(replies)) { - String qid = replies.get(0).getQid(); - questionService.dao().clear(Question_reply.class, Cnd.where("qid", "=", qid).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))); - replies.forEach(v -> { - v.setUserId(String.valueOf(ShiroUtil.getPrincipalProperty("id"))); - v.setRtime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); - }); - questionService.insert(replies); - } - return Result.success(); - } - return Result.success(); - } - - /** - * 保存答案 只针对答题模式 - * - * @param replies 问题回复 - * @return {@link Object} - */ - @At("/saveAnswer2") - public Object saveAnswer2(Question_reply[] replies) { - if (Lang.isNotEmpty(replies)) { - Arrays.asList(replies).forEach(v -> { - v.setUserId(String.valueOf(ShiroUtil.getPrincipalProperty("id"))); - v.setRtime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); - }); - questionService.insert(replies); - insertQuestionAnswerScore(Arrays.asList(replies)); - insertQuestionAnswerScore2(Arrays.asList(replies)); - } - return Result.success(); - } - - public void insertQuestionAnswerScore(List replyList) { - //用户id - String userId = (String) ShiroUtil.getPrincipalProperty("id"); - //问卷id - String questionId = replyList.get(0).getQid(); - //题目id - String issueId = replyList.get(0).getIssueId(); - - Question_issue issue = dao.fetch(Question_issue.class, Cnd.where("iid", "=", issueId)); - Integer fraction = issue.getFraction(); - - Sql sql = Sqls.create(""" - SELECT wid FROM question_wor qw WHERE qw.correct = 1 AND qw.wiid = @wiid - """).setParam("wiid", issueId); - //正确的选项 - Set correctOptionIdList = new HashSet<>((List) Daos.query(dao, sql.toString(), Sqls.callback.strList())); - //用户选的选项 - Set userSelectedOptionIdList = replyList.stream().map(v -> v.getRwid()).collect(Collectors.toSet()); - - int count = dao.count(QuestionAnswerUserScore.class, Cnd.where("questionId", "=", questionId).and("subjectId", "=", issueId).and("answerDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd")).and("userId", "=", userId)); - - QuestionAnswerUserScore answerUserScore = new QuestionAnswerUserScore(); - answerUserScore.setQuestionId(questionId); - answerUserScore.setSubjectId(issueId); - answerUserScore.setUserId(userId); - answerUserScore.setAnswerDate(new Date()); - answerUserScore.setAnswerNum(count + 1); - - if (correctOptionIdList.equals(userSelectedOptionIdList)) { - answerUserScore.setSubjectScore(fraction); - } else { - answerUserScore.setSubjectScore(0); - } - dao.insert(answerUserScore); - } - - public void insertQuestionAnswerScore2(List replyList) { - //问卷id - String questionId = replyList.get(0).getQid(); - //查询今天的题目 - List todayIssues = dao.query(Question_issue.class, Cnd.where("displayDate", "=", DateUtil.today()) - .and("iqid", "=", questionId)); - if (todayIssues != null && todayIssues.size() > 0) { - Set todayIssueIds = todayIssues.stream().map(v -> v.getIid()).collect(Collectors.toSet()); - //判断今天的题目是否已答完 - List replyIssues = dao.query(Question_reply.class, Cnd.where("userId", "=", ShiroUtil.getPrincipalProperty("id")).and("qid", "=", questionId)); - Set replyIssueIds = replyIssues.stream().map(v -> v.getIssueId()).collect(Collectors.toSet()); - if (todayIssueIds.equals(replyIssueIds)) { - //答完了 去看看今天有没有答过 - int count = dao.count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getPrincipalProperty("id")).and("answerDate", "=", DateUtil.today())); - - AtomicInteger sum = new AtomicInteger(); - - //每题的回答记录 - Map> issueReplies = replyIssues.stream().collect(Collectors.groupingBy(v -> v.getIssueId())); - - //查出选项信息 - dao.fetchLinks(todayIssues, "wors"); - - issueReplies.forEach((k, v) -> { - //用户回答的选项 - Set userReplyOptionIds = v.stream().map(x -> x.getRwid()).collect(Collectors.toSet()); - - Optional issueOptional = todayIssues.stream().filter(x -> x.getIid().equals(k)).findFirst(); - - //正确答案 - Set correctOptionIds = issueOptional.map(x -> x.getWors().stream().filter(c -> c.getCorrect() != null && c.getCorrect()).map(z -> z.getWid()).collect(Collectors.toSet())).orElse(null); - if (userReplyOptionIds.equals(correctOptionIds)) { - sum.addAndGet(issueOptional.map(i -> i.getFraction()).orElse(0)); - } - }); - - QuestionUserScore questionUserScore = new QuestionUserScore(); - questionUserScore.setQuestionId(questionId); - questionUserScore.setUserId((String) ShiroUtil.getPrincipalProperty("id")); - questionUserScore.setAnswerDate(new Date()); - questionUserScore.setAnswerNum(count + 1); - questionUserScore.setScore(sum.get()); - dao.insert(questionUserScore); - - } - } - } - - /** - * 答题信息 - * - * @param id id - * @return {@link Object} - */ - @At("/answerInfo/?") - public Object answerInfo(String id) { - List replies = questionService.dao().query(Question_reply.class, Cnd.where("qid", "=", id).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))); - return Result.success(replies); - } - - /** - * 再答一次 - * - * @param questionId 问题id - * @return {@link Object} - */ - @At("/answerAgain") - public Object answerAgain(String questionId) { - Sql issueIdsSql = Sqls.create("select iid from question_issue where iqid = @qid").setParam("qid", questionId); - String[] issueIds = (String[]) Daos.query(dao, issueIdsSql.toString(), Sqls.callback.strs()); - //清空本日的答题记录 - dao.clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getPlatformUid()).and("issueId", "in", issueIds)); - return Result.success(); - } - - @At("/winInfo") - public Object winInfo(String questionId) { -// List winners = dao.query(QuestionWinner.class, Cnd.where("questionId", "=", questionId)); -// return Result.success(winners); - Sql sql = Sqls.create(""" - SELECT - u.username, - qw.winDate, - u.id - FROM - `question_winner` qw - LEFT JOIN `user` u ON u.id = qw.userId - WHERE - qw.questionId = @questionId - """); - sql.setParam("questionId", questionId); - List list = questionService.listMap(sql); - return Result.success(list); - } - - @At("/canAnswer") - public Object canAnswer(String questionId) { - - //每天的题目数量 - int issueCount = dao.count(Question_issue.class, Cnd.where("iqid", "=", questionId).and("displayDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd"))); - - //当前最大答题次数 - int maxCount = dao.func(QuestionAnswerUserScore.class, "max", "answerNum", Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))); - - //最大答题次数已经答了多少题 - int answerIssue = dao.count(QuestionAnswerUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getPrincipalProperty("id")).and("answerNum", "=", maxCount)); - - return Result.success(answerIssue < issueCount); - - } - - @At("/todayMaxScore") - public Object todayMaxScore(String questionId) { - List userScores = dao.query(QuestionUserScore.class, Cnd.where("questionId", "=", questionId) - .and("userId", "=", ShiroUtil.getPrincipalProperty("id")) - .and("answerDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd"))); - - Map numScoreMap = userScores.stream().collect(Collectors.toMap(v -> v.getAnswerNum(), v -> v.getScore())); - -// List list = dao.query(QuestionAnswerUserScore.class, Cnd.where("questionId", "=", questionId) -// .and("userId", "=", ShiroUtil.getPrincipalProperty("id")) -// .and("answerDate", "=", DateUtil.format(new Date(), "yyyy-MM-dd"))); -// -// Map numScoreMap = list.stream().collect(Collectors.groupingBy(v -> v.getAnswerNum(), Collectors.summingInt(v -> v.getSubjectScore()))); - return Result.success(numScoreMap); - } - - -} diff --git a/src/main/java/io/v/nutz/question/service/QuestionService.java b/src/main/java/io/v/nutz/question/service/QuestionService.java deleted file mode 100644 index 8d76193..0000000 --- a/src/main/java/io/v/nutz/question/service/QuestionService.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.v.nutz.question.service; - -import io.v.nutz.question.model.Question; -import io.v.nutz.service.ViService; -import org.nutz.lang.util.NutMap; - -/** - * Created by 李耀威 on 2020-02-19 - * info by 问卷调查 service - */ -public interface QuestionService extends ViService { - Question getQuestion(String qid); - - NutMap getVoteData(String qid); - - NutMap getRankData(String qid); - -} diff --git a/src/main/java/io/v/nutz/question/service/impl/QuestionServiceImpl.java b/src/main/java/io/v/nutz/question/service/impl/QuestionServiceImpl.java deleted file mode 100644 index 5a3f876..0000000 --- a/src/main/java/io/v/nutz/question/service/impl/QuestionServiceImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.v.nutz.question.service.impl; - -import io.v.nutz.question.model.Question; -import io.v.nutz.question.model.Question_issue; -import io.v.nutz.question.service.QuestionIssueService; -import io.v.nutz.question.service.QuestionReplyService; -import io.v.nutz.question.service.QuestionService; -import io.v.nutz.question.service.QuestionWorService; -import io.v.nutz.service.impl.ViServiceImpl; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; -import org.nutz.dao.entity.Record; -import org.nutz.dao.sql.Sql; -import org.nutz.integration.jedis.RedisService; -import org.nutz.ioc.loader.annotation.Inject; -import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.util.NutMap; -import org.nutz.plugins.wkcache.annotation.CacheDefaults; - -@IocBean(args = {"refer:dao"}) -@CacheDefaults(cacheName = "Zgfw_question") -public class QuestionServiceImpl extends ViServiceImpl implements QuestionService { - @Inject - private QuestionIssueService questionIssueService; - @Inject - private QuestionWorService questionWorService; - @Inject - private QuestionReplyService questionReplyService; - @Inject - private RedisService redisService; - - public QuestionServiceImpl(Dao dao) { - super(dao); - } - - @Override - public Question getQuestion(String qid) { - Question question = fetch(qid); - question.setIssues(questionIssueService.query(Cnd.where("iqid", "=", qid).asc("ipxbh"))); - for (Question_issue issue : question.getIssues()) { - issue.setWors(questionWorService.query(Cnd.where("wiid", "=", issue.getIid()).asc("wpxbh"))); - } - return question; - } - - @Override - public NutMap getVoteData(String qid) { - Question_issue issue = questionIssueService.fetch(Cnd.where("iqid", "=", qid)); - NutMap res = new NutMap(); - //选项数 - res.setv("optionum", questionWorService.count(Cnd.where("wiid", "=", issue.getIid()))); - //投票总数 - int votecount = questionReplyService.count(Sqls.create("SELECT COUNT(1) FROM question_reply r WHERE r.`rwid` IN (SELECT w.`wid` FROM zgfw_question_wor w WHERE w.`wiid` = @iid)").setParam("iid", issue.getIid())); - res.setv("votecount", votecount); - - Sql sql = Sqls.create("SELECT w.`wid`,(SELECT COUNT(1) FROM question_reply r WHERE r.rwid=w.`wid`) COUNT FROM zgfw_question_wor w WHERE w.`wiid` = @iid").setParam("iid", issue.getIid()); - for (Record record : questionWorService.list(sql)) { - res.setv(record.getString("wid"), record.getInt("count")); - } - return res; - } - - @Override - public NutMap getRankData(String qid) { - NutMap res = new NutMap(); - Question question = getQuestion(qid); - res.setv("qid", qid); - res.setv("qtitle", question.getQtitle()); - - Question_issue issue = questionIssueService.fetch(Cnd.where("iqid", "=", qid)); - res.setv("iname", issue.getIname()); - //选项数 - res.setv("optionum", questionWorService.count(Cnd.where("wiid", "=", issue.getIid()))); - //投票总数 - int votecount = questionReplyService.count(Sqls.create("SELECT COUNT(1) FROM question_reply r WHERE r.`rwid` IN (SELECT w.`wid` FROM zgfw_question_wor w WHERE w.`wiid` = @iid)").setParam("iid", issue.getIid())); - res.setv("votecount", votecount); - - Sql sql = Sqls.create("SELECT w.`wid`,w.`wimg`,w.`wtxt`,(SELECT COUNT(1) FROM question_reply r WHERE r.rwid=w.`wid`) COUNT FROM zgfw_question_wor w WHERE w.`wiid` = @iid ORDER BY COUNT DESC").setParam("iid", issue.getIid()); - res.setv("wors", questionWorService.list(sql)); - - return res; - } -} diff --git a/src/main/java/io/v/nutz/web/commons/utils/ShiroUtil.java b/src/main/java/io/v/nutz/web/commons/utils/ShiroUtil.java index 4a6e642..cc9782a 100644 --- a/src/main/java/io/v/nutz/web/commons/utils/ShiroUtil.java +++ b/src/main/java/io/v/nutz/web/commons/utils/ShiroUtil.java @@ -397,4 +397,8 @@ public class ShiroUtil { return Lang.isNotEmpty(ids) ? ids : null; } -} \ No newline at end of file + + public static String getUserId() { + return (String) getPrincipalProperty("id"); + } +} diff --git a/src/main/java/io/v/nutz/question/controller/QuestionAnswerRankingController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerRankingController.java similarity index 54% rename from src/main/java/io/v/nutz/question/controller/QuestionAnswerRankingController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerRankingController.java index d66f8a5..e45016b 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionAnswerRankingController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerRankingController.java @@ -1,15 +1,16 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; -import cn.hutool.core.util.StrUtil; import io.v.nutz.annontation.ViReturn; +import io.v.nutz.base.page.Pagination; import io.v.nutz.modules.models.PageForm; -import io.v.nutz.question.service.QuestionService; import io.v.nutz.sys.services.SysUnionService; -import io.v.nutz.util.ShiroUtil; +import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.question.service.QuestionAnswerRankingService; +import io.v.nutz.zhgh.question.service.QuestionService; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.nutz.dao.Cnd; @@ -40,6 +41,9 @@ public class QuestionAnswerRankingController { @Inject private SysUnionService sysUnionService; + @Inject + private QuestionAnswerRankingService questionAnswerRankingService; + @At("") @Ok("beetl:/platform/question/ranking.html") @RequiresPermissions("question.answer.ranking") @@ -49,96 +53,25 @@ public class QuestionAnswerRankingController { @At @ViReturn @RequiresPermissions("question.answer.ranking") - public Object pageData(PageForm pageForm, @Param(value = "questionId",required = false) String questionId, - @Param(value = "unionId",required = false) String unionId, - @Param(value = "unitId",required = false) String unitId, - @Param(value = "answerDate",required = false) String answerDate) { - Sql sql = Sqls.create(""" - SELECT - qus.userId, - DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, - MAX( score ) AS max_score, - qus.answerNum, - u.loginname, - u.username, - u.sex, - u.unitname, - u.unionname, - u.mobile - FROM - question_user_score qus - LEFT JOIN `user` u ON u.id = qus.userId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.groupBy("qus.userId", "qus.answerDate"); - cnd.desc("qus.userId").desc("max_score"); - cnd.andEX("u.unionid", "=", unionId); - cnd.andEX("u.unitid", "=", unitId); - cnd.andEX("qus.answerDate", "=", answerDate); - cnd.and("qus.questionId", "=", questionId); - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%")); - } - cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); - sql.setCondition(cnd); - return questionService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + public Object pageData(PageForm pageForm, @Param(value = "questionId", required = false) String questionId, + @Param(value = "unionId", required = false) String unionId, + @Param(value = "unitId", required = false) String unitId, + @Param(value = "answerDate", required = false) String answerDate) { + Pagination pagination = questionAnswerRankingService.pageData(pageForm, questionId, unionId, unitId, answerDate); + return pagination; } @At @Ok("void") @RequiresPermissions("question.answer.ranking") - public void doExport(@Param(value = "questionId",required = false) String questionId, - @Param(value = "unionId",required = false) String unionId, - @Param(value = "unitId",required = false) String unitId, - @Param(value = "answerDate",required = false) String answerDate, HttpServletResponse response) { + public void doExport(@Param(value = "questionId", required = false) String questionId, + @Param(value = "unionId", required = false) String unionId, + @Param(value = "unitId", required = false) String unitId, + @Param(value = "answerDate", required = false) String answerDate, HttpServletResponse response) { try { - Sql sql = Sqls.create(""" - SELECT - qus.userId, - DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, - MAX( score ) AS max_score, - qus.answerNum, - u.loginname, - u.username, - u.sex, - u.unitname, - u.unionname, - u.mobile - FROM - question_user_score qus - LEFT JOIN `user` u ON u.id = qus.userId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.groupBy("qus.userId", "qus.answerDate"); - cnd.desc("qus.userId").desc("max_score"); - cnd.andEX("u.unionid", "=", unionId); - cnd.andEX("u.unitid", "=", unitId); - cnd.andEX("qus.answerDate", "=", answerDate); - cnd.and("qus.questionId", "=", questionId); - cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); - sql.setCondition(cnd); - List dataList = questionService.listMap(sql); - - List exportEntities = new ArrayList<>(); - exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); - exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); - exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); - exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 20)); - exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); - exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); - exportEntities.add(new ExcelExportEntity("分数", "max_score", 20)); - exportEntities.add(new ExcelExportEntity("答题日期", "answerDate", 20)); - - response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(("得分名单.xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); - ExportParams exportParams = new ExportParams(); - exportParams.setType(ExcelType.XSSF); - Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, dataList); - workbook.write(response.getOutputStream()); - + questionAnswerRankingService.exportXlsx(questionId, response.getOutputStream()); } catch (Exception e) { e.printStackTrace(); } @@ -147,7 +80,7 @@ public class QuestionAnswerRankingController { @At @Ok("void") @RequiresPermissions("question.answer.ranking") - public void doExportAll(@Param(value = "questionId",required = false) String questionId, HttpServletResponse response) { + public void doExportAll(@Param(value = "questionId", required = false) String questionId, HttpServletResponse response) { try { Sql sql = Sqls.create(""" SELECT @@ -210,7 +143,7 @@ public class QuestionAnswerRankingController { Cnd cnd = Cnd.NEW(); cnd.and("YEAR(qctime)", "=", year); if (!ShiroUtil.hasRole("sysadmin")) { - cnd.and("qcreator", "=", ShiroUtil.getUserId()); + cnd.and("qcreator", "=", ShiroUtil.getPrincipalProperty("id")); } cnd.and("qflag", "=", 2); cnd.desc("qctime"); diff --git a/src/main/java/io/v/nutz/question/controller/QuestionAnswerWinnerController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerWinnerController.java similarity index 95% rename from src/main/java/io/v/nutz/question/controller/QuestionAnswerWinnerController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerWinnerController.java index 5c370f7..786e6f9 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionAnswerWinnerController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionAnswerWinnerController.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; @@ -9,9 +9,9 @@ import cn.wizzer.framework.base.Result; import cn.wizzer.framework.page.Pagination; import io.v.nutz.annontation.ViReturn; import io.v.nutz.modules.models.PageForm; -import io.v.nutz.question.model.Question; -import io.v.nutz.question.model.QuestionWinner; -import io.v.nutz.question.service.QuestionService; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.QuestionWinner; +import io.v.nutz.zhgh.question.service.QuestionService; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.nutz.dao.Cnd; @@ -63,8 +63,8 @@ public class QuestionAnswerWinnerController { u.unitname, u.unionname, u.mobile, - (select max(score) from question_user_score where questionId = qw.questionId and userId = qw.userId and answerDate = DATE_SUB( qw.winDate, INTERVAL 0 DAY )) maxScore, - DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate + DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate, + qw.score FROM question_winner qw LEFT JOIN `user` u ON u.id = qw.userId @@ -108,8 +108,8 @@ public class QuestionAnswerWinnerController { u.unitname, u.unionname, u.mobile, - (select max(score) from question_user_score where questionId = qw.questionId and userId = qw.userId and answerDate = DATE_SUB( qw.winDate, INTERVAL 0 DAY )) maxScore, - DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate + DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate, + qw.score FROM question_winner qw LEFT JOIN `user` u ON u.id = qw.userId @@ -132,7 +132,7 @@ public class QuestionAnswerWinnerController { exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); exportEntities.add(new ExcelExportEntity("中奖日期", "winDate", 20)); - exportEntities.add(new ExcelExportEntity("抽奖分数(最高分)", "maxScore", 20)); + exportEntities.add(new ExcelExportEntity("抽奖分数", "score", 20)); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(("中奖名单.xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); diff --git a/src/main/java/io/v/nutz/question/controller/QuestionCakeController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionCakeController.java similarity index 98% rename from src/main/java/io/v/nutz/question/controller/QuestionCakeController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionCakeController.java index 57c9a37..f175245 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionCakeController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionCakeController.java @@ -1,12 +1,12 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import io.v.nutz.annontation.ViReturn; import io.v.nutz.dao.CndPlus; -import io.v.nutz.question.service.QuestionService; import io.v.nutz.util.ViTool; +import io.v.nutz.zhgh.question.service.QuestionService; import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; diff --git a/src/main/java/io/v/nutz/zhgh/question/controller/QuestionH5Controller.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionH5Controller.java new file mode 100644 index 0000000..ac15eb4 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionH5Controller.java @@ -0,0 +1,548 @@ +package io.v.nutz.zhgh.question.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.wizzer.framework.base.Result; +import cn.wizzer.framework.page.Pagination; +import io.v.nutz.activity.models.ActivityUserScope; +import io.v.nutz.modules.models.PageForm; +import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.question.model.*; +import io.v.nutz.zhgh.question.service.QuestionService; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.Daos; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 问卷H5 + * + * @author jug + * @date 2023/04/24 + */ +@IocBean +@At("/mobile/question/h5") +@Ok("json:full") +public class QuestionH5Controller { + + @Inject + private QuestionService questionService; + + @Inject + private Dao dao; + + @At("/list") + @Ok("beetl:/mobile/question/list.html") + @RequiresAuthentication + public void list() { + + } + + @At("/poll/index") + @Ok("beetl:/mobile/question/poll.html") + public void pollIndex() { + + } + + @At("/shop/index") + @Ok("beetl:/mobile/question/shop.html") + public void shopIndex() { + + } + + @At("/cake/index") + @Ok("beetl:/mobile/question/cake.html") + public void cakeIndex() { + + } + + @At("/answer/index") + @Ok("beetl:/mobile/question/answer.html") + @RequiresAuthentication + public void answerIndex() { + + } + + + /** + * 页面数据 + * + * @param pageForm 页面形式 + * @param status 状态 进行中1 已结束2 + * @param type 类型 问卷类型 + * @return {@link Object} + */ + @At("/pageData") + public Object pageData(PageForm pageForm, int status, int type) { + Sql sql = Sqls.create(""" + select + q.* + from + question q + $condition + """); + sql.setParam("today", DateUtil.today()); + Cnd cnd = Cnd.NEW(); + long now = System.currentTimeMillis(); + if (status == 1) { + cnd.and("q.startTime", "<", now); + cnd.and("q.endTime", ">", now); + } else { + cnd.and("q.endTime", "<", now); + } + cnd.and("q.qlx", "=", type); + cnd.and("q.qflag", "=", 2); + cnd.desc("q.startTime"); + sql.setCondition(cnd); + + Pagination pagination = questionService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + /** + * 检查参加权限 + * + * @param activityUserScopeId 活动用户范围id + * @return {@link Object} + */ + @At("/checkPermission/?") + public Object checkPermission(String activityUserScopeId) { + boolean exists = questionService.dao().count(ActivityUserScope.class, Cnd.where("groupId", "=", activityUserScopeId).and("userId", "=", ShiroUtil.getPrincipalProperty("id"))) > 0; + return Result.success(exists); + } + + + /** + * 问卷信息 + * + * @param id id + * @param currentDate 日期 + * @param randomCount 轮数 + * @return {@link Object} + */ + @At("/questionInfo/{id}") + public Object questionInfo(@PathVariable String id, + @Param(required = false, value = "currentDate") String currentDate, + @Param(required = false, value = "randomCount") Integer randomCount) { + Question question = questionService.fetch(id); + Cnd issueCnd = Cnd.NEW(); + + Integer ctMode = question.getCtMode(); + + if (ctMode == 1) { + //定时定题 + + //判断传入的日期是否已经加入到表里 + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId()) + .and("displayDate", "=", currentDate)); + if (Lang.isEmpty(randomIssue)) { + Sql issueSql = Sqls.queryString(" SELECT iid FROM `question_issue` where iqid = @qid AND displayDate = @displayDate"); + issueSql.setParam("qid", id); + issueSql.setParam("displayDate", currentDate); + dao.execute(issueSql); + String[] randomIssueIds = (String[]) issueSql.getResult(); + QuestionRandomIssue questionRandomIssue = new QuestionRandomIssue(); + questionRandomIssue.setQuestionId(id); + questionRandomIssue.setUserId(ShiroUtil.getUserId()); + questionRandomIssue.setIssueIds(Arrays.asList(randomIssueIds)); + questionRandomIssue.setNum(null); + questionRandomIssue.setIsFinish(false); + questionRandomIssue.setDisplayDate(DateUtil.parseDate(currentDate)); + dao.insert(questionRandomIssue); + issueCnd.and("iid", "in", randomIssueIds); + } else { + issueCnd.and("iid", "in", randomIssue.getIssueIds()); + } + } else if (ctMode == 2) { + //随机模式 + + //判断是否为一天答题 + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + + //每次随机的题目数量 + Integer ranDomSingleIssueNum = question.getRanDomSingleIssueNum(); + //总共随机几次 + Integer ranDomSum = question.getRanDomSum(); + + if (betweenDay == 0) { + //同一天 一天随机多次 + + if (randomCount != null) { + QuestionRandomIssue randomIssues = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId()).and("num", "=", randomCount)); + issueCnd.andEX("iid", "in", randomIssues.getIssueIds()); + } else { + //用户的随机题目 + List randomIssues = dao.query(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId())); + + //查询已经随机但是并没有答题完成的题目 + List notFinishIssueIds = randomIssues.stream().filter(v -> v.getIsFinish() != null && !v.getIsFinish()).findFirst().map(QuestionRandomIssue::getIssueIds).orElseGet(Collections::emptyList); + + if (Lang.isNotEmpty(notFinishIssueIds)) { + //就查询没答完的题目 + issueCnd.and("iid", "in", notFinishIssueIds); + } else { + //进行下一次随机 然后加入到随机题目表里 + //已经答了的题目 + List hasAnswerIssueIds = randomIssues.stream().flatMap(v -> v.getIssueIds().stream()).collect(Collectors.toList()); + //已经随机几次了 + int maxAnswerNum = randomIssues.stream().mapToInt(QuestionRandomIssue::getNum).max().orElse(0); + + Sql issueSql = null; + if (maxAnswerNum == ranDomSum) { + //随机完了 没有题目了 默认去最后一轮 +// issueCnd.andEX("iid", "in", hasAnswerIssueIds); + List lastRanDomIssueIds = randomIssues.stream().filter(v -> v.getNum() == maxAnswerNum).flatMap(v -> v.getIssueIds().stream()).collect(Collectors.toList()); + issueCnd.andEX("iid", "in", lastRanDomIssueIds); + } else { + if (maxAnswerNum == 0) { + //从没有随即过 + issueSql = Sqls.queryString(" SELECT iid FROM `question_issue` where iqid = @qid ORDER BY RAND() LIMIT @num"); + } else { + //之前随机过 + issueSql = Sqls.queryString(" SELECT iid FROM `question_issue` where iqid = @qid and iid not in (@issueIds) ORDER BY RAND() LIMIT @num"); + issueSql.setParam("issueIds", hasAnswerIssueIds); + } + issueSql.setParam("qid", id); + issueSql.setParam("num", ranDomSingleIssueNum); + dao.execute(issueSql); + String[] randomIssueIds = (String[]) issueSql.getResult(); + + if (Lang.isNotEmpty(randomIssueIds)) { + QuestionRandomIssue questionRandomIssue = new QuestionRandomIssue(); + questionRandomIssue.setQuestionId(id); + questionRandomIssue.setUserId(ShiroUtil.getUserId()); + questionRandomIssue.setIssueIds(Arrays.asList(randomIssueIds)); + questionRandomIssue.setNum(maxAnswerNum + 1); + questionRandomIssue.setIsFinish(false); + questionRandomIssue.setDisplayDate(DateUtil.parseDate(DateUtil.today())); + dao.insert(questionRandomIssue); + } + //获取本次的随机题目 + issueCnd.andEX("iid", "in", randomIssueIds); + } + } + } + } else { + //不是一天 那就一天随机一次 + + //用户的随机题目记录 + List randomIssues = dao.query(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId())); + //已经随机的题目 + List hasRanDomIssueIds = randomIssues.stream().flatMap(v -> v.getIssueIds().stream()).collect(Collectors.toList()); + + //判断传入的日期是否已经加入到表里 + QuestionRandomIssue currentDateRandomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId()) + .and("displayDate", "=", currentDate)); + if (Lang.isEmpty(currentDateRandomIssue)) { + Sql issueSql = null; + if (Lang.isEmpty(hasRanDomIssueIds)) { + issueSql = Sqls.queryString(" SELECT iid FROM `question_issue` where iqid = @qid ORDER BY RAND() LIMIT @num"); + } else { + //之前随机过 + issueSql = Sqls.queryString(" SELECT iid FROM `question_issue` where iqid = @qid and iid not in (@issueIds) ORDER BY RAND() LIMIT @num"); + issueSql.setParam("issueIds", hasRanDomIssueIds); + } + issueSql.setParam("num", ranDomSingleIssueNum); + issueSql.setParam("qid", id); + dao.execute(issueSql); + String[] randomIssueIds = (String[]) issueSql.getResult(); + QuestionRandomIssue questionRandomIssue = new QuestionRandomIssue(); + questionRandomIssue.setQuestionId(id); + questionRandomIssue.setUserId(ShiroUtil.getUserId()); + questionRandomIssue.setIssueIds(Arrays.asList(randomIssueIds)); + questionRandomIssue.setNum(null); + questionRandomIssue.setIsFinish(false); + questionRandomIssue.setDisplayDate(DateUtil.parseDate(currentDate)); + dao.insert(questionRandomIssue); + issueCnd.and("iid", "in", randomIssueIds); + } else { + issueCnd.and("iid", "in", currentDateRandomIssue.getIssueIds()); + } + } + } else if (ctMode == 3) { + //常规模式 + //判断是否将题目加进去了 + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId())); + if (Lang.isEmpty(randomIssue)) { + Sql issueSql = Sqls.create(" SELECT iid FROM `question_issue` where iqid = @qid"); + issueSql.setParam("qid", id); + issueSql.setCallback(Sqls.callback.strList()); + dao.execute(issueSql); + List randomIssueIds = (List) issueSql.getResult(); + Collections.shuffle(randomIssueIds); + QuestionRandomIssue questionRandomIssue = new QuestionRandomIssue(); + questionRandomIssue.setQuestionId(id); + questionRandomIssue.setUserId(ShiroUtil.getUserId()); + questionRandomIssue.setIssueIds(randomIssueIds); + questionRandomIssue.setNum(null); + questionRandomIssue.setIsFinish(false); + dao.insert(questionRandomIssue); + issueCnd.and("iid", "in", randomIssueIds); + } else { + issueCnd.and("iid", "in", randomIssue.getIssueIds()); + } + } + +// issueCnd.asc("ipxbh"); + questionService.fetchLinks(question, "issues", issueCnd); + for (Question_issue issue : question.getIssues()) { + questionService.fetchLinks(issue, "wors", Cnd.NEW().asc("wpxbh")); + } + + if (question.getDisruptingOrder()) { + Collections.shuffle(question.getIssues()); + } + + return Result.success(question); + } + + /** + * 保存答案 + * + * @param repliesArray 答复记录 + * @param questionId 问卷ID + * @param isSave 是否保存 + * @return {@link Object} + */ + @At("/saveAnswer") + public Object saveAnswer(@Param("replies") Question_reply[] repliesArray, String questionId, Boolean isSave) { + questionService.saveAnswer(repliesArray, questionId, isSave); + return Result.success(); + } + + + /** + * 答题信息 + * + * @param id id + * @return {@link Object} + */ + @At("/answerInfo/?") + public Object answerInfo(String id, + @Param(required = false, value = "currentDate") String currentDate, + @Param(required = false, value = "randomCount") Integer randomCount) { + Cnd cnd = Cnd.where("qid", "=", id).and("userId", "=", ShiroUtil.getPrincipalProperty("id")); + + Question question = dao.fetch(Question.class, id); + if (question.getCtMode() == 1) { + cnd.and("DATE(rtime)", "=", currentDate); + } else if (question.getCtMode() == 2) { + if (questionService.isSameDay(question.getStartTime(), question.getEndTime())) { + + } else { + cnd.and("DATE(rtime)", "=", currentDate); + } + } else if (question.getCtMode() == 3) { + + } + + List replies = questionService.dao().query(Question_reply.class, cnd); + return Result.success(replies); + } + + /** + * 再答一次 + * + * @param questionId 问题id + * @return {@link Object} + */ + @At("/answerAgain") + public Object answerAgain(String questionId) { + Sql issueIdsSql = Sqls.create("select iid from question_issue where iqid = @qid").setParam("qid", questionId); + String[] issueIds = (String[]) Daos.query(dao, issueIdsSql.toString(), Sqls.callback.strs()); + //清空本日的答题记录 + dao.clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getPlatformUid()).and("issueId", "in", issueIds)); + return Result.success(); + } + + @At("/winInfo") + public Object winInfo(String questionId) { +// List winners = dao.query(QuestionWinner.class, Cnd.where("questionId", "=", questionId)); +// return Result.success(winners); + Sql sql = Sqls.create(""" + SELECT + u.username, + qw.winDate, + u.id + FROM + `question_winner` qw + LEFT JOIN `user` u ON u.id = qw.userId + WHERE + qw.questionId = @questionId + """); + sql.setParam("questionId", questionId); + List list = questionService.listMap(sql); + return Result.success(list); + } + + /** + * 判断用户是否答完 + * + * @param questionId 问卷ID + * @return + */ + @At + public Object checkUserFinishAnswer(String questionId, + @Param(required = false, value = "currentDate") String currentDate, + @Param(required = false, value = "randomCount") Integer randomCount) { + Question question = dao.fetch(Question.class, questionId); + if (question.getCtMode() == 3) { + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + return Result.success(randomIssue.getIsFinish()); + } else if (question.getCtMode() == 2) { + //判断是否为一天答题 + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + + if (betweenDay == 0) { + //同一天 + if (randomCount != null) { + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("num", "=", randomCount)); + return Result.success(randomIssue.getIsFinish()); + } + return Result.success(false); + } else { + //不是同一天 判断今天是否答完就行了 + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today())); + //时间过了 + if (DateUtil.parseDate(currentDate).isBefore(DateUtil.parseDate(DateUtil.today()))) { + return Result.success(true); + } + return Result.success(randomIssue.getIsFinish()); + } + } else if (question.getCtMode() == 1) { + QuestionRandomIssue randomIssue = dao.fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", currentDate)); + //时间过了 + if (DateUtil.parseDate(currentDate).isBefore(DateUtil.parseDate(DateUtil.today()))) { + return Result.success(true); + } + return Result.success(randomIssue.getIsFinish()); + } + return Result.success(false); + } + + @At + public Object checkCanAnswerAgain(String questionId, + @Param(required = false, value = "currentDate") String currentDate, + @Param(required = false, value = "randomCount") Integer randomCount) { + Question question = dao.fetch(Question.class, questionId); + if (question.getCanRepeatedAnswer()) { + //0次则不限制 + if (question.getCanRepeatedAnswerNum() == 0) { + return Result.success(true); + } + + if (question.getCtMode() == 3) { + int count = dao.count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + return Result.success(count < question.getCanRepeatedAnswerNum()); + } else if (question.getCtMode() == 2) { + //判断是否为一天答题 + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (betweenDay == 0) { + return Result.success(false); + } else { + int count = dao.count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("answerDate", "=", DateUtil.today())); + return Result.success(count < question.getCanRepeatedAnswerNum()); + } + } else if (question.getCtMode() == 1) { + int count = dao.count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("answerDate", "=", currentDate)); + //时间过了 + if (Lang.isNotEmpty(currentDate) && DateUtil.parseDate(currentDate).isBefore(DateUtil.parseDate(DateUtil.today()))) { + return Result.success(false); + } + return Result.success(count < question.getCanRepeatedAnswerNum()); + } + } + return Result.success(false); + } + + /** + * 获取得分 + * + * @param questionId + * @param currentDate + * @param randomCount + * @return + */ + @At + public Object getScore(String questionId, + @Param(required = false, value = "currentDate") String currentDate, + @Param(required = false, value = "randomCount") Integer randomCount) { + Question question = dao.fetch(Question.class, questionId); + + if (question.getCtMode() == 1) { + QuestionUserScore userScore = dao.fetch(QuestionUserScore.class, Cnd.where("questionId", "=", questionId) + .and("userId", "=", ShiroUtil.getUserId()) + .and("displayDate", "=", currentDate) + .desc(question.getCalcScoreMode() == 1 ? "score" : "answerNum")); + return Result.success().addData(Optional.ofNullable(userScore).map(v -> v.getScore()).orElse(0)); + } else if (question.getCtMode() == 2) { + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + + if (betweenDay == 0) { + QuestionUserScore userScore = dao.fetch(QuestionUserScore.class, Cnd.where("questionId", "=", questionId) + .and("userId", "=", ShiroUtil.getUserId()) +// .and("displayDate", "=", currentDate) + .and("answerNum", "=", randomCount) + .desc("answerNum")); + return Result.success().addData(Optional.ofNullable(userScore).map(v -> v.getScore()).orElse(0)); + } else { + QuestionUserScore userScore = dao.fetch(QuestionUserScore.class, Cnd.where("questionId", "=", questionId) + .and("userId", "=", ShiroUtil.getUserId()) + .and("displayDate", "=", currentDate) + .desc(question.getCalcScoreMode() == 1 ? "score" : "answerNum")); + return Result.success().addData(Optional.ofNullable(userScore).map(v -> v.getScore()).orElse(0)); + } + } else if (question.getCtMode() == 3) { + QuestionUserScore userScore = dao.fetch(QuestionUserScore.class, Cnd.where("questionId", "=", questionId) + .and("userId", "=", ShiroUtil.getUserId()) + .desc(question.getCalcScoreMode() == 1 ? "score" : "answerNum")); + return Result.success().addData(Optional.ofNullable(userScore).map(v -> v.getScore()).orElse(0)); + } + return Result.success(); + } + + /** + * 获取用户已回答的轮数 针对单天随机 + * + * @param questionId 问卷ID + * @return + */ + @At + public Object getUserHasAnswerRandomNum(String questionId) { + Question question = dao.fetch(Question.class, questionId); + //判断是否为一天答题 + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (question.getCtMode() == 2 && betweenDay == 0) { + int count = dao.count(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId) + .and("userId", "=", ShiroUtil.getUserId())); + return Result.success().addData(count); + } + return Result.success().addData(0); + } +} diff --git a/src/main/java/io/v/nutz/question/controller/QuestionMangeController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionMangeController.java similarity index 78% rename from src/main/java/io/v/nutz/question/controller/QuestionMangeController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionMangeController.java index 7ec250f..18d73fd 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionMangeController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionMangeController.java @@ -1,24 +1,25 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; import cn.wizzer.framework.base.Result; import io.v.nutz.annontation.ViReturn; -import io.v.nutz.base.utils.DateUtil; import io.v.nutz.modules.models.PageForm; -import io.v.nutz.question.model.Question; -import io.v.nutz.question.model.Question_issue; -import io.v.nutz.question.model.Question_reply; -import io.v.nutz.question.model.Question_wor; -import io.v.nutz.question.service.QuestionIssueService; -import io.v.nutz.question.service.QuestionReplyService; -import io.v.nutz.question.service.QuestionService; -import io.v.nutz.question.service.QuestionWorService; import io.v.nutz.sys.models.Sys_task; import io.v.nutz.sys.services.SysTaskService; import io.v.nutz.task.services.TaskPlatformService; -import io.v.nutz.util.ShiroUtil; +import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.Question_issue; +import io.v.nutz.zhgh.question.model.Question_reply; +import io.v.nutz.zhgh.question.model.Question_wor; +import io.v.nutz.zhgh.question.service.QuestionIssueService; +import io.v.nutz.zhgh.question.service.QuestionReplyService; +import io.v.nutz.zhgh.question.service.QuestionService; +import io.v.nutz.zhgh.question.service.QuestionWorService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Chain; @@ -30,18 +31,18 @@ import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.json.Json; +import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.random.R; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.POST; import org.nutz.mvc.annotation.Param; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.stream.Collectors; /** @@ -86,7 +87,7 @@ public class QuestionMangeController { @ViReturn @RequiresPermissions("question.mange") public Object pageData(PageForm pageForm, @Param(value = "qtitle", required = false) String qtitle, - @Param(value = "year",required = false) Integer year) { + @Param(value = "year", required = false) Integer year) { try { Cnd cnd = Cnd.NEW(); if (Strings.isNotBlank(qtitle)) { @@ -98,6 +99,7 @@ public class QuestionMangeController { sql.setCondition(cnd); return Result.success().addData(questionService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), sql)); } catch (Exception e) { + e.printStackTrace(); return Result.error(); } } @@ -114,8 +116,6 @@ public class QuestionMangeController { @RequiresPermissions("question.mange") public Object upStatus(String qid, Integer flag) { try { - Assert.notBlank(qid); - Assert.notNull(flag); dao.update(Question.class, Chain.make("qflag", flag), Cnd.where("qid", "=", qid)); return Result.success(); } catch (Exception e) { @@ -131,13 +131,23 @@ public class QuestionMangeController { public Object doAdd(@Param("question") Question question) { try { question.setQflag(1); - question.setQctime(DateUtil.getDate()); + question.setQctime(DateUtil.now()); question.setQcreator(ShiroUtil.getPrincipalProperty("id").toString()); + //这里要额外判断下随机模式下的答题天数 + if (question.getQlx() == 2) { + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (betweenDay < 1) { + //同一天 + question.setCanRepeatedAnswer(false); + question.setCanRepeatedAnswerNum(null); + } + } + Question insert = questionService.insert(question); - int i = 1; - for (Question_issue issue : question.getIssues()) { issue.setIid(Strings.isNotBlank(issue.getIid()) ? issue.getIid() : R.UU32()); issue.setIqid(insert.getQid()); @@ -145,7 +155,6 @@ public class QuestionMangeController { if (question.getCtMode() == 2) { issue.setIpxbh(i); } - Question_issue issueInsert = questionIssueService.insert(issue); int j = 1; for (Question_wor wor : issue.getWors()) { @@ -157,9 +166,7 @@ public class QuestionMangeController { } i++; } - - raffleTask(question.getQid()); - +// raffleTask(question.getQid()); return Result.success(); } catch (Exception e) { e.printStackTrace(); @@ -173,6 +180,17 @@ public class QuestionMangeController { @ViReturn @RequiresPermissions("question.mange") public Object doEdit(@Param("question") Question question) { + //这里要额外判断下随机模式下的答题天数 + if (question.getQlx() == 2) { + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (betweenDay < 1) { + //同一天 + question.setCanRepeatedAnswer(false); + question.setCanRepeatedAnswerNum(null); + } + } questionService.update(question); List oldIssues = dao.query(Question_issue.class, Cnd.where("iqid", "=", question.getQid())); @@ -239,7 +257,7 @@ public class QuestionMangeController { /** - * 删除文具按 + * 删除问卷 * * @param qid qid * @return {@link Object} @@ -309,13 +327,23 @@ public class QuestionMangeController { @At("/modifyBasicInfo") @RequiresPermissions("question.mange") @ViReturn - public Object modifyBasicInfo(Question question) { + public Object modifyBasicInfo(@Param("question") Question question) { try { Assert.notNull(question); + if (question.getQlx() == 2) { + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (betweenDay < 1) { + //同一天 + question.setCanRepeatedAnswer(false); + question.setCanRepeatedAnswerNum(null); + } + } if (StrUtil.isNotBlank(question.getQid())) { dao.updateIgnoreNull(question); } else { - question.setQctime(cn.hutool.core.date.DateUtil.today()); + question.setQctime(DateUtil.today()); question.setQcreator(ShiroUtil.getUserId()); question.setQflag(1); dao.insert(question); @@ -370,9 +398,9 @@ public class QuestionMangeController { for (int i = 0; i < issueList.size(); i++) { Question_issue issue = issueList.get(i); issue.setIqid(questionId); - if (question.getCtMode() == 2) { +// if (question.getCtMode() == 2) { issue.setIpxbh(i + 1); - } +// } dao.insertOrUpdate(issue); List wors = issue.getWors(); for (int i1 = 0; i1 < wors.size(); i1++) { @@ -416,41 +444,41 @@ public class QuestionMangeController { * @param questionId 问题id */ private void raffleTask(String questionId) { - Question question = dao.fetch(Question.class, questionId); - - //每天凌晨一点执行 - String cron = "0 0 1 * * ?"; - cron = "30 * * * * ? "; - String cronData = Json.toJson(Map.of("questionId", questionId)); + //删除之前的任务再添加 + List oldTasks = dao.query(Sys_task.class, Cnd.where("data", "like", "%" + questionId + "%")); + for (Sys_task task : oldTasks) { + taskPlatformService.delete(task.getId(), task.getId()); + sysTaskService.delete(task.getId()); + } String jobClass = "io.v.nutz.task.job.question.QuestionRaffleJob"; - Sys_task task = sysTaskService.fetch(Cnd.where("jobClass", "=", jobClass).and("data", "=", cronData)); - + Question question = dao.fetch(Question.class, questionId); //需要抽奖 if (question.getIsRaffle() != null && question.getIsRaffle()) { - if (task != null) { - task.setName(HtmlUtil.cleanHtmlTag(question.getQtitle()) + "问卷调查抽奖任务"); - task.setCron(cron); - sysTaskService.updateIgnoreNull(task); - if (taskPlatformService.isExist(task.getId(), task.getId())) { - taskPlatformService.delete(task.getId(), task.getId()); - } - } else { - task = new Sys_task(); + + String dateFormat = "ss mm HH dd MM ? yyyy"; + SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); + + List raffleRules = question.getRaffleRule(); + for (Question.RaffleRule raffleRule : raffleRules) { + Date raffleTime = raffleRule.getRaffleTime(); + String formatTimeStr = sdf.format(raffleTime); + + NutMap raffleRuleMap = Lang.obj2nutmap(raffleRule); + raffleRuleMap.put("questionId", questionId); + + String cronData = Json.toJson(raffleRuleMap); + + Sys_task task = new Sys_task(); task.setName(HtmlUtil.cleanHtmlTag(question.getQtitle()) + "问卷调查抽奖任务"); task.setJobClass(jobClass); task.setNote("问卷调查抽奖任务"); - task.setCron(cron); + task.setCron(formatTimeStr); task.setData(cronData); task.setDisabled(false); sysTaskService.insert(task); - } - taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron(), - task.getNote(), task.getData()); - } else { - if (task != null) { - taskPlatformService.delete(task.getId(), task.getId()); - sysTaskService.delete(task.getId()); + taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron(), + task.getNote(), task.getData()); } } } diff --git a/src/main/java/io/v/nutz/question/controller/QuestionPollAnalysisController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionPollAnalysisController.java similarity index 95% rename from src/main/java/io/v/nutz/question/controller/QuestionPollAnalysisController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionPollAnalysisController.java index a81d488..dc3d98a 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionPollAnalysisController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionPollAnalysisController.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.annotation.Excel; @@ -6,12 +6,12 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.wizzer.framework.base.Result; import io.v.nutz.base.utils.Html2Text; import io.v.nutz.modules.models.PageForm; -import io.v.nutz.question.model.Question; -import io.v.nutz.question.model.Question_issue; -import io.v.nutz.question.service.QuestionIssueService; -import io.v.nutz.question.service.QuestionReplyService; -import io.v.nutz.question.service.QuestionService; -import io.v.nutz.question.service.QuestionWorService; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.Question_issue; +import io.v.nutz.zhgh.question.service.QuestionIssueService; +import io.v.nutz.zhgh.question.service.QuestionReplyService; +import io.v.nutz.zhgh.question.service.QuestionService; +import io.v.nutz.zhgh.question.service.QuestionWorService; import lombok.Data; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.authz.annotation.RequiresPermissions; diff --git a/src/main/java/io/v/nutz/question/controller/QuestionUnionIntentionalChoiceController.java b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionUnionIntentionalChoiceController.java similarity index 99% rename from src/main/java/io/v/nutz/question/controller/QuestionUnionIntentionalChoiceController.java rename to src/main/java/io/v/nutz/zhgh/question/controller/QuestionUnionIntentionalChoiceController.java index 42c13f6..52f3613 100644 --- a/src/main/java/io/v/nutz/question/controller/QuestionUnionIntentionalChoiceController.java +++ b/src/main/java/io/v/nutz/zhgh/question/controller/QuestionUnionIntentionalChoiceController.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.controller; +package io.v.nutz.zhgh.question.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.annotation.Excel; @@ -10,11 +10,11 @@ import cn.wizzer.framework.base.Result; import io.v.nutz.activity.models.ActivityUserScope; import io.v.nutz.annontation.ViReturn; import io.v.nutz.dao.CndPlus; -import io.v.nutz.question.model.Question; -import io.v.nutz.question.service.QuestionService; import io.v.nutz.sys.models.Sys_union; import io.v.nutz.util.ViTool; import io.v.nutz.web.commons.utils.FileUtil; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.service.QuestionService; import lombok.Data; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.time.DateFormatUtils; @@ -109,7 +109,7 @@ public class QuestionUnionIntentionalChoiceController { """).setParam("questionId", questionId); CndPlus cndPlus = CndPlus.create(); - cndPlus.andExcludeEmpty("un.id", "=", unionId); + cndPlus.andEX("un.id", "=", unionId); sql.setCondition(cndPlus); List unionList = questionService.listMap(sql); @@ -270,7 +270,7 @@ public class QuestionUnionIntentionalChoiceController { $condition """).setParam("questionId", questionId); - cnd.andExcludeEmpty("u.unionid", "=", unionId); + cnd.andEX("u.unionid", "=", unionId); cnd.groupBy("u.id"); cnd.desc("u.unioncode"); sql.setCondition(cnd); diff --git a/src/main/java/io/v/nutz/question/model/Question.java b/src/main/java/io/v/nutz/zhgh/question/model/Question.java similarity index 63% rename from src/main/java/io/v/nutz/question/model/Question.java rename to src/main/java/io/v/nutz/zhgh/question/model/Question.java index e48e2fd..bb0cd4e 100644 --- a/src/main/java/io/v/nutz/question/model/Question.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/Question.java @@ -1,9 +1,10 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; import java.io.Serializable; +import java.util.Date; import java.util.List; @@ -51,7 +52,7 @@ public class Question implements Serializable { @Column @Comment("说明") - @ColDefine(type = ColType.VARCHAR, width = 2000) + @ColDefine(customType = "text") private String qsm; @Column @@ -95,16 +96,16 @@ public class Question implements Serializable { @ColDefine(type = ColType.INT) private Integer ctMode; - @Column - @Comment("单次出题数量") - @ColDefine(type = ColType.INT) - private Integer ctNum; - @Column @Comment("是否抽奖") @ColDefine(type = ColType.BOOLEAN) private Boolean isRaffle; + @Column + @Comment("抽奖时间") + @ColDefine(type = ColType.DATETIME) + private Date raffleTime; + @Column @Comment("多少分可以抽奖") @ColDefine(type = ColType.INT) @@ -115,5 +116,59 @@ public class Question implements Serializable { @ColDefine(type = ColType.INT) private Integer raffleWinnerUserNum; + @Column + @Comment("题目顺序打乱") + @ColDefine(type = ColType.BOOLEAN) + private Boolean disruptingOrder; + @Column + @Comment("随机单次出题数量") + @ColDefine(type = ColType.INT) + private Integer ranDomSingleIssueNum; + + @Column + @Comment("总共随机次数") + @ColDefine(type = ColType.INT) + private Integer ranDomSum; + + @Column + @Comment("是否多次答") + @ColDefine(type = ColType.BOOLEAN) + private Boolean canRepeatedAnswer; + + @Column + @Comment("多次答数") + @ColDefine(type = ColType.INT) + private Integer canRepeatedAnswerNum; + + @Column + @Comment("得分统计(重复答题允许下 1.保存最高分 2.保存最新得分)") + @ColDefine(type = ColType.INT) + private Integer calcScoreMode; + + @Column + @Comment("抽奖规则") + @ColDefine(type = ColType.MYSQL_JSON) + private List raffleRule; + + /** + * 抽奖规则 + */ + @Data + public static class RaffleRule { + //开始答题时间 + private Date startAnswerDate; + + //结束答题时间 + private Date endAnswerDate; + + //抽奖时间 + private Date raffleTime; + + //抽奖分数 + private Integer raffleScore; + + //抽奖人数 + private Integer raffleWinnerUserNum; + } } diff --git a/src/main/java/io/v/nutz/question/model/QuestionAnswerUserScore.java b/src/main/java/io/v/nutz/zhgh/question/model/QuestionAnswerUserScore.java similarity index 96% rename from src/main/java/io/v/nutz/question/model/QuestionAnswerUserScore.java rename to src/main/java/io/v/nutz/zhgh/question/model/QuestionAnswerUserScore.java index dd832a2..c83c108 100644 --- a/src/main/java/io/v/nutz/question/model/QuestionAnswerUserScore.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/QuestionAnswerUserScore.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; diff --git a/src/main/java/io/v/nutz/zhgh/question/model/QuestionRandomIssue.java b/src/main/java/io/v/nutz/zhgh/question/model/QuestionRandomIssue.java new file mode 100644 index 0000000..8b73149 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/model/QuestionRandomIssue.java @@ -0,0 +1,52 @@ +package io.v.nutz.zhgh.question.model; + +import io.v.nutz.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Comment("问卷随机题目") +@Table +public class QuestionRandomIssue extends BaseModel { + + @Name + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("问卷的id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String questionId; + + @Column + @Comment("用户id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String userId; + + @Column + @Comment("题目") + @ColDefine(type = ColType.MYSQL_JSON) + private List issueIds; + + @Column + @Comment("回答次数") + @ColDefine(type = ColType.INT) + private Integer num; + + @Column + @Comment("是否回答完成") + @ColDefine(type = ColType.BOOLEAN) + private Boolean isFinish; + + @Column + @Comment("显示日期") + @ColDefine(type = ColType.DATE) + private Date displayDate; +} diff --git a/src/main/java/io/v/nutz/question/model/QuestionSigner.java b/src/main/java/io/v/nutz/zhgh/question/model/QuestionSigner.java similarity index 96% rename from src/main/java/io/v/nutz/question/model/QuestionSigner.java rename to src/main/java/io/v/nutz/zhgh/question/model/QuestionSigner.java index 1ede0a1..ee8f2ff 100644 --- a/src/main/java/io/v/nutz/question/model/QuestionSigner.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/QuestionSigner.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import lombok.experimental.Accessors; diff --git a/src/main/java/io/v/nutz/question/model/QuestionUserScore.java b/src/main/java/io/v/nutz/zhgh/question/model/QuestionUserScore.java similarity index 66% rename from src/main/java/io/v/nutz/question/model/QuestionUserScore.java rename to src/main/java/io/v/nutz/zhgh/question/model/QuestionUserScore.java index ff5ac8c..4c2a1ba 100644 --- a/src/main/java/io/v/nutz/question/model/QuestionUserScore.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/QuestionUserScore.java @@ -1,6 +1,8 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; +import io.v.nutz.base.model.BaseModel; import lombok.Data; +import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; import org.nutz.dao.interceptor.annotation.PrevInsert; @@ -12,9 +14,10 @@ import java.util.Date; * @author jug * @date 2023/06/20 */ +@EqualsAndHashCode(callSuper = true) @Data @Table -public class QuestionUserScore { +public class QuestionUserScore extends BaseModel { @Name @ColDefine(type = ColType.VARCHAR, width = 32) @@ -46,4 +49,13 @@ public class QuestionUserScore { @ColDefine(type = ColType.INT) private Integer answerNum; + @Column + @Comment("随机次数") + @ColDefine(type = ColType.INT) + private Integer randomNum; + + @Column + @Comment("显示日期(只针对定时定题)") + @ColDefine(type = ColType.DATE) + private Date displayDate; } diff --git a/src/main/java/io/v/nutz/question/model/QuestionWinner.java b/src/main/java/io/v/nutz/zhgh/question/model/QuestionWinner.java similarity index 83% rename from src/main/java/io/v/nutz/question/model/QuestionWinner.java rename to src/main/java/io/v/nutz/zhgh/question/model/QuestionWinner.java index 7d18bd9..d0363bc 100644 --- a/src/main/java/io/v/nutz/question/model/QuestionWinner.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/QuestionWinner.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; @@ -37,4 +37,9 @@ public class QuestionWinner { @ColDefine(type = ColType.DATE) private Date winDate; + @Column + @Comment("分数") + @ColDefine(type = ColType.INT) + private Integer score; + } diff --git a/src/main/java/io/v/nutz/question/model/Question_issue.java b/src/main/java/io/v/nutz/zhgh/question/model/Question_issue.java similarity index 98% rename from src/main/java/io/v/nutz/question/model/Question_issue.java rename to src/main/java/io/v/nutz/zhgh/question/model/Question_issue.java index aafc1e5..7965763 100644 --- a/src/main/java/io/v/nutz/question/model/Question_issue.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/Question_issue.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; diff --git a/src/main/java/io/v/nutz/question/model/Question_reply.java b/src/main/java/io/v/nutz/zhgh/question/model/Question_reply.java similarity index 94% rename from src/main/java/io/v/nutz/question/model/Question_reply.java rename to src/main/java/io/v/nutz/zhgh/question/model/Question_reply.java index 938c445..d071af2 100644 --- a/src/main/java/io/v/nutz/question/model/Question_reply.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/Question_reply.java @@ -1,10 +1,11 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; import org.nutz.integration.json4excel.annotation.J4EIgnore; import java.io.Serializable; +import java.util.List; /** @@ -85,4 +86,6 @@ public class Question_reply implements Serializable { @One(field = "rwid", key = "wid") private Question_wor wor; + + private List userSelect; } diff --git a/src/main/java/io/v/nutz/question/model/Question_wor.java b/src/main/java/io/v/nutz/zhgh/question/model/Question_wor.java similarity index 98% rename from src/main/java/io/v/nutz/question/model/Question_wor.java rename to src/main/java/io/v/nutz/zhgh/question/model/Question_wor.java index db14f46..d6ed20c 100644 --- a/src/main/java/io/v/nutz/question/model/Question_wor.java +++ b/src/main/java/io/v/nutz/zhgh/question/model/Question_wor.java @@ -1,4 +1,4 @@ -package io.v.nutz.question.model; +package io.v.nutz.zhgh.question.model; import lombok.Data; import org.nutz.dao.entity.annotation.*; diff --git a/src/main/java/io/v/nutz/zhgh/question/service/QuestionAnswerRankingService.java b/src/main/java/io/v/nutz/zhgh/question/service/QuestionAnswerRankingService.java new file mode 100644 index 0000000..3b4ff53 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/service/QuestionAnswerRankingService.java @@ -0,0 +1,23 @@ +package io.v.nutz.zhgh.question.service; + +import io.v.nutz.base.page.Pagination; +import io.v.nutz.base.service.BaseService; +import io.v.nutz.modules.models.PageForm; +import io.v.nutz.zhgh.question.model.QuestionUserScore; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * 得分 + */ +public interface QuestionAnswerRankingService extends BaseService { + + Pagination pageData(PageForm pageForm, + String questionId, + String unionId, + String unitId, + String answerDate); + + void exportXlsx(String questionId, OutputStream os) throws IOException; +} diff --git a/src/main/java/io/v/nutz/question/service/QuestionIssueService.java b/src/main/java/io/v/nutz/zhgh/question/service/QuestionIssueService.java similarity index 56% rename from src/main/java/io/v/nutz/question/service/QuestionIssueService.java rename to src/main/java/io/v/nutz/zhgh/question/service/QuestionIssueService.java index 8fa28f5..ef92d5f 100644 --- a/src/main/java/io/v/nutz/question/service/QuestionIssueService.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/QuestionIssueService.java @@ -1,8 +1,8 @@ -package io.v.nutz.question.service; +package io.v.nutz.zhgh.question.service; import io.v.nutz.base.service.BaseService; -import io.v.nutz.question.model.Question_issue; +import io.v.nutz.zhgh.question.model.Question_issue; public interface QuestionIssueService extends BaseService { } diff --git a/src/main/java/io/v/nutz/question/service/QuestionReplyService.java b/src/main/java/io/v/nutz/zhgh/question/service/QuestionReplyService.java similarity index 80% rename from src/main/java/io/v/nutz/question/service/QuestionReplyService.java rename to src/main/java/io/v/nutz/zhgh/question/service/QuestionReplyService.java index b977747..3181cc5 100644 --- a/src/main/java/io/v/nutz/question/service/QuestionReplyService.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/QuestionReplyService.java @@ -1,10 +1,9 @@ -package io.v.nutz.question.service; +package io.v.nutz.zhgh.question.service; - -import io.v.nutz.question.model.Question; -import io.v.nutz.question.model.Question_reply; import io.v.nutz.service.ViService; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.Question_reply; import java.util.List; diff --git a/src/main/java/io/v/nutz/zhgh/question/service/QuestionService.java b/src/main/java/io/v/nutz/zhgh/question/service/QuestionService.java new file mode 100644 index 0000000..80a7f85 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/service/QuestionService.java @@ -0,0 +1,44 @@ +package io.v.nutz.zhgh.question.service; + +import io.v.nutz.service.ViService; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.Question_reply; +import org.nutz.lang.util.NutMap; + +/** + * Created by 李耀威 on 2020-02-19 + * info by 问卷调查 service + */ +public interface QuestionService extends ViService { + Question getQuestion(String qid); + + NutMap getVoteData(String qid); + + NutMap getRankData(String qid); + + + /** + * 答题 + * + * @param repliesArray 记录 + * @param questionId 问卷ID + * @param isSave 是否保存 + */ + void saveAnswer(Question_reply[] repliesArray, String questionId, Boolean isSave); + + + /** + * 是否同天 仅限随机 + * @param questionId 问卷ID + * @return + */ + boolean isSameDay(String questionId); + + /** + * 是否同天 仅限随机 + * @param startTimeTs 开始时间 + * @param endTimeTs 结束时间 + * @return + */ + boolean isSameDay(long startTimeTs,long endTimeTs); +} diff --git a/src/main/java/io/v/nutz/question/service/QuestionWorService.java b/src/main/java/io/v/nutz/zhgh/question/service/QuestionWorService.java similarity index 56% rename from src/main/java/io/v/nutz/question/service/QuestionWorService.java rename to src/main/java/io/v/nutz/zhgh/question/service/QuestionWorService.java index a437a35..68dbaa7 100644 --- a/src/main/java/io/v/nutz/question/service/QuestionWorService.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/QuestionWorService.java @@ -1,8 +1,8 @@ -package io.v.nutz.question.service; +package io.v.nutz.zhgh.question.service; import io.v.nutz.base.service.BaseService; -import io.v.nutz.question.model.Question_wor; +import io.v.nutz.zhgh.question.model.Question_wor; public interface QuestionWorService extends BaseService { } diff --git a/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionAnswerRankingServiceImpl.java b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionAnswerRankingServiceImpl.java new file mode 100644 index 0000000..258f538 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionAnswerRankingServiceImpl.java @@ -0,0 +1,422 @@ +package io.v.nutz.zhgh.question.service.impl; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +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.modules.models.PageForm; +import io.v.nutz.zhgh.question.model.Question; +import io.v.nutz.zhgh.question.model.QuestionUserScore; +import io.v.nutz.zhgh.question.service.QuestionAnswerRankingService; +import io.v.nutz.zhgh.question.service.QuestionService; +import org.apache.poi.ss.usermodel.Workbook; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class QuestionAnswerRankingServiceImpl extends BaseServiceImpl implements QuestionAnswerRankingService { + public QuestionAnswerRankingServiceImpl(Dao dao) { + super(dao); + } + + @Inject + private QuestionService questionService; + + @Override + public Pagination pageData(PageForm pageForm, String questionId, String unionId, String unitId, String answerDate) { + Question question = dao().fetch(Question.class, questionId); + + if (question.getCtMode() == 1) { + Sql sql = Sqls.create(""" + SELECT + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, + qus.score, + qus.answerNum, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile + FROM + question_user_score qus + LEFT JOIN `user` u ON u.id = qus.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unitid", "=", unitId); + cnd.andEX("qus.answerDate", "=", answerDate); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%")); + } + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + if (question.getCalcScoreMode() == 1) { + cnd.and("qus.score", "in", Sqls.create("select max(score) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } else if (question.getCalcScoreMode() == 2) { + cnd.and("qus.answerNum", "in", Sqls.create("select max(answerNum) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } else if (question.getCtMode() == 2) { + if (questionService.isSameDay(question.getStartTime(), question.getEndTime())) { + Sql sql = Sqls.create(""" + SELECT + GROUP_CONCAT( qus.answerNum, '(', qus.score, ')' ORDER BY qus.answerNum SEPARATOR ', ' ) AS everyRandomScore, + sum( score ) AS score, + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile, + q.ctMode, + q.calcScoreMode + FROM + `question_user_score` qus + LEFT JOIN `user` u ON u.id = qus.userId + LEFT JOIN question q ON q.qid = qus.questionId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unitid", "=", unitId); + cnd.andEX("qus.answerDate", "=", answerDate); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%")); + } + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } else { + Sql sql = Sqls.create(""" + SELECT + ( + SELECT + score\s + FROM + question_user_score\s + WHERE + userId = qus.userId\s + AND answerDate = qus.answerDate\s + AND answerNum = max( qus.answerNum )\s + AND questionId = qus.questionId + ) as lastAnswerNumScore, + ( + SELECT + score\s + FROM + question_user_score\s + WHERE + userId = qus.userId\s + AND answerDate = qus.answerDate\s + AND score = max( qus.score )\s + AND questionId = qus.questionId + ) as maxAnswerScore, + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate, + qus.answerNum, + max( qus.answerNum ), + min( qus.answerNum ), + qus.score, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile, + q.ctMode, + q.calcScoreMode + FROM + `question_user_score` qus + LEFT JOIN `user` u ON u.id = qus.userId + LEFT JOIN question q ON q.qid = qus.questionId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unitid", "=", unitId); + cnd.andEX("qus.answerDate", "=", answerDate); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%")); + } + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + sql.setCondition(cnd); + Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List list = pagination.getList(); + for (NutMap map : list) { + map.put("score", map.getInt(question.getCalcScoreMode() == 1 ? "maxAnswerScore" : "lastAnswerNumScore")); + } + return pagination; + } + } else if (question.getCtMode() == 3) { + Sql sql = Sqls.create(""" + SELECT + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, + qus.score, + qus.answerNum, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile + FROM + question_user_score qus + LEFT JOIN `user` u ON u.id = qus.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.andEX("u.unionid", "=", unionId); + cnd.andEX("u.unitid", "=", unitId); + cnd.andEX("qus.answerDate", "=", answerDate); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%")); + } + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + if (question.getCalcScoreMode() == 1) { + cnd.and("qus.score", "in", Sqls.create("select max(score) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } else if (question.getCalcScoreMode() == 2) { + cnd.and("qus.answerNum", "in", Sqls.create("select max(answerNum) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + return new Pagination(); + } + + @Override + public void exportXlsx(String questionId, OutputStream os) throws IOException { + Question question = dao().fetch(Question.class, questionId); + + if (question.getCtMode() == 1) { + Sql sql = Sqls.create(""" + SELECT + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, + qus.score, + qus.answerNum, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile + FROM + question_user_score qus + LEFT JOIN `user` u ON u.id = qus.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + if (question.getCalcScoreMode() == 1) { + cnd.and("qus.score", "in", Sqls.create("select max(score) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } else if (question.getCalcScoreMode() == 2) { + cnd.and("qus.answerNum", "in", Sqls.create("select max(answerNum) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } + sql.setCondition(cnd); + List list = listMap(sql); + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); + exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); + exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 20)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); + exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("分数", "score", 20)); + exportEntities.add(new ExcelExportEntity("答题日期", "answerDate", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); + workbook.write(os); + + } else if (question.getCtMode() == 2) { + if (questionService.isSameDay(question.getStartTime(), question.getEndTime())) { + Sql sql = Sqls.create(""" + SELECT + GROUP_CONCAT( qus.answerNum, '(', qus.score, ')' ORDER BY qus.answerNum SEPARATOR ', ' ) AS everyRandomScore, + sum( score ) AS score, + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile, + q.ctMode, + q.calcScoreMode + FROM + `question_user_score` qus + LEFT JOIN `user` u ON u.id = qus.userId + LEFT JOIN question q ON q.qid = qus.questionId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + sql.setCondition(cnd); + List list = listMap(sql); + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); + exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); + exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 20)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); + exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("分数", "score", 20)); + exportEntities.add(new ExcelExportEntity("每轮分数", "everyRandomScore", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); + workbook.write(os); + + } else { + Sql sql = Sqls.create(""" + SELECT + ( + SELECT + score\s + FROM + question_user_score\s + WHERE + userId = qus.userId\s + AND answerDate = qus.answerDate\s + AND answerNum = max( qus.answerNum )\s + AND questionId = qus.questionId + ) as lastAnswerNumScore, + ( + SELECT + score\s + FROM + question_user_score\s + WHERE + userId = qus.userId\s + AND answerDate = qus.answerDate\s + AND score = max( qus.score )\s + AND questionId = qus.questionId + ) as maxAnswerScore, + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate, + qus.answerNum, + max( qus.answerNum ), + min( qus.answerNum ), + qus.score, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile, + q.ctMode, + q.calcScoreMode + FROM + `question_user_score` qus + LEFT JOIN `user` u ON u.id = qus.userId + LEFT JOIN question q ON q.qid = qus.questionId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + sql.setCondition(cnd); + List list = listMap(sql); + for (NutMap map : list) { + map.put("score", map.getInt(question.getCalcScoreMode() == 1 ? "maxAnswerScore" : "lastAnswerNumScore")); + } + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); + exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); + exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 20)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); + exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("分数", "score", 20)); + exportEntities.add(new ExcelExportEntity("答题日期", "answerDate", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); + workbook.write(os); + } + } else if (question.getCtMode() == 3) { + Sql sql = Sqls.create(""" + SELECT + qus.userId, + DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) as answerDate, + qus.score, + qus.answerNum, + u.loginname, + u.username, + u.sex, + u.unitname, + u.unionname, + u.mobile + FROM + question_user_score qus + LEFT JOIN `user` u ON u.id = qus.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("qus.questionId", "=", questionId); + + cnd.groupBy("qus.answerDate", "qus.userId"); + cnd.asc("qus.answerDate").asc("u.unionid").asc("u.id"); + if (question.getCalcScoreMode() == 1) { + cnd.and("qus.score", "in", Sqls.create("select max(score) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } else if (question.getCalcScoreMode() == 2) { + cnd.and("qus.answerNum", "in", Sqls.create("select max(answerNum) from question_user_score where userId = qus.userId and questionId = qus.questionId and answerDate = qus.answerDate")); + } + sql.setCondition(cnd); + List list = listMap(sql); + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("工号", "loginname", 20)); + exportEntities.add(new ExcelExportEntity("姓名", "username", 20)); + exportEntities.add(new ExcelExportEntity("性别", "sex", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 20)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20)); + exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("分数", "score", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list); + workbook.write(os); + } + } +} diff --git a/src/main/java/io/v/nutz/question/service/impl/QuestionIssueServiceImpl.java b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionIssueServiceImpl.java similarity index 75% rename from src/main/java/io/v/nutz/question/service/impl/QuestionIssueServiceImpl.java rename to src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionIssueServiceImpl.java index 56283f6..a0bd980 100644 --- a/src/main/java/io/v/nutz/question/service/impl/QuestionIssueServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionIssueServiceImpl.java @@ -1,9 +1,9 @@ -package io.v.nutz.question.service.impl; +package io.v.nutz.zhgh.question.service.impl; import io.v.nutz.base.service.impl.BaseServiceImpl; -import io.v.nutz.question.model.Question_issue; -import io.v.nutz.question.service.QuestionIssueService; +import io.v.nutz.zhgh.question.model.Question_issue; +import io.v.nutz.zhgh.question.service.QuestionIssueService; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.plugins.wkcache.annotation.CacheDefaults; diff --git a/src/main/java/io/v/nutz/question/service/impl/QuestionReplyServiceImpl.java b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionReplyServiceImpl.java similarity index 96% rename from src/main/java/io/v/nutz/question/service/impl/QuestionReplyServiceImpl.java rename to src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionReplyServiceImpl.java index 3bc5474..440a01c 100644 --- a/src/main/java/io/v/nutz/question/service/impl/QuestionReplyServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionReplyServiceImpl.java @@ -1,9 +1,9 @@ -package io.v.nutz.question.service.impl; +package io.v.nutz.zhgh.question.service.impl; import io.v.nutz.base.utils.DateUtil; -import io.v.nutz.question.model.*; -import io.v.nutz.question.service.QuestionReplyService; import io.v.nutz.service.impl.ViServiceImpl; +import io.v.nutz.zhgh.question.model.*; +import io.v.nutz.zhgh.question.service.QuestionReplyService; import org.nutz.aop.interceptor.async.Async; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; @@ -13,6 +13,7 @@ import org.nutz.dao.sql.Sql; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.random.R; + import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionServiceImpl.java b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionServiceImpl.java new file mode 100644 index 0000000..e832786 --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionServiceImpl.java @@ -0,0 +1,266 @@ +package io.v.nutz.zhgh.question.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import io.v.nutz.service.impl.ViServiceImpl; +import io.v.nutz.web.commons.utils.ShiroUtil; +import io.v.nutz.zhgh.question.model.*; +import io.v.nutz.zhgh.question.service.QuestionIssueService; +import io.v.nutz.zhgh.question.service.QuestionReplyService; +import io.v.nutz.zhgh.question.service.QuestionService; +import io.v.nutz.zhgh.question.service.QuestionWorService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.entity.Record; +import org.nutz.dao.sql.Sql; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.plugins.wkcache.annotation.CacheDefaults; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +@CacheDefaults(cacheName = "Zgfw_question") +public class QuestionServiceImpl extends ViServiceImpl implements QuestionService { + @Inject + private QuestionIssueService questionIssueService; + @Inject + private QuestionWorService questionWorService; + @Inject + private QuestionReplyService questionReplyService; + @Inject + private RedisService redisService; + + public QuestionServiceImpl(Dao dao) { + super(dao); + } + + @Override + public Question getQuestion(String qid) { + Question question = fetch(qid); + question.setIssues(questionIssueService.query(Cnd.where("iqid", "=", qid).asc("ipxbh"))); + for (Question_issue issue : question.getIssues()) { + issue.setWors(questionWorService.query(Cnd.where("wiid", "=", issue.getIid()).asc("wpxbh"))); + } + return question; + } + + @Override + public NutMap getVoteData(String qid) { + Question_issue issue = questionIssueService.fetch(Cnd.where("iqid", "=", qid)); + NutMap res = new NutMap(); + //选项数 + res.setv("optionum", questionWorService.count(Cnd.where("wiid", "=", issue.getIid()))); + //投票总数 + int votecount = questionReplyService.count(Sqls.create("SELECT COUNT(1) FROM question_reply r WHERE r.`rwid` IN (SELECT w.`wid` FROM zgfw_question_wor w WHERE w.`wiid` = @iid)").setParam("iid", issue.getIid())); + res.setv("votecount", votecount); + + Sql sql = Sqls.create("SELECT w.`wid`,(SELECT COUNT(1) FROM question_reply r WHERE r.rwid=w.`wid`) COUNT FROM zgfw_question_wor w WHERE w.`wiid` = @iid").setParam("iid", issue.getIid()); + for (Record record : questionWorService.list(sql)) { + res.setv(record.getString("wid"), record.getInt("count")); + } + return res; + } + + @Override + public NutMap getRankData(String qid) { + NutMap res = new NutMap(); + Question question = getQuestion(qid); + res.setv("qid", qid); + res.setv("qtitle", question.getQtitle()); + + Question_issue issue = questionIssueService.fetch(Cnd.where("iqid", "=", qid)); + res.setv("iname", issue.getIname()); + //选项数 + res.setv("optionum", questionWorService.count(Cnd.where("wiid", "=", issue.getIid()))); + //投票总数 + int votecount = questionReplyService.count(Sqls.create("SELECT COUNT(1) FROM question_reply r WHERE r.`rwid` IN (SELECT w.`wid` FROM zgfw_question_wor w WHERE w.`wiid` = @iid)").setParam("iid", issue.getIid())); + res.setv("votecount", votecount); + + Sql sql = Sqls.create("SELECT w.`wid`,w.`wimg`,w.`wtxt`,(SELECT COUNT(1) FROM question_reply r WHERE r.rwid=w.`wid`) COUNT FROM zgfw_question_wor w WHERE w.`wiid` = @iid ORDER BY COUNT DESC").setParam("iid", issue.getIid()); + res.setv("wors", questionWorService.list(sql)); + + return res; + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void saveAnswer(Question_reply[] repliesArray, String questionId, Boolean isSave) { + //删除上一次的答题记录 + //此处需判断 如果是有分多天 随机多次就要按条件删除 + + //问卷信息包含题目选项 + Question question = getQuestion(questionId); + + if (question.getCtMode() == 1) { + //删除今天的之前的答题记录 + dao().clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("DATE(rtime)", "=", DateUtil.today())); + } else if (question.getCtMode() == 2) { + DateTime startTime = DateUtil.date(question.getStartTime()); + DateTime endTime = DateUtil.date(question.getEndTime()); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + if (betweenDay > 0) { + //多天随机 + dao().clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("DATE(rtime)", "=", DateUtil.today())); + } else { + //一天多次随机 删除保存的 + dao().clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("DATE(rtime)", "=", DateUtil.today()).and("save", "=", 1)); + } + } else if (question.getCtMode() == 3) { + dao().clear(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + } + + List replyList = new ArrayList<>(); + for (Question_reply reply : repliesArray) { + if (Lang.isNotEmpty(reply.getUserSelect())) { + for (String userSelect : reply.getUserSelect()) { + Question_reply questionReply = new Question_reply(); + questionReply.setRwid(userSelect); + questionReply.setIssueId(reply.getIssueId()); + questionReply.setUserId(ShiroUtil.getUserId()); + questionReply.setRtime(DateUtil.now()); + questionReply.setRwid(userSelect); + questionReply.setQid(questionId); + questionReply.setSave(isSave); + replyList.add(questionReply); + } + } + } + + insert(replyList); + + //判断是否提交 提交则计算此次分数 + + if (!isSave) { + + //得分 + AtomicInteger sum = new AtomicInteger(); + + //常规模式计算全部题目的分数 + if (question.getCtMode() == 3) { + //每题的回答记录 + List replies = dao().query(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("userId", "=", ShiroUtil.getUserId())); + Map> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId)); + + issueReplies.forEach((k, v) -> { + //用户回答的选项 + Set userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet()); + //正确答案 + Optional issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst(); + Set correctOptionIds = issueOptional.map(x -> x.getWors().stream().filter(c -> c.getCorrect() != null && c.getCorrect()).map(z -> z.getWid()).collect(Collectors.toSet())).orElse(null); + if (userReplyOptionIds.equals(correctOptionIds)) { + sum.addAndGet(issueOptional.map(i -> i.getFraction()).orElse(0)); + } + }); + + //查询之前的回答记录 + int count = dao().count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + + QuestionUserScore questionUserScore = new QuestionUserScore(); + questionUserScore.setQuestionId(questionId); + questionUserScore.setUserId(ShiroUtil.getUserId()); + questionUserScore.setAnswerDate(new Date()); + questionUserScore.setAnswerNum(count + 1); + questionUserScore.setScore(sum.get()); + dao().insert(questionUserScore); + } else if (question.getCtMode() == 1) { + //每题的回答记录 + QuestionRandomIssue randomIssue = dao().fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today())); + List issueIds = randomIssue.getIssueIds(); + List replies = dao().query(Question_reply.class, Cnd.where("issueId", "in", issueIds).and("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + Map> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId)); + issueReplies.forEach((k, v) -> { + //用户回答的选项 + Set userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet()); + //正确答案 + Optional issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst(); + Set correctOptionIds = issueOptional.map(x -> x.getWors().stream().filter(c -> c.getCorrect() != null && c.getCorrect()).map(z -> z.getWid()).collect(Collectors.toSet())).orElse(null); + if (userReplyOptionIds.equals(correctOptionIds)) { + sum.addAndGet(issueOptional.map(i -> i.getFraction()).orElse(0)); + } + }); + + //查询之前的回答记录 + int count = dao().count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today())); + + QuestionUserScore questionUserScore = new QuestionUserScore(); + questionUserScore.setQuestionId(questionId); + questionUserScore.setUserId(ShiroUtil.getUserId()); + questionUserScore.setAnswerDate(new Date()); + questionUserScore.setAnswerNum(count + 1); + questionUserScore.setScore(sum.get()); + questionUserScore.setDisplayDate(DateUtil.parseDate(DateUtil.today())); + dao().insert(questionUserScore); + } else if (question.getCtMode() == 2) { + + //每题的回答记录 + QuestionRandomIssue randomIssue = dao().fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today()).desc("num")); + List issueIds = randomIssue.getIssueIds(); + List replies = dao().query(Question_reply.class, Cnd.where("issueId", "in", issueIds).and("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + Map> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId)); + issueReplies.forEach((k, v) -> { + //用户回答的选项 + Set userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet()); + //正确答案 + Optional issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst(); + Set correctOptionIds = issueOptional.map(x -> x.getWors().stream().filter(c -> c.getCorrect() != null && c.getCorrect()).map(z -> z.getWid()).collect(Collectors.toSet())).orElse(null); + if (userReplyOptionIds.equals(correctOptionIds)) { + sum.addAndGet(issueOptional.map(i -> i.getFraction()).orElse(0)); + } + }); + + //同一天 + //查询之前的回答记录 + int count = dao().count(QuestionUserScore.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today())); + + QuestionUserScore questionUserScore = new QuestionUserScore(); + questionUserScore.setQuestionId(questionId); + questionUserScore.setUserId(ShiroUtil.getUserId()); + questionUserScore.setAnswerDate(new Date()); + questionUserScore.setAnswerNum(count + 1); + questionUserScore.setScore(sum.get()); + questionUserScore.setDisplayDate(DateUtil.parseDate(DateUtil.today())); + dao().insert(questionUserScore); + } + + //随机题库设为已完成 + if (question.getCtMode() == 3) { + //常规模式下不需要判断次数 + dao().update(QuestionRandomIssue.class, Chain.make("isFinish", 1), Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId())); + } else if (question.getCtMode() == 1) { + //定时定题需要加上日期的条件 + dao().update(QuestionRandomIssue.class, Chain.make("isFinish", 1), Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today())); + } else if (question.getCtMode() == 2) { + //随机模式 要判断是否为同一天 + + QuestionRandomIssue randomIssue = dao().fetch(QuestionRandomIssue.class, Cnd.where("questionId", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("displayDate", "=", DateUtil.today()).desc("num")); + randomIssue.setIsFinish(true); + dao().update(randomIssue, "isFinish"); + } + + } + } + + @Override + public boolean isSameDay(String questionId) { + Question question = dao().fetch(Question.class, questionId); + return isSameDay(question.getStartTime(), question.getEndTime()); + } + + @Override + public boolean isSameDay(long startTimeTs, long endTimeTs) { + DateTime startTime = DateUtil.date(startTimeTs); + DateTime endTime = DateUtil.date(endTimeTs); + long betweenDay = DateUtil.betweenDay(startTime, endTime, true); + return betweenDay == 0; + } +} diff --git a/src/main/java/io/v/nutz/question/service/impl/QuestionWorServiceImpl.java b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionWorServiceImpl.java similarity index 73% rename from src/main/java/io/v/nutz/question/service/impl/QuestionWorServiceImpl.java rename to src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionWorServiceImpl.java index 8379116..8c5ff11 100644 --- a/src/main/java/io/v/nutz/question/service/impl/QuestionWorServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/question/service/impl/QuestionWorServiceImpl.java @@ -1,8 +1,8 @@ -package io.v.nutz.question.service.impl; +package io.v.nutz.zhgh.question.service.impl; import io.v.nutz.base.service.impl.BaseServiceImpl; -import io.v.nutz.question.model.Question_wor; -import io.v.nutz.question.service.QuestionWorService; +import io.v.nutz.zhgh.question.model.Question_wor; +import io.v.nutz.zhgh.question.service.QuestionWorService; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.plugins.wkcache.annotation.CacheDefaults; diff --git a/src/main/resources/views/mobile/question/answer.html b/src/main/resources/views/mobile/question/answer.html index 3aecde4..0b9f379 100644 --- a/src/main/resources/views/mobile/question/answer.html +++ b/src/main/resources/views/mobile/question/answer.html @@ -3,534 +3,590 @@ layout("/mobile/platform.html"){ #-->
-
-
-
- 序号:{{ currentIssueIndex + 1 + '/' + todayIssueList.length }} -
-
- - 答题时间:{{ questionData.qdtkssj + ' 至 ' + questionData.qdtjssj }} -
-
- -
- - - 下一题 - - -
-
- - - - -
每人仅有一次机会
- - -
- -
-
+
+ diff --git a/src/main/resources/views/mobile/question/list.html b/src/main/resources/views/mobile/question/list.html index 006fe62..103513e 100644 --- a/src/main/resources/views/mobile/question/list.html +++ b/src/main/resources/views/mobile/question/list.html @@ -86,13 +86,14 @@ layout("/mobile/platform.html"){ width: 100%; background: transparent; } - .winPopup img{ + + .winPopup img { transform: translateY(-50%); position: absolute; top: 50%; } - .winPopup .van-popup__close-icon{ + .winPopup .van-popup__close-icon { } @@ -107,7 +108,7 @@ layout("/mobile/platform.html"){ width: 100%; } - .win_tag{ + .win_tag { position: relative; top: 16px; left: 5px; @@ -138,19 +139,25 @@ layout("/mobile/platform.html"){
{{ item.qtitle }}
- 创建时间: + 活动开始时间: - {{ moment(item.createTime).format('YYYY年MM月DD日') }} + {{ moment(item.startTime).format('YYYY年MM月DD日') }}
-
- 题目数量: +
+ 活动结束时间: - {{item.ctMode === 1 ? item.topicTotal : item.ctNum }} - - - 获奖信息 - + {{ moment(item.endTime).format('YYYY年MM月DD日') }} + +
+
+ + + + + + 获奖信息
@@ -166,16 +173,22 @@ layout("/mobile/platform.html"){ + >
- +
恭喜您中奖了,本次活动中奖机会只有一次喔!
+ + +
活动期间,每天答题次数不限,每天答题的最终成绩取最高分。每天答题得90分(含)以上者,可参加线上抽奖活动。
+
6月17日至6月23日每天线上抽取“幸运奖”100名'。
+
@@ -192,8 +205,10 @@ layout("/mobile/platform.html"){ queryForm: { status: '1' }, - winPopupShow:false, - isWin:false + winPopupShow: false, + isWin: false, + + tipShow:false } }, created() { @@ -269,6 +284,7 @@ layout("/mobile/platform.html"){ async openAnswer(item) { const {qid, qlx, qflag, activityUserScopeId} = item + if (qflag !== 2) { this.$modal.msg('该问卷未发布') return @@ -280,13 +296,39 @@ layout("/mobile/platform.html"){ return } - /*if (activityUserScopeId) { + if (activityUserScopeId) { const resp = await $.get('/mobile/question/h5/checkPermission/' + activityUserScopeId) if (!resp.data) { this.$modal.msg('您无权限参加') return } - }*/ + } + + if (qid === '827cc4ef9cde47ed97bc21f6be75f91a') { + this.$dialog.alert({ + title:'提示', + messageAlign:'left', + message: '
活动期间,每天答题次数不限,每天答题的最终成绩取最高分。每天答题得90分(含)以上者,可参加线上抽奖活动。
' + + '
6月17日至6月23日每天线上抽取“幸运奖”100名。
'+ + '
答题并提交成功后,可于次日查看获奖信息。
' + , + }).then(()=>{ + if (qlx === 1) { + //调查 + location.href = '/mobile/question/h5/poll/index?id=' + qid + } else if (qlx === 2) { + //答题 + location.href = '/mobile/question/h5/answer/index?id=' + qid + } else if (qlx === 3) { + //购物 + location.href = '/mobile/question/h5/shop/index?id=' + qid + } else if (qlx === 4) { + //蛋糕卡 + location.href = '/mobile/question/h5/cake/index?id=' + qid + } + }) + return + } if (qlx === 1) { //调查 diff --git a/src/main/resources/views/mobile/question/shop.html b/src/main/resources/views/mobile/question/shop.html new file mode 100644 index 0000000..590cc7d --- /dev/null +++ b/src/main/resources/views/mobile/question/shop.html @@ -0,0 +1,502 @@ + + + + +
+
+ + +
+
+
+
+
{{ questionData.qtitle }}
+
+ +
+
+ +
+
+
+ 多选 +
+
+ * + + {{ issueIndex + 1 }}. + {{ removeHTMLTag(issue.iname) }} + (最少选择:{{issue.iminselect}}) + (最多选择:{{issue.imaxselect}}) +
+ {{ issue.its }} +
+
+
+ + + + + + +
+
+
+
+ + +
+
+
+ + + + diff --git a/src/main/resources/views/platform/question/question.html b/src/main/resources/views/platform/question/question.html index 945776a..24654a8 100644 --- a/src/main/resources/views/platform/question/question.html +++ b/src/main/resources/views/platform/question/question.html @@ -34,14 +34,6 @@ layout("/layouts/platform.html"){ color: red; } - #qsmEditor .w-e-text-container { - height: 200px !important; - } - - #qsmEditor div { - z-index: 0 !important; - } - .btDiv { cursor: pointer; } @@ -229,7 +221,7 @@ layout("/layouts/platform.html"){