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

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;
}
}