package com.doumee.service.business.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.Constants.UserType; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.DeclareAnswerJoinMapper; import com.doumee.dao.business.DeclareAnswerMapper; import com.doumee.dao.business.QuestionnaireMapper; import com.doumee.dao.business.QuestionnaireProblemMapper; import com.doumee.dao.business.model.DeclareAnswer; import com.doumee.dao.business.model.Declares; import com.doumee.dao.business.model.Questionnaire; import com.doumee.dao.business.model.QuestionnaireProblem; import com.doumee.service.business.DeclareAnswerService; 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.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.gson.JsonObject; import java.math.BigDecimal; import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /** * 项目申报问卷答题记录Service实现 * @author 江蹄蹄 * @date 2023/02/15 08:55 */ @Service public class DeclareAnswerServiceImpl implements DeclareAnswerService { @Autowired private DeclareAnswerMapper declareAnswerMapper; @Autowired private DeclareAnswerJoinMapper declareAnswerJoinMapper; @Autowired private QuestionnaireMapper questionnaireMapper; @Autowired private QuestionnaireProblemMapper questionnaireProblemMapper; @Value("${debug_model}") private Boolean isdebug; @Override public Integer create(DeclareAnswer declareAnswer) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); //只有企业用户有答题场景 if(!isdebug && Constants.formatIntegerNum(user.getType()) != UserType.COMPANY.getKey()){ throw new BusinessException(ResponseStatus.NOT_ALLOWED); } if(StringUtils.isBlank(declareAnswer.getContent()) || declareAnswer.getQuestionnaireId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } //查询问卷对象 Questionnaire model = questionnaireMapper.selectById(declareAnswer.getQuestionnaireId()); if(model ==null || Constants.formatIntegerNum(model.getIsdeleted()) != Constants.ZERO){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } //获取全部题目记录 List proList = getProblemList(model.getId()); if(proList ==null || proList.size() == 0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该问卷信息有误,请联系系统管理员处理!"); } declareAnswer.setScore(new BigDecimal(0)); JSONArray answer = new JSONArray(); try { //[{"select":"","opt":[],"score":0.2},{""},...] JSONArray content = JSONObject.parseArray(declareAnswer.getContent()); int aNum = 0; int no =0; for(QuestionnaireProblem p : proList){ JSONArray array = JSONObject.parseArray(p.getOpt()); if(array==null || array.size() == 0){ continue; } //根据no查询答案 JSONObject ta = getAnswerByNo(content,no); if(ta == null || StringUtils.isBlank(ta.getString("select"))){ ta = new JSONObject(); ta.put("no",no); ta.put("score",0); ta.put("type",p.getType()); ta.put("title",p.getTitle()); ta.put("select",""); ta.put("opt",array); }else{ aNum ++;//有答题 ta.put("title",p.getTitle()); ta.put("type",p.getType()); ta.put("opt",array); String type = p.getType(); String[] ss = ta.getString("select").split(","); if(StringUtils.equals(type,Constants.ZERO+"") && ss.length>1){ //如果是单选 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(no+1)+"】题为单选!"); } BigDecimal ts = new BigDecimal(0); for (int j = 0; j < ss.length; j++) { //选项 Integer is = Integer.parseInt(ss[j]); if(is < array.size()){ JSONObject prolbem = array.getJSONObject(is); BigDecimal score = prolbem.getBigDecimal("score"); if(score!=null){ ts= ts.add(score); } } } ta.put("score",ts); declareAnswer.setScore(declareAnswer.getScore().add(ts)); } answer.add(ta); no++; } if(aNum ==0){ //一题未答! throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请至少完成一项题目的答题!"); } }catch (BusinessException e){ throw e; }catch (Exception e){ throw new BusinessException(ResponseStatus.DATA_ERRO); } declareAnswer.setCompanyId(user.getCompanyId()); declareAnswer.setIsdeleted(Constants.ZERO); declareAnswer.setCreateDate(DateUtil.getCurrentDate()); declareAnswer.setCreator(user.getId()); declareAnswer.setContent(JSONObject.toJSONString(answer)); declareAnswer.setQuestionnaireId(model.getId()); declareAnswerMapper.insert(declareAnswer); return declareAnswer.getId(); } private JSONObject getAnswerByNo(JSONArray content, int no) { if(content==null || content.size() == 0){ return null; } for (int i = 0; i < content.size(); i++) { JSONObject t = content.getJSONObject(i); if(t!=null && StringUtils.equals(no+"",t.getString("no"))){ return t; } } return null; } private List getProblemList(Integer id) { QuestionnaireProblem p = new QuestionnaireProblem(); p.setIsdeleted(Constants.ZERO); p.setQuestionnaireId(id); return questionnaireProblemMapper.selectList(new QueryWrapper<>(p)); } @Override public void deleteById(Integer id) { declareAnswerMapper.deleteById(id); } @Override public void delete(DeclareAnswer declareAnswer) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(declareAnswer); declareAnswerMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } declareAnswerMapper.deleteBatchIds(ids); } @Override public void updateById(DeclareAnswer declareAnswer) { declareAnswerMapper.updateById(declareAnswer); } @Override public void updateByIdInBatch(List declareAnswers) { if (CollectionUtils.isEmpty(declareAnswers)) { return; } for (DeclareAnswer declareAnswer: declareAnswers) { this.updateById(declareAnswer); } } @Override public DeclareAnswer findById(Integer id) { return declareAnswerMapper.selectById(id); } @Override public DeclareAnswer findJoinById(Integer id) { MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(DeclareAnswer.class); wrapper.leftJoin(Questionnaire.class,Questionnaire::getId,DeclareAnswer::getQuestionnaireId); wrapper.selectAs(Questionnaire::getTitle,DeclareAnswer::getTitle); wrapper.eq(DeclareAnswer::getId,id); DeclareAnswer model = declareAnswerJoinMapper.selectJoinOne(DeclareAnswer.class,wrapper.last("limit 1")); return model; } @Override public DeclareAnswer findOne(DeclareAnswer declareAnswer) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(DeclareAnswer::getId,declareAnswer.getId()) .eq(DeclareAnswer::getIsdeleted,Constants.ZERO); return declareAnswerMapper.selectOne(wrapper); } @Override public List findList(DeclareAnswer declareAnswer) { QueryWrapper wrapper = new QueryWrapper<>(declareAnswer); return declareAnswerMapper.selectList(wrapper); } @Override public List findExport( DeclareAnswer model) { DeclareAnswer pageWrap = findJoinById(model.getId()); if(pageWrap == null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,答题记录不存在,请返回刷新重试!"); } List list = new ArrayList<>(); try { //答题记录 JSONArray opts = JSONArray.parseArray(pageWrap.getContent()); if(opts != null){ for (int i = 0; i < opts.size(); i++) { DeclareAnswer a = new DeclareAnswer(); JSONObject json = opts.getJSONObject(i); a.setScore(json.getBigDecimal("score")); a.setTitle(json.getString("title")); a.setId(json.getInteger("no")); Integer select =null; try { select= Integer.parseInt(json.getString("select")); }catch (Exception e){ } JSONArray ss = json.getJSONArray("opt"); String content = ""; try { for (int j = 0; j < ss.size() ; j++) { if(StringUtils.isNotBlank(content)){ content+="\n"; } content+= ss.getJSONObject(j).getString("opt"); if(select != null && select.intValue() < ss.size() && select.intValue() ==j){ //答题结果 a.setContent( ss.getJSONObject(j).getString("opt")); } } }catch (Exception e){ a.setContent(""); } a.setRemark(content); a.setType(StringUtils.equals(json.getString("type"),Constants.ONE+"")?"多选":"单选"); list.add(a); } } }catch (Exception e){ } model.setTitle(pageWrap.getTitle()); model.setScore(pageWrap.getScore()); return list; } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); if (pageWrap.getModel().getId() != null) { queryWrapper.lambda().eq(DeclareAnswer::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getCreator() != null) { queryWrapper.lambda().eq(DeclareAnswer::getCreator, pageWrap.getModel().getCreator()); } if (pageWrap.getModel().getCreateDate() != null) { queryWrapper.lambda().ge(DeclareAnswer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); queryWrapper.lambda().le(DeclareAnswer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); } if (pageWrap.getModel().getEditor() != null) { queryWrapper.lambda().eq(DeclareAnswer::getEditor, pageWrap.getModel().getEditor()); } if (pageWrap.getModel().getEditDate() != null) { queryWrapper.lambda().ge(DeclareAnswer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); queryWrapper.lambda().le(DeclareAnswer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); } if (pageWrap.getModel().getIsdeleted() != null) { queryWrapper.lambda().eq(DeclareAnswer::getIsdeleted, pageWrap.getModel().getIsdeleted()); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.lambda().eq(DeclareAnswer::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getCompanyId() != null) { queryWrapper.lambda().eq(DeclareAnswer::getCompanyId, pageWrap.getModel().getCompanyId()); } if (pageWrap.getModel().getProjectId() != null) { queryWrapper.lambda().eq(DeclareAnswer::getProjectId, pageWrap.getModel().getProjectId()); } if (pageWrap.getModel().getQuestionnaireId() != null) { queryWrapper.lambda().eq(DeclareAnswer::getQuestionnaireId, pageWrap.getModel().getQuestionnaireId()); } if (pageWrap.getModel().getDeclareId() != null) { queryWrapper.lambda().eq(DeclareAnswer::getDeclareId, pageWrap.getModel().getDeclareId()); } if (pageWrap.getModel().getScore() != null) { queryWrapper.lambda().eq(DeclareAnswer::getScore, pageWrap.getModel().getScore()); } if (pageWrap.getModel().getContent() != null) { queryWrapper.lambda().eq(DeclareAnswer::getContent, pageWrap.getModel().getContent()); } for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(declareAnswerMapper.selectPage(page, queryWrapper)); } @Override public long count(DeclareAnswer declareAnswer) { QueryWrapper wrapper = new QueryWrapper<>(declareAnswer); return declareAnswerMapper.selectCount(wrapper); } }