init
This commit is contained in:
+154
@@ -0,0 +1,154 @@
|
||||
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.base.annontation.ViReturn;
|
||||
import io.v.nutz.base.page.Pagination;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
import io.v.nutz.zhgh.question.service.QuestionAnswerRankingService;
|
||||
import io.v.nutz.zhgh.question.service.QuestionService;
|
||||
import io.v.nutz.sys.services.SysUnionService;
|
||||
import io.v.nutz.web.commons.utils.ShiroUtil;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.nutz.dao.Cnd;
|
||||
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 org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@IocBean
|
||||
@At("/platform/question/answer/ranking")
|
||||
@Ok("json:full")
|
||||
public class QuestionAnswerRankingController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@Inject
|
||||
private SysUnionService sysUnionService;
|
||||
|
||||
@Inject
|
||||
private QuestionAnswerRankingService questionAnswerRankingService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/question/ranking.html")
|
||||
@RequiresPermissions("question.answer.ranking")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@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) {
|
||||
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) {
|
||||
try {
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("得分名单.xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
|
||||
questionAnswerRankingService.exportXlsx(questionId, response.getOutputStream());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
@RequiresPermissions("question.answer.ranking")
|
||||
public void doExportAll(@Param(value = "questionId", required = false) String questionId, HttpServletResponse response) {
|
||||
try {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
summary.userId,
|
||||
count(summary.answerNum) as answerTotal,
|
||||
MAX( summary.total_score ) AS max_score,
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname
|
||||
FROM
|
||||
( SELECT userId, answerNum, SUM( subjectScore ) AS total_score,questionId FROM question_answer_user_score GROUP BY userId, answerNum ) AS summary
|
||||
LEFT JOIN `user` u ON u.id = summary.userId
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.groupBy("summary.userId");
|
||||
cnd.desc("userId").desc("max_score");
|
||||
cnd.and("summary.questionId", "=", questionId);
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> dataList = questionService.listMap(sql);
|
||||
|
||||
List<NutMap> excelDataList = new ArrayList<>();
|
||||
|
||||
Map<String, List<NutMap>> unionNameGroupList = dataList.stream().collect(Collectors.groupingBy(v -> v.getString("unionname")));
|
||||
unionNameGroupList.forEach((k, v) -> {
|
||||
NutMap unionMap = NutMap.NEW();
|
||||
unionMap.addv("unionname", k);
|
||||
unionMap.addv("lt60", v.stream().filter(x -> x.getInt("max_score", 0) < 60).count());
|
||||
unionMap.addv("gte60<80", v.stream().filter(x -> x.getInt("max_score", 0) >= 60 && x.getInt("max_score", 0) < 80).count());
|
||||
unionMap.addv("gte80<90", v.stream().filter(x -> x.getInt("max_score", 0) >= 80 && x.getInt("max_score", 0) < 90).count());
|
||||
unionMap.addv("gte90<100", v.stream().filter(x -> x.getInt("max_score", 0) >= 90 && x.getInt("max_score", 0) <= 100).count());
|
||||
excelDataList.add(unionMap);
|
||||
});
|
||||
|
||||
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
||||
exportEntities.add(new ExcelExportEntity("分工会名称", "unionname", 30));
|
||||
exportEntities.add(new ExcelExportEntity("分数<60", "lt60", 20));
|
||||
exportEntities.add(new ExcelExportEntity("60≤分数<80", "gte60<80", 20));
|
||||
exportEntities.add(new ExcelExportEntity("80≤分数<90", "gte80<90", 20));
|
||||
exportEntities.add(new ExcelExportEntity("90≤分数≤100", "gte90<100", 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, excelDataList);
|
||||
workbook.write(response.getOutputStream());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
public Object getQuestion(Integer year) {
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("YEAR(qctime)", "=", year);
|
||||
if (!ShiroUtil.hasRole("sysadmin")) {
|
||||
cnd.and("qcreator", "=", ShiroUtil.getUserId());
|
||||
}
|
||||
cnd.and("qflag", "=", 2);
|
||||
cnd.desc("qctime");
|
||||
return questionService.query(cnd);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,316 @@
|
||||
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 cn.wizzer.framework.base.Result;
|
||||
import cn.wizzer.framework.page.Pagination;
|
||||
import io.v.nutz.base.annontation.ViReturn;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
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;
|
||||
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.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 javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@IocBean
|
||||
@At("/platform/question/answer/winners")
|
||||
@Ok("json:full")
|
||||
public class QuestionAnswerWinnerController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/question/winner.html")
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
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 = "winDate",required = false) String winDate) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
u.mobile,
|
||||
DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate,
|
||||
qw.score
|
||||
FROM
|
||||
question_winner qw
|
||||
LEFT JOIN `user` u ON u.id = qw.userId
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.andEX("u.unionid", "=", unionId);
|
||||
cnd.andEX("u.unitid", "=", unitId);
|
||||
cnd.andEX("qw.winDate", "=", winDate);
|
||||
cnd.and("qw.questionId", "=", questionId);
|
||||
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
|
||||
cnd.and(Cnd.exps("u.loginname", "like", "%" + pageForm.getSearchKeyword() + "%").or("u.username", "like", "%" + pageForm.getSearchKeyword() + "%"));
|
||||
}
|
||||
cnd.desc("qw.winDate");
|
||||
sql.setCondition(cnd);
|
||||
Pagination pagination = questionService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
|
||||
return pagination;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出中奖名单
|
||||
*
|
||||
* @param questionId 问题id
|
||||
* @param unionId 工会id
|
||||
* @param unitId 单位id
|
||||
* @param response 响应
|
||||
*/
|
||||
@At
|
||||
@Ok("void")
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
public void exportWinners(@Param(value = "questionId",required = false) String questionId,
|
||||
@Param(value = "unionId",required = false) String unionId,
|
||||
@Param(value = "unitId",required = false) String unitId,
|
||||
@Param(value = "winDate",required = false) String winDate, HttpServletResponse response) {
|
||||
try {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
u.mobile,
|
||||
DATE_FORMAT( qw.winDate, '%Y-%m-%d' ) as winDate,
|
||||
qw.score
|
||||
FROM
|
||||
question_winner qw
|
||||
LEFT JOIN `user` u ON u.id = qw.userId
|
||||
$condition
|
||||
""");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.andEX("u.unionid", "=", unionId);
|
||||
cnd.andEX("u.unitid", "=", unitId);
|
||||
cnd.andEX("qw.winDate", "=", winDate);
|
||||
cnd.and("qw.questionId", "=", questionId);
|
||||
cnd.desc("qw.winDate");
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> dataList = questionService.listMap(sql);
|
||||
|
||||
List<ExcelExportEntity> 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("中奖日期", "winDate", 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));
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, dataList);
|
||||
workbook.write(response.getOutputStream());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
public Object getQuestion(Integer year) {
|
||||
List<Question> list = questionService.query(Cnd.NEW().andEX("YEAR(qctime)", "=", year).and("qlx", "=", 2).and("isRaffle","=",1));
|
||||
return Result.success(list);
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
public Object getReadyRaffleUser(String questionId, @Param("answerDate[]") String[] answerDate, Integer score, Integer isWin) {
|
||||
if (Lang.isEmptyArray(answerDate)) {
|
||||
// return Result.success();
|
||||
}
|
||||
List<NutMap> list = new ArrayList<>();
|
||||
if (answerDate.length == 1) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
qus.userId,
|
||||
DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate,
|
||||
MAX( qus.score ) AS 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.and("qus.questionId", "=", questionId);
|
||||
cnd.andEX("qus.answerDate", "in", answerDate);
|
||||
if (score != null) {
|
||||
cnd.having(Cnd.NEW().and("MAX(qus.score)", ">=", score));
|
||||
}
|
||||
|
||||
sql.setCondition(cnd);
|
||||
} else {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
tmp.userId,
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
u.mobile,
|
||||
sum( max_score ) score
|
||||
FROM
|
||||
( SELECT answerDate, userId, max( score ) max_score FROM `question_user_score` where answerDate in (@answerDate) and questionId = @questionId GROUP BY answerDate, userId ) tmp
|
||||
LEFT JOIN `user` u ON u.id = tmp.userId
|
||||
$condition
|
||||
""");
|
||||
sql.setParam("questionId", questionId);
|
||||
sql.setParam("answerDate", answerDate);
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.groupBy("userId");
|
||||
if (score != null) {
|
||||
cnd.having(Cnd.NEW().and("SUM( max_score )", ">=", score));
|
||||
}
|
||||
sql.setCondition(cnd);
|
||||
list = questionService.listMap(sql);
|
||||
}
|
||||
return Result.success(list);
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.answer.winners")
|
||||
public Object doRaffle(String questionId, @Param("answerDate[]") Date[] answerDate, Integer score) {
|
||||
if (Lang.isEmpty(answerDate)) {
|
||||
return Result.error("请选择答题日期");
|
||||
}
|
||||
|
||||
Question question = questionService.fetch(questionId);
|
||||
//抽奖分数
|
||||
Integer raffleScore = question.getRaffleScore();
|
||||
//中奖者人数
|
||||
Integer raffleWinnerUserNum = question.getRaffleWinnerUserNum();
|
||||
//已中奖的用户
|
||||
List<QuestionWinner> winners = questionService.dao().query(QuestionWinner.class, Cnd.where("questionId", "=", questionId));
|
||||
List<String> winnerIds = winners.stream().map(v -> v.getUserId()).collect(Collectors.toList());
|
||||
|
||||
//符合条件的抽奖人员
|
||||
List<NutMap> users = new ArrayList<>();
|
||||
|
||||
if (answerDate.length == 1) {
|
||||
//每天抽 取这天的最高分
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
qus.userId,
|
||||
DATE_FORMAT( qus.answerDate, '%Y-%m-%d' ) AS answerDate,
|
||||
MAX( qus.score ) AS 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.and("qus.questionId", "=", questionId);
|
||||
cnd.andEX("qus.answerDate", "in", answerDate);
|
||||
if (score != null) {
|
||||
cnd.having(Cnd.NEW().and("MAX(qus.score)", ">=", score));
|
||||
}
|
||||
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> list = questionService.listMap(sql);
|
||||
users = list.stream().filter(v -> !winnerIds.contains(v.getString("userId"))).collect(Collectors.toList());
|
||||
} else {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
tmp.userId,
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
u.mobile,
|
||||
sum( max_score ) score
|
||||
FROM
|
||||
( SELECT answerDate, userId, max( score ) max_score FROM `question_user_score` where answerDate in (@answerDate) and questionId = @questionId GROUP BY answerDate, userId ) tmp
|
||||
LEFT JOIN `user` u ON u.id = tmp.userId
|
||||
$condition
|
||||
""");
|
||||
sql.setParam("questionId", questionId);
|
||||
sql.setParam("answerDate", answerDate);
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.groupBy("userId");
|
||||
if (score != null) {
|
||||
cnd.having(Cnd.NEW().and("SUM( max_score )", ">=", score));
|
||||
}
|
||||
sql.setCondition(cnd);
|
||||
List<NutMap> list = questionService.listMap(sql);
|
||||
users = list.stream().filter(v -> !winnerIds.contains(v.getString("userId"))).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
// 随机打乱用户ID列表
|
||||
Collections.shuffle(users);
|
||||
List<NutMap> winnerUsers;
|
||||
if (users.size() >= raffleWinnerUserNum) {
|
||||
winnerUsers = users.subList(0, raffleWinnerUserNum);
|
||||
} else {
|
||||
winnerUsers = users.subList(0, users.size());
|
||||
}
|
||||
|
||||
List<QuestionWinner> questionWinners = winnerUsers.stream().map(v -> {
|
||||
QuestionWinner winner = new QuestionWinner();
|
||||
winner.setQuestionId(questionId);
|
||||
winner.setUserId(v.getString("userId"));
|
||||
winner.setWinDate(new Date());
|
||||
return winner;
|
||||
}).collect(Collectors.toList());
|
||||
questionService.insert(questionWinners);
|
||||
|
||||
return Result.success(winnerUsers);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
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.base.annontation.ViReturn;
|
||||
import io.v.nutz.base.dao.CndPlus;
|
||||
import io.v.nutz.zhgh.question.service.QuestionService;
|
||||
import io.v.nutz.base.utils.ViTool;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
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.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 javax.servlet.http.HttpServletResponse;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 蛋糕卡、意向选择
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/07/03
|
||||
*/
|
||||
@IocBean
|
||||
@At("/platform/question/cake")
|
||||
@Ok("json:full")
|
||||
public class QuestionCakeController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
public void doExportCakeUnion(@Param(value = "questionId",required = false) String questionId, HttpServletResponse response) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
un.id unionId,
|
||||
un.unionName,
|
||||
(select count(1) from user where member = 1 and unionid = un.id) AS teacherSum,
|
||||
(
|
||||
select
|
||||
count(1)
|
||||
from
|
||||
activity_user_scope aus
|
||||
left join "user" u on u.id = aus.userId
|
||||
where
|
||||
groupId in (
|
||||
select
|
||||
activityUserScopeId
|
||||
from
|
||||
question
|
||||
where
|
||||
qid = @questionId
|
||||
)
|
||||
and u.unionId = un.id
|
||||
) as teacherSum,
|
||||
(
|
||||
SELECT
|
||||
count( DISTINCT r.userId )
|
||||
FROM
|
||||
question_reply r
|
||||
LEFT JOIN `user` u ON r.userId = u.id
|
||||
WHERE
|
||||
u.unionid = un.id
|
||||
AND r.qid = @questionId
|
||||
) replyNum
|
||||
FROM
|
||||
sys_union un
|
||||
$condition
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
CndPlus cndPlus = CndPlus.create();
|
||||
sql.setCondition(cndPlus);
|
||||
List<NutMap> unionList = questionService.listMap(sql);
|
||||
|
||||
List<NutMap> resultList = new ArrayList<>();
|
||||
|
||||
Sql sqlOption = Sqls.create("""
|
||||
select wtxt from question_wor where wiid in (select iid from question_issue where iqid = @questionId)
|
||||
""").setParam("questionId", questionId);
|
||||
List<String> optionList = questionService.listMap(sqlOption).stream().map(v -> v.getString("wtxt")).collect(Collectors.toList());
|
||||
|
||||
Sql sqlx = Sqls.create("""
|
||||
SELECT
|
||||
u.userName,
|
||||
u.loginName,
|
||||
qw.wtxt,
|
||||
dw.unionId,
|
||||
dw.`name` as unitName,
|
||||
gh.unionname as unionName
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN question_wor qw ON qw.wid = qr.rwid
|
||||
LEFT JOIN sys_user u ON u.id = qr.userId
|
||||
LEFT JOIN sys_unit dw ON dw.id = u.unitid\s
|
||||
LEFT JOIN sys_union gh on gh.id = dw.unionid
|
||||
WHERE
|
||||
qr.qid = @questionId
|
||||
""").setParam("questionId", questionId);
|
||||
List<NutMap> list = questionService.listMap(sqlx);
|
||||
|
||||
List<ExcelExportEntity> entityList = new ArrayList<>();
|
||||
|
||||
unionList.forEach(v -> {
|
||||
NutMap unionMap = Lang.obj2nutmap(v);
|
||||
List<NutMap> unionAllList = list.stream().filter(x -> x.getString("unionId").equals(v.getString("unionId"))).collect(Collectors.toList());
|
||||
unionMap.put("totalCount", unionAllList.size());
|
||||
optionList.forEach(o -> {
|
||||
unionMap.put(o, unionAllList.stream().filter(x -> x.getString("wtxt").equals(o)).count());
|
||||
});
|
||||
unionMap.put("unselectedTeacherSum", unionMap.getInt("teacherSum") - unionAllList.size());
|
||||
resultList.add(unionMap);
|
||||
});
|
||||
|
||||
|
||||
entityList.add(new ExcelExportEntity("基层工会", "unionName", 30));
|
||||
entityList.add(new ExcelExportEntity("职工人数", "teacherSum", 20));
|
||||
optionList.forEach(v -> {
|
||||
entityList.add(new ExcelExportEntity(v, v, 20));
|
||||
});
|
||||
entityList.add(new ExcelExportEntity("参加人数", "totalCount", 20));
|
||||
entityList.add(new ExcelExportEntity("未选人数", "unselectedTeacherSum", 20));
|
||||
entityList.add(new ExcelExportEntity("领取人签字", "", 20));
|
||||
|
||||
try {
|
||||
ViTool.excelResponse(response, "发放记录.xls");
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, resultList);
|
||||
workbook.write(response.getOutputStream());
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 蛋糕卡这类查询每个分工会下的人选的什么物品
|
||||
*
|
||||
* @param questionId
|
||||
* @param unionId
|
||||
* @return
|
||||
*/
|
||||
public List<NutMap> cakeUserDataByUnionId(String questionId, String unionId) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.userName,
|
||||
u.loginName,
|
||||
qw.wtxt,
|
||||
dw.unionId,
|
||||
dw.`name` AS unitName,
|
||||
gh.unionname AS unionName
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN question_wor qw ON qw.wid = qr.rwid
|
||||
LEFT JOIN sys_user u ON u.id = qr.userId
|
||||
LEFT JOIN sys_unit dw ON dw.id = u.unitid
|
||||
LEFT JOIN sys_union gh ON gh.id = dw.unionid
|
||||
WHERE
|
||||
qr.qid = @questionId
|
||||
AND dw.unionId = @unionId
|
||||
ORDER BY dw.unitCode ASC,convert(u.loginName using gbk)ASC
|
||||
""");
|
||||
sql.setParam("questionId", questionId).setParam("unionId", unionId);
|
||||
return questionService.listMap(sql);
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
public Object cakeUserData(String questionId, String unionId) {
|
||||
return cakeUserDataByUnionId(questionId, unionId);
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
public void doExportCakeUser(@Param(value = "questionId",required = false) String questionId,
|
||||
@Param(value = "unionId",required = false) String unionId, HttpServletResponse response) {
|
||||
List<NutMap> list = cakeUserDataByUnionId(questionId, unionId);
|
||||
List<ExcelExportEntity> entityList = new ArrayList<>();
|
||||
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
|
||||
entityList.add(new ExcelExportEntity("姓名", "userName", 20));
|
||||
entityList.add(new ExcelExportEntity("所选物品", "wtxt", 20));
|
||||
entityList.add(new ExcelExportEntity("单位", "unitName", 20));
|
||||
entityList.add(new ExcelExportEntity("工会", "unionName", 20));
|
||||
try {
|
||||
ViTool.excelResponse(response, "领取记录.xls");
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, list);
|
||||
workbook.write(response.getOutputStream());
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,525 @@
|
||||
package io.v.nutz.zhgh.question.controller;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.wizzer.framework.base.Result;
|
||||
import cn.wizzer.framework.page.Pagination;
|
||||
import io.v.nutz.zhgh.activity.models.ActivityUserScope;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
import io.v.nutz.zhgh.question.model.*;
|
||||
import io.v.nutz.zhgh.question.service.QuestionService;
|
||||
import io.v.nutz.web.commons.utils.ShiroUtil;
|
||||
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.ThreadLocalRandom;
|
||||
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.*
|
||||
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<QuestionRandomIssue> randomIssues = dao.query(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId()));
|
||||
|
||||
//查询已经随机但是并没有答题完成的题目
|
||||
List<String> 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<String> 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<String> 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<QuestionRandomIssue> randomIssues = dao.query(QuestionRandomIssue.class, Cnd.where("questionId", "=", question.getQid()).and("userId", "=", ShiroUtil.getUserId()));
|
||||
//已经随机的题目
|
||||
List<String> 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<String> randomIssueIds = (List<String>) 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) {
|
||||
List<Question_reply> 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<QuestionWinner> 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<NutMap> 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()) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,486 @@
|
||||
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.cron.CronUtil;
|
||||
import cn.hutool.http.HtmlUtil;
|
||||
import cn.wizzer.framework.base.Result;
|
||||
import io.v.nutz.base.annontation.ViReturn;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
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 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.web.commons.utils.ShiroUtil;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
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.sql.Sql;
|
||||
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.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 问卷管理
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/06/19
|
||||
*/
|
||||
@At("/platform/question/manage")
|
||||
@Ok("json:full")
|
||||
@IocBean
|
||||
public class QuestionMangeController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@Inject
|
||||
private Dao dao;
|
||||
|
||||
@Inject
|
||||
private QuestionWorService questionWorService;
|
||||
|
||||
@Inject
|
||||
private QuestionIssueService questionIssueService;
|
||||
|
||||
@Inject
|
||||
private QuestionReplyService questionReplyService;
|
||||
|
||||
@Inject
|
||||
private SysTaskService sysTaskService;
|
||||
|
||||
@Inject
|
||||
private TaskPlatformService taskPlatformService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/question/question.html")
|
||||
@RequiresPermissions("question.mange")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.mange")
|
||||
public Object pageData(PageForm pageForm, @Param(value = "qtitle", required = false) String qtitle,
|
||||
@Param(value = "year", required = false) Integer year) {
|
||||
try {
|
||||
Cnd cnd = Cnd.NEW();
|
||||
if (Strings.isNotBlank(qtitle)) {
|
||||
cnd.where().andLike("qtitle", qtitle);
|
||||
}
|
||||
cnd.and("YEAR(qctime)", "=", year);
|
||||
cnd.desc("qctime");
|
||||
Sql sql = Sqls.create("SELECT q.*,u.`username` FROM question q LEFT JOIN sys_user u ON q.`qcreator`=u.`id` $condition");
|
||||
sql.setCondition(cnd);
|
||||
return Result.success().addData(questionService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), sql));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改活动状态
|
||||
*
|
||||
* @param qid qid
|
||||
* @param flag flag
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.mange")
|
||||
public Object upStatus(String qid, Integer flag) {
|
||||
try {
|
||||
dao.update(Question.class, Chain.make("qflag", flag), Cnd.where("qid", "=", qid));
|
||||
return Result.success();
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@POST
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.mange")
|
||||
public Object doAdd(@Param("question") Question question) {
|
||||
try {
|
||||
question.setQflag(1);
|
||||
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());
|
||||
|
||||
if (question.getCtMode() == 2) {
|
||||
issue.setIpxbh(i);
|
||||
}
|
||||
Question_issue issueInsert = questionIssueService.insert(issue);
|
||||
int j = 1;
|
||||
for (Question_wor wor : issue.getWors()) {
|
||||
wor.setWid(R.UU32());
|
||||
wor.setWiid(issueInsert.getIid());
|
||||
wor.setWpxbh(j);
|
||||
questionWorService.insert(wor);
|
||||
j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
// raffleTask(question.getQid());
|
||||
return Result.success();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@POST
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@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<Question_issue> oldIssues = dao.query(Question_issue.class, Cnd.where("iqid", "=", question.getQid()));
|
||||
dao.fetchLinks(oldIssues, "wors");
|
||||
|
||||
List<Question_issue> issues = question.getIssues();
|
||||
for (int i = 0; i < issues.size(); i++) {
|
||||
Question_issue issue = issues.get(i);
|
||||
issue.setIqid(question.getQid());
|
||||
if (question.getCtMode() == 2) {
|
||||
issue.setIpxbh(i + 1);
|
||||
}
|
||||
dao.insertOrUpdate(issue);
|
||||
List<Question_wor> wors = issue.getWors();
|
||||
for (int i1 = 0; i1 < wors.size(); i1++) {
|
||||
Question_wor wor = wors.get(i1);
|
||||
wor.setWiid(issue.getIid());
|
||||
wor.setWpxbh(i1 + 1);
|
||||
}
|
||||
dao.insertOrUpdate(wors);
|
||||
}
|
||||
// for (Question_issue issue : issues) {
|
||||
// issue.setIqid(question.getQid());
|
||||
// dao.insertOrUpdate(issue);
|
||||
// List<Question_wor> wors = issue.getWors();
|
||||
// for (Question_wor wor : wors) {
|
||||
// wor.setWiid(issue.getIid());
|
||||
// }
|
||||
// dao.insertOrUpdate(wors);
|
||||
// }
|
||||
|
||||
|
||||
List<String> newIssueIds = issues.stream().map(v -> v.getIid()).collect(Collectors.toList());
|
||||
List<Question_issue> deleteIssues = oldIssues.stream().filter(v -> !newIssueIds.contains(v.getIid())).collect(Collectors.toList());
|
||||
//题目删掉
|
||||
dao.clear(Question_issue.class, Cnd.where("iid", "in", deleteIssues));
|
||||
//选项删掉
|
||||
dao.clear(Question_wor.class, Cnd.where("wiid", "in", deleteIssues));
|
||||
//回答记录删掉
|
||||
dao.clear(Question_reply.class, Cnd.where("issueId", "in", deleteIssues));
|
||||
|
||||
|
||||
for (Question_issue oldIssue : oldIssues) {
|
||||
if (newIssueIds.contains(oldIssue.getIid())) {
|
||||
//判断选项是否还在
|
||||
|
||||
List<String> oldWorIds = oldIssue.getWors().stream().map(v -> v.getWid()).collect(Collectors.toList());
|
||||
List<String> newWorIds = issues.stream().filter(v -> v.getIid().equals(oldIssue.getIid())).findFirst().map(v -> v.getWors().stream().map(x -> x.getWid()).collect(Collectors.toList())).orElse(new ArrayList<>());
|
||||
|
||||
List<String> deleteWorIds = oldWorIds.stream().filter(v -> !newWorIds.contains(v)).collect(Collectors.toList());
|
||||
|
||||
//选项删掉
|
||||
dao.clear(Question_wor.class, Cnd.where("wid", "in", deleteWorIds));
|
||||
//回答记录删掉
|
||||
dao.clear(Question_reply.class, Cnd.where("rwid", "in", deleteWorIds));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
raffleTask(question.getQid());
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除问卷
|
||||
*
|
||||
* @param qid qid
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@RequiresPermissions("question.mange")
|
||||
@ViReturn
|
||||
public Object deleteQuestion(String qid) {
|
||||
try {
|
||||
List<Question_issue> issues = questionIssueService.query(Cnd.where("iqid", "=", qid));
|
||||
for (Question_issue issue : issues) {
|
||||
List<Question_wor> wors = questionWorService.query(Cnd.where("wiid", "=", issue.getIid()));
|
||||
for (Question_wor wor : wors) {
|
||||
if (Strings.isNotBlank(wor.getWimg())) {
|
||||
File file = new File(wor.getWimg());
|
||||
if (file.exists() && file.isFile()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
questionWorService.clear(Cnd.where("wiid", "=", issue.getIid()));
|
||||
}
|
||||
questionIssueService.clear(Cnd.where("iqid", "=", qid));
|
||||
questionReplyService.clear(Cnd.where("qid", "=", qid));
|
||||
questionService.delete(qid);
|
||||
|
||||
String cronData = Json.toJson(Map.of("questionId", qid));
|
||||
Sys_task sysTask = sysTaskService.fetch(Cnd.where("data", "=", cronData));
|
||||
if (sysTask != null) {
|
||||
taskPlatformService.delete(sysTask.getId(), sysTask.getId());
|
||||
sysTaskService.delete(sysTask.getId());
|
||||
}
|
||||
|
||||
return Result.success();
|
||||
} catch (Exception e) {
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 问卷基本信息
|
||||
*
|
||||
* @param qid qid
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At("/findBasicInfo")
|
||||
@RequiresPermissions("question.mange")
|
||||
@ViReturn
|
||||
public Object findBasicInfo(String qid) {
|
||||
try {
|
||||
Assert.notBlank(qid);
|
||||
Question question = questionService.fetch(qid);
|
||||
return Result.success(question);
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 修改问卷基本信息
|
||||
*
|
||||
* @param question 问题
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At("/modifyBasicInfo")
|
||||
@RequiresPermissions("question.mange")
|
||||
@ViReturn
|
||||
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.setQcreator(ShiroUtil.getUserId());
|
||||
question.setQflag(1);
|
||||
dao.insert(question);
|
||||
}
|
||||
raffleTask(question.getQid());
|
||||
return Result.success();
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 题目信息
|
||||
*
|
||||
* @param questionId 问题id
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At("/issueList")
|
||||
@RequiresPermissions("question.mange")
|
||||
@ViReturn
|
||||
public Object issueList(String questionId) {
|
||||
try {
|
||||
List<Question_issue> issues = dao.query(Question_issue.class, Cnd.where("iqid", "=", questionId).asc("displayDate").asc("ipxbh"));
|
||||
dao.fetchLinks(issues, "wors", Cnd.NEW().asc("wpxbh"));
|
||||
|
||||
return Result.success(issues);
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑题目信息
|
||||
*
|
||||
* @param issues 问题
|
||||
* @param questionId 问题id
|
||||
* @return {@link Object}
|
||||
*/
|
||||
@At("/modifyIssues")
|
||||
@RequiresPermissions("question.mange")
|
||||
@ViReturn
|
||||
public Object modifyIssues(@Param("issues") Question_issue[] issues, @Param("questionId") String questionId) {
|
||||
try {
|
||||
Assert.notNull(issues);
|
||||
Assert.notBlank(questionId);
|
||||
Question question = dao.fetch(Question.class, questionId);
|
||||
List<Question_issue> oldIssues = dao.query(Question_issue.class, Cnd.where("iqid", "=", questionId));
|
||||
dao.fetchLinks(oldIssues, "wors");
|
||||
|
||||
List<Question_issue> issueList = Arrays.asList(issues);
|
||||
for (int i = 0; i < issueList.size(); i++) {
|
||||
Question_issue issue = issueList.get(i);
|
||||
issue.setIqid(questionId);
|
||||
if (question.getCtMode() == 2) {
|
||||
issue.setIpxbh(i + 1);
|
||||
}
|
||||
dao.insertOrUpdate(issue);
|
||||
List<Question_wor> wors = issue.getWors();
|
||||
for (int i1 = 0; i1 < wors.size(); i1++) {
|
||||
Question_wor wor = wors.get(i1);
|
||||
wor.setWiid(issue.getIid());
|
||||
wor.setWpxbh(i1 + 1);
|
||||
}
|
||||
dao.insertOrUpdate(wors);
|
||||
}
|
||||
|
||||
List<String> newIssueIds = issueList.stream().map(v -> v.getIid()).collect(Collectors.toList());
|
||||
List<Question_issue> deleteIssues = oldIssues.stream().filter(v -> !newIssueIds.contains(v.getIid())).collect(Collectors.toList());
|
||||
//题目删掉
|
||||
dao.clear(Question_issue.class, Cnd.where("iid", "in", deleteIssues));
|
||||
//选项删掉
|
||||
dao.clear(Question_wor.class, Cnd.where("wiid", "in", deleteIssues));
|
||||
//回答记录删掉
|
||||
dao.clear(Question_reply.class, Cnd.where("issueId", "in", deleteIssues));
|
||||
|
||||
for (Question_issue oldIssue : oldIssues) {
|
||||
if (newIssueIds.contains(oldIssue.getIid())) {
|
||||
//判断选项是否还在
|
||||
List<String> oldWorIds = oldIssue.getWors().stream().map(v -> v.getWid()).collect(Collectors.toList());
|
||||
List<String> newWorIds = issueList.stream().filter(v -> v.getIid().equals(oldIssue.getIid())).findFirst().map(v -> v.getWors().stream().map(x -> x.getWid()).collect(Collectors.toList())).orElse(new ArrayList<>());
|
||||
List<String> deleteWorIds = oldWorIds.stream().filter(v -> !newWorIds.contains(v)).collect(Collectors.toList());
|
||||
//选项删掉
|
||||
dao.clear(Question_wor.class, Cnd.where("wid", "in", deleteWorIds));
|
||||
//回答记录删掉
|
||||
dao.clear(Question_reply.class, Cnd.where("rwid", "in", deleteWorIds));
|
||||
}
|
||||
}
|
||||
return Result.success();
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽奖活动任务
|
||||
*
|
||||
* @param questionId 问题id
|
||||
*/
|
||||
private void raffleTask(String questionId) {
|
||||
//删除之前的任务再添加
|
||||
List<Sys_task> 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";
|
||||
Question question = dao.fetch(Question.class, questionId);
|
||||
//需要抽奖
|
||||
if (question.getIsRaffle() != null && question.getIsRaffle()) {
|
||||
|
||||
String dateFormat = "ss mm HH dd MM ? yyyy";
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
|
||||
|
||||
List<Question.RaffleRule> 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(formatTimeStr);
|
||||
task.setData(cronData);
|
||||
task.setDisabled(false);
|
||||
sysTaskService.insert(task);
|
||||
taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron(),
|
||||
task.getNote(), task.getData());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
package io.v.nutz.zhgh.question.controller;
|
||||
|
||||
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
||||
import cn.wizzer.framework.base.Result;
|
||||
import io.v.nutz.base.utils.Html2Text;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
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;
|
||||
import org.nutz.dao.Cnd;
|
||||
import org.nutz.dao.Sqls;
|
||||
import org.nutz.dao.entity.Record;
|
||||
import org.nutz.dao.sql.Sql;
|
||||
import org.nutz.ioc.loader.annotation.Inject;
|
||||
import org.nutz.ioc.loader.annotation.IocBean;
|
||||
import org.nutz.lang.Strings;
|
||||
import org.nutz.mvc.annotation.At;
|
||||
import org.nutz.mvc.annotation.Ok;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* 在线调查分析
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/06/21
|
||||
*/
|
||||
@At("/platform/question/pollAnalysis")
|
||||
@Ok("json:full")
|
||||
@IocBean
|
||||
public class QuestionPollAnalysisController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@Inject
|
||||
private QuestionIssueService questionIssueService;
|
||||
|
||||
@Inject
|
||||
private QuestionWorService questionWorService;
|
||||
|
||||
@Inject
|
||||
private QuestionReplyService questionReplyService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/question/pollAnalysis.html")
|
||||
@RequiresPermissions("question.pollAnalysis")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.pollAnalysis")
|
||||
public Object tkData(@Param("wid") String wid,
|
||||
@Param(value = "searchKeyword",required = false) String searchKeyword,
|
||||
@Param("pageNumber") int pageNumber,
|
||||
@Param("pageSize") int pageSize) {
|
||||
try {
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.and("rwid", "=", wid);
|
||||
if (Strings.isNotBlank(searchKeyword)) {
|
||||
cnd.where().andLike("rval", searchKeyword);
|
||||
}
|
||||
cnd.desc("rtime");
|
||||
return Result.success().addData(questionReplyService.listPage(pageNumber, pageSize, cnd));
|
||||
} catch (Exception e) {
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.pollAnalysis")
|
||||
public Object pageData(@Param(value = "qtitle",required = false) String qtitle,
|
||||
@Param(value = "year",required = false) Integer year, PageForm pageForm) {
|
||||
try {
|
||||
Sql sql = Sqls.create("SELECT q.*,u.`username` FROM question q LEFT JOIN sys_user u ON q.`qcreator`=u.`id` $condition");
|
||||
Cnd cnd = Cnd.NEW();
|
||||
cnd.andEX("qlx", "=", 1);
|
||||
if (Strings.isNotBlank(qtitle)) {
|
||||
cnd.where().andLike("qtitle", qtitle);
|
||||
}
|
||||
cnd.andEX("YEAR(qctime)", "=", year);
|
||||
cnd.desc("qctime");
|
||||
sql.setCondition(cnd);
|
||||
return Result.success(questionService.list(pageForm, sql));
|
||||
} catch (Exception e) {
|
||||
return Result.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.pollAnalysis")
|
||||
public Object getReplyData(String qid) {
|
||||
try {
|
||||
Map result = new HashMap();
|
||||
|
||||
Question question = questionService.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")));
|
||||
}
|
||||
|
||||
result.put("q", question);
|
||||
|
||||
List<Question_issue> issues = questionIssueService.query(Cnd.where("iqid", "=", qid));
|
||||
for (Question_issue issue : issues) {
|
||||
Sql yysSql = Sqls.create("SELECT COUNT(DISTINCT reply.`ridentity`) FROM question_reply reply WHERE reply.`rwid`\n" +
|
||||
" IN (SELECT wor.`wid` FROM question_wor wor WHERE wor.`wiid` = @iid)").setParam("iid", issue.getIid());
|
||||
|
||||
|
||||
Sql zsSql = Sqls.create("SELECT COUNT(1) FROM question_reply reply WHERE reply.`rwid`\n" +
|
||||
" IN (SELECT wor.`wid` FROM question_wor wor WHERE wor.`wiid` = @iid)").setParam("iid", issue.getIid());
|
||||
|
||||
|
||||
int yxs = questionWorService.count(yysSql);
|
||||
int zs = questionWorService.count(zsSql);
|
||||
Map i = new HashMap();
|
||||
|
||||
Sql sql = Sqls.create("SELECT reply.`rwid`,COUNT(1) c FROM question_reply reply \n" +
|
||||
" WHERE reply.`rwid` IN (SELECT wor.`wid` FROM question_wor wor WHERE wor.`wiid` = @iid)\n" +
|
||||
" GROUP BY reply.`rwid`").setParam("iid", issue.getIid());
|
||||
List<Record> list = questionReplyService.list(sql);
|
||||
|
||||
for (Record record : list) {
|
||||
i.put(record.getString("rwid"), record.getInt("c"));
|
||||
}
|
||||
|
||||
Sql sumSql = Sqls.create("""
|
||||
SELECT COUNT(DISTINCT reply.userId) FROM question_reply reply WHERE reply.qid = @qid
|
||||
""").setParam("qid", qid);
|
||||
i.put("num", questionReplyService.count(sumSql));
|
||||
|
||||
i.put("yxs", yxs); //有效数
|
||||
i.put("zs", zs); //总数
|
||||
|
||||
result.put(issue.getIid(), i);
|
||||
}
|
||||
return Result.success().addData(result);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.pollAnalysis")
|
||||
public void doExport(@Param(value = "questionId",required = false) String questionId, HttpServletResponse response) {
|
||||
try {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
qu.qtitle,
|
||||
issue.ipxbh,
|
||||
issue.iname,
|
||||
wor.wtxt,
|
||||
wor.wsm ,
|
||||
(SELECT COUNT(DISTINCT reply.userId) FROM question_reply reply WHERE reply.qid = qu.qid) num,
|
||||
(SELECT COUNT(DISTINCT reply.userId) FROM question_reply reply WHERE reply.qid = qu.qid AND reply.rwid = wor.wid) votersNum,
|
||||
CONCAT(convert((((SELECT COUNT(DISTINCT reply.userId) FROM question_reply reply WHERE reply.qid = qu.qid AND reply.rwid = wor.wid)/(SELECT COUNT(DISTINCT reply.userId) FROM question_reply reply WHERE reply.qid = qu.qid)) * 100),decimal(18,2)),'%') voterScale
|
||||
FROM
|
||||
question_wor wor
|
||||
LEFT JOIN question_issue issue ON issue.iid = wor.wiid
|
||||
LEFT JOIN question qu ON qu.qid = issue.iqid
|
||||
WHERE
|
||||
qu.qid = @questionId
|
||||
AND issue.itx = 1
|
||||
ORDER BY
|
||||
issue.ipxbh,wor.wpxbh
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
List<ExportEntity> exportList = questionService.listEntity(sql, ExportEntity.class);
|
||||
|
||||
for (int i = 0; i < exportList.size(); i++) {
|
||||
exportList.get(i).setIndex(i + 1);
|
||||
exportList.get(i).setIname(Html2Text.toPlainText(exportList.get(i).getIname()));
|
||||
}
|
||||
|
||||
String fileName = exportList.isEmpty() ? "" : exportList.get(0).getQtitle();
|
||||
String num = exportList.isEmpty() ? "" : exportList.get(0).getNum();
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + "汇总.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(fileName + "(参加问卷的人数:" + num + "人)", fileName), ExportEntity.class, exportList);
|
||||
workbook.write(response.getOutputStream());
|
||||
workbook.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ExportEntity {
|
||||
@Excel(name = "序号")
|
||||
private Integer index;
|
||||
|
||||
@Excel(name = "商品类别", width = 40d)
|
||||
private String iname;
|
||||
|
||||
@Excel(name = "商品名称", width = 40d)
|
||||
private String wtxt;
|
||||
|
||||
@Excel(name = "规格说明", width = 60d)
|
||||
private String wsm;
|
||||
|
||||
@Excel(name = "投票人数", width = 20d)
|
||||
private String votersNum;
|
||||
|
||||
@Excel(name = "投票比例", width = 20d)
|
||||
private String voterScale;
|
||||
|
||||
private String num;
|
||||
|
||||
private String qtitle;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+789
@@ -0,0 +1,789 @@
|
||||
package io.v.nutz.zhgh.question.controller;
|
||||
|
||||
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
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.afterturn.easypoi.excel.export.ExcelExportService;
|
||||
import cn.wizzer.framework.base.Result;
|
||||
import io.v.nutz.zhgh.activity.models.ActivityUserScope;
|
||||
import io.v.nutz.base.annontation.ViReturn;
|
||||
import io.v.nutz.base.dao.CndPlus;
|
||||
import io.v.nutz.zhgh.question.model.Question;
|
||||
import io.v.nutz.zhgh.question.service.QuestionService;
|
||||
import io.v.nutz.sys.models.Sys_union;
|
||||
import io.v.nutz.base.utils.ViTool;
|
||||
import io.v.nutz.web.commons.utils.FileUtil;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
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.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.Param;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
* 意向选择
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/07/03
|
||||
*/
|
||||
@At("/platform/question/intentionalChoice")
|
||||
@Ok("json:full")
|
||||
@IocBean
|
||||
public class QuestionUnionIntentionalChoiceController {
|
||||
|
||||
@Inject
|
||||
private QuestionService questionService;
|
||||
|
||||
@At("")
|
||||
@Ok("beetl:/platform/question/intentionalChoice.html")
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public void index() {
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public Object getData(@Param(value = "questionId",required = false) String questionId,
|
||||
@Param(value = "unionId", required = false) String unionId) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
un.id unionId,
|
||||
un.unionName,
|
||||
(select count(1) from "user" where member = 1 and unionid = un.id) AS teacherSum1,
|
||||
(
|
||||
select
|
||||
count(1)
|
||||
from
|
||||
activity_user_scope aus
|
||||
left join "user" u on u.id = aus.userId
|
||||
where
|
||||
groupId in (
|
||||
select
|
||||
activityUserScopeId
|
||||
from
|
||||
question
|
||||
where
|
||||
qid = @questionId
|
||||
)
|
||||
and u.unionId = un.id
|
||||
) as teacherSum,
|
||||
(
|
||||
SELECT
|
||||
count( DISTINCT r.userId )
|
||||
FROM
|
||||
question_reply r
|
||||
LEFT JOIN `user` u ON r.userId = u.id
|
||||
WHERE
|
||||
u.unionid = un.id
|
||||
AND r.qid = @questionId
|
||||
) replyNum
|
||||
FROM
|
||||
sys_union un
|
||||
$condition
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
CndPlus cndPlus = CndPlus.create();
|
||||
cndPlus.andEx("un.id", "=", unionId);
|
||||
sql.setCondition(cndPlus);
|
||||
List<NutMap> unionList = questionService.listMap(sql);
|
||||
|
||||
Integer qlx = questionService.fetch(questionId).getQlx();
|
||||
if (qlx != 4) {
|
||||
List<NutMap> optionList = new ArrayList<>();
|
||||
optionList.add(NutMap.NEW().addv("label", "基层工会名称").addv("prop", "unionName"));
|
||||
optionList.add(NutMap.NEW().addv("label", "职工人数").addv("prop", "teacherSum"));
|
||||
optionList.add(NutMap.NEW().addv("label", "参加人数").addv("prop", "replyNum"));
|
||||
return Map.of("list", unionList, "label", optionList);
|
||||
}
|
||||
List<NutMap> resultList = new ArrayList<>();
|
||||
|
||||
Sql sqlOption = Sqls.create("""
|
||||
select wtxt from question_wor where wiid in (select iid from question_issue where iqid = @questionId)
|
||||
""").setParam("questionId", questionId);
|
||||
List<String> optionList = questionService.listMap(sqlOption).stream().map(v -> v.getString("wtxt")).collect(Collectors.toList());
|
||||
|
||||
Sql sqlx = Sqls.create("""
|
||||
SELECT
|
||||
u.userName,
|
||||
u.loginName,
|
||||
qw.wtxt,
|
||||
dw.unionId,
|
||||
dw.`name` as unitName,
|
||||
gh.unionname as unionName
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN question_wor qw ON qw.wid = qr.rwid
|
||||
LEFT JOIN sys_user u ON u.id = qr.userId
|
||||
LEFT JOIN sys_unit dw ON dw.id = u.unitid\s
|
||||
LEFT JOIN sys_union gh on gh.id = dw.unionid
|
||||
WHERE
|
||||
qr.qid = @questionId
|
||||
""").setParam("questionId", questionId);
|
||||
List<NutMap> list = questionService.listMap(sqlx);
|
||||
|
||||
unionList.forEach(v -> {
|
||||
NutMap unionMap = Lang.obj2nutmap(v);
|
||||
List<NutMap> unionAllList = list.stream().filter(x -> x.getString("unionId").equals(v.getString("unionId"))).collect(Collectors.toList());
|
||||
unionMap.put("totalCount", unionAllList.size());
|
||||
optionList.forEach(o -> {
|
||||
unionMap.put(o, unionAllList.stream().filter(x -> x.getString("wtxt").equals(o)).count());
|
||||
});
|
||||
unionMap.put("unselectedTeacherSum", unionMap.getInt("teacherSum") - unionAllList.size());
|
||||
resultList.add(unionMap);
|
||||
});
|
||||
|
||||
List<NutMap> labelList = new ArrayList<>();
|
||||
labelList.add(NutMap.NEW().addv("label", "基层工会名称").addv("prop", "unionName"));
|
||||
labelList.add(NutMap.NEW().addv("label", "职工人数").addv("prop", "teacherSum"));
|
||||
|
||||
optionList.forEach(v -> {
|
||||
labelList.add(NutMap.NEW().addv("label", v).addv("prop", v));
|
||||
});
|
||||
labelList.add(NutMap.NEW().addv("label", "参加人数").addv("prop", "totalCount"));
|
||||
labelList.add(NutMap.NEW().addv("label", "未选人数").addv("prop", "unselectedTeacherSum"));
|
||||
|
||||
return Map.of("list", resultList, "label", labelList);
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public Object getAnswerData(String questionId, String unionId) {
|
||||
if (Strings.isBlank(questionId) || Strings.isBlank(unionId)) {
|
||||
return Result.error("缺少必要参数");
|
||||
}
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
(
|
||||
SELECT
|
||||
sum( tab.fraction )
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
IF
|
||||
((
|
||||
SELECT
|
||||
sum( ( SELECT 1 FROM question_reply reply WHERE reply.rwid = wor.wid AND reply.userId = u.id ) )
|
||||
FROM
|
||||
question_wor wor
|
||||
WHERE
|
||||
wor.wiid = issue.iid
|
||||
AND wor.correct = 1
|
||||
) = ( SELECT count( 1 ) FROM question_wor wor WHERE wor.wiid = issue.iid AND wor.correct = 1 ),
|
||||
issue.fraction,
|
||||
0
|
||||
) fraction
|
||||
FROM
|
||||
question_issue issue
|
||||
WHERE
|
||||
issue.iqid = @questionId
|
||||
) tab
|
||||
) fraction
|
||||
FROM
|
||||
`user` u
|
||||
INNER JOIN question_reply reply ON reply.userId = u.id
|
||||
WHERE
|
||||
u.unionid = @unionId
|
||||
GROUP BY
|
||||
u.id
|
||||
""").setParam("questionId", questionId).setParam("unionId", unionId);
|
||||
|
||||
return questionService.listMap(sql);
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public void doExport(@Param(value = "questionId",required = false) String questionId,
|
||||
@Param(value = "unionId",required = false) String unionId, HttpServletResponse response) {
|
||||
try {
|
||||
CndPlus cnd = CndPlus.create();
|
||||
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
q.qtitle,
|
||||
(
|
||||
SELECT
|
||||
sum( tab.fraction )
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
IF
|
||||
((
|
||||
SELECT
|
||||
sum( ( SELECT 1 FROM question_reply reply WHERE reply.rwid = wor.wid AND reply.userId = u.id ) )
|
||||
FROM
|
||||
question_wor wor
|
||||
WHERE
|
||||
wor.wiid = issue.iid
|
||||
AND wor.correct = 1
|
||||
) = ( SELECT count( 1 ) FROM question_wor wor WHERE wor.wiid = issue.iid AND wor.correct = 1 ),
|
||||
issue.fraction,
|
||||
0
|
||||
) fraction
|
||||
FROM
|
||||
question_issue issue
|
||||
WHERE
|
||||
issue.iqid = @questionId
|
||||
) tab
|
||||
) fraction
|
||||
FROM
|
||||
`user` u
|
||||
INNER JOIN question_reply reply ON reply.userId = u.id
|
||||
LEFT JOIN question q ON q.qid = reply.qid
|
||||
$condition
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
cnd.andEx("u.unionid", "=", unionId);
|
||||
cnd.groupBy("u.id");
|
||||
cnd.desc("u.unioncode");
|
||||
sql.setCondition(cnd);
|
||||
|
||||
List<ExportEntity> exportList = questionService.listEntity(sql, ExportEntity.class);
|
||||
|
||||
String fileName = exportList.isEmpty() ? "" : exportList.get(0).getQtitle();
|
||||
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + "答题汇总.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ExportEntity.class, exportList);
|
||||
workbook.write(response.getOutputStream());
|
||||
workbook.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public Object getQuestion(Integer year) {
|
||||
return questionService.query(Cnd.where("YEAR(qctime)", "=", year).and("qlx", "=", 4).desc("qctime"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 蛋糕卡这类查询每个分工会下的人选的什么物品
|
||||
*
|
||||
* @param questionId
|
||||
* @param unionId
|
||||
* @return
|
||||
*/
|
||||
@At
|
||||
@ViReturn
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public Object cakeDataByUnionId(String questionId, String unionId) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.userName,
|
||||
u.loginName,
|
||||
qw.wtxt,
|
||||
dw.unionId,
|
||||
dw.`name` AS unitName,
|
||||
gh.unionname AS unionName
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN question_wor qw ON qw.wid = qr.rwid
|
||||
LEFT JOIN sys_user u ON u.id = qr.userId
|
||||
LEFT JOIN sys_unit dw ON dw.id = u.unitid
|
||||
LEFT JOIN sys_union gh ON gh.id = dw.unionid
|
||||
WHERE
|
||||
qr.qid = @questionId
|
||||
AND dw.unionId = @unionId
|
||||
""");
|
||||
sql.setParam("questionId", questionId).setParam("unionId", unionId);
|
||||
return questionService.listMap(sql);
|
||||
}
|
||||
|
||||
@At
|
||||
@ViReturn
|
||||
public Object getUnselectedUser(@Param(value = "unionId", required = false) String unionId, String questionId) {
|
||||
Question question = questionService.fetch(questionId);
|
||||
Integer qlx = question.getQlx();
|
||||
Integer activityUserScopeId = question.getActivityUserScopeId();
|
||||
if (activityUserScopeId == null) {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT loginname,username,unitname,mobile FROM `user`
|
||||
where unionid = @unionId
|
||||
and welfareMember = 1
|
||||
and id not in
|
||||
(select userId from question_reply where qid = @questionId and userId is not null)
|
||||
""");
|
||||
sql.setParam("unionId", unionId).setParam("questionId", questionId);
|
||||
return questionService.listMap(sql);
|
||||
} else {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.loginname,
|
||||
u.username,
|
||||
u.unitname,
|
||||
u.mobile
|
||||
FROM
|
||||
activity_user_scope aus
|
||||
LEFT JOIN `user` u ON u.id = aus.userId
|
||||
WHERE
|
||||
aus.groupId = @groupId
|
||||
AND u.unionId = @unionId
|
||||
AND aus.userId NOT IN (
|
||||
SELECT
|
||||
userId
|
||||
FROM
|
||||
question_reply
|
||||
WHERE
|
||||
qid = @qid)
|
||||
""");
|
||||
sql.setParam("groupId", activityUserScopeId);
|
||||
sql.setParam("unionId", unionId);
|
||||
sql.setParam("qid", questionId);
|
||||
return questionService.listMap(sql);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public List<Map<String, Object>> shopData(String questionId) {
|
||||
Sql userSql = Sqls.create("""
|
||||
SELECT
|
||||
su.loginname,
|
||||
su.username,
|
||||
su.unitname,
|
||||
su.unionname,
|
||||
signer.signerUserName,
|
||||
signer.signerPhone,
|
||||
signer.signerAddress,
|
||||
( SELECT SUM( rep.number ) FROM question_reply rep WHERE rep.qid = reply.qid AND rep.userId = reply.userId ) totalNumber,
|
||||
(
|
||||
SELECT
|
||||
SUM(( rep.number * wor.price ))
|
||||
FROM
|
||||
question_reply rep
|
||||
LEFT JOIN question_wor wor ON wor.wid = rep.rwid
|
||||
WHERE
|
||||
rep.qid = reply.qid
|
||||
AND rep.userId = reply.userId
|
||||
) totalPrice
|
||||
FROM
|
||||
question_reply reply
|
||||
LEFT JOIN `user` su ON su.id = reply.userId
|
||||
LEFT JOIN question_signer signer ON signer.userId = reply.userId
|
||||
AND signer.questionId = reply.qid
|
||||
WHERE
|
||||
reply.qid = @questionId
|
||||
GROUP BY
|
||||
reply.userId
|
||||
ORDER BY
|
||||
su.username
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
List<ExportUserEntity> userList = questionService.listEntity(userSql, ExportUserEntity.class);
|
||||
|
||||
Sql inventorySql = Sqls.create("""
|
||||
SELECT
|
||||
su.loginname,
|
||||
su.username,
|
||||
su.unitname,
|
||||
su.unionname,
|
||||
wor.wtxt commodityName,
|
||||
wor.price,
|
||||
reply.number,
|
||||
signer.signerUserName,
|
||||
signer.signerPhone,
|
||||
signer.signerAddress
|
||||
FROM
|
||||
question_reply reply
|
||||
LEFT JOIN question_wor wor ON wor.wid = reply.rwid
|
||||
LEFT JOIN `user` su ON su.id = reply.userId
|
||||
LEFT JOIN question_signer signer ON signer.userId = reply.userId
|
||||
AND signer.questionId = reply.qid
|
||||
WHERE
|
||||
reply.qid = @questionId
|
||||
ORDER BY
|
||||
su.username
|
||||
""").setParam("questionId", questionId);
|
||||
|
||||
List<ExportInventoryEntity> inventoryList = questionService.listEntity(inventorySql, ExportInventoryEntity.class);
|
||||
|
||||
ExportParams userExportParams = new ExportParams();
|
||||
userExportParams.setSheetName("人员表");
|
||||
Map<String, Object> userExportMap = new HashMap<>();
|
||||
userExportMap.put("name", "人员表");
|
||||
userExportMap.put("title", userExportParams);
|
||||
userExportMap.put("entity", ExportUserEntity.class);
|
||||
userExportMap.put("data", userList);
|
||||
|
||||
|
||||
ExportParams inventoryExportParams = new ExportParams();
|
||||
inventoryExportParams.setSheetName("清单表");
|
||||
Map<String, Object> inventoryExportMap = new HashMap<>();
|
||||
inventoryExportMap.put("name", "清单表");
|
||||
inventoryExportMap.put("title", inventoryExportParams);
|
||||
inventoryExportMap.put("entity", ExportInventoryEntity.class);
|
||||
inventoryExportMap.put("data", inventoryList);
|
||||
|
||||
List<Map<String, Object>> sheetsList = new ArrayList<>();
|
||||
sheetsList.add(userExportMap);
|
||||
sheetsList.add(inventoryExportMap);
|
||||
|
||||
return sheetsList;
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public void doExportInventory(@Param(value = "questionId",required = false) String questionId, HttpServletResponse response) {
|
||||
try {
|
||||
List<Map<String, Object>> sheetsList = shopData(questionId);
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("购物清单.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
|
||||
Workbook workBook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
|
||||
workBook.write(response.getOutputStream());
|
||||
workBook.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@At
|
||||
@RequiresPermissions("question.intentionalChoice")
|
||||
public Object shopDetail(String questionId, String unionId) {
|
||||
try {
|
||||
String unionname = questionService.dao().fetch(Sys_union.class, unionId).getUnionname();
|
||||
List<Map<String, Object>> list = shopData(questionId);
|
||||
|
||||
|
||||
list.forEach(v -> {
|
||||
Object name = v.get("name");
|
||||
if (v.get("name").equals("人员表")) {
|
||||
List<ExportUserEntity> eulist = (List<ExportUserEntity>) v.get("data");
|
||||
List<ExportUserEntity> newEuList = eulist.stream().filter(x -> x.getUnionname().equals(unionname)).collect(Collectors.toList());
|
||||
v.put("data", newEuList);
|
||||
}
|
||||
|
||||
if (v.get("name").equals("清单表")) {
|
||||
List<ExportInventoryEntity> eulist = (List<ExportInventoryEntity>) v.get("data");
|
||||
List<ExportInventoryEntity> newEuList = eulist.stream().filter(x -> x.getUnionname().equals(unionname)).collect(Collectors.toList());
|
||||
v.put("data", newEuList);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return list;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return Result.error();
|
||||
}
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
public void shopExport(String questionId, HttpServletResponse response) throws Exception {
|
||||
//根据问卷id查询
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
question_wor
|
||||
WHERE wiid IN (SELECT iid FROM question_issue WHERE iqid = @questionId)
|
||||
""");
|
||||
sql.setParam("questionId", questionId);
|
||||
List<NutMap> list = questionService.listMap(sql);
|
||||
|
||||
String fileName = "名单汇总文件夹";
|
||||
|
||||
response.reset();
|
||||
response.setContentType("application/x-msdownload;charset=utf-8");
|
||||
|
||||
String tmpPath = "tmp/" + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss", Locale.CHINA) + "/";
|
||||
File tmpDir = new File(tmpPath);
|
||||
tmpDir.mkdirs();
|
||||
|
||||
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
||||
ExcelExportEntity indexEntity = new ExcelExportEntity("序号", "xh", 20);
|
||||
indexEntity.setFormat("isAddIndex");
|
||||
exportEntities.add(indexEntity);
|
||||
|
||||
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
|
||||
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
|
||||
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
|
||||
exportEntities.add(new ExcelExportEntity("单位", "unitname", 40));
|
||||
exportEntities.add(new ExcelExportEntity("分工会", "unionname", 40));
|
||||
exportEntities.add(new ExcelExportEntity("手机号", "mobile", 20));
|
||||
exportEntities.add(new ExcelExportEntity("所选物品", "shop", 20));
|
||||
|
||||
list.forEach(item -> {
|
||||
|
||||
Sql ssql = Sqls.create("""
|
||||
SELECT
|
||||
u.username,
|
||||
u.loginname,
|
||||
u.sex,
|
||||
u.unitname,
|
||||
u.unionname,
|
||||
u.mobile,
|
||||
@shop as shop
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN `user` u ON qr.userId = u.id
|
||||
$condition
|
||||
""");
|
||||
ssql.setParam("shop", item.getString("wtxt"));
|
||||
Cnd scnd = Cnd.NEW();
|
||||
scnd.and("qid", "=", questionId);
|
||||
scnd.and("rwid", "=", item.getString("wid"));
|
||||
scnd.asc("unitcode");
|
||||
ssql.setCondition(scnd);
|
||||
|
||||
List<NutMap> sList = questionService.listMap(ssql);
|
||||
|
||||
FileOutputStream outputStream = null;
|
||||
try {
|
||||
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
|
||||
outputStream = new FileOutputStream(tmpPath + item.getString("wtxt") + ".xlsx");
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, sList);
|
||||
workbook.write(outputStream);
|
||||
workbook.close();
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
|
||||
String aimsDir = "zipTmp/" + R.UU32();
|
||||
String aimsName = fileName + ".zip";
|
||||
String aimsPath = aimsDir + "/" + aimsName;
|
||||
FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
|
||||
|
||||
response.setHeader("content-disposition", "attachment;filename="
|
||||
+ URLEncoder.encode(aimsName, "UTF-8"));
|
||||
|
||||
File aimsFile = new File(aimsPath);
|
||||
FileInputStream inputStream = new FileInputStream(aimsFile);
|
||||
IOUtils.copy(inputStream, response.getOutputStream());
|
||||
inputStream.close();
|
||||
aimsFile.delete();
|
||||
|
||||
FileUtil.deleteDir(new File(tmpPath));
|
||||
FileUtil.deleteDir(new File(aimsDir));
|
||||
}
|
||||
|
||||
@At
|
||||
@Ok("void")
|
||||
public void doUnionUserExport(String questionId, boolean flag, HttpServletResponse response) {
|
||||
Dao dao = questionService.dao();
|
||||
Question question = questionService.fetch(questionId);
|
||||
Integer qlx = question.getQlx();
|
||||
Integer activityUserScopeId = question.getActivityUserScopeId();
|
||||
|
||||
List<ExcelExportEntity> entityList = new ArrayList<>();
|
||||
entityList.add(new ExcelExportEntity("姓名", "userName", 20));
|
||||
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
|
||||
entityList.add(new ExcelExportEntity("性别", "sex", 20));
|
||||
entityList.add(new ExcelExportEntity("单位", "unitName", 30));
|
||||
entityList.add(new ExcelExportEntity("分工会", "unionName", 35));
|
||||
entityList.add(new ExcelExportEntity("手机号", "mobile", 30));
|
||||
List<NutMap> mapList = null;
|
||||
if (!flag) {
|
||||
if (qlx == 4 && activityUserScopeId != null) {
|
||||
List<ActivityUserScope> activityUserScopeList = dao.query(ActivityUserScope.class, Cnd.where("groupId", "=", activityUserScopeId));
|
||||
List<String> userIds = activityUserScopeList.stream().map(v -> v.getUserId()).collect(Collectors.toList());
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
loginname AS loginName,
|
||||
username AS userName,
|
||||
unitname AS unitName,
|
||||
unionname AS unionName,
|
||||
mobile,
|
||||
sex
|
||||
FROM `user`
|
||||
where
|
||||
id in (@userIds)
|
||||
and id not in
|
||||
(select userId from question_reply where qid = @questionId and userId is not null)
|
||||
""");
|
||||
sql.setParam("userIds", userIds);
|
||||
sql.setParam("questionId", questionId);
|
||||
mapList = questionService.listMap(sql);
|
||||
} else {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
loginname AS loginName,
|
||||
username AS userName,
|
||||
unitname AS unitName,
|
||||
unionname AS unionName,
|
||||
mobile,
|
||||
sex
|
||||
FROM `user`
|
||||
where member = 1
|
||||
and id not in
|
||||
(select userId from question_reply where qid = @questionId and userId is not null)
|
||||
""");
|
||||
sql.setParam("questionId", questionId);
|
||||
mapList = questionService.listMap(sql);
|
||||
}
|
||||
} else {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
u.username userName,
|
||||
u.loginname loginName,
|
||||
qw.wtxt,
|
||||
u.unionId,
|
||||
u.unitname AS unitName,
|
||||
u.unionname AS unionName,
|
||||
u.mobile,
|
||||
u.sex
|
||||
FROM
|
||||
question_reply qr
|
||||
LEFT JOIN question_wor qw ON qw.wid = qr.rwid
|
||||
LEFT JOIN `user` u ON u.id = qr.userId
|
||||
WHERE
|
||||
qr.qid = @questionId
|
||||
ORDER BY u.unitcode ASC,convert(u.loginName using gbk)ASC
|
||||
""");
|
||||
sql.setParam("questionId", questionId);
|
||||
mapList = questionService.listMap(sql);
|
||||
entityList.add(new ExcelExportEntity("所选物品", "wtxt", 30));
|
||||
}
|
||||
Map<String, List<NutMap>> userListMap = mapList.stream().collect(Collectors.groupingBy(v -> v.getString("unionName")));
|
||||
Workbook workbook = new XSSFWorkbook();
|
||||
|
||||
userListMap.forEach((k, v) -> {
|
||||
ExcelExportService service = new ExcelExportService();
|
||||
ExportParams exportParams = new ExportParams();
|
||||
exportParams.setTitle(k);
|
||||
exportParams.setSheetName(k);
|
||||
exportParams.setType(ExcelType.XSSF);
|
||||
service.createSheetForMap(workbook, exportParams, entityList, v);
|
||||
});
|
||||
|
||||
try {
|
||||
ViTool.excelResponse(response, (flag ? "已选名单" : "未选名单") + ".xlsx");
|
||||
ServletOutputStream outputStream = response.getOutputStream();
|
||||
workbook.write(outputStream);
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Data
|
||||
public static class ExportUserEntity {
|
||||
@Excel(name = "工号", width = 20d)
|
||||
private String loginname;
|
||||
|
||||
@Excel(name = "姓名", width = 20d)
|
||||
private String username;
|
||||
|
||||
@Excel(name = "所属单位", width = 40d)
|
||||
private String unitname;
|
||||
|
||||
@Excel(name = "所属工会", width = 40d)
|
||||
private String unionname;
|
||||
|
||||
@Excel(name = "选购总数")
|
||||
private String totalNumber;
|
||||
|
||||
@Excel(name = "总金额")
|
||||
private String totalPrice;
|
||||
|
||||
@Excel(name = "签收人姓名", width = 20d)
|
||||
private String signerUserName;
|
||||
|
||||
@Excel(name = "联系方式", width = 40d)
|
||||
private String signerPhone;
|
||||
|
||||
@Excel(name = "收货地址", width = 40d)
|
||||
private String signerAddress;
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ExportInventoryEntity {
|
||||
@Excel(name = "工号", width = 20d)
|
||||
private String loginname;
|
||||
|
||||
@Excel(name = "姓名", width = 20d)
|
||||
private String username;
|
||||
|
||||
@Excel(name = "商品名称", width = 20d)
|
||||
private String commodityName;
|
||||
|
||||
@Excel(name = "商品单价")
|
||||
private String price;
|
||||
|
||||
@Excel(name = "选购数量")
|
||||
private String number;
|
||||
|
||||
@Excel(name = "所属工会")
|
||||
private String unionname;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ExportEntity {
|
||||
@Excel(name = "工号", width = 20d)
|
||||
private String loginname;
|
||||
|
||||
@Excel(name = "姓名", width = 20d)
|
||||
private String username;
|
||||
|
||||
@Excel(name = "性别", width = 20d)
|
||||
private String sex;
|
||||
|
||||
@Excel(name = "所属单位", width = 40d)
|
||||
private String unitname;
|
||||
|
||||
@Excel(name = "所属工会", width = 40d)
|
||||
private String unionname;
|
||||
|
||||
@Excel(name = "分值", width = 20d)
|
||||
private String fraction;
|
||||
|
||||
private String qtitle;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* 问卷调查
|
||||
*
|
||||
* @author 1V
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Table("Question")
|
||||
public class Question implements Serializable {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("qid")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@Prev(els = {@EL("uuid()")})
|
||||
private String qid;
|
||||
|
||||
@Column
|
||||
@Comment("问卷调查创建人")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String qcreator;
|
||||
|
||||
@Column
|
||||
@Comment("问卷调查创建时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String qctime;
|
||||
|
||||
@Column
|
||||
@Comment("问卷调查状态(1:未开启 2:已开启 3:已关闭)")
|
||||
@ColDefine(type = ColType.INT, width = 1)
|
||||
private Integer qflag;
|
||||
|
||||
@Column
|
||||
@Comment("类型(1:调查 2:答题 3:购物)")
|
||||
@ColDefine(type = ColType.INT, width = 1)
|
||||
private Integer qlx;
|
||||
|
||||
@Column
|
||||
@Comment("标题")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 200)
|
||||
private String qtitle;
|
||||
|
||||
@Column
|
||||
@Comment("说明")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 2000)
|
||||
private String qsm;
|
||||
|
||||
@Column
|
||||
@Comment("每日可答次数")
|
||||
@ColDefine(type = ColType.INT, width = 2)
|
||||
private Integer qrkdcs;
|
||||
|
||||
@Column
|
||||
@Comment("每日开始答题时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String qdtkssj;
|
||||
|
||||
@Column
|
||||
@Comment("每日结束答题时间")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String qdtjssj;
|
||||
|
||||
@Many(field = "iqid")
|
||||
private List<Question_issue> issues;
|
||||
|
||||
@Column
|
||||
@Comment("开始时间")
|
||||
private Long startTime;
|
||||
|
||||
@Column
|
||||
@Comment("结束时间")
|
||||
private Long endTime;
|
||||
|
||||
@Column
|
||||
@Comment("自动选择默认项")
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private boolean autoSelect;
|
||||
|
||||
@Column
|
||||
@Comment("参加人员分组id,为空则不限制参加人员")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer activityUserScopeId;
|
||||
|
||||
@Column
|
||||
@Comment("出题模式 1.定时定题 2.随机题目")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer ctMode;
|
||||
|
||||
@Column
|
||||
@Comment("是否抽奖")
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean isRaffle;
|
||||
|
||||
@Column
|
||||
@Comment("抽奖时间")
|
||||
@ColDefine(type = ColType.DATETIME)
|
||||
private Date raffleTime;
|
||||
|
||||
@Column
|
||||
@Comment("多少分可以抽奖")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer raffleScore;
|
||||
|
||||
@Column
|
||||
@Comment("最终获奖人数")
|
||||
@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> raffleRule;
|
||||
|
||||
/**
|
||||
* 抽奖规则
|
||||
*/
|
||||
@Data
|
||||
public static class RaffleRule {
|
||||
//开始答题时间
|
||||
private Date startAnswerDate;
|
||||
|
||||
//结束答题时间
|
||||
private Date endAnswerDate;
|
||||
|
||||
//抽奖时间
|
||||
private Date raffleTime;
|
||||
|
||||
//抽奖分数
|
||||
private Integer raffleScore;
|
||||
|
||||
//抽奖人数
|
||||
private Integer raffleWinnerUserNum;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package io.v.nutz.zhgh.question.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @FileName io.v.nutz.zgfw.model.question.QuestionAnswerUserScore
|
||||
* @Description: 答题类型每个人得分
|
||||
* @Author zxc
|
||||
* @Date 2022/5/16:14:56
|
||||
* @Version V1.0
|
||||
**/
|
||||
@Table
|
||||
@Data
|
||||
public class QuestionAnswerUserScore {
|
||||
|
||||
@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 subjectId;
|
||||
|
||||
@Column
|
||||
@Comment("该题得分")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer subjectScore;
|
||||
|
||||
@Column
|
||||
@Comment("用户id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String userId;
|
||||
|
||||
@Column
|
||||
@Comment("得分时间")
|
||||
@ColDefine(type = ColType.DATE)
|
||||
private Date answerDate;
|
||||
|
||||
@Column
|
||||
@Comment("回答次数")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer answerNum;
|
||||
|
||||
}
|
||||
@@ -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<String> 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;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package io.v.nutz.zhgh.question.model;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
|
||||
/**
|
||||
* @author: Aaron
|
||||
* @create: 2021-06-08 16:06
|
||||
* @description:
|
||||
**/
|
||||
|
||||
@Data
|
||||
@Table("question_signer")
|
||||
@Accessors(chain = true)
|
||||
public class QuestionSigner {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@Comment("id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@Prev(els = {@EL("uuid()")})
|
||||
private String id;
|
||||
|
||||
@Column
|
||||
@Comment("问卷Id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String questionId;
|
||||
|
||||
@Column
|
||||
@Comment("问卷调查填写人")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String userId;
|
||||
|
||||
@Column
|
||||
@Comment("签收人姓名")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String signerUserName;
|
||||
|
||||
@Column
|
||||
@Comment("联系方式")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 20)
|
||||
private String signerPhone;
|
||||
|
||||
@Column
|
||||
@Comment("收货地址")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 200)
|
||||
private String signerAddress;
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
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;
|
||||
|
||||
/**
|
||||
* 问卷分数
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/06/20
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@Table
|
||||
public class QuestionUserScore 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("得分")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer score;
|
||||
|
||||
@Column
|
||||
@Comment("用户id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String userId;
|
||||
|
||||
@Column
|
||||
@Comment("得分时间")
|
||||
@ColDefine(type = ColType.DATE)
|
||||
private Date answerDate;
|
||||
|
||||
@Column
|
||||
@Comment("回答次数")
|
||||
@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;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package io.v.nutz.zhgh.question.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 问卷获奖表
|
||||
*
|
||||
* @author jug
|
||||
* @date 2023/06/12
|
||||
*/
|
||||
@Data
|
||||
@Table
|
||||
public class QuestionWinner {
|
||||
|
||||
@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.DATE)
|
||||
private Date winDate;
|
||||
|
||||
@Column
|
||||
@Comment("分数")
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer score;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
package io.v.nutz.zhgh.question.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
import org.nutz.integration.json4excel.annotation.J4EIgnore;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 问卷调查问题
|
||||
*
|
||||
* @author 1V
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Table("Question_issue")
|
||||
public class Question_issue implements Serializable {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String iid;
|
||||
|
||||
@Column
|
||||
@Comment("所属问卷调查id")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String iqid;
|
||||
|
||||
@Column
|
||||
@Comment("题名")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.TEXT)
|
||||
private String iname;
|
||||
|
||||
@Column
|
||||
@Comment("提示")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.TEXT)
|
||||
private String its;
|
||||
|
||||
@Column
|
||||
@Comment("是否必答")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean iisbd;
|
||||
|
||||
@Column
|
||||
@Comment("题型 (1 选择题 2 填空题)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 2)
|
||||
private Integer itx;
|
||||
|
||||
@Column
|
||||
@Comment("是否单选(选择题)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean iisdx;
|
||||
|
||||
@Column
|
||||
@Comment("最小选择数(多选)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 4)
|
||||
private Integer iminselect;
|
||||
|
||||
@Column
|
||||
@Comment("最大选择数(多选)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 4)
|
||||
private Integer imaxselect;
|
||||
|
||||
@Column
|
||||
@Comment("是否随机选项")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean iisrandom;
|
||||
|
||||
@Column
|
||||
@Comment("排列方式(1:竖向排列 2:横向排列)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 2)
|
||||
private Integer iplfs;
|
||||
|
||||
@Column
|
||||
@Comment("每行多少列(横向排列)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 2)
|
||||
private Integer icolnum;
|
||||
|
||||
@Column
|
||||
@Comment("排序编号")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 4)
|
||||
private Integer ipxbh;
|
||||
|
||||
@Column
|
||||
@Comment("该题分数")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 4)
|
||||
private Integer fraction;
|
||||
|
||||
@Column
|
||||
@Comment("显示日期")
|
||||
@ColDefine(type = ColType.DATE)
|
||||
private Date displayDate;
|
||||
|
||||
@One(field = "iqid", key = "qid")
|
||||
private Question question;
|
||||
|
||||
@Many(field = "wiid")
|
||||
private List<Question_wor> wors;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* 1V
|
||||
* <p>
|
||||
* 问卷调查作答表
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Table("Question_reply")
|
||||
public class Question_reply implements Serializable {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@Prev(els = {@EL("uuid()")})
|
||||
private String rid;
|
||||
|
||||
@Column
|
||||
@Comment("问卷的id")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String qid;
|
||||
|
||||
@Column
|
||||
@Comment("题目id")
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String issueId;
|
||||
|
||||
@Column
|
||||
@Comment("选择的选项id")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String rwid;
|
||||
|
||||
@Column
|
||||
@Comment("设备唯一标识")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String ropenid;
|
||||
|
||||
@Column
|
||||
@Comment("单次答题唯一标识")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String ridentity;
|
||||
|
||||
@Column
|
||||
@Comment("填空题时填的值")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 2000)
|
||||
private String rval;
|
||||
|
||||
@Column
|
||||
@Comment("提交时间")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 50)
|
||||
private String rtime;
|
||||
|
||||
@Column
|
||||
@Comment("用户ID")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String userId;
|
||||
|
||||
@Column
|
||||
@Comment("是否保存")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean save;
|
||||
|
||||
@Column
|
||||
@Comment("所选数量")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT)
|
||||
private Integer number;
|
||||
|
||||
@One(field = "rwid", key = "wid")
|
||||
private Question_wor wor;
|
||||
|
||||
private List<String> userSelect;
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package io.v.nutz.zhgh.question.model;
|
||||
|
||||
import lombok.Data;
|
||||
import org.nutz.dao.entity.annotation.*;
|
||||
import org.nutz.dao.interceptor.annotation.PrevInsert;
|
||||
import org.nutz.integration.json4excel.annotation.J4EIgnore;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 问卷调查问题答案
|
||||
*
|
||||
* @author 1V
|
||||
*/
|
||||
|
||||
@Data
|
||||
@Table("Question_wor")
|
||||
public class Question_wor implements Serializable {
|
||||
|
||||
@Column
|
||||
@Name
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
@PrevInsert(uu32 = true)
|
||||
private String wid;
|
||||
|
||||
@Column
|
||||
@Comment("所属题目")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 32)
|
||||
private String wiid;
|
||||
|
||||
@Column
|
||||
@Comment("选项文字")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 100)
|
||||
private String wtxt;
|
||||
|
||||
@Column
|
||||
@Comment("选项图片")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.TEXT)
|
||||
private String wimg;
|
||||
|
||||
@Column
|
||||
@Comment("选项说明")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 2000)
|
||||
private String wsm;
|
||||
|
||||
@Column
|
||||
@Comment("选项链接")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.VARCHAR, width = 2000)
|
||||
private String wlj;
|
||||
|
||||
@Column
|
||||
@Comment("是否允许填空")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean wistk;
|
||||
|
||||
@Column
|
||||
@Comment("是否必须填空(允许填空时)")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean wisbt;
|
||||
|
||||
@Column
|
||||
@Comment("是否默认选中")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean wismr;
|
||||
|
||||
@Column
|
||||
@Comment("排序编号")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.INT, width = 4)
|
||||
private Integer wpxbh;
|
||||
|
||||
@Column
|
||||
@Comment("是否正确答案")
|
||||
@ColDefine(type = ColType.BOOLEAN)
|
||||
private Boolean correct;
|
||||
|
||||
@Column
|
||||
@Comment("单价")
|
||||
@J4EIgnore
|
||||
@ColDefine(type = ColType.FLOAT)
|
||||
private Integer price;
|
||||
|
||||
@One(field = "wiid", key = "iid")
|
||||
private Question_issue issue;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package io.v.nutz.zhgh.question.service;
|
||||
|
||||
import io.v.nutz.base.page.Pagination;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
import io.v.nutz.base.service.BaseService;
|
||||
import io.v.nutz.zhgh.question.model.QuestionUserScore;
|
||||
import org.nutz.dao.sql.Sql;
|
||||
import org.nutz.mvc.annotation.Param;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* 得分
|
||||
*/
|
||||
public interface QuestionAnswerRankingService extends BaseService<QuestionUserScore> {
|
||||
|
||||
Pagination pageData(PageForm pageForm,
|
||||
String questionId,
|
||||
String unionId,
|
||||
String unitId,
|
||||
String answerDate);
|
||||
|
||||
void exportXlsx(String questionId, OutputStream os) throws IOException;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package io.v.nutz.zhgh.question.service;
|
||||
|
||||
|
||||
import io.v.nutz.base.service.BaseService;
|
||||
import io.v.nutz.zhgh.question.model.Question_issue;
|
||||
|
||||
public interface QuestionIssueService extends BaseService<Question_issue> {
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package io.v.nutz.zhgh.question.service;
|
||||
|
||||
|
||||
|
||||
import io.v.nutz.zhgh.question.model.Question;
|
||||
import io.v.nutz.zhgh.question.model.Question_reply;
|
||||
import io.v.nutz.base.service.ViService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface QuestionReplyService extends ViService<Question_reply> {
|
||||
/**
|
||||
* 判断今天是否还可以答题/投票
|
||||
*
|
||||
* @param question
|
||||
* @param ropenid
|
||||
* @return
|
||||
*/
|
||||
boolean canAnswer(Question question, String ropenid);
|
||||
|
||||
/**
|
||||
* 添加答题数据
|
||||
*
|
||||
* @param replys
|
||||
*/
|
||||
void saveAnswerData(List<Question_reply> replys);
|
||||
|
||||
void doAdd(List<Question_reply> replys, Boolean save);
|
||||
|
||||
void insertQuestionAnswerScore(List<Question_reply> replyList);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package io.v.nutz.zhgh.question.service;
|
||||
|
||||
import io.v.nutz.zhgh.question.model.Question;
|
||||
import io.v.nutz.base.service.ViService;
|
||||
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> {
|
||||
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);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package io.v.nutz.zhgh.question.service;
|
||||
|
||||
|
||||
import io.v.nutz.base.service.BaseService;
|
||||
import io.v.nutz.zhgh.question.model.Question_wor;
|
||||
|
||||
public interface QuestionWorService extends BaseService<Question_wor> {
|
||||
}
|
||||
+424
@@ -0,0 +1,424 @@
|
||||
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.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import io.v.nutz.base.page.Pagination;
|
||||
import io.v.nutz.base.query.PageForm;
|
||||
import io.v.nutz.base.service.impl.BaseServiceImpl;
|
||||
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<QuestionUserScore> 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<NutMap> 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<NutMap> list = listMap(sql);
|
||||
List<ExcelExportEntity> 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<NutMap> list = listMap(sql);
|
||||
|
||||
List<ExcelExportEntity> 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<NutMap> list = listMap(sql);
|
||||
for (NutMap map : list) {
|
||||
map.put("score", map.getInt(question.getCalcScoreMode() == 1 ? "maxAnswerScore" : "lastAnswerNumScore"));
|
||||
}
|
||||
|
||||
List<ExcelExportEntity> 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<NutMap> list = listMap(sql);
|
||||
|
||||
List<ExcelExportEntity> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package io.v.nutz.zhgh.question.service.impl;
|
||||
|
||||
|
||||
import io.v.nutz.base.service.impl.BaseServiceImpl;
|
||||
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;
|
||||
|
||||
/**
|
||||
* Created by 李耀威 on 2020/02/19
|
||||
*/
|
||||
@IocBean(args = {"refer:dao"})
|
||||
@CacheDefaults(cacheName = "Zgfw_question_issue")
|
||||
public class QuestionIssueServiceImpl extends BaseServiceImpl<Question_issue> implements QuestionIssueService {
|
||||
public QuestionIssueServiceImpl(Dao dao) {
|
||||
super(dao);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package io.v.nutz.zhgh.question.service.impl;
|
||||
|
||||
import io.v.nutz.base.utils.DateUtil;
|
||||
import io.v.nutz.zhgh.question.model.*;
|
||||
import io.v.nutz.zhgh.question.service.QuestionReplyService;
|
||||
import io.v.nutz.base.service.impl.ViServiceImpl;
|
||||
import org.nutz.aop.interceptor.async.Async;
|
||||
import org.nutz.aop.interceptor.ioc.TransAop;
|
||||
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.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;
|
||||
|
||||
|
||||
@IocBean(args = {"refer:dao"})
|
||||
public class QuestionReplyServiceImpl extends ViServiceImpl<Question_reply> implements QuestionReplyService {
|
||||
public QuestionReplyServiceImpl(Dao dao) {
|
||||
super(dao);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canAnswer(Question question, String ropenid) {
|
||||
Sql sql = Sqls.create("SELECT COUNT(DISTINCT ridentity) FROM question_reply WHERE ropenid=@ropenid AND qid = @qid AND left(rtime, 10) = @rtime ");
|
||||
sql.setParam("ropenid", ropenid);
|
||||
sql.setParam("qid", question.getQid());
|
||||
sql.setParam("rtime", DateUtil.getDate());
|
||||
if (question.getQrkdcs() != null && count(sql) >= question.getQrkdcs()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void saveAnswerData(List<Question_reply> replys) {
|
||||
for (Question_reply reply : replys) {
|
||||
insert(reply);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void doAdd(List<Question_reply> replys, Boolean save) {
|
||||
if (!replys.isEmpty()) {
|
||||
String qid = replys.get(0).getQid();
|
||||
String userId = replys.get(0).getUserId();
|
||||
clear(Cnd.where("qid", "=", qid).and("userId", "=", userId));
|
||||
replys.forEach(reply -> {
|
||||
reply.setSave(save);
|
||||
reply.setRidentity(R.UU32());
|
||||
reply.setRtime(DateUtil.getDateTime());
|
||||
insert(reply);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Async
|
||||
public void insertQuestionAnswerScore(List<Question_reply> replyList) {
|
||||
//用户id
|
||||
String userId = replyList.get(0).getUserId();
|
||||
//选项id
|
||||
String rwid = replyList.get(0).getRwid();
|
||||
//问卷id
|
||||
String questionId = replyList.get(0).getQid();
|
||||
|
||||
Question_wor questionWor = dao().fetch(Question_wor.class, Cnd.where("wid", "=", rwid));
|
||||
//题目id
|
||||
String wiid = questionWor.getWiid();
|
||||
|
||||
Question_issue subject = dao().fetch(Question_issue.class, Cnd.where("iid", "=", wiid));
|
||||
Integer fraction = subject.getFraction();
|
||||
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
wid
|
||||
FROM
|
||||
question_wor qw
|
||||
WHERE
|
||||
qw.correct = 1
|
||||
AND qw.wiid = @wiid
|
||||
""");
|
||||
sql.setParam("wiid", wiid);
|
||||
sql.setCallback(Sqls.callback.strs());
|
||||
dao().execute(sql);
|
||||
//正确的选项
|
||||
List<String> correctOptionIdList = sql.getList(String.class);
|
||||
//用户选的选项
|
||||
List<String> userSelectedOptionIdList = replyList.stream().map(v -> v.getRwid()).collect(Collectors.toList());
|
||||
|
||||
QuestionAnswerUserScore answerUserScore = new QuestionAnswerUserScore();
|
||||
answerUserScore.setQuestionId(questionId);
|
||||
answerUserScore.setSubjectId(wiid);
|
||||
answerUserScore.setUserId(userId);
|
||||
|
||||
String[] correctOptionIdArray = correctOptionIdList.toArray(new String[]{});
|
||||
String[] userSelectedOptionIdArray = userSelectedOptionIdList.toArray(new String[]{});
|
||||
Arrays.sort(correctOptionIdArray);
|
||||
Arrays.sort(userSelectedOptionIdArray);
|
||||
|
||||
if (Arrays.equals(correctOptionIdArray, userSelectedOptionIdArray)) {
|
||||
answerUserScore.setSubjectScore(fraction);
|
||||
} else {
|
||||
answerUserScore.setSubjectScore(0);
|
||||
}
|
||||
dao().insert(answerUserScore);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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.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 io.v.nutz.base.service.impl.ViServiceImpl;
|
||||
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<Question> 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<Question_reply> 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<Question_reply> replies = dao().query(Question_reply.class, Cnd.where("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()).and("userId", "=", ShiroUtil.getUserId()));
|
||||
Map<String, List<Question_reply>> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId));
|
||||
|
||||
issueReplies.forEach((k, v) -> {
|
||||
//用户回答的选项
|
||||
Set<String> userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet());
|
||||
//正确答案
|
||||
Optional<Question_issue> issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst();
|
||||
Set<String> 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<String> issueIds = randomIssue.getIssueIds();
|
||||
List<Question_reply> replies = dao().query(Question_reply.class, Cnd.where("issueId", "in", issueIds).and("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()));
|
||||
Map<String, List<Question_reply>> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId));
|
||||
issueReplies.forEach((k, v) -> {
|
||||
//用户回答的选项
|
||||
Set<String> userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet());
|
||||
//正确答案
|
||||
Optional<Question_issue> issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst();
|
||||
Set<String> 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<String> issueIds = randomIssue.getIssueIds();
|
||||
List<Question_reply> replies = dao().query(Question_reply.class, Cnd.where("issueId", "in", issueIds).and("qid", "=", questionId).and("userId", "=", ShiroUtil.getUserId()));
|
||||
Map<String, List<Question_reply>> issueReplies = replies.stream().collect(Collectors.groupingBy(Question_reply::getIssueId));
|
||||
issueReplies.forEach((k, v) -> {
|
||||
//用户回答的选项
|
||||
Set<String> userReplyOptionIds = v.stream().map(Question_reply::getRwid).collect(Collectors.toSet());
|
||||
//正确答案
|
||||
Optional<Question_issue> issueOptional = question.getIssues().stream().filter(x -> x.getIid().equals(k)).findFirst();
|
||||
Set<String> 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package io.v.nutz.zhgh.question.service.impl;
|
||||
|
||||
import io.v.nutz.base.service.impl.BaseServiceImpl;
|
||||
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;
|
||||
|
||||
@IocBean(args = {"refer:dao"})
|
||||
@CacheDefaults(cacheName = "Zgfw_question_wor")
|
||||
public class QuestionWorServiceImpl extends BaseServiceImpl<Question_wor> implements QuestionWorService {
|
||||
public QuestionWorServiceImpl(Dao dao) {
|
||||
super(dao);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user