SurveyStatsManagerImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. package net.diaowen.dwsurvey.service.impl;
  2. import java.util.List;
  3. import java.util.regex.Pattern;
  4. import net.diaowen.common.QuType;
  5. import net.diaowen.dwsurvey.dao.SurveyStatsDao;
  6. import net.diaowen.dwsurvey.entity.DataCross;
  7. import net.diaowen.dwsurvey.entity.Question;
  8. import net.diaowen.dwsurvey.entity.SurveyDirectory;
  9. import net.diaowen.dwsurvey.entity.SurveyStats;
  10. import net.diaowen.dwsurvey.service.*;
  11. import net.sf.json.JSONArray;
  12. import org.hibernate.criterion.Criterion;
  13. import org.hibernate.criterion.Restrictions;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import net.diaowen.common.service.BaseServiceImpl;
  18. /**
  19. * 问卷统计
  20. * @author keyuan(keyuan258@gmail.com)
  21. *
  22. * https://github.com/wkeyuan/DWSurvey
  23. * http://dwsurvey.net
  24. */
  25. @Service
  26. public class SurveyStatsManagerImpl extends
  27. BaseServiceImpl<SurveyStats, String> implements SurveyStatsManager {
  28. @Autowired
  29. private SurveyStatsDao surveyStatsDao;
  30. @Autowired
  31. private SurveyAnswerManager surveyAnswerManager;
  32. @Autowired
  33. private QuestionManager questionManager;
  34. @Autowired
  35. private AnYesnoManager anYesnoManager;
  36. @Autowired
  37. private AnRadioManager anRadioManager;
  38. @Autowired
  39. private AnFillblankManager anFillblankManager;
  40. @Autowired
  41. private AnEnumquManager anEnumquManager;
  42. @Autowired
  43. private AnDFillblankManager anDFillblankManager;
  44. @Autowired
  45. private AnCheckboxManager anCheckboxManager;
  46. @Autowired
  47. private AnAnswerManager anAnswerManager;
  48. @Autowired
  49. private AnScoreManager anScoreManager;
  50. @Autowired
  51. private AnOrderManager anOrderManager;
  52. @Autowired
  53. private AnUploadFileManager anUploadFileManager;
  54. @Override
  55. public void setBaseDao() {
  56. this.baseDao = surveyStatsDao;
  57. }
  58. @Override
  59. public SurveyStats findBySurvey(String surveyId) {
  60. // return surveyStatsDao.findUniqueBy("surveyId", surveyId);
  61. Criterion criterion = Restrictions.eq("surveyId", surveyId);
  62. return surveyStatsDao.findFirst(criterion);
  63. }
  64. @Override
  65. public SurveyStats findBySurvey(SurveyDirectory surveyDirectory) {
  66. if (surveyDirectory != null && surveyDirectory.getId() != null) {
  67. return findBySurvey(surveyDirectory.getId());
  68. }
  69. return null;
  70. }
  71. @Override
  72. public SurveyStats findNewStatsData(SurveyDirectory surveyDirectory) {
  73. SurveyStats surveyStats = null;
  74. if (surveyDirectory != null && surveyDirectory.getId() != null) {
  75. String surveyId = surveyDirectory.getId();
  76. surveyStats = findBySurvey(surveyId);
  77. if (surveyStats != null) {
  78. int isNew = surveyStats.getIsNewData();
  79. if (isNew != 1) {
  80. // 则更新数据
  81. upStats(surveyStats);
  82. }
  83. }
  84. }
  85. return surveyStats;
  86. }
  87. private void upStats(SurveyStats surveyStats) {
  88. surveyAnswerManager.surveyStatsData(surveyStats);
  89. // 更新stats
  90. int anCount = surveyStats.getAnswerNum();
  91. int effectiveNum = surveyStats.getEffectiveNum();
  92. int unEffectiveNum = anCount - effectiveNum;
  93. surveyStats.setUnEffectiveNum(unEffectiveNum);
  94. int completeNum = surveyStats.getCompleteNum();
  95. int unCompleteNum = anCount - completeNum;
  96. surveyStats.setUnCompleteNum(unCompleteNum);
  97. surveyStats.setIsNewData(1);
  98. surveyStatsDao.save(surveyStats);
  99. }
  100. /**
  101. * 单个题目频数统计分析
  102. */
  103. @Override
  104. public List<Question> findFrequency(SurveyDirectory survey) {
  105. List<Question> questions = questionManager.findDetails(survey.getId(),
  106. "2");
  107. for (Question question : questions) {
  108. QuType quType = question.getQuType();
  109. if (QuType.YESNO == quType) {// 是非题
  110. anYesnoManager.findGroupStats(question);
  111. } else if (QuType.RADIO == quType || QuType.COMPRADIO == quType) {// 单选
  112. anRadioManager.findGroupStats(question);
  113. } else if (QuType.CHECKBOX == quType
  114. || QuType.COMPCHECKBOX == quType) {// 多选 复合多选
  115. anCheckboxManager.findGroupStats(question);
  116. } else if (QuType.FILLBLANK == quType) {// 填空题
  117. anFillblankManager.findGroupStats(question);
  118. } else if (QuType.ANSWER == quType) {// 多行填空题
  119. anAnswerManager.findGroupStats(question);
  120. } else if (QuType.MULTIFILLBLANK == quType) {// 组合填空
  121. anDFillblankManager.findGroupStats(question);
  122. } else if (QuType.ENUMQU == quType) {// 枚举题
  123. anEnumquManager.findGroupStats(question);
  124. } else if (QuType.SCORE == quType) {// 评分题
  125. anScoreManager.findGroupStats(question);
  126. } else if (QuType.ORDERQU == quType) {
  127. anOrderManager.findGroupStats(question);
  128. } else if (QuType.UPLOADFILE == quType) {
  129. anUploadFileManager.findGroupStats(question);
  130. }
  131. }
  132. return questions;
  133. }
  134. @Override
  135. public List<Question> findRowVarQus(SurveyDirectory survey) {
  136. return questionManager.findStatsRowVarQus(survey);
  137. }
  138. @Override
  139. public List<Question> findColVarQus(SurveyDirectory survey) {
  140. return questionManager.findStatsColVarQus(survey);
  141. }
  142. /**
  143. * 均值交叉统计
  144. */
  145. @Override
  146. public List<DataCross> findStatsDataCross(String rowQuId, String colQuId) {
  147. if (rowQuId != null && !"".equals(rowQuId) && colQuId != null
  148. && !"".equals(colQuId)) {
  149. Question rowQuestion = questionManager.getDetail(rowQuId);
  150. Question colQuestion = questionManager.getDetail(colQuId);
  151. QuType quType = rowQuestion.getQuType();
  152. if (QuType.YESNO == quType) {// 是非题
  153. return anYesnoManager.findStatsDataCross(rowQuestion,
  154. colQuestion);
  155. } else if (QuType.RADIO == quType || QuType.COMPRADIO == quType) {// 单选题
  156. return anRadioManager.findStatsDataCross(rowQuestion,
  157. colQuestion);
  158. } else if (QuType.CHECKBOX == quType
  159. || QuType.COMPCHECKBOX == quType) {
  160. return anCheckboxManager.findStatsDataCross(rowQuestion,
  161. colQuestion);
  162. }
  163. }
  164. // surveyStatsDao.findStatsDataCross(rowQuestion,colQuestion);
  165. return null;
  166. }
  167. @Override
  168. public void save(SurveyStats t) {
  169. String surveyId = t.getSurveyId();
  170. if (surveyId != null && !"".equals(surveyId)) {
  171. SurveyStats surveyStats = findBySurvey(surveyId);
  172. if (surveyStats == null) {
  173. super.save(t);
  174. }
  175. }
  176. }
  177. @Override
  178. public List<DataCross> findDataChart(String quId) {
  179. if (quId != null && !"".equals(quId)) {
  180. Question question = questionManager.getDetail(quId);
  181. QuType quType = question.getQuType();
  182. if (QuType.YESNO == quType) {// 是非题
  183. return anYesnoManager.findStatsDataChart(question);
  184. } else if (QuType.RADIO == quType || QuType.COMPRADIO == quType) {// 单选题
  185. return anRadioManager.findStatsDataChart(question);
  186. } else if (QuType.CHECKBOX == quType || QuType.COMPCHECKBOX == quType) {
  187. return anCheckboxManager.findStatsDataChart(question);
  188. } else if (QuType.FILLBLANK == quType){
  189. anFillblankManager.findGroupStats(question);
  190. } else if (QuType.MULTIFILLBLANK == quType){
  191. anDFillblankManager.findGroupStats(question);
  192. }
  193. }
  194. return null;
  195. }
  196. /**
  197. * 单个题目频数统计分析
  198. */
  199. public List<Question> findFrequency_temp(SurveyDirectory survey) {
  200. List<Question> questions = questionManager.findDetails(survey.getId(),
  201. "2");
  202. for (Question question : questions) {
  203. QuType quType = question.getQuType();
  204. if (QuType.YESNO == quType) {// 是非题
  205. anYesnoManager.findGroupStats(question);
  206. } else if (QuType.RADIO == quType || QuType.COMPRADIO == quType) {// 单选
  207. // 复合单选
  208. anRadioManager.findGroupStats(question);
  209. } else if (QuType.CHECKBOX == quType
  210. || QuType.COMPCHECKBOX == quType) {// 多选 复合多选
  211. anCheckboxManager.findGroupStats(question);
  212. } else if (QuType.FILLBLANK == quType) {// 填空题
  213. anFillblankManager.findGroupStats(question);
  214. } else if (QuType.ANSWER == quType) {// 多行填空题
  215. anAnswerManager.findGroupStats(question);
  216. } else if (QuType.MULTIFILLBLANK == quType) {// 组合填空
  217. anDFillblankManager.findGroupStats(question);
  218. } else if (QuType.ENUMQU == quType) {// 枚举题
  219. anEnumquManager.findGroupStats(question);
  220. } else if (QuType.SCORE == quType) {// 评分题
  221. anScoreManager.findGroupStats(question);
  222. }
  223. }
  224. return questions;
  225. }
  226. @Override
  227. @Transactional(readOnly = true)
  228. public List<Question> dataChart1s(SurveyDirectory survey) {
  229. List<Question> questions = questionManager.findDetails(survey.getId(),
  230. "2");
  231. for (Question question : questions) {
  232. List<DataCross> crosses = findDataChart(question.getId());
  233. if(crosses!=null){
  234. for (DataCross dataCross : crosses) {
  235. // 去掉optionName中的html
  236. String optionName = dataCross.getOptionName();
  237. if(optionName==null){
  238. optionName="";
  239. }
  240. optionName = removeTagFromText(optionName);
  241. if(optionName.length()>15){
  242. optionName=optionName.substring(0, 15)+"...";
  243. }
  244. dataCross.setOptionName(optionName);
  245. }
  246. String statJson = JSONArray.fromObject(crosses).toString();
  247. question.setStatJson(statJson);
  248. }
  249. }
  250. return questions;
  251. }
  252. public void questionDateCross(Question question) {
  253. List<DataCross> crosses = findDataChart(question.getId());
  254. if(crosses!=null){
  255. for (DataCross dataCross : crosses) {
  256. // 去掉optionName中的html
  257. String optionName = dataCross.getOptionName();
  258. if(optionName==null){
  259. optionName="";
  260. }
  261. optionName = removeTagFromText(optionName);
  262. if(optionName.length()>15){
  263. optionName=optionName.substring(0, 15)+"...";
  264. }
  265. dataCross.setOptionName(optionName);
  266. }
  267. String statJson = JSONArray.fromObject(crosses).toString();
  268. question.setStatJson(statJson);
  269. }
  270. }
  271. public String removeTagFromText(String htmlStr) {
  272. if (htmlStr == null || "".equals(htmlStr))
  273. return "";
  274. String textStr = "";
  275. Pattern pattern;
  276. java.util.regex.Matcher matcher;
  277. try {
  278. String regEx_remark = "<!--.+?-->";
  279. // 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
  280. // }
  281. String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
  282. // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
  283. // }
  284. String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
  285. String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
  286. String regEx_html1 = "<[^>]+";
  287. htmlStr = htmlStr.replaceAll("\n", "");
  288. htmlStr = htmlStr.replaceAll("\t", "");
  289. htmlStr = htmlStr.replaceAll("\r", "");
  290. pattern = Pattern.compile(regEx_remark);// 过滤注释标签
  291. matcher = pattern.matcher(htmlStr);
  292. htmlStr = matcher.replaceAll("");
  293. pattern = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
  294. matcher = pattern.matcher(htmlStr);
  295. htmlStr = matcher.replaceAll(""); // 过滤script标签
  296. pattern = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
  297. matcher = pattern.matcher(htmlStr);
  298. htmlStr = matcher.replaceAll(""); // 过滤style标签
  299. pattern = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
  300. matcher = pattern.matcher(htmlStr);
  301. htmlStr = matcher.replaceAll(""); // 过滤html标签
  302. pattern = Pattern.compile(regEx_html1, Pattern.CASE_INSENSITIVE);
  303. matcher = pattern.matcher(htmlStr);
  304. htmlStr = matcher.replaceAll(""); // 过滤html标签
  305. htmlStr = htmlStr.replaceAll("\n[\\s| ]*\r", "");
  306. htmlStr = htmlStr.replaceAll("<(.*)>(.*)<\\/(.*)>|<(.*)\\/>", "");
  307. textStr = htmlStr.trim();
  308. } catch (Exception e) {
  309. e.printStackTrace();
  310. }
  311. return textStr;// 返回文本字符串
  312. }
  313. }