/* * Copyright 2002-2006 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.openuap.cms.survey.action.poll; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.openuap.base.util.ControllerHelper; import org.openuap.cms.survey.model.Answer; import org.openuap.cms.survey.model.AnswerItem; import org.openuap.cms.survey.model.Question; import org.openuap.cms.survey.model.QuestionItem; import org.openuap.cms.survey.model.QuestionPage; import org.openuap.cms.survey.model.Survey; import org.openuap.cms.survey.model.SurveyAnswer; import org.openuap.cms.survey.model.SurveyRecord; import org.openuap.cms.survey.model.Voter; import org.openuap.cms.user.model.IUser; import org.springframework.util.StringUtils; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndViewDefiningException; /** * 简单投票向导控制器 * * <p> * $Id: SimplePollWizardAction.java 4017 2011-03-13 13:55:50Z orangeforjava $ * </p> * * @author Joseph * @version 4.0 */ public class SimplePollWizardAction extends PollWizardAction { protected String defaultScreensPath; protected String resultViewName; protected String pollViewName; /** 若需要有最后一步填写用户信息,则设置这个视图.*/ protected String endViewName; public static final String SESSION_AUTHORIZATION = "uap.authToken"; public static final String SESSION_VOTER = "uap.voter"; public SimplePollWizardAction() { initDefaultProperty(); } protected void initDefaultProperty() { initScreensPath(); // setCommandName("voter"); //单页面格式,在后面会重新设置其值 setPages(new String[] { pollViewName }); } protected void initScreensPath() { defaultScreensPath = "/plugin/cms/survey/screens/poll/"; resultViewName = defaultScreensPath + "poll_result.html"; pollViewName = defaultScreensPath + "poll.html"; endViewName=null; } public ModelAndView beforePerform(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper, Map model) throws Exception { ModelAndView mv = super.beforePerform(request, response, helper, model); if (mv != null) { return mv; } model.put("action", this); // 获得问卷id Long sid = helper.getLong("sid", 0L); if (sid == 0) { return this.errorPage(request, response, helper, "survey_not_exist", model); } Survey survey = getSurveyManager().getSurveyById(sid); if (survey == null) { return this.errorPage(request, response, helper, "survey_not_exist", model); } Long rid = helper.getLong("rid", 0L); if (rid == 0) { return this.errorPage(request, response, helper, "survey_record_not_exist", model); } SurveyRecord surveyRecord = getSurveyManager().getSurveyRecordById(rid); Integer type = surveyRecord.getType(); if (type.equals(Survey.MEMBER_TYPE)) { // 目前不需要会员登录,但是如果是会员已经登录,则判断是否已经提交问卷 if (!this.isLogin(request, response)) { return this.loginForm(request, response, helper); } } // 若已经填写调查问卷,则不能重复填写 if (!isPermitPoll(request, response)) { // return this.errorPage(request, response, helper, "isnot_permit_poll", model); } return null; } /** * 完成调查 * * @param request * * @param response * * @param command * * @param bindException * * @param helper * * @param model * * @return * @throws */ protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException bindException, ControllerHelper helper, Map model) throws Exception { HttpSession session = request.getSession(true); upateAnswer(request, session); // Object obj = session.getAttribute(SURVEY_ANSWER); String surveyId = request.getParameter("sid"); String recordId = request.getParameter("rid"); ModelAndView mv = new ModelAndView(resultViewName, model); // Long voterId = null; Voter voter = (Voter) command; // try { if (obj != null && surveyId != null) { Long sid = new Long(surveyId); Long rid = new Long(recordId); IUser user = getUser(); // if (user != null) { voter.setVoterCompany(""); voter.setVoterContact(user.getTitle()); voter.setVoterDepartment(""); voter.setVoterEmail(user.getEmail()); voter.setVoterFax(""); voter.setVoterIpaddress(helper.getRealIP()); voter.setVoterMobile(""); voter.setVoterName(user.getName()); voter.setVoterSurveyId(sid); voter.setSurveyRecordId(rid); voter.setVoterTel(""); voter.setVoterUserId(new Long(user.getUserId().intValue())); } SurveyAnswer surveyAnswer = (SurveyAnswer) obj; surveyAnswer.setVoter(voter); // voter.setVoterPollDate(new Long(System.currentTimeMillis())); voterId = this.getQuestionManager().addVoter(voter); // 保存答案 Map questionAnswers = surveyAnswer.getQuestionAnswers(); Set qkey = questionAnswers.keySet(); Iterator qiterator = qkey.iterator(); while (qiterator.hasNext()) { Long questionId = (Long) qiterator.next(); Answer voterAnswer = (Answer) questionAnswers .get(questionId); voterAnswer.setSurveyId(sid); voterAnswer.setVoterId(voterId); voterAnswer.setSurveyRecordId(rid); this.getQuestionManager().addAnswer(voterAnswer); // 更新选项选择次数 String answer = voterAnswer.getAnswer(); if (answer != null && !answer.equals("")) { // this.getSurveyManager().updateQuestionItems(rid,answer); } } // 保存答案选项值 Map questionAnswerItems = surveyAnswer.getQuestionItemAnswers(); Set qikey = questionAnswerItems.keySet(); Iterator qiIterator = qikey.iterator(); while (qiIterator.hasNext()) { Long itemId = (Long) qiIterator.next(); AnswerItem voterAnswerItem = (AnswerItem) questionAnswerItems .get(itemId); voterAnswerItem.setSurveyId(sid); voterAnswerItem.setVoterId(voterId); voterAnswerItem.setSurveyRecordId(rid); this.getQuestionManager().addAnswerItem(voterAnswerItem); } // 更新投票者状态 session.setAttribute(SESSION_VOTER, voter); session.removeAttribute(SURVEY_ANSWER); } model.put("rs", "success"); model.put("sid", surveyId); model.put("rid", recordId); } catch (Exception ex) { ex.printStackTrace(); model.put("rs", "failed"); model.put("msgs", ex); if (voterId != null) { this.getQuestionManager().deleteAnswerByVoter(voterId); this.getQuestionManager().deleteAnswerItemByVoter(voterId); // questionManager.updateQuestionItems2(); voter.setVoterId(voterId); this.getQuestionManager().deleteVoter(voter); } } model.put("sid", surveyId); return mv; } protected Object formBackingObject(HttpServletRequest request) throws ModelAndViewDefiningException { String sid = request.getParameter("sid"); String rid = request.getParameter("rid"); Voter voter = new Voter(); IUser user = getUser(); // System.out.println("member="+member); if (user != null) { voter.setVoterCompany(""); voter.setVoterContact(user.getTitle()); voter.setVoterDepartment(""); voter.setVoterEmail(user.getEmail()); voter.setVoterFax(""); voter.setVoterMobile(""); voter.setVoterName(user.getName()); voter.setVoterTel(""); voter.setVoterUserId(new Long(user.getUserId().intValue())); } else { voter.setVoterName("匿名"); voter.setVoterUserId(new Long(0)); } voter.setVoterSex(""); voter.setVoterProp1(""); voter.setVoterProp2(""); voter.setVoterProp3(""); voter.setVoterProp4(""); voter.setVoterProp5(""); voter.setVoterProp6(""); voter.setVoterProp7(""); voter.setVoterProp8(""); voter.setVoterProp9(""); voter.setVoterProp10(""); // voter.setSurveyRecordId(new Long(rid)); voter.setVoterIpaddress(request.getRemoteAddr()); if (sid != null) { voter.setVoterSurveyId(new Long(sid)); } Long id = new Long(sid); Survey survey = getSurveyManager().getSurveyById(id); List pages = getQuestionManager().getPages(id); int size = pages.size(); String[] views = new String[size+1]; for (int i = 0; i < size; i++) { views[i] = pollViewName; } //若最后一页需要填写用户信息 if(endViewName!=null){ views[views.length-1]=endViewName; } //重新设置页面信息 this.setPages(views); return voter; } /** * 数据校验 * * @param request * * @param command * * @param errors * * @param page * int */ protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors, int page) { //TODO 需要检验填写的用户信息 } protected Map referenceData(HttpServletRequest request, int page) { Map model = new HashMap(); String sid = request.getParameter("sid"); String rid = request.getParameter("rid"); if (sid != null && rid != null) { // Long surveyId = new Long(sid); Long surveyRecordId = new Long(rid); List pages = getQuestionManager().getPages(surveyId); Long pid = null; pid = new Long(page + 1); QuestionPage qp = getQuestionManager().getQuestionPage(surveyId, pid); Survey survey = getSurveyManager().getSurveyById(surveyId); SurveyRecord surveyRecord = getSurveyManager() .getSurveyRecordById(new Long(rid)); model.put("survey", survey); model.put("surveyRecord", surveyRecord); model.put("questionPage", qp); model.put("pageId", (page + 1)); // model.put("pages", pages); } model.put("sid", sid); model.put("rid", rid); return model; } /** * 校验页面 * * @param command * * @param errors * * @param page * int * @param helper * * @param model * Map */ protected void validatePage(Object command, Errors errors, int page, ControllerHelper helper, Map model) { String questionIds = helper.getString(QUESTION_IDS); if (questionIds != null) { String[] questionIdAry = questionIds.split(","); for (int i = 0; i < questionIdAry.length; i++) { String questionId = questionIdAry[i]; Long qid = new Long(questionId); Question q = this.getQuestionManager().getQuestionById(qid); // q.getQuestionInputFilter(); int type = q.getQuestionType().intValue(); if (type == 1 || type == 2 || type == 5 || type == 6) { String items[] = helper.getStrings(questionId); if (items == null) { // 选项必须填写 errors .reject("", q.getQuestionTitle() + ":" + "必须选择选项"); } else { for (int j = 0; j < items.length; j++) { String itemId = items[j]; Long iid = new Long(itemId); QuestionItem qi = this.getQuestionManager() .getQuestionItemById(iid); int itemType = qi.getQuestionItemType().intValue(); if (itemType == 1) { // 其他输入 String iinput = helper.getString(itemId + "_i_input"); if (!StringUtils.hasText(iinput)) { // 其他输入必须填写 errors.reject("", q.getQuestionTitle() + "-" + qi.getQuestionItemText() + ":" + "其他输入必须填写"); } } } } if (type == 5 || type == 6) { String desc = helper.getString(questionId + "_q_input"); if (!StringUtils.hasText(desc)) { // 题目备注必须填写 errors.reject("", q.getQuestionTitle() + ":" + "题目备注必须填写"); } } } else if (type == 3 || type == 4) { String desc = helper.getString(questionId + "_q_input"); if (!StringUtils.hasText(desc)) { // 题目必须填写 errors .reject("", q.getQuestionTitle() + ":" + "题目必须填写"); } } } } } /** * 处理每个页面的提交 * * @param request * * @param command * * @param errors * * @param page * int * @param helper * * @param model * Map * @throws Exception */ protected void postProcessPage(HttpServletRequest request, Object command, Errors errors, int page, ControllerHelper helper, Map model) throws Exception { HttpSession session = request.getSession(true); upateAnswer(request, session); // } /** * 显示登录界面 * * @param request * * @param response * * @param helper * * @return */ public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper) { helper.sendRedirect(helper.getBaseURL() + "user/login.jhtml?done=" + helper.encodeURL(helper.getFullURI())); return null; } /** * 判断用户是否登录 * * @param request * * @param response * * @return boolean */ public boolean isLogin(HttpServletRequest request, HttpServletResponse response) { try { return this.getUserSession().isLogin(); } catch (Exception ex) { return false; } } protected boolean isPermitPoll(HttpServletRequest request, HttpServletResponse response) { return true; } public void setDefaultScreensPath(String defaultScreensPath) { this.defaultScreensPath = defaultScreensPath; } public void setResultViewName(String resultViewName) { this.resultViewName = resultViewName; } public void setPollViewName(String pollViewName) { this.pollViewName = pollViewName; } public void setEndViewName(String endViewName) { this.endViewName = endViewName; } }