WebScaleResultController.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. package com.rf.psychological.scale.rest;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.serializer.SerializerFeature;
  6. import com.fasterxml.jackson.databind.ObjectMapper;
  7. import com.rf.psychological.base.rest.BaseController;
  8. import com.rf.psychological.dao.dto.InstitutionRecordingUsersDTO;
  9. import com.rf.psychological.dao.dto.scale.NewResultDto;
  10. import com.rf.psychological.enums.UserRole;
  11. import com.rf.psychological.file.excel.ExcelClass;
  12. import com.rf.psychological.dao.model.*;
  13. import com.rf.psychological.institution.service.InstitutionService;
  14. import com.rf.psychological.opLog.annotation.OperationLogAnnotation;
  15. import com.rf.psychological.plan.dao.model.TestPlanEntity;
  16. import com.rf.psychological.plan.dao.model.TestPlanUserEntity;
  17. import com.rf.psychological.plan.service.TestPlanContendService;
  18. import com.rf.psychological.plan.service.TestPlanService;
  19. import com.rf.psychological.plan.service.TestPlanUserService;
  20. import com.rf.psychological.scale.dao.dto.SubjectEntityDto2;
  21. import com.rf.psychological.scale.dao.model.*;
  22. import com.rf.psychological.scale.service.*;
  23. import com.rf.psychological.security.AesEncryptUtils;
  24. import com.rf.psychological.security.SafetyProcess;
  25. import com.rf.psychological.user.dao.model.UserEntity;
  26. import com.rf.psychological.user.dao.model.UserFileEntity;
  27. import com.rf.psychological.user.service.UserFileService;
  28. import com.rf.psychological.user.service.UserService;
  29. import com.rf.psychological.utils.*;
  30. import com.rf.psychological.utils.DateUtil;
  31. import com.rf.psychological.wxpay.model.PromotionInfo;
  32. import com.rf.psychological.wxpay.service.PromotionInfoService;
  33. import com.rf.psychological.wxpay.service.WxPayService;
  34. import io.swagger.annotations.Api;
  35. import io.swagger.annotations.ApiOperation;
  36. import jodd.util.StringUtil;
  37. import lombok.SneakyThrows;
  38. import lombok.extern.slf4j.Slf4j;
  39. import org.apache.commons.io.FileUtils;
  40. import org.apache.commons.lang.StringUtils;
  41. import org.apache.poi.ss.usermodel.*;
  42. import org.apache.poi.xssf.usermodel.XSSFSheet;
  43. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.beans.factory.annotation.Value;
  46. import org.springframework.transaction.annotation.Transactional;
  47. import org.springframework.web.bind.annotation.*;
  48. import javax.servlet.http.HttpServletResponse;
  49. import java.io.*;
  50. import java.lang.reflect.Constructor;
  51. import java.lang.reflect.InvocationTargetException;
  52. import java.lang.reflect.Method;
  53. import java.nio.file.Files;
  54. import java.nio.file.Path;
  55. import java.nio.file.Paths;
  56. import java.text.DecimalFormat;
  57. import java.text.SimpleDateFormat;
  58. import java.util.*;
  59. import java.util.stream.Collectors;
  60. import java.util.stream.Stream;
  61. import java.util.zip.ZipEntry;
  62. import java.util.zip.ZipOutputStream;
  63. import static com.rf.psychological.utils.FileUtil.html2pdf;
  64. /**
  65. * @author zsf
  66. * {@code @description:接收测试结果计算结果--量表测试}
  67. * @date 2021/1/21 16:07
  68. */
  69. @Slf4j
  70. @RestController
  71. @RequestMapping("/result")
  72. @Api(tags = "web端量表测试结果计算")
  73. public class WebScaleResultController extends BaseController {
  74. @Autowired
  75. private SubjectService subjectService;
  76. @Autowired
  77. private UserRecordService userRecordService;
  78. @Autowired
  79. private UserService userService;
  80. @Autowired
  81. private ScaleService scaleService;
  82. @Autowired
  83. private AnswerService answerService;
  84. @Autowired
  85. private ScaleMarksService scaleMarksService;
  86. @Autowired
  87. private DimensionService dimensionService;
  88. @Autowired
  89. private ScaleConfigService scaleConfigService;
  90. @Autowired
  91. private ScaleScoringVersion scaleScoringVersion;
  92. @Autowired
  93. private TestPlanContendService testPlanContendService;
  94. @Autowired
  95. private TestPlanUserService testPlanUserService;
  96. @Autowired
  97. private TestPlanService testPlanService;
  98. @Autowired
  99. private WarnService warnService;
  100. @Autowired
  101. private DimensionOrgService dimensionOrgService;
  102. @Autowired
  103. private InstitutionService institutionService;
  104. @Autowired
  105. private ScaleDetailsService scaleDetailsService;
  106. @SafetyProcess
  107. @Transactional(rollbackFor = Exception.class)
  108. @OperationLogAnnotation("保存量表记录")
  109. @PostMapping("/{flag}")
  110. @ApiOperation(value = "flag:量表标志,jsonObject:测试结果")
  111. public Result completeTest(@RequestBody String json, @PathVariable String flag) throws Exception {
  112. String data = AesEncryptUtils.decrypt(JSONObject.parseObject(json).getString("data"));
  113. JSONObject jsonObject = JSONObject.parseObject(data);
  114. System.out.println("----------------result-------------------");
  115. System.out.println(jsonObject);
  116. String testPlanId = "0";
  117. UserEntity userEntity = this.userService.getOne(jsonObject.getString("userId"));
  118. if (userEntity == null) {
  119. return fail("用户不存在");
  120. }
  121. String userName = userEntity.getPetName();
  122. String userBirthday = userEntity.getBirthday();
  123. String userSex = userEntity.getGender();
  124. String institutionNo = userEntity.getInstitutionNo();
  125. //提交是校验测试次数是否达到上限
  126. if (institutionService.checkTestNum(institutionNo)){
  127. return fail(Constant.DEFAULT_VALUE_ZERO,"测试次数已达上限,请联系机构管理员");
  128. }
  129. if (userSex.equals("0")) {
  130. userSex = "男";
  131. } else if (userSex.equals("1")) {
  132. userSex = "女";
  133. }else {
  134. userSex = "性别";
  135. }
  136. String phone = userEntity.getPhone();
  137. if (jsonObject.containsKey("testPlanId") && StringUtils.isNotBlank(jsonObject.getString("testPlanId"))) {
  138. testPlanId = jsonObject.getString("testPlanId");
  139. TestPlanEntity testPlanEntity = this.testPlanService.findById(testPlanId);
  140. if (testPlanEntity == null) {
  141. return fail("测试计划不存在");
  142. }
  143. if (testPlanEntity.getStatus() == Constant.TEST_PLAN_STATUS_UNSTART)
  144. return fail("测试计划尚未开始");
  145. if (testPlanEntity.getStatus() < Constant.TEST_PLAN_STATUS_UNSTART)
  146. return fail("测试计划已结束");
  147. UserRecordEntity checkTestPlanId = userRecordService.findByPhoneAndTestPlanIdAndInstitution(institutionNo, phone, testPlanId, flag);
  148. if (checkTestPlanId != null) {
  149. return fail("", "该测试已完成");
  150. }
  151. //更新测试计划状态
  152. updateUserPlanStatus(testPlanId, institutionNo, phone, flag, userEntity.getId(), testPlanContendService, testPlanUserService);
  153. }
  154. String testTime = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒").format(new Date());
  155. if (jsonObject.containsKey("startTime")) {
  156. testTime = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒").format(jsonObject.getDate("startTime"));
  157. }
  158. String fileName = userName + Constant.SPLIT_CHAR + userBirthday + Constant.SPLIT_CHAR + userSex + Constant.SPLIT_CHAR + testTime;
  159. String testResult = "";
  160. JSONArray jsonArray = jsonObject.getJSONArray("scale_result");
  161. // 创建返回的json对象
  162. JSONObject resultJson = new JSONObject(true);
  163. //根据flag获取全部选项
  164. List<ScaleEntity> scaleEntities = this.scaleService.getScaleByFlag(flag);
  165. //根据flag获取全部答案
  166. List<AnswerEntity> answerEntities = this.answerService.getAnswerByFlag(flag);
  167. //根据flag获取全部评分规则
  168. List<ScaleMarksEntity> scaleMarksEntities = this.scaleMarksService.getScaleMarksByFlag(flag);
  169. //根据flag获取全部维度信息
  170. List<DimensionEntity> dimensionEntities = this.dimensionService.getDimensionByFlag(flag);
  171. //根据flag获取量表名称
  172. //List<SubjectEntity> subjectEntities = this.subjectService.getSubjectByFlag(flag);
  173. ScaleDetailsEntity detailsEntity = this.scaleDetailsService.getSubjectDetailsByFlag(flag);
  174. resultJson.put("scaleEntities", scaleEntities);
  175. resultJson.put("answerEntities", answerEntities);
  176. resultJson.put("scaleMarksEntities", scaleMarksEntities);
  177. resultJson.put("dimensionEntities", dimensionEntities);
  178. //性别,用于MMPI量表计算
  179. resultJson.put("gender", userEntity.getGender());
  180. //机构编号,用于预警信息判断
  181. resultJson.put("institutionNo", institutionNo);
  182. //用户id用于预警信息保存
  183. resultJson.put("userId", userEntity.getId());
  184. resultJson.put("dimensionOrgService", dimensionOrgService);
  185. //答题结果列表
  186. List<ScaleEntity> dataList = jsonArray.toJavaList(ScaleEntity.class);
  187. ScaleConfigEntity scaleConfigByFlag = scaleConfigService.findScaleConfigByFlag(flag);
  188. String className = (scaleConfigByFlag == null ? "com.rf.psychological.scale.resultBusiness.scaleResult.COMMONScale" : scaleConfigByFlag.getResultConfig());
  189. Class<?> cls; // 取得Class对象
  190. try {
  191. cls = Class.forName(className);
  192. Constructor<?> cons = cls.getConstructor(JSONArray.class, JSONObject.class);
  193. // Object obj = cons.newInstance(); // 为构造方法传递参数
  194. Object obj = cons.newInstance(jsonArray, resultJson);
  195. //cls.getDeclaredMethods();
  196. Method method = null;
  197. //通过配置文件获取量表计分规则使用的版本
  198. ObjectMapper objectMapper = new ObjectMapper();
  199. String str = objectMapper.writeValueAsString(scaleScoringVersion.getVersionmap());
  200. HashMap mapScale = JSON.parseObject(str, HashMap.class);
  201. Set<Map.Entry<String, String>> en = mapScale.entrySet();
  202. for (Map.Entry<String, String> entry : en) {
  203. String[] flags = entry.getValue().split(", ");
  204. for (String obtainFlag : flags) {
  205. if (obtainFlag.equals(flag)) {
  206. method = cls.getDeclaredMethod(entry.getKey());
  207. break;
  208. }
  209. }
  210. }
  211. if (method == null) {
  212. method = cls.getDeclaredMethod("scaleCalculate");
  213. }
  214. resultJson = (JSONObject) method.invoke(obj);
  215. } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException |
  216. InvocationTargetException e) {
  217. e.printStackTrace();
  218. }
  219. JSONObject dimensionScore = null;
  220. if (resultJson.getJSONObject("resultJson").containsKey("dimensionScoreMap")) {
  221. dimensionScore = resultJson.getJSONObject("resultJson").getJSONObject("dimensionScoreMap");
  222. resultJson.getJSONObject("resultJson").remove("dimensionScoreMap");
  223. }
  224. resultJson.getJSONObject("resultJson").remove("scaleEntities");
  225. resultJson.getJSONObject("resultJson").remove("answerEntities");
  226. resultJson.getJSONObject("resultJson").remove("scaleMarksEntities");
  227. resultJson.getJSONObject("resultJson").remove("dimensionEntities");
  228. resultJson.getJSONObject("resultJson").remove("gender");
  229. resultJson.getJSONObject("resultJson").remove("institutionNo");
  230. resultJson.getJSONObject("resultJson").remove("userId");
  231. resultJson.getJSONObject("resultJson").remove("dimensionOrgService");
  232. if (resultJson.getJSONObject("resultJson").containsKey("resultJson") && resultJson.getJSONObject("resultJson").get("测试结果指导").equals("请认真按照实际情况如实回答")) {
  233. resultJson = resultJson.getJSONObject("resultJson");
  234. return success(resultJson, "完成");
  235. }
  236. fileName = fileName + "-" + detailsEntity.getScaleName() + ".xlsx";
  237. //导出文件
  238. ExcelUtil.createExcelFile(ScaleEntity.class, dataList, (List<Map<String, String>>) resultJson.get("resultMapList"), new ExcelClass().contentExcel(), fileName, detailsEntity.getScaleName());
  239. //计算结果
  240. JSONArray dbJsonList = new JSONArray();
  241. JSONObject dbJson = new JSONObject(true);
  242. boolean versionFlag = false;
  243. Map<String, Object> newResultJson = null;
  244. if (!resultJson.containsKey("newResultJson")) {
  245. dbJson.put("version", 1.0);
  246. dbJson.put("newTableContext", "");
  247. } else {
  248. newResultJson = (Map<String, Object>) resultJson.get("newResultJson");
  249. List<NewResultDto> newResultDtos = (List<NewResultDto>) newResultJson.get("result");
  250. for (int y = 1; y < newResultDtos.size(); y++) {
  251. List<ScaleMarksEntity> scaleMarksEntityList = this.scaleMarksService.getScaleMarksByFlagAndName(flag,newResultDtos.get(y).getName());
  252. if(scaleMarksEntityList != null && scaleMarksEntityList.size() > 0 ){
  253. //取最大值最小值
  254. double minScore = Double.parseDouble(scaleMarksEntityList.get(0).getScoreStart());
  255. double maxScore = Double.parseDouble(scaleMarksEntityList.get(0).getScoreEnd());
  256. for (int i = 1; i < scaleMarksEntityList.size(); i++) {
  257. if(Double.parseDouble(scaleMarksEntityList.get(i).getScoreStart()) < minScore){
  258. minScore = Double.parseDouble(scaleMarksEntityList.get(i).getScoreStart());
  259. }
  260. if(Double.parseDouble(scaleMarksEntityList.get(i).getScoreEnd()) > maxScore){
  261. maxScore = Double.parseDouble(scaleMarksEntityList.get(i).getScoreEnd());
  262. }
  263. }
  264. newResultDtos.get(y).setMinScore(String.valueOf(minScore));
  265. newResultDtos.get(y).setMaxScore(String.valueOf(maxScore));
  266. DecimalFormat df = new DecimalFormat("######0.00");
  267. String percent = Double.parseDouble(df.format((Double.parseDouble(newResultDtos.get(y).getScore())-minScore)/(maxScore-minScore)*100)) + "%";
  268. newResultDtos.get(y).setPercent(percent);
  269. }
  270. }
  271. dbJson.put("version", 2.0);
  272. dbJson.put("newTableContext", newResultJson);
  273. versionFlag = true;
  274. }
  275. resultJson = resultJson.getJSONObject("resultJson");
  276. List<WarnEntity> warnEntityList = new ArrayList<WarnEntity>();
  277. if(resultJson.containsKey("warnEntityList")) {
  278. warnEntityList = resultJson.getJSONArray("warnEntityList").toJavaList(WarnEntity.class);
  279. resultJson.remove("warnEntityList");
  280. }
  281. // 获取JSON第一层所有的key
  282. Set<String> keys = resultJson.keySet();
  283. //列名
  284. List colNames = new ArrayList();
  285. colNames.add("项目");
  286. colNames.add("内容");
  287. dbJson.put("colNames", colNames);
  288. JSONArray tableContext = new JSONArray();
  289. // 获取第一层每个key对应的值 的类型
  290. for (String key : keys) {
  291. //列值
  292. List colValue = new ArrayList();
  293. colValue.add(resultJson.get(key));
  294. JSONObject row = new JSONObject();
  295. row.put("name", key);
  296. row.put("value", colValue);
  297. tableContext.add(row);
  298. }
  299. dbJson.put("tableContext", tableContext);
  300. dbJsonList.add(dbJson);
  301. //测试记录
  302. int i = 1;
  303. // 获取第一层每个key对应的值 的类型
  304. for (String key : keys) {
  305. if (i == keys.size()) {
  306. testResult += key + ":" + resultJson.get(key);
  307. } else {
  308. testResult += key + ":" + resultJson.get(key) + ";";
  309. }
  310. i++;
  311. }
  312. String filePath;
  313. filePath = "./心理检测/检测结果/" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "/" + detailsEntity.getScaleName() + "/" + fileName;
  314. UserRecordEntity userRecordEntity = testRecord(flag, phone, institutionNo, testTime, filePath, JSON.toJSONString(dbJsonList, SerializerFeature.DisableCircularReferenceDetect), detailsEntity.getScaleName(), JSON.toJSONString(dataList, SerializerFeature.DisableCircularReferenceDetect), testResult, testPlanId);
  315. //预警信息处理
  316. if (dimensionScore != null && dimensionScore.size() > 0) {
  317. if (dimensionEntities != null && dimensionEntities.size() > 0) {
  318. for (int y = 0; y < dimensionEntities.size(); y++) {
  319. //计算维度逻辑是否需要预警
  320. DimensionOrgEntity byInstitutionNoAndDimensionId = dimensionOrgService.findByInstitutionNoAndDimensionId(institutionNo, dimensionEntities.get(y).getId());
  321. if (byInstitutionNoAndDimensionId != null) {
  322. switch (byInstitutionNoAndDimensionId.getLogic()) {
  323. case "lt":
  324. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) < Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  325. //添加预警信息
  326. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  327. }
  328. break;
  329. case "le":
  330. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) <= Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  331. //添加预警信息
  332. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  333. }
  334. break;
  335. case "eq":
  336. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) == Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  337. //添加预警信息
  338. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  339. }
  340. break;
  341. case "ne":
  342. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) != Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  343. //添加预警信息
  344. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  345. }
  346. break;
  347. case "ge":
  348. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) >= Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  349. //添加预警信息
  350. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  351. }
  352. break;
  353. case "gt":
  354. if (dimensionScore.getDouble(dimensionEntities.get(y).getId()) > Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())) {
  355. //添加预警信息
  356. warnEntityList.add(createWarnEntry(dimensionEntities.get(y).getFlag(), institutionNo, jsonObject.getString("userId"), dimensionEntities.get(y).getId(), dimensionScore.getDouble(dimensionEntities.get(y).getId())));
  357. }
  358. break;
  359. }
  360. }
  361. }
  362. // resultJson.put("warnEntityList",warnEntityList);
  363. }
  364. if (warnEntityList.size() > 0) {
  365. warnEntityList.forEach(item -> {
  366. item.setResultId(userRecordEntity.getId());
  367. item.setCreateTime(userRecordEntity.getTestDate());
  368. DimensionOrgEntity dimensionOrgEntity = this.dimensionOrgService.findByInstitutionNoAndDimensionId(institutionNo,item.getDimensionId());
  369. item.setThreshold(dimensionOrgEntity.getThreshold());
  370. item.setLogic(dimensionOrgEntity.getLogic());
  371. this.warnService.save(item);
  372. });
  373. }
  374. }
  375. //获取下测试记录
  376. userRecordService.getUserRecordById(userRecordEntity.getId());
  377. return success(userRecordEntity.getId(), "完成");
  378. }
  379. private UserRecordEntity testRecord(String flag, String phone, String institutionNo, String testTime, String fileName, String testResult, String name, String dataList, String testResults, String testPlanId) {
  380. //根据flag记录测试数
  381. this.subjectService.addTestNum(flag);
  382. //添加用户测试记录
  383. UserRecordEntity userRecordEntity = new UserRecordEntity();
  384. userRecordEntity.setFlag(flag);
  385. userRecordEntity.setPhone(phone);
  386. userRecordEntity.setInstitutionNo(institutionNo);
  387. userRecordEntity.setTestDate(testTime);
  388. userRecordEntity.setTestResult(testResult);
  389. userRecordEntity.setType("0");
  390. userRecordEntity.setFileName(fileName);
  391. userRecordEntity.setName(name);
  392. if (!flag.equals("20230327160727")) {
  393. userRecordEntity.setTestRecord(dataList);
  394. }
  395. userRecordEntity.setTestResults(testResults);
  396. if (testPlanId == null || testPlanId.equals("")) {
  397. userRecordEntity.setTestPlanId("0");
  398. } else {
  399. userRecordEntity.setTestPlanId(testPlanId);
  400. }
  401. this.userRecordService.save(userRecordEntity);
  402. return userRecordEntity;
  403. }
  404. public static void updateUserPlanStatus(String testPlanId, String institutionNo, String phone, String flag, String uId,TestPlanContendService testPlanContendService,TestPlanUserService testPlanUserService){
  405. if (!"0".equals(testPlanId) && !StringUtils.isEmpty(testPlanId)) {
  406. //检查测试内容里的任务是否完成
  407. //测试计划任务总数
  408. int contentCount = testPlanContendService.countContent(testPlanId);
  409. //用户已完成测试总数
  410. int completedCount = testPlanContendService.getUserDoTestPlanContendNum(institutionNo,phone,testPlanId)+1;
  411. if(contentCount == completedCount){
  412. //更新用户状态为完成状态
  413. Optional<TestPlanUserEntity> testPlanUserByTestIdAndUserId = testPlanUserService.findTestPlanUserByTestIdAndUserId(testPlanId, uId);
  414. TestPlanUserEntity entity = testPlanUserByTestIdAndUserId.orElse(null);
  415. if(entity != null){
  416. entity.setIsComplete(Constant.USER_PLAN_STATUS_COMPLETED);
  417. testPlanUserService.save(entity);
  418. }
  419. }
  420. }
  421. }
  422. private WarnEntity createWarnEntry(String flag, String institutionNo, String userId, String id, double score) {
  423. WarnEntity warn = new WarnEntity();
  424. warn.setFlag(flag);
  425. warn.setInstitutionNo(institutionNo);
  426. warn.setUserId(userId);
  427. warn.setDimensionId(id);
  428. warn.setScore(String.valueOf(score));
  429. return warn;
  430. }
  431. }