This commit is contained in:
Paidax
2024-11-29 09:03:59 +08:00
commit 2ffadd89a7
3480 changed files with 879405 additions and 0 deletions
@@ -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&lt80", v.stream().filter(x -> x.getInt("max_score", 0) >= 60 && x.getInt("max_score", 0) < 80).count());
unionMap.addv("gte80&lt90", v.stream().filter(x -> x.getInt("max_score", 0) >= 80 && x.getInt("max_score", 0) < 90).count());
unionMap.addv("gte90&lt100", 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&lt80", 20));
exportEntities.add(new ExcelExportEntity("80≤分数<90", "gte80&lt90", 20));
exportEntities.add(new ExcelExportEntity("90≤分数≤100", "gte90&lt100", 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;
}
}
@@ -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> {
}
@@ -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);
}
}