SurveyAnswerDaoImpl.java 15 KB

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