ReviewPaperService.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. package edu.nju.service;
  2. import edu.nju.dao.*;
  3. import edu.nju.entities.*;
  4. import edu.nju.model.CrowdReviewReportDTO;
  5. import edu.nju.model.CrowdReviewReportVO;
  6. import edu.nju.model.ReviewPaperVO;
  7. import org.json.JSONArray;
  8. import org.json.JSONObject;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import java.text.SimpleDateFormat;
  12. import java.util.*;
  13. @Service
  14. public class ReviewPaperService {
  15. @Autowired
  16. ReviewItemDao itemDao;
  17. @Autowired
  18. ReviewAnswerDao answerDao;
  19. @Autowired
  20. ReviewService reviewService;
  21. @Autowired
  22. ReviewReportDao reviewReportDao;
  23. @Autowired
  24. ReviewPaperJsonDao reviewPaperJsonDao;
  25. @Autowired
  26. ReviewPaperDao reviewPaperDao;
  27. @Autowired
  28. ReviewJobDao reviewJobDao;
  29. @Autowired
  30. ReviewWorkerDao reviewWorkerDao;
  31. @Autowired
  32. ReviewGroupDao reviewGroupDao;
  33. public ReviewPaperJson getReviewPaperJson(String paperId) {
  34. return reviewPaperJsonDao.findJsonByPaper(paperId);
  35. }
  36. public ReviewPaper getPaper(String paperId){
  37. return reviewPaperDao.findPaper(paperId);
  38. }
  39. public List<ReviewReport> getReportsByPaperId(String paperId){
  40. return reviewReportDao.getReportsByPaperId(paperId);
  41. }
  42. public List<ReviewPaper> getPapers(){
  43. return reviewPaperDao.findPapers();
  44. }
  45. public CrowdReviewReportVO uploadReport(CrowdReviewReportDTO crowdReviewReportDTO){
  46. JSONArray reportArray= new JSONObject(crowdReviewReportDTO).getJSONArray("crowdReviewReportItems");
  47. try {
  48. String paperName=crowdReviewReportDTO.getName();
  49. String paperType=crowdReviewReportDTO.getType();
  50. String paperId = reviewPaperDao.save(new ReviewPaper(paperName,Long.toString(System.currentTimeMillis()),paperType));
  51. String paperJson=initPaperJson(reportArray,paperName,Long.toString(System.currentTimeMillis()),paperType);
  52. reviewPaperJsonDao.save(new ReviewPaperJson(paperId,paperJson));
  53. for (int i = 0; i < reportArray.length(); i++) {
  54. JSONObject reportObject = reportArray.getJSONObject(i);
  55. saveReport(reportObject, paperId);
  56. }
  57. String testUrl="http://47.99.140.117:9004/changePaper?id=";
  58. return new CrowdReviewReportVO("success",testUrl+paperId);
  59. } catch (Exception e) {
  60. return new CrowdReviewReportVO("fail",e.getMessage());
  61. }
  62. }
  63. private String initPaperJson(JSONArray reportArray,String name, String createTime, String type) throws Exception{
  64. try {
  65. JSONObject object=new JSONObject();
  66. object.put("description","");
  67. object.put("name",name);
  68. object.put("create_time",createTime);
  69. object.put("type",type);
  70. object.put("application_url","");
  71. object.put("requirement_url","");
  72. object.put("report_list",reportArray);
  73. object.put("item_group_list",new JSONArray());
  74. return object.toString();
  75. }catch (Exception e){
  76. throw new Exception(e.getMessage());
  77. }
  78. }
  79. public JSONObject uploadPaper(String paperJson){
  80. JSONObject object = new JSONObject();
  81. String result=checkPaper(paperJson);
  82. if(!result.equals("success")){
  83. object.put("status","fail");
  84. object.put("message",result);
  85. return object;
  86. }
  87. object=savePaper(paperJson);
  88. return object;
  89. }
  90. public JSONObject savePaper(String paperJson){
  91. JSONObject object = new JSONObject();
  92. try {
  93. JSONObject jsonObject = new JSONObject(paperJson);
  94. ReviewPaperVO reviewPaperVO = getReviewPaperVO(jsonObject);
  95. reviewPaperVO.setCreate_time(Long.toString(System.currentTimeMillis()));
  96. ReviewPaper reviewPaper = new ReviewPaper(reviewPaperVO);
  97. String paperId=reviewPaperDao.save(reviewPaper);
  98. reviewPaperJsonDao.save(new ReviewPaperJson(paperId,paperJson));
  99. saveReportAndItem(paperId, jsonObject);
  100. object.put("status","success");
  101. object.put("paperId",paperId);
  102. }catch (Exception e){
  103. object.put("status","fail");
  104. object.put("message",e.getMessage());
  105. }
  106. return object;
  107. }
  108. public JSONObject updatePaper(String paperId,String paperJson){
  109. JSONObject object = new JSONObject();
  110. String result=checkPaper(paperJson);
  111. if(!result.equals("success")){
  112. object.put("status","fail");
  113. object.put("message",result);
  114. return object;
  115. }
  116. try {
  117. JSONObject jsonObject = new JSONObject(paperJson);
  118. ReviewPaperVO reviewPaperVO = getReviewPaperVO(jsonObject);
  119. ReviewPaper reviewPaper = reviewPaperDao.findPaper(paperId);
  120. reviewPaper.setReviewPaper(reviewPaperVO);
  121. reviewPaperDao.save(reviewPaper); //实际是update
  122. reviewPaperJsonDao.update(paperId, paperJson);
  123. reviewReportDao.removeByPaper(paperId);
  124. itemDao.removeByPaper(paperId);
  125. saveReportAndItem(paperId, jsonObject);
  126. object.put("status","success");
  127. object.put("paperId",paperId);
  128. }catch (Exception e){
  129. object.put("status","fail");
  130. object.put("message",e.getMessage());
  131. }
  132. return object;
  133. }
  134. private void saveReportAndItem(String paperId,JSONObject jsonObject)throws Exception{
  135. try {
  136. JSONArray reportArray = jsonObject.getJSONArray("report_list");
  137. HashMap<Integer, String> reportIndexToId = new HashMap<>();
  138. for (int i = 0; i < reportArray.length(); i++) {
  139. JSONObject reportObject = reportArray.getJSONObject(i);
  140. int reportIndex = reportObject.getInt("index");
  141. String id = saveReport(reportObject, paperId);
  142. reportIndexToId.put(reportIndex, id);
  143. }
  144. JSONArray itemGroupArray = jsonObject.getJSONArray("item_group_list");
  145. //save item
  146. //item index-id
  147. HashMap<String, Integer> itemIdToOptionNum = new HashMap<>();
  148. HashMap<Integer, String> itemIndexToId = new HashMap<>();
  149. for (int i = 0; i < itemGroupArray.length(); i++) {
  150. JSONObject itemGroupObject = itemGroupArray.getJSONObject(i);
  151. saveItem(itemGroupObject, paperId, itemIdToOptionNum, reportIndexToId, itemIndexToId);
  152. }
  153. }catch (Exception e){
  154. throw new Exception(e.getMessage());
  155. }
  156. }
  157. public ReviewPaperVO getReviewPaperVO(JSONObject jsonObject)throws Exception{
  158. try {
  159. String description = jsonObject.getString("description");
  160. String name = jsonObject.getString("name");
  161. String time = jsonObject.getString("create_time");
  162. String type = jsonObject.getString("type");
  163. String applicationLocation = jsonObject.getString("application_url");
  164. String requirementLocation = jsonObject.getString("requirement_url");
  165. ReviewPaperVO reviewPaperVO=new ReviewPaperVO(description, name, time, type, applicationLocation, requirementLocation);
  166. return reviewPaperVO;
  167. }catch (Exception e){
  168. throw new Exception(e.getMessage());
  169. }
  170. }
  171. private String saveReport(JSONObject reportObject,String paper_id)throws Exception{
  172. try {
  173. JSONArray imgArray=new JSONArray();
  174. if(reportObject.has("img_url")) {
  175. imgArray = reportObject.getJSONArray("img_url");
  176. }
  177. List<String> img_urls=new ArrayList<>();
  178. for(int i=0;i<imgArray.length();i++){
  179. img_urls.add(String.valueOf(imgArray.get(i)));
  180. }
  181. JSONArray fileArray=new JSONArray();
  182. if(reportObject.has("file_url")) {
  183. fileArray = reportObject.getJSONArray("file_url");
  184. }
  185. List<String> file_urls=new ArrayList<>();
  186. for(int i=0;i<fileArray.length();i++){
  187. file_urls.add(String.valueOf(fileArray.get(i)));
  188. }
  189. String name=reportObject.getString("name");
  190. String description=reportObject.getString("description");
  191. String original_id=reportObject.getString("original_id");
  192. ReviewReport reviewReport=new ReviewReport(original_id,paper_id,name,description,img_urls,file_urls);
  193. return reviewReportDao.save(reviewReport);
  194. }catch (Exception e){
  195. throw new Exception("report 创建失败: "+e.getMessage());
  196. }
  197. }
  198. private void saveItem(JSONObject itemGroupObject,String paper_id,HashMap<String,Integer>item_id_to_option_num,HashMap<Integer,String>report_index_to_id,HashMap<Integer,String>item_index_to_id)throws Exception{
  199. //List<String>itemIds=new ArrayList<>();
  200. List<String> reportIds=new ArrayList<>();
  201. try {
  202. JSONArray reportArray=itemGroupObject.getJSONArray("report_list");
  203. for (int j=0;j<reportArray.length();j++){
  204. int reportIndex= Integer.parseInt(String.valueOf(reportArray.get(j)));
  205. reportIds.add(report_index_to_id.get(reportIndex));
  206. }
  207. JSONArray itemArray=itemGroupObject.getJSONArray("item_list");
  208. for (int j=0;j<itemArray.length();j++){
  209. JSONObject itemObject=itemArray.getJSONObject(j);
  210. int index=itemObject.getInt("index");
  211. Boolean isRequired=itemObject.getBoolean("is_required");
  212. String description=itemObject.getString("description");
  213. String type=itemObject.getString("type");
  214. List<String>options=new ArrayList<>();
  215. JSONArray optionArray=itemObject.getJSONArray("options");
  216. for(int k=0;k<optionArray.length();k++){
  217. options.add(String.valueOf(optionArray.get(k)));
  218. }
  219. ReviewItem item=new ReviewItem(paper_id,isRequired,options,description,reportIds,type);
  220. String item_id = itemDao.saveItem(item);
  221. // itemIds.add(item_id);
  222. // item_id_to_option_num.put(item_id,options.size());
  223. item_index_to_id.put(index,item_id);
  224. }
  225. }catch (Exception e){
  226. throw new Exception("item 创建失败: "+e.getMessage());
  227. }
  228. // try {
  229. // for(int j=0;j<reportIds.size();j++){
  230. // ReviewReport report=reviewReportDao.findReviewReport(reportIds.get(j));
  231. // report.setItem_id(itemIds);
  232. // reviewReportDao.save(report);
  233. // }
  234. // }catch (Exception e){
  235. // throw new Exception("item创建失败,请检查配置的report_index是否存在! ");
  236. // }
  237. }
  238. public String checkPaper(String paperJson){
  239. String result="success";
  240. try {
  241. JSONObject jsonObject=new JSONObject(paperJson);
  242. String description=jsonObject.getString("description");
  243. String name=jsonObject.getString("name");
  244. String time=jsonObject.getString("create_time");
  245. String type=jsonObject.getString("type");
  246. String application_location=jsonObject.getString("application_url");
  247. String requirement_location=jsonObject.getString("requirement_url");
  248. Set<Integer> reportIndexs=new HashSet<>();
  249. JSONArray reportList=jsonObject.getJSONArray("report_list");
  250. for(int i=0;i<reportList.length();i++){
  251. JSONObject report=reportList.getJSONObject(i);
  252. int index=report.getInt("index");
  253. if(reportIndexs.contains(index)){
  254. throw new Exception("report_list中report的index不能重复");
  255. }else{
  256. reportIndexs.add(index);
  257. }
  258. String reportName=report.getString("name");
  259. String originalId=report.getString("original_id");
  260. String reportDescription=report.getString("description");
  261. // JSONArray imgUrls=report.getJSONArray("img_url");
  262. // JSONArray fileUrls=report.getJSONArray("file_url");
  263. }
  264. JSONArray itemGroupArray=jsonObject.getJSONArray("item_group_list");
  265. Set<Integer>itemReportIndexs=new HashSet<>();
  266. for(int i=0;i<itemGroupArray.length();i++){
  267. Set<Integer>itemIndexs=new HashSet<>();
  268. JSONObject itemGroup=itemGroupArray.getJSONObject(i);
  269. JSONArray itemReportList=itemGroup.getJSONArray("report_list");
  270. for(int j=0;j<itemReportList.length();j++){
  271. int reportIndex=Integer.parseInt(String.valueOf(itemReportList.get(j)));
  272. if(!reportIndexs.contains(reportIndex)){
  273. throw new Exception("item_group_list中包含不存在的report ");
  274. }else{
  275. if(itemReportIndexs.contains(reportIndex)){
  276. throw new Exception("item_group_list中的report不能重复");
  277. }
  278. else{
  279. itemReportIndexs.add(reportIndex);
  280. }
  281. }
  282. }
  283. JSONArray itemList=itemGroup.getJSONArray("item_list");
  284. for(int j=0;j<itemList.length();j++){
  285. JSONObject item=itemList.getJSONObject(j);
  286. int index=item.getInt("index");
  287. if(itemIndexs.contains(index)){
  288. throw new Exception("item_group_list中的item_index不能重复");
  289. }
  290. else {
  291. itemIndexs.add(index);
  292. }
  293. String itemDescription=item.getString("description");
  294. Boolean isRequired=item.getBoolean("is_required");
  295. String itemType=item.getString("type");
  296. JSONArray options=item.getJSONArray("options");
  297. }
  298. }
  299. // JSONArray groupList=jsonObject.getJSONArray("group_list");
  300. // Set<String>workers=new HashSet<>();
  301. // for(int i=0;i<groupList.length();i++){
  302. // JSONObject groupObject=groupList.getJSONObject(i);
  303. // String groupName=groupObject.getString("name");
  304. // String groupDescription=groupObject.getString("description");
  305. // JSONArray workerList=groupObject.getJSONArray("worker_list");
  306. // for(int j=0;j<workerList.length();j++){
  307. // String workerId=String.valueOf(workerList.get(j));
  308. // if(workers.contains(workerId)){
  309. // throw new Exception("同一个worker不能属于不同的group");
  310. // }else{
  311. // workers.add(workerId);
  312. // }
  313. // }
  314. // JSONArray workerReportList=groupObject.getJSONArray("report_list");
  315. // for(int j=0;j<workerReportList.length();j++){
  316. // int reportIndex= Integer.parseInt(String.valueOf(workerReportList.get(j)));
  317. // if(!reportIndexs.contains(reportIndex)){
  318. // throw new Exception("group_report_list中包含不存在的report ");
  319. // }
  320. // }
  321. // }
  322. }catch (Exception e){
  323. return e.getMessage();
  324. }
  325. return result;
  326. }
  327. public boolean delPaper(String paperId){
  328. try {
  329. reviewPaperDao.remove(paperId);
  330. reviewPaperJsonDao.remove(paperId);
  331. reviewReportDao.removeByPaper(paperId);
  332. itemDao.removeByPaper(paperId);
  333. return true;
  334. } catch (Exception e) {
  335. e.printStackTrace();
  336. return false;
  337. }
  338. }
  339. public String addWorker(String examId,String paperId, List<String>workerList){
  340. String jobId=reviewJobDao.save(new ReviewJob(examId,paperId,Long.toString(System.currentTimeMillis())));
  341. List<String>workerIds=new ArrayList<>();
  342. for(int i=0;i<workerList.size();i++){
  343. String workerIndex=workerList.get(i);
  344. String workerId=reviewWorkerDao.save(new ReviewWorker(workerIndex,paperId,examId,jobId));
  345. workerIds.add(workerId);
  346. }
  347. List<ReviewReport>reviewReports=getReportsByPaperId(paperId);
  348. List<String>reportIds=new ArrayList<>();
  349. for(int i=0;i<reviewReports.size();i++)
  350. reportIds.add(reviewReports.get(i).getId());
  351. reviewGroupDao.save(new ReviewGroup("default","",workerIds,jobId,reportIds));
  352. return jobId;
  353. }
  354. public ReviewWorker getWorker(String workerIndex,String examId){
  355. return reviewWorkerDao.getWorkerByOriginalId(workerIndex,examId);
  356. }
  357. }