/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.plugin.vote.manager.service; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import com.ewcms.plugin.vote.manager.dao.PersonDAO; import com.ewcms.plugin.vote.manager.dao.QuestionnaireDAO; import com.ewcms.plugin.vote.model.Questionnaire; import com.ewcms.plugin.vote.model.Subject; import com.ewcms.plugin.vote.model.SubjectItem; /** * 问卷调查主体Service * * @author 吴智俊 */ @Service public class QuestionnaireService implements QuestionnaireServiceable { protected static final Logger logger = LoggerFactory.getLogger(QuestionnaireService.class); @Autowired private QuestionnaireDAO questionnaireDAO; @Autowired private PersonDAO personDAO; public void setQuestionnaireDAO(QuestionnaireDAO questionnaireDAO){ this.questionnaireDAO = questionnaireDAO; } public void setPersonDAO(PersonDAO personDAO){ this.personDAO = personDAO; } @Override public Long addQuestionnaire(Questionnaire questionnaire) { Integer channelId = questionnaire.getChannelId(); Assert.notNull(channelId); if (questionnaire.getStartTime() == null){ questionnaire.setStartTime(new Date(Calendar.getInstance().getTime().getTime())); } Long maxSort = questionnaireDAO.findQuestionnaireMaxSort(channelId); questionnaire.setSort(maxSort + 1); questionnaireDAO.persist(questionnaire); return questionnaire.getId(); } @Override public void delQuestionnaire(Long questionnaireId) { questionnaireDAO.removeByPK(questionnaireId); } @Override public Questionnaire findQuestionnaire(Long questionnaireId) { return questionnaireDAO.get(questionnaireId); } @Override public Long updQuestionnaire(Questionnaire questionnaire) { Long questionnaireId = questionnaire.getId(); Assert.notNull(questionnaireId); Questionnaire questionnaire_old = questionnaireDAO.get(questionnaireId); Assert.notNull(questionnaire_old); questionnaire.setSubjects(questionnaire_old.getSubjects()); questionnaireDAO.merge(questionnaire); return questionnaire.getId(); } @Override public StringBuffer getQuestionnaireViewToHtml(Long questionnaireId, String servletContentName){ try{ // if (!servletContentName.equals("")){ // servletContentName = servletContentName; // } StringBuffer view = new StringBuffer(); view.append("<link rel='stylesheet' type='text/css' href='" + servletContentName + "/ewcmssource/page/vote/vote.css'/>\n"); view.append("<script language='javascript' src='" + servletContentName + "/ewcmssource/page/vote/vote.js'></script>\n"); view.append("<div class='diaocha'>").append("<p class='bt01'></p>").append("<div class='dc_detail'>"); Questionnaire questionnaire = questionnaireDAO.get(questionnaireId); if (questionnaire == null) return view.append("<p class='dc_tit'>没有问卷调查</p>").append("</div>").append("</div>"); view.append("<p class='dc_tit'>" + questionnaire.getTitle() + "</p>\n"); if ((questionnaire.getVoteEnd()!= null && questionnaire.getVoteEnd()) || (questionnaire.getEndTime() != null && questionnaire.getEndTime().getTime() < Calendar.getInstance().getTime().getTime())){ view.append("<p class='dc_tit'>对不起,此调查已结束,不再接受投票</p>"); }else{ List<Subject> subjects = questionnaire.getSubjects(); if (subjects == null || subjects.isEmpty()) return new StringBuffer("<p>没有问卷调查</p>"); view.append("<div id='vote_" + questionnaireId + "' class='votecontainer' style='text-align:left'>\n"); view.append(" <form id='voteForm_" + questionnaireId + "' name='voteForm_" + questionnaireId + "' action='" + servletContentName + "/submit.vote' method='post' target='_self'>\n"); view.append(" <input type='hidden' id='questionnaireId' name='questionnaireId' value='" + questionnaireId + "'/>\n"); view.append(" <input type='hidden' id='voteEnd' name='voteEnd' value='" + questionnaire.getVoteEnd() + "'/>\n"); // view.append(" <dl>\n"); Boolean isItemEntity = false; Long row = 1L; for (Subject subject : subjects){ List<SubjectItem> subjectItems = subject.getSubjectItems(); if (subjectItems == null || subjectItems.isEmpty()) continue; isItemEntity = true; // view.append(" <dt id='" + subject.getId() + "'>" + row + "." + subject.getTitle() + "</dt>\n"); view.append(" <ul id='" + subject.getId() + "' style='list-style:none;'>" + row + "." + subject.getTitle() + "\n"); Subject.Status subjectStatus = subject.getStatus(); String subjectStatusValue = ""; switch(subjectStatus){ case RADIO : subjectStatusValue = "radio"; break; case OPTION : subjectStatusValue = "checkbox"; break; case INPUT : subjectStatusValue = "text"; break; } for (SubjectItem subjectItem : subjectItems){ SubjectItem.Status subjectItemStatus = subjectItem.getStatus(); // view.append(" <dd>\n"); view.append(" <li>\n"); if (!subjectStatusValue.equals("text")){ view.append(" <label><input name='Subject_" + subject.getId() + "' type='" + subjectStatusValue + "' value='" + subjectItem.getId() + "' id='Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "_Button'/>" + subjectItem.getTitle() + "</label>\n"); } switch(subjectItemStatus){ case CHOOSE : break; case SINGLETEXT : if (subjectStatusValue.equals("text")){ view.append(" <input id='Subject_" + subject.getId() + "' name='Subject_" + subject.getId() + "' type='text' value=''/></dd>\n"); }else{ view.append(" <input id='Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "' name='Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "' type='text' value='' onClick=\"clickInput('Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "');\"/></dd>\n"); } break; case MULTITEXT : if (subjectStatusValue.equals("text")){ view.append(" <textarea style='height:60px;width:400px;vertical-align:top;' id='Subject_" + subject.getId() + "' name='Subject_" + subject.getId() + "'/></textarea></dd>\n"); }else{ view.append(" <textarea style='height:60px;width:400px;vertical-align:top;' id='Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "' name='Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "' onClick=\"clickInput('Subject_" + subject.getId() + "_Item_" + subjectItem.getId() + "');\"/></textarea></dd>\n"); } break; } // view.append(" </dd>\n"); view.append(" </li>\n"); } row++; view.append(" </ul>\n"); } if (!isItemEntity) return new StringBuffer("<p>没有问卷调查</p>"); // view.append(" </dl>\n"); if (questionnaire.getVerifiCode()){ view.append(" <ul style='list-style:none;'>"); view.append(" <li>"); // view.append(" <dl>\n"); // view.append(" <dd>\n"); view.append(" <img id='id_checkcode' align='absmiddle' width='120px' src='" + servletContentName + "/checkcode.jpg' alt='点击刷新验证码' title='看不清,换一张' onclick='codeRefresh(this,\"" + servletContentName + "/checkcode.jpg\");' style='cursor:pointer;'/>\n"); view.append(" <input type='text' name='j_checkcode' class='checkcode' size='10' maxlength='4' title='验证码不区分大小写'/>"); // view.append(" </dd>\n"); // view.append(" </dl>\n"); view.append(" </li>"); view.append(" </ul>"); } view.append(" <dl>\n"); view.append(" <dd>\n"); view.append(" <input type='submit' value='提交' onclick='return checkVote(" + questionnaireId + ");'> "); if (questionnaire.getStatus() != Questionnaire.Status.NOVIEW){ view.append(" <input type='button' value='查看' onclick='javascript:window.open(\"" + servletContentName + "/result.vote?id=" + questionnaireId + "\",\"_blank\")'>\n"); } view.append(" </dd>\n"); view.append(" </dl>\n"); view.append(" </form>\n"); view.append("</div>\n"); } view.append("</div>").append("</div>"); return view; }catch(Exception e){ return new StringBuffer("<p>没有问卷调查</p>"); } } @Override public StringBuffer getQuestionnaireResultClientToHtml(Long questionnaireId, String servletContentName, String ipAddr){ return getQuestionnaireResultToHtml(questionnaireId, servletContentName, ipAddr, true); } @Override public StringBuffer getQuestionnaireResultToHtml(Long questionnaireId, String servletContentName, String ipAddr, Boolean isView){ try{ // if (!servletContentName.equals("")){ // servletContentName = "/" + servletContentName; // } Questionnaire questionnaire = questionnaireDAO.get(questionnaireId); if (questionnaire == null) return new StringBuffer("<p>没有问卷调查结果</p>"); if (isView){ if (questionnaire.getStatus() == Questionnaire.Status.NOVIEW) return new StringBuffer("<p>不允许查看 " + questionnaire.getTitle() + " 结果</p>"); if (questionnaire.getStatus() == Questionnaire.Status.VOTEVIEW){ Boolean isEntity = personDAO.findPersonIsEntity(questionnaireId, ipAddr); if (!isEntity) return new StringBuffer("<p>只有对 " + questionnaire.getTitle() + " 进行投票后才能查看结果 <a href='javascript:history.go(-1);'>返回<a></p>"); } } StringBuffer result = new StringBuffer(); result.append("<div id='voteresult' style='height:100%;overflow-y:auto;text-align:left;'>\n"); result.append("<link rel='stylesheet' type='text/css' href='" + servletContentName + "/ewcmssource/page/vote/voteresult.css'/>\n"); result.append(" <div style='padding:10px;overflow:hidden;_overflow:visible;_height:1%;'>\n"); result.append(" <h2 style='float:left;'>" + questionnaire.getTitle() + ":调查结果</h2>\n"); //result.append(" <h2 style='float:right;'>投票人数:" + questionnaire.getNumber() + "</h2>\n"); result.append(" </div>\n"); List<Subject> subjects = questionnaire.getSubjects(); if (subjects == null || subjects.isEmpty()) return new StringBuffer("<p>没有问卷调查结果</p>"); Boolean isItemEntity = false; Long subjectSort = 1L; for (Subject subject : subjects){ if (subject.getStatus() == Subject.Status.INPUT) continue; List<SubjectItem> subjectItems = subject.getSubjectItems(); if (subjectItems == null || subjectItems.isEmpty()) continue; isItemEntity = true; result.append(" <div class='voteresultb'>\n"); result.append(" <h3>" + subjectSort + "." + subject.getTitle() + "[" + subject.getStatusDescription() + "]</h3>\n"); result.append(" <table name ='ChartTable'>\n"); result.append(" <tbody>\n"); result.append(" <tr class='row0'>\n"); result.append(" <th width='552' class='col1' scope='col'>选项</th>\n"); result.append(" <th width='264' class='col2' scope='col'>比例</th>\n"); result.append(" </tr>\n"); Long subjectItemSort = 1L; Long sum = CalculateSum(subject); for (SubjectItem subjectItem : subjectItems){ String percentage = "0%"; if (sum > 0){ double value = (double)subjectItem.getVoteNumber()/sum; DecimalFormat df = new DecimalFormat("##.00"); String dfValue = df.format(value); value = Double.parseDouble(dfValue); NumberFormat nf = NumberFormat.getPercentInstance(); percentage = nf.format(value); } result.append(" <tr class='row1'>\n"); result.append(" <td class='col1'><span>" + subjectItemSort + "</span><p>" + subjectItem.getTitle() + "</p></td>\n"); result.append(" <td class='col2'><div style='width:190px; line-height:33px;position:relative;'>" + subjectItem.getVoteNumber() + "票 比例:" + percentage + "<span class='percent_bg'><span class='percent' style='width:" + percentage + "'/></span></span></div>\n"); result.append(" </tr>\n"); subjectItemSort++; } result.append(" </tbody>\n"); result.append(" </table>\n"); result.append(" </div>\n"); subjectSort++; } if (!isItemEntity) return new StringBuffer("<p>没有问卷调查结果</p>"); return result; }catch(Exception e){ return new StringBuffer("<p>没有问卷调查结果</p>"); } } private Long CalculateSum(Subject subject){ if (subject == null) return 0L; List<SubjectItem> subjectItems = subject.getSubjectItems(); Long sum = 0L; for (SubjectItem subjectItem : subjectItems){ sum += subjectItem.getVoteNumber(); } return sum; } }