ReviewPaperService.java 17 KB

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