SurveyAnswerDaoImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package net.diaowen.dwsurvey.dao.impl;
  2. import net.diaowen.common.dao.BaseDaoImpl;
  3. import net.diaowen.dwsurvey.dao.SurveyAnswerDao;
  4. import net.diaowen.dwsurvey.entity.*;
  5. import net.diaowen.dwsurvey.service.SurveyStatsManager;
  6. import org.hibernate.Criteria;
  7. import org.hibernate.Session;
  8. import org.hibernate.criterion.Criterion;
  9. import org.hibernate.criterion.Restrictions;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Repository;
  12. import java.util.Date;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 问卷回答 dao
  17. * @author keyuan(keyuan258@gmail.com)
  18. *
  19. * https://github.com/wkeyuan/DWSurvey
  20. * http://dwsurvey.net
  21. */
  22. @Repository
  23. public class SurveyAnswerDaoImpl extends BaseDaoImpl<SurveyAnswer, String> implements SurveyAnswerDao {
  24. @Override
  25. public void saveAnswer(SurveyAnswer surveyAnswer,
  26. Map<String, Map<String, Object>> quMaps) {
  27. Date curDate=new Date();
  28. Session session=this.getSession();
  29. //保存答案信息
  30. String surveyId=surveyAnswer.getSurveyId();
  31. SurveyDirectory survey=(SurveyDirectory) session.get(SurveyDirectory.class, surveyId);
  32. // Integer answerNum = survey.getAnswerNum();
  33. // if(answerNum==null){
  34. // answerNum=0;
  35. // }
  36. // survey.setAnswerNum(answerNum+1);
  37. // session.update(survey);//更新回答数
  38. int surveyQuAnItemNum=survey.getAnItemLeastNum();//可以回答的最少项目数
  39. // surveyAnswer.setBgAnDate(curDate);
  40. surveyAnswer.setEndAnDate(new Date());
  41. Date endAnDate = surveyAnswer.getEndAnDate();
  42. Date bgAnDate = surveyAnswer.getBgAnDate();
  43. surveyAnswer.setTotalTime(0f);
  44. if(endAnDate!=null && bgAnDate!=null){
  45. //计算答卷用时
  46. long time=endAnDate.getTime()-bgAnDate.getTime();
  47. surveyAnswer.setTotalTime(Float.parseFloat(time/1000+""));
  48. }
  49. session.save(surveyAnswer);
  50. int anCount=0;
  51. //保存答案
  52. //是非题
  53. Map<String,Object> yesnoMaps=quMaps.get("yesnoMaps");
  54. anCount+=saveAnYesnoMaps(surveyAnswer, yesnoMaps,session);
  55. //单选题
  56. Map<String,Object> radioMaps=quMaps.get("radioMaps");
  57. anCount+=saveCompAnRadioMaps(surveyAnswer, radioMaps,session);
  58. //多选题
  59. Map<String,Object> checkboxMaps=quMaps.get("checkboxMaps");
  60. anCount+=saveCompAnCheckboxMaps(surveyAnswer,checkboxMaps,session);
  61. //填空题
  62. Map<String,Object> fillblankMaps=quMaps.get("fillblankMaps");
  63. anCount+=saveAnFillMaps(surveyAnswer, fillblankMaps,session);
  64. //多项填空题
  65. Map<String,Object> multifillblankMaps=quMaps.get("multifillblankMaps");
  66. anCount+=saveAnMultiFillMaps(surveyAnswer, multifillblankMaps,session);
  67. //问答题
  68. Map<String,Object> answerMaps=quMaps.get("answerMaps");
  69. anCount+=saveAnAnswerMaps(surveyAnswer, answerMaps,session);
  70. //复合单选题
  71. Map<String,Object> compRadioMaps=quMaps.get("compRadioMaps");
  72. anCount+=saveCompAnRadioMaps(surveyAnswer, compRadioMaps,session);
  73. //复合多选题
  74. Map<String,Object> compCheckboxMaps=quMaps.get("compCheckboxMaps");
  75. anCount+=saveCompAnCheckboxMaps(surveyAnswer, compCheckboxMaps,session);
  76. //枚举题
  77. Map<String, Object> enumMaps=quMaps.get("enumMaps");
  78. anCount+=saveEnumMaps(surveyAnswer, enumMaps, session);
  79. //评分题
  80. Map<String,Object> scoreMaps=quMaps.get("scoreMaps");
  81. anCount+=saveScoreMaps(surveyAnswer,scoreMaps,session);
  82. //排序题 quOrderMaps
  83. Map<String,Object> quOrderMaps=quMaps.get("quOrderMaps");
  84. anCount+=saveQuOrderMaps(surveyAnswer,quOrderMaps,session);
  85. //保存anCount
  86. surveyAnswer.setCompleteItemNum(anCount);
  87. int isComplete=0;
  88. if(anCount>=surveyQuAnItemNum){
  89. isComplete=1;//表示回完
  90. }
  91. surveyAnswer.setIsComplete(isComplete);
  92. int isEffective=0;
  93. if(anCount>0){
  94. isEffective=1;//暂时只要答过一题就表示回答有效
  95. }
  96. surveyAnswer.setIsEffective(isEffective);
  97. session.save(surveyAnswer);
  98. }
  99. private int saveQuOrderMaps(SurveyAnswer surveyAnswer,
  100. Map<String, Object> quOrderMaps, Session session) {
  101. String surveyId=surveyAnswer.getSurveyId();
  102. String surveyAnswerId=surveyAnswer.getId();
  103. int answerQuCount=0;
  104. if(quOrderMaps!=null){
  105. for (String key : quOrderMaps.keySet()) {
  106. String quId=key;
  107. boolean isAn = false;
  108. Map<String,Object> mapRows=(Map<String, Object>) quOrderMaps.get(key);
  109. for (String keyRow : mapRows.keySet()) {
  110. String rowId=keyRow;
  111. String orderNumValue=mapRows.get(keyRow).toString();
  112. if(orderNumValue!=null && !"".equals(orderNumValue)){
  113. AnOrder anScore=new AnOrder(surveyId,surveyAnswerId,quId,rowId,orderNumValue);
  114. session.save(anScore);
  115. isAn = true;
  116. }
  117. }
  118. if (isAn) answerQuCount++;
  119. }
  120. }
  121. return answerQuCount;
  122. }
  123. /**
  124. * 保存评分题
  125. * @param surveyAnswer
  126. * @param scoreMaps
  127. * @param session
  128. */
  129. private int saveScoreMaps(SurveyAnswer surveyAnswer,
  130. Map<String, Object> scoreMaps, Session session) {
  131. String surveyId=surveyAnswer.getSurveyId();
  132. String surveyAnswerId=surveyAnswer.getId();
  133. int answerQuCount=0;
  134. if(scoreMaps!=null){
  135. for (String key : scoreMaps.keySet()) {
  136. String quId=key;
  137. Map<String,Object> mapRows=(Map<String, Object>) scoreMaps.get(key);
  138. boolean isAn = false;
  139. for (String keyRow : mapRows.keySet()) {
  140. String rowId=keyRow;
  141. String scoreValue=mapRows.get(keyRow).toString();
  142. if(scoreValue!=null && !"".equals(scoreValue)){
  143. AnScore anScore=new AnScore(surveyId,surveyAnswerId,quId,rowId,scoreValue);
  144. session.save(anScore);
  145. isAn = true;
  146. }
  147. }
  148. if(isAn) answerQuCount++;
  149. }
  150. }
  151. return answerQuCount;
  152. }
  153. /**
  154. * 保存枚举题
  155. * @param surveyAnswer
  156. * @param enumMaps
  157. * @param session
  158. */
  159. private int saveEnumMaps(SurveyAnswer surveyAnswer,
  160. Map<String, Object> enumMaps, Session session) {
  161. String surveyId=surveyAnswer.getSurveyId();
  162. String surveyAnswerId=surveyAnswer.getId();
  163. int answerQuCount=0;
  164. for (String key : enumMaps.keySet()) {
  165. answerQuCount++;
  166. String[] splitKey=key.split("_");
  167. String quId=splitKey[0];
  168. Integer quItemNum=Integer.parseInt(splitKey[1]);
  169. String answerValue=enumMaps.get(key).toString();
  170. AnEnumqu anAnswer=new AnEnumqu(surveyId,surveyAnswerId,quId,quItemNum,answerValue);
  171. session.save(anAnswer);
  172. }
  173. return answerQuCount;
  174. }
  175. /**
  176. * 保存判断题答案
  177. * @param anAnswerMaps
  178. * @param session
  179. */
  180. private int saveAnAnswerMaps(SurveyAnswer surveyAnswer,
  181. Map<String, Object> anAnswerMaps,Session session) {
  182. String surveyId=surveyAnswer.getSurveyId();
  183. String surveyAnswerId=surveyAnswer.getId();
  184. int answerQuCount=0;
  185. for (String key : anAnswerMaps.keySet()) {
  186. String quId=key;
  187. String answerValue=anAnswerMaps.get(key).toString();
  188. if(answerValue!=null && !"".equals(answerValue)){
  189. AnAnswer anAnswer=new AnAnswer(surveyId,surveyAnswerId,quId,answerValue);
  190. session.save(anAnswer);
  191. answerQuCount++;
  192. }
  193. }
  194. return answerQuCount;
  195. }
  196. /**
  197. * 保存单项填空题答案
  198. * @param fillMaps
  199. * @param session
  200. */
  201. private int saveAnFillMaps(SurveyAnswer surveyAnswer,
  202. Map<String, Object> fillMaps,Session session) {
  203. String surveyId=surveyAnswer.getSurveyId();
  204. String surveyAnswerId=surveyAnswer.getId();
  205. int answerQuCount=0;
  206. for (String key : fillMaps.keySet()) {
  207. String quId=key;
  208. String answerValue=fillMaps.get(key).toString();
  209. if(answerValue!=null && !"".equals(answerValue)){
  210. AnFillblank anFillblank=new AnFillblank(surveyId,surveyAnswerId,quId,answerValue);
  211. session.save(anFillblank);
  212. answerQuCount++;
  213. }
  214. }
  215. return answerQuCount;
  216. }
  217. /**
  218. * 保存多选题答案
  219. * @param checkboxMaps
  220. * @param session
  221. */
  222. private int saveAnCheckboxMaps(SurveyAnswer surveyAnswer,
  223. Map<String, Object> checkboxMaps,Session session) {
  224. String surveyId=surveyAnswer.getSurveyId();
  225. String surveyAnswerId=surveyAnswer.getId();
  226. int answerQuCount=0;
  227. if (checkboxMaps!=null)
  228. for (String key : checkboxMaps.keySet()) {
  229. String quId=key;
  230. Map<String, Object> map=(Map<String, Object>) checkboxMaps.get(key);
  231. for (String keyMap : map.keySet()) {
  232. answerQuCount++;
  233. String quItemId=map.get(keyMap).toString();
  234. AnCheckbox anCheckbox=new AnCheckbox(surveyId,surveyAnswerId,quId,quItemId);
  235. session.save(anCheckbox);
  236. }
  237. }
  238. return answerQuCount;
  239. }
  240. /**
  241. * 保存复合多选题答案
  242. * @param session
  243. */
  244. private int saveCompAnCheckboxMaps(SurveyAnswer surveyAnswer,
  245. Map<String, Object> compCheckboxMaps, Session session) {
  246. String surveyId=surveyAnswer.getSurveyId();
  247. String surveyAnswerId=surveyAnswer.getId();
  248. int answerQuCount=0;
  249. if(compCheckboxMaps!=null){
  250. for (String key : compCheckboxMaps.keySet()) {
  251. String quId=key;
  252. boolean isAn = false;
  253. Map<String, Object> map=(Map<String, Object>) compCheckboxMaps.get(key);
  254. for (String keyMap : map.keySet()) {
  255. // String quItemId=map.get(keyMap).toString();
  256. AnCheckbox tempAnCheckbox=(AnCheckbox) map.get(keyMap);
  257. String quItemId=tempAnCheckbox.getQuItemId();
  258. String otherText=tempAnCheckbox.getOtherText();
  259. if(quItemId!=null){
  260. AnCheckbox anCheckbox=new AnCheckbox(surveyId,surveyAnswerId,quId,quItemId);
  261. anCheckbox.setOtherText(otherText);
  262. session.save(anCheckbox);
  263. isAn = true;
  264. }
  265. }
  266. if(isAn) answerQuCount++;
  267. }
  268. }
  269. return answerQuCount;
  270. }
  271. /**
  272. * 保存多项填空题答案
  273. * @param dfillMaps
  274. * @param session
  275. */
  276. private int saveAnMultiFillMaps(SurveyAnswer surveyAnswer,
  277. Map<String, Object> dfillMaps,Session session) {
  278. String surveyId=surveyAnswer.getSurveyId();
  279. String surveyAnswerId=surveyAnswer.getId();
  280. int answerQuCount=0;
  281. for (String key : dfillMaps.keySet()) {
  282. String quId=key;
  283. boolean isAn = false;
  284. Map<String, Object> map=(Map<String, Object>) dfillMaps.get(key);
  285. if(map!=null && map.size()>0){
  286. for (String keyMap : map.keySet()) {
  287. //answerValue+=keyMap+Question.splitTag1+map.get(keyMap)+Question.splitTag;
  288. String quItemId=keyMap;
  289. String answerValue=map.get(keyMap).toString();
  290. if(answerValue!=null && !"".equals(answerValue)){
  291. AnDFillblank anDFillblank=new AnDFillblank(surveyId,surveyAnswerId,quId,quItemId,answerValue);
  292. session.save(anDFillblank);
  293. isAn = true;
  294. }
  295. }
  296. }
  297. if(isAn) answerQuCount++;
  298. }
  299. return answerQuCount;
  300. }
  301. /**
  302. * 保存单选题答案
  303. * @param radioMaps
  304. * @param session
  305. */
  306. private int saveAnRadioMaps(SurveyAnswer surveyAnswer,
  307. Map<String, Object> radioMaps,Session session) {
  308. String surveyId=surveyAnswer.getSurveyId();
  309. String surveyAnswerId=surveyAnswer.getId();
  310. int answerQuCount=0;
  311. if (radioMaps!=null)
  312. for (String key : radioMaps.keySet()) {
  313. answerQuCount++;
  314. String quId=key;
  315. String quItemId=radioMaps.get(key).toString();
  316. AnRadio anRadio=new AnRadio(surveyId,surveyAnswerId,quId,quItemId);
  317. session.save(anRadio);
  318. }
  319. return answerQuCount;
  320. }
  321. /**
  322. * 复合单选题
  323. * @param surveyAnswer
  324. * @param compRadioMaps
  325. * @param session
  326. */
  327. private int saveCompAnRadioMaps(SurveyAnswer surveyAnswer,
  328. Map<String, Object> compRadioMaps, Session session) {
  329. String surveyId=surveyAnswer.getSurveyId();
  330. String surveyAnswerId=surveyAnswer.getId();
  331. int answerQuCount=0;
  332. if(compRadioMaps!=null){
  333. for (String key : compRadioMaps.keySet()) {
  334. answerQuCount++;
  335. String quId=key;
  336. //String quItemId=compRadioMaps.get(key).toString();
  337. AnRadio tempAnRadio=(AnRadio) compRadioMaps.get(key);
  338. String quItemId=tempAnRadio.getQuItemId();
  339. String othertext=tempAnRadio.getOtherText();
  340. AnRadio anRadio=new AnRadio(surveyId,surveyAnswerId,quId,quItemId);
  341. anRadio.setOtherText(othertext);
  342. session.save(anRadio);
  343. }
  344. }
  345. return answerQuCount;
  346. }
  347. /**
  348. * 保存是非题答案
  349. * @param yesnoMaps
  350. * @param session
  351. */
  352. public int saveAnYesnoMaps(SurveyAnswer surveyAnswer,Map<String,Object> yesnoMaps,Session session){
  353. String surveyId=surveyAnswer.getSurveyId();
  354. String surveyAnswerId=surveyAnswer.getId();
  355. int answerQuCount=0;
  356. for (String key : yesnoMaps.keySet()) {
  357. answerQuCount++;
  358. String quId=key;
  359. String yesnoAnswer=yesnoMaps.get(key).toString();
  360. AnYesno anYesno=new AnYesno(surveyId,surveyAnswerId,quId,yesnoAnswer);
  361. session.save(anYesno);
  362. }
  363. return answerQuCount;
  364. }
  365. public SurveyStats surveyStatsData(SurveyStats surveyStats){
  366. try{
  367. StringBuffer sqlBuf=new StringBuffer("select MIN(bg_an_date) firstDate,MAX(bg_an_date) lastDate,count(id) anCount,min(total_time) minTime,avg(total_time) avgTime, ");
  368. sqlBuf.append("count(case when is_complete =1 then is_complete end) complete1, ");
  369. sqlBuf.append("count(case when is_effective =1 then is_effective end) effective1, ");
  370. sqlBuf.append("count(case when handle_state =0 then handle_state end) handle0, ");
  371. sqlBuf.append("count(case when handle_state =1 then handle_state end) handle1, ");
  372. sqlBuf.append("count(case when handle_state =2 then handle_state end) handle2, ");
  373. sqlBuf.append("count(case when data_source =0 then data_source end) datasource0, ");
  374. sqlBuf.append("count(case when data_source =1 then data_source end) datasource1, ");
  375. sqlBuf.append("count(case when data_source =2 then data_source end) datasource2, ");
  376. sqlBuf.append("count(case when data_source =3 then data_source end) datasource3 ");
  377. sqlBuf.append("from t_survey_answer where survey_id=? ");
  378. Object[] objects = (Object[]) this.getSession().createSQLQuery(sqlBuf.toString()).setParameter(1, surveyStats.getSurveyId()).uniqueResult();
  379. surveyStats.setFirstAnswer((Date)objects[0]);
  380. surveyStats.setLastAnswer((Date)objects[1]);
  381. surveyStats.setAnswerNum(Integer.parseInt(objects[2].toString()));
  382. String minTime=objects[3].toString();
  383. int minIndex=minTime.indexOf(".");
  384. if(minIndex>0){
  385. minTime=minTime.substring(0,minIndex);
  386. }
  387. surveyStats.setAnMinTime(Integer.parseInt(minTime));//Min Time
  388. String avgTime=objects[4].toString();
  389. int avgIndex=avgTime.indexOf(".");
  390. if(avgIndex>0){
  391. avgTime=avgTime.substring(0,avgIndex);
  392. }
  393. surveyStats.setAnAvgTime(Integer.parseInt(avgTime));//Avg Time
  394. surveyStats.setCompleteNum(Integer.parseInt(objects[5].toString()));
  395. surveyStats.setEffectiveNum(Integer.parseInt(objects[6].toString()));
  396. surveyStats.setUnHandleNum(Integer.parseInt(objects[7].toString()));
  397. surveyStats.setHandlePassNum(Integer.parseInt(objects[8].toString()));
  398. surveyStats.setHandleUnPassNum(Integer.parseInt(objects[9].toString()));
  399. surveyStats.setOnlineNum(Integer.parseInt(objects[10].toString()));
  400. surveyStats.setInputNum(Integer.parseInt(objects[11].toString()));
  401. surveyStats.setMobileNum(Integer.parseInt(objects[12].toString()));
  402. surveyStats.setImportNum(Integer.parseInt(objects[13].toString()));
  403. }catch (Exception e) {
  404. e.printStackTrace();
  405. }
  406. // 0网调 1录入数据 2移动数据 3导入数据
  407. return surveyStats;
  408. }
  409. @Override
  410. public Long countResult(String surveyId) {
  411. Criterion cri2= Restrictions.lt("handleState", 3);
  412. Criterion cri3=Restrictions.eq("isEffective", 1);
  413. Criteria c = null;
  414. if(surveyId!=null){
  415. Criterion cri1 = Restrictions.eq("surveyId",surveyId);
  416. c = createCriteria(cri1,cri2,cri3);
  417. }else{
  418. c = createCriteria(cri2,cri3);
  419. }
  420. return countCriteriaResult(c);
  421. }
  422. }