You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
18 KiB
379 lines
18 KiB
package com.zh.lingnuo.serviceImpl;
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.zh.lingnuo.controller.answerer.CompanyQnAnswerController;
|
|
import com.zh.lingnuo.controller.answerer.CompanyQnAnswerController.ResultAnswerAll;
|
|
import com.zh.lingnuo.controller.company.CompanyQnController;
|
|
import com.zh.lingnuo.mapper.CompanyQnAnswererMapper;
|
|
import com.zh.lingnuo.mapper.CompanyQnMapper;
|
|
import com.zh.lingnuo.model.CompanyQn;
|
|
import com.zh.lingnuo.model.CompanyQnAnswer;
|
|
import com.zh.lingnuo.mapper.CompanyQnAnswerMapper;
|
|
import com.zh.lingnuo.model.CompanyQnAnswerer;
|
|
import com.zh.lingnuo.model.CompanyQnTitle;
|
|
import com.zh.lingnuo.service.ICompanyQnAnswerService;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.zh.lingnuo.service.ICompanyQnAnswererService;
|
|
import com.zh.lingnuo.service.ICompanyQnService;
|
|
import com.zh.lingnuo.service.ICompanyQnTitleService;
|
|
import com.zh.lingnuo.utils.Common;
|
|
import com.zh.lingnuo.utils.ExcelExport;
|
|
import com.zh.lingnuo.utils.PageUtil;
|
|
import com.zh.lingnuo.utils.result.Result;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import javax.servlet.ServletOutputStream;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.net.URLEncoder;
|
|
import java.time.LocalDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.*;
|
|
|
|
/**
|
|
* <p>
|
|
* 服务实现类
|
|
* </p>
|
|
*
|
|
* @author zh
|
|
* @since 2022-09-13
|
|
*/
|
|
@Service
|
|
public class CompanyQnAnswerServiceImpl extends ServiceImpl<CompanyQnAnswerMapper, CompanyQnAnswer> implements ICompanyQnAnswerService {
|
|
|
|
@Autowired
|
|
private ICompanyQnService companyQnService;
|
|
@Autowired
|
|
private ICompanyQnTitleService companyQnTitleService;
|
|
@Autowired
|
|
private ICompanyQnAnswererService companyQnAnswererService;
|
|
|
|
@Autowired
|
|
private CompanyQnMapper companyQnMapper;
|
|
@Autowired
|
|
private CompanyQnAnswerMapper companyQnAnswerMapper;
|
|
@Autowired
|
|
private CompanyQnAnswererMapper companyQnAnswererMapper;
|
|
|
|
// 问卷列表
|
|
public Result qnList(CompanyQnAnswerController.paramsAnswererQnList params, int answererId) {
|
|
IPage<CompanyQnMapper.MapperResultAnswererQnList> qnList = companyQnMapper.qnList(PageUtil.SetPage(params.getPageNum(), params.getPageSize()), answererId);
|
|
return Result.success(qnList);
|
|
}
|
|
|
|
// 答题结果
|
|
public Result all(int qnId, int answererId) {
|
|
List<CompanyQnAnswerMapper.MapperResultAnswerAll> list = companyQnAnswerMapper.answerList(new QueryWrapper<CompanyQnAnswer>()
|
|
.eq("t1.qn_id", qnId).eq("t1.answerer_id", answererId));
|
|
List<ResultAnswerAll> result = new ArrayList();
|
|
HashMap<Integer, HashMap<String, List<Integer>>> t = new HashMap();
|
|
for (CompanyQnAnswerMapper.MapperResultAnswerAll i : list) {
|
|
int titleId = i.getTitleId();
|
|
if (null == t.get(titleId)) {
|
|
t.put(titleId, new HashMap<>());
|
|
ResultAnswerAll r = new ResultAnswerAll();
|
|
BeanUtils.copyProperties(i, r);
|
|
Integer kind = i.getTitleKind();
|
|
if (null != kind) {
|
|
r.setTitleKindName(CompanyQnTitle.getKindName(kind));
|
|
if (kind == CompanyQnTitle.CompanyQnTitleKindPartnerChoice) {
|
|
r.setAnswerOpt(null);
|
|
r.setAnswerCont(null);
|
|
}
|
|
if (kind == CompanyQnTitle.CompanyQnTitleKindMultiChoice){
|
|
r.setAnswerMultiOpt(i.getAnswerOpt().split(","));
|
|
}
|
|
}
|
|
result.add(r);
|
|
}
|
|
Integer id = i.getQnTowardsId();
|
|
if (null != i.getTitleKind() && i.getTitleKind() == CompanyQnTitle.CompanyQnTitleKindPartnerChoice && Common.higherZero(id)) {
|
|
HashMap<String, List<Integer>> l = t.get(titleId);
|
|
if (null == l.get(i.getAnswerOpt())) {
|
|
l.put(i.getAnswerOpt(), new ArrayList<Integer>());
|
|
}
|
|
l.get(i.getAnswerOpt()).add(id);
|
|
}
|
|
}
|
|
for (ResultAnswerAll item : result) {
|
|
item.setAnswerPartnerChoice(t.get(item.getTitleId()));
|
|
}
|
|
return Result.success(result);
|
|
}
|
|
|
|
// 全部被评人
|
|
public Result allQnTowards(int qnId, int answererId) {
|
|
|
|
List<CompanyQnAnswererMapper.MapperResultQnAnswererAll> list = companyQnAnswererMapper.qnAnswererList(new QueryWrapper<CompanyQnAnswerer>().eq("t1.qn_id", qnId).ne("t1.answerer_id", answererId));
|
|
List<CompanyQnAnswerController.ResultQnTowards> resList = new ArrayList<>();
|
|
for (CompanyQnAnswererMapper.MapperResultQnAnswererAll i : list) {
|
|
CompanyQnAnswerController.ResultQnTowards r = new CompanyQnAnswerController.ResultQnTowards();
|
|
BeanUtils.copyProperties(i, r);
|
|
r.setId(i.getAnswererId());
|
|
resList.add(r);
|
|
}
|
|
return Result.success(resList);
|
|
}
|
|
|
|
// 答题
|
|
@Transactional
|
|
public Result add(CompanyQnAnswerController.paramsCompanyQnAnswerAdd params) {
|
|
int titleId = params.getTitleId();
|
|
int answererId = params.getUserInfo().getId();
|
|
CompanyQnTitle companyQnTitle = companyQnTitleService.getById(titleId);
|
|
if (null == companyQnTitle) {
|
|
return Result.err("问卷题目错误");
|
|
}
|
|
int qnId = companyQnTitle.getQnId();
|
|
CompanyQn qn = companyQnService.getById(qnId);
|
|
if (null == qn) {
|
|
return Result.err("未知问卷");
|
|
}
|
|
if (CompanyQn.CompanyQnStatusRelease != qn.getStatus()) {
|
|
return Result.err("不在可答题时间");
|
|
}
|
|
CompanyQnAnswer companyQnAnswer = new CompanyQnAnswer()
|
|
.setQnId(qnId)
|
|
.setTitleId(companyQnTitle.getId())
|
|
.setAnswererId(answererId);
|
|
UpdateWrapper<CompanyQnAnswer> up = new UpdateWrapper<CompanyQnAnswer>()
|
|
.eq("qn_id", qnId)
|
|
.eq("title_id", titleId)
|
|
.eq("answerer_id", answererId);
|
|
String answerOpt = null;
|
|
String answerCont = null;
|
|
JSONObject options = null;
|
|
if (Common.isContain(new int[]{CompanyQnTitle.CompanyQnTitleKindChoice, CompanyQnTitle.CompanyQnTitleKindPartnerChoice, CompanyQnTitle.CompanyQnTitleKindMultiChoice}, companyQnTitle.getKind())) {
|
|
try {
|
|
options = JSONObject.parseObject((String) companyQnTitle.getOptions());
|
|
} catch (Exception e) {
|
|
return Result.err("题目选项有误");
|
|
}
|
|
if (null == options) {
|
|
return Result.err("题目选项有误");
|
|
}
|
|
}
|
|
switch (companyQnTitle.getKind()) {
|
|
case 1: // 填空题
|
|
answerCont = params.getAnswerFill();
|
|
if (!StringUtils.isNotBlank(answerCont)) {
|
|
return Result.err("回答为空");
|
|
}
|
|
super.saveOrUpdate(companyQnAnswer.setAnswerOpt(answerCont), up);
|
|
break;
|
|
case 2: // 选择题
|
|
answerOpt = params.getAnswerChoice();
|
|
answerCont = (String) options.get(answerOpt);
|
|
if (null == answerOpt || null == answerCont) {
|
|
return Result.err("回答为空");
|
|
}
|
|
super.saveOrUpdate(companyQnAnswer.setAnswerOpt(answerOpt), up);
|
|
break;
|
|
case 3: // 互选题
|
|
HashMap<String, int[]> answerPartnerChoice = params.getAnswerPartnerChoice();
|
|
ArrayList<CompanyQnAnswer> list = new ArrayList<>();
|
|
for (String key : answerPartnerChoice.keySet()) {
|
|
answerOpt = key;
|
|
answerCont = (String) options.get(key);
|
|
if (null == answerOpt || null == answerCont) {
|
|
return Result.err("选项有误");
|
|
}
|
|
if (null == answerPartnerChoice.get(key) || !answerPartnerChoice.get(key).getClass().isArray()) {
|
|
return Result.err("选项有误");
|
|
}
|
|
int[] qnTowards = answerPartnerChoice.get(key);
|
|
super.remove(up);
|
|
for (int i : qnTowards) {
|
|
list.add(new CompanyQnAnswer()
|
|
.setQnId(qnId)
|
|
.setTitleId(companyQnTitle.getId())
|
|
.setAnswererId(answererId)
|
|
.setAnswerOpt(answerOpt)
|
|
.setQnTowardsId(i));
|
|
}
|
|
}
|
|
super.saveBatch(list);
|
|
break;
|
|
case 4: // 多选题
|
|
String[] answerOpts = params.getAnswerMultiChoice();
|
|
if(answerOpts==null||answerOpts.length <=0){
|
|
return Result.err("回答为空");
|
|
}
|
|
for (String opt : answerOpts) {
|
|
answerCont = (String) options.get(opt);
|
|
if (null == opt || null == answerCont) {
|
|
return Result.err("选项不符");
|
|
}
|
|
}
|
|
super.saveOrUpdate(companyQnAnswer.setAnswerOpt(String.join(",",answerOpts)), up);
|
|
break;
|
|
default:
|
|
return Result.err("未知题型");
|
|
}
|
|
return Result.success("");
|
|
}
|
|
|
|
// 结束答题
|
|
@Transactional
|
|
public Result end(int qnId, int answererId) {
|
|
int booleanInt = companyQnAnswererMapper.isFinished(qnId, answererId);
|
|
if (booleanInt == 0){
|
|
return Result.err("未完成全部问卷");
|
|
}
|
|
if (!companyQnAnswererService.update(new CompanyQnAnswerer(),
|
|
new UpdateWrapper<CompanyQnAnswerer>()
|
|
.eq("qn_id",qnId)
|
|
.eq("answerer_id",answererId)
|
|
.eq("status", CompanyQnAnswerer.CompanyQnAnswerStatusProgressing)
|
|
.set("status", CompanyQnAnswerer.CompanyQnAnswerStatusCompleted)
|
|
.set("finished_at", LocalDateTime.now())
|
|
)) {
|
|
return Result.err("提交失败");
|
|
}
|
|
return Result.success("");
|
|
}
|
|
|
|
//答题人互评详情
|
|
public Result partnerChoiceResult(IPage page,int qnId, boolean isManage) {
|
|
CompanyQn qn = companyQnService.getById(qnId);
|
|
if (null == qn) {
|
|
return Result.err("未知问卷");
|
|
}
|
|
QueryWrapper<CompanyQnAnswer> qw = new QueryWrapper<>();
|
|
qw.select("answerer_id").eq("qn_id", qnId).groupBy("answerer_id");
|
|
IPage iPage = super.page(page, qw);
|
|
List<CompanyQnAnswer> answererIds = iPage.getRecords();
|
|
Collection ids = new ArrayList<>();
|
|
if (answererIds.size() > 0) {
|
|
for (CompanyQnAnswer i : answererIds) {
|
|
ids.add(i.getAnswererId());
|
|
}
|
|
}
|
|
return Result.success(iPage.setRecords(ids.size()>0?answererResultData(qnId, isManage ? false : 1 == (qn.getIsSecret()),ids):new ArrayList<>()));
|
|
}
|
|
|
|
// 答题人结果导出Excel
|
|
public void resultExportExcel(HttpServletResponse response, int qnId, boolean isManage) {
|
|
CompanyQn qn = companyQnService.getById(qnId);
|
|
if (null == qn) {
|
|
return;
|
|
}
|
|
List<CompanyQnTitle> qnTitleList = companyQnTitleService.list(new QueryWrapper<CompanyQnTitle>()
|
|
.eq("qn_id", qnId));
|
|
Map<Integer, String> qnTitleMap = new LinkedHashMap<>();
|
|
for (CompanyQnTitle qnTitle : qnTitleList) {
|
|
qnTitleMap.put(qnTitle.getId(), qnTitle.getTitle());
|
|
}
|
|
LinkedHashMap<String, List<Map>> sheets = new LinkedHashMap<>();
|
|
|
|
// 问卷结果
|
|
List<Map> customResultList = new ArrayList<>();
|
|
List<Map> partnerChoiceResultList = new ArrayList<>();
|
|
List<CompanyQnController.AnswererResult> list = answererResultData(qnId,isManage ? false : (qn.getIsSecret() == 1), null);
|
|
for (CompanyQnController.AnswererResult answererResult : list) {
|
|
if (answererResult.getQnTowardsId() >0){
|
|
Map map = new LinkedHashMap();
|
|
map.put("SourceId", answererResult.getAnswererId());
|
|
map.put("SourceName", answererResult.getAnswererName());
|
|
map.put("TargetId", answererResult.getQnTowardsId());
|
|
map.put("TargetName", answererResult.getQnTowardsName());
|
|
for (CompanyQnController.AnswererTitleResult answererTitleResult : answererResult.getAnswerTitleResult()) {
|
|
String title = "题目编号" + answererTitleResult.getTitleId().toString();
|
|
if (null != qnTitleMap.get(answererTitleResult.getTitleId())) {
|
|
title = qnTitleMap.get(answererTitleResult.getTitleId());
|
|
}
|
|
map.put(title, answererTitleResult.getAnswerOpt());
|
|
}
|
|
partnerChoiceResultList.add(map);
|
|
}else{
|
|
Map map = new LinkedHashMap();
|
|
map.put("SourceId", answererResult.getAnswererId());
|
|
map.put("SourceName", answererResult.getAnswererName());
|
|
for (CompanyQnController.AnswererTitleResult answererTitleResult : answererResult.getAnswerTitleResult()) {
|
|
String title = "题目编号" + answererTitleResult.getTitleId().toString();
|
|
if (null != qnTitleMap.get(answererTitleResult.getTitleId())) {
|
|
title = qnTitleMap.get(answererTitleResult.getTitleId());
|
|
}
|
|
map.put(title, answererTitleResult.getAnswerOpt());
|
|
}
|
|
customResultList.add(map);
|
|
}
|
|
}
|
|
sheets.put("问卷结果", customResultList);
|
|
sheets.put("互选结果", partnerChoiceResultList);
|
|
if (isManage) {
|
|
// 问卷人员
|
|
List<CompanyQnAnswererMapper.MapperResultQnAnswererAll> answerers = companyQnAnswererMapper.qnAnswererList(new QueryWrapper<CompanyQnAnswerer>()
|
|
.eq("qn_id", qnId));
|
|
List<Map> answererList = new ArrayList<>();
|
|
for (CompanyQnAnswererMapper.MapperResultQnAnswererAll answerer : answerers) {
|
|
Map map = new LinkedHashMap();
|
|
map.put("name", answerer.getName());
|
|
map.put("tel", answerer.getTel());
|
|
map.put("mail", answerer.getMail());
|
|
// map.put("workAge", answerer.getWorkAge());
|
|
map.put("department", answerer.getDepartment());
|
|
map.put("startAt", answerer.getStartedAt());
|
|
map.put("finishAt", answerer.getFinishedAt());
|
|
answererList.add(map);
|
|
}
|
|
sheets.put("问卷人员", answererList);
|
|
}
|
|
XSSFWorkbook wb = ExcelExport.createExcel(sheets, null);
|
|
try {
|
|
String day = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd"));
|
|
String fileName = URLEncoder.encode(qn.getTitle(), "UTF8");
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;chartset=utf-8");
|
|
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + "-" + day + ".xlsx");
|
|
ServletOutputStream out = response.getOutputStream();
|
|
wb.write(out);
|
|
out.flush();
|
|
out.close();
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
//答题人答题数据
|
|
public List answererResultData(int qnId,boolean isSecret, Collection<Integer> answererIds) {
|
|
QueryWrapper<CompanyQnAnswer> qw = new QueryWrapper<>();
|
|
qw.eq("t1.qn_id", qnId);
|
|
if (null != answererIds && answererIds.size() > 0) {
|
|
qw.in("t1.answerer_id", answererIds);
|
|
}
|
|
List<CompanyQnAnswerMapper.MapperAnswererResult> list = companyQnAnswerMapper.answererResult(qw);
|
|
List<CompanyQnController.AnswererResult> result = new ArrayList();
|
|
HashMap<Integer, HashMap<Integer, List<CompanyQnController.AnswererTitleResult>>> t = new HashMap();
|
|
for (CompanyQnAnswerMapper.MapperAnswererResult i : list) {
|
|
int asId = i.getAnswererId();
|
|
int qnTowardsId = i.getQnTowardsId();
|
|
if (null == t.get(asId)) {
|
|
t.put(asId, new HashMap<Integer, List<CompanyQnController.AnswererTitleResult>>());
|
|
}
|
|
if (null == t.get(asId).get(qnTowardsId)) {
|
|
t.get(asId).put(qnTowardsId, new ArrayList<>());
|
|
CompanyQnController.AnswererResult r = new CompanyQnController.AnswererResult();
|
|
BeanUtils.copyProperties(i, r);
|
|
if (isSecret) {
|
|
r.setAnswererName(String.valueOf(asId));
|
|
r.setQnTowardsName(String.valueOf(qnTowardsId));
|
|
}
|
|
result.add(r);
|
|
}
|
|
t.get(asId).get(qnTowardsId).add(new CompanyQnController.AnswererTitleResult()
|
|
.setTitleId(i.getTitleId()).setAnswerOpt(i.getAnswerOpt()));
|
|
}
|
|
for (CompanyQnController.AnswererResult item : result) {
|
|
item.setAnswerTitleResult(t.get(item.getAnswererId()).get(item.getQnTowardsId()));
|
|
}
|
|
return result;
|
|
}
|
|
}
|