TaskService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package com.ruoyi.sim.service.impl;
  2. import java.util.*;
  3. import com.ruoyi.common.core.domain.AjaxResult;
  4. import com.ruoyi.common.utils.DateUtils;
  5. import com.ruoyi.common.utils.SecurityUtils;
  6. import com.ruoyi.sim.domain.Fault;
  7. import com.ruoyi.sim.domain.TaskFault;
  8. import com.ruoyi.sim.domain.vo.FaultTreeVo;
  9. import com.ruoyi.sim.domain.vo.TaskCUVo;
  10. import com.ruoyi.sim.domain.vo.TaskVo;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.BeanUtils;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import com.ruoyi.sim.mapper.TaskMapper;
  18. import com.ruoyi.sim.domain.Task;
  19. import org.springframework.transaction.annotation.Transactional;
  20. /**
  21. * 任务Service业务层处理
  22. *
  23. * @author tom
  24. * @date 2024-12-13
  25. */
  26. @Service
  27. public class TaskService {
  28. private static final Logger l = LoggerFactory.getLogger(TaskService.class);
  29. @Autowired
  30. private TaskMapper taskMapper;
  31. @Autowired
  32. private FaultService faultService;
  33. @Autowired
  34. private TaskFaultService taskFaultService;
  35. @Autowired
  36. private SimService simService;
  37. /**
  38. * 查询任务
  39. *
  40. * @param taskId 任务主键
  41. * @return 任务
  42. */
  43. public AjaxResult selectTaskByTaskId(Long taskId) {
  44. // check
  45. if (taskId == null) {
  46. return AjaxResult.error("taskId is null");
  47. }
  48. Task t = taskMapper.selectTaskByTaskId(taskId);
  49. if (t == null) {
  50. return AjaxResult.error("task is null");
  51. }
  52. //
  53. TaskVo vo = new TaskVo();
  54. String simType = t.getSimType();
  55. BeanUtils.copyProperties(t, vo);
  56. // 查询获得数据结构。
  57. List<FaultTreeVo> listStyleT = faultService.listAllListTreeStyleBySimType(simType);
  58. // 变成扁平list
  59. List<FaultTreeVo> listStyleF = FaultService.flatten(listStyleT);
  60. for (FaultTreeVo o : listStyleF) {
  61. if (o == null) {
  62. continue;
  63. }
  64. if (Fault.Type.TYPE_GZBW.equals(o.getFaultType())) {
  65. TaskFault tf = o.getTaskFault();
  66. TaskFault tfQ = taskFaultService.selectUniqueTaskFault(taskId, tf.getFaultId());
  67. // 存在就设置上数据库中TaskFault值。
  68. if (tfQ != null) {
  69. o.setTaskFault(tfQ);
  70. }
  71. }
  72. }
  73. // 变成树list
  74. vo.setSelectedData(FaultService.toTree(listStyleF, Fault.ROOT_FAULT_ID));
  75. // 故障现象
  76. vo.setCountGZXX(getCountGZXX(taskId));
  77. // 故障部位
  78. vo.setCountGZBW(getCountGZBW(taskId));
  79. //
  80. return AjaxResult.success(vo);
  81. }
  82. /**
  83. * 查询任务列表
  84. *
  85. * @param q 任务
  86. * @return 任务
  87. */
  88. public List<TaskVo> list(Task q) {
  89. if (q == null) {
  90. return Collections.emptyList();
  91. }
  92. List<Task> listT = taskMapper.selectTaskList(q);
  93. List<TaskVo> listVo = new ArrayList<>(listT.size());
  94. listT.forEach(t -> {
  95. TaskVo vo = new TaskVo();
  96. BeanUtils.copyProperties(t, vo);
  97. // 故障现象
  98. vo.setCountGZXX(getCountGZXX(t.getTaskId()));
  99. // 故障部位
  100. vo.setCountGZBW(getCountGZBW(t.getTaskId()));
  101. listVo.add(vo);
  102. });
  103. return listVo;
  104. }
  105. public int getCountGZXX(long taskId) {
  106. return faultService.countType1ByType3(
  107. taskFaultService.toFaultList(
  108. taskFaultService.listYesByFaultType(taskId, Fault.Type.TYPE_GZBW)
  109. )
  110. );
  111. }
  112. public int getCountGZBW(long taskId) {
  113. return taskFaultService.countYesByFaultType(taskId, Fault.Type.TYPE_GZBW);
  114. }
  115. @Transactional()
  116. public AjaxResult insertOrUpdateTaskByTeacher(TaskCUVo v) {
  117. String simType = v.getSimType();
  118. String[] faultIds = v.getFaultIds();
  119. l.info("simType = {}", simType);
  120. // check
  121. AjaxResult arE1 = check(simType, faultIds);
  122. if (arE1.isError()) {
  123. return arE1;
  124. }
  125. Set<String> hashSet = new HashSet<>(Arrays.asList(faultIds));
  126. l.info("hashSet = {}", hashSet);
  127. TaskVo tv = buildBlankTaskVo(simType);
  128. // 查询获得数据结构。
  129. List<FaultTreeVo> listStyleT = tv.getSelectedData();
  130. // 变成扁平list
  131. List<FaultTreeVo> listStyleF = FaultService.flatten(listStyleT);
  132. listStyleF
  133. .stream()
  134. .filter(vo -> hashSet.contains(vo.getFaultId()))
  135. .forEach(vo -> vo.getTaskFault().setFlag(TaskFault.Flag.YES));
  136. if (v.getTaskId() == null || v.getTaskId() == 0) {
  137. tv.setTaskId(null);
  138. } else {
  139. tv.setTaskId(v.getTaskId());
  140. }
  141. tv.setName(v.getName());
  142. tv.setSimType(v.getSimType());
  143. l.info("listStyleF.size = {}", listStyleF.size());
  144. // 变回tree
  145. tv.setSelectedData(FaultService.toTree(listStyleF, Fault.ROOT_FAULT_ID));
  146. AjaxResult arE2 = null;
  147. if (v.getTaskId() == null || v.getTaskId() == 0) {
  148. arE2 = insertTaskByTeacher(tv);
  149. } else {
  150. arE2 = updateTaskByTeacher(tv);
  151. }
  152. if (arE2 == null || arE2.isError()) {
  153. return arE2;
  154. }
  155. return AjaxResult.success();
  156. }
  157. public AjaxResult check(String simType, String[] faultIds) {
  158. for (String faultId : faultIds) {
  159. if (!faultService.isType3(faultId)) {
  160. return AjaxResult.error("faultId not TYPE_GZBW!");
  161. }
  162. }
  163. if (!faultService.isExist(simType, faultIds)) {
  164. return AjaxResult.error("faultId not exist!");
  165. }
  166. return AjaxResult.success();
  167. }
  168. /**
  169. * 新增任务
  170. *
  171. * @param tv 任务
  172. * @return 结果
  173. * todo:事务有问题。
  174. */
  175. @Transactional()
  176. public AjaxResult insertTaskByTeacher(TaskVo tv) {
  177. l.info("insertTaskByTeacher {}", tv);
  178. // check
  179. AjaxResult arE1 = checkAddOrEdit(tv);
  180. if (arE1.isError()) {
  181. return arE1;
  182. }
  183. //
  184. tv.setCreateByUserId(SecurityUtils.getUserId());
  185. tv.setCreateBy(SecurityUtils.getUsername());
  186. tv.setCreateTime(DateUtils.getNowDate());
  187. tv.setUpdateBy(SecurityUtils.getUsername());
  188. tv.setUpdateTime(DateUtils.getNowDate());
  189. // do.
  190. // id新增一定要null。
  191. tv.setTaskId(null);
  192. taskMapper.insertTask(tv);
  193. // do ref.
  194. AjaxResult arRef = dealRef(tv);
  195. if (arRef.isError()) {
  196. return arRef;
  197. }
  198. return AjaxResult.success();
  199. }
  200. /**
  201. * 修改任务
  202. *
  203. * @param tv 任务
  204. * @return 结果
  205. */
  206. public AjaxResult updateTaskByTeacher(TaskVo tv) {
  207. l.info("updateTaskByTeacher " + tv);
  208. // check
  209. AjaxResult arE1 = checkAddOrEdit(tv);
  210. if (arE1.isError()) {
  211. return arE1;
  212. }
  213. // check taskId
  214. {
  215. Task tQ = taskMapper.selectTaskByTaskId(tv.getTaskId());
  216. if (tQ == null) {
  217. return AjaxResult.error("taskId not exist!");
  218. }
  219. }
  220. //
  221. tv.setCreateByUserId(SecurityUtils.getUserId());
  222. tv.setCreateBy(SecurityUtils.getUsername());
  223. tv.setCreateTime(DateUtils.getNowDate());
  224. tv.setUpdateBy(SecurityUtils.getUsername());
  225. tv.setUpdateTime(DateUtils.getNowDate());
  226. // do.
  227. if (tv.getTaskId() == null || tv.getTaskId() == 0) {
  228. return AjaxResult.error("taskId not exist!");
  229. }
  230. taskMapper.updateTask(tv);
  231. // do ref.
  232. AjaxResult arE2 = dealRef(tv);
  233. if (arE2.isError()) {
  234. return arE2;
  235. }
  236. return AjaxResult.success();
  237. }
  238. public AjaxResult checkAddOrEdit(TaskVo tv) {
  239. if (tv == null) {
  240. return AjaxResult.error("TaskVo empty!");
  241. }
  242. if (!simService.checkSimTypeOk(tv.getSimType())) {
  243. return AjaxResult.error("simType value error!");
  244. }
  245. if (!Task.Type.TEACHER_ADD.equals(tv.getTaskType())) {
  246. return AjaxResult.error("taskType value error!");
  247. }
  248. if (StringUtils.isEmpty(tv.getName())) {
  249. return AjaxResult.error("name isEmpty!");
  250. }
  251. return AjaxResult.success();
  252. }
  253. public boolean exist(Long taskId) {
  254. return (selectTaskByTaskId(taskId) != null);
  255. }
  256. /**
  257. * 处理关联数据。
  258. *
  259. * @param tv
  260. */
  261. public AjaxResult dealRef(TaskVo tv) {
  262. List<FaultTreeVo> selectedData = tv.getSelectedData();
  263. if (selectedData == null) {
  264. return AjaxResult.error("selectedData null!");
  265. }
  266. List<FaultTreeVo> list = FaultService.flatten(selectedData);
  267. dealRef(tv.getTaskId(), list);
  268. return AjaxResult.success();
  269. }
  270. /**
  271. * @param flatten 扁平list
  272. * @return
  273. */
  274. public AjaxResult dealRef(Long taskId, List<FaultTreeVo> flatten) {
  275. for (FaultTreeVo ftv : flatten) {
  276. if (ftv == null) {
  277. continue;
  278. }
  279. // 仅仅处理故障部位。
  280. if (!Fault.Type.TYPE_GZBW.equals(ftv.getFaultType())) {
  281. continue;
  282. }
  283. TaskFault tf = ftv.getTaskFault();
  284. // check
  285. if (tf == null) {
  286. return AjaxResult.error("TaskFault empty!");
  287. }
  288. String flag = tf.getFlag();
  289. if (StringUtils.isEmpty(flag)) {
  290. return AjaxResult.error("flag empty!");
  291. }
  292. if (!TaskFault.Flag.YES.equals(flag) &&
  293. !TaskFault.Flag.NO.equals(flag) &&
  294. !TaskFault.Flag.UNKNOWN.equals(flag)) {
  295. return AjaxResult.error("flag must YES or NO,UNKNOWN!");
  296. }
  297. // todo:选中数量限制
  298. // 故障部位冲突 暂时没有故障部位冲突。
  299. // UNKNOWN 作为 NO 插入或修改数据。
  300. // 处理flag。
  301. if (TaskFault.Flag.UNKNOWN.equals(flag)) {
  302. tf.setFlag(TaskFault.Flag.NO);
  303. }
  304. tf.setTaskId(taskId);
  305. //
  306. TaskFault tfQ = taskFaultService.selectUniqueTaskFault(taskId, tf.getFaultId());
  307. if (tfQ == null) {
  308. taskFaultService.insertTaskFault(taskId, tf.getFaultId(), tf.getFlag());
  309. } else {
  310. tfQ.setFlag(tf.getFlag());
  311. taskFaultService.updateTaskFault(tfQ);
  312. }
  313. }
  314. return AjaxResult.success();
  315. }
  316. /**
  317. * 批量删除任务
  318. *
  319. * @param ids 需要删除的任务主键
  320. * @return 结果
  321. */
  322. @Transactional
  323. public AjaxResult deleteTaskByTaskIds(Long[] ids) {
  324. if (ids == null || ids.length == 0) {
  325. return AjaxResult.error("taskIds null!");
  326. }
  327. for (Long tId : ids) {
  328. taskMapper.deleteTaskByTaskId(tId);
  329. taskFaultService.deleteTaskFaultByTaskId(tId);
  330. }
  331. return AjaxResult.success();
  332. }
  333. /**
  334. * 删除任务信息
  335. *
  336. * @param taskId 任务主键
  337. * @return 结果
  338. */
  339. public int deleteTaskByTaskId(Long taskId) {
  340. return taskMapper.deleteTaskByTaskId(taskId);
  341. }
  342. /**
  343. * 为了新建Task,返回一个带tree结构的任务详细信息。
  344. *
  345. * @return 任务
  346. */
  347. public AjaxResult getInfoForAdd(final String simType) {
  348. // check
  349. if (StringUtils.isEmpty(simType)) {
  350. return AjaxResult.error("simType empty!");
  351. }
  352. if (!simService.checkSimTypeOk(simType)) {
  353. return AjaxResult.error("simType value error!");
  354. }
  355. return AjaxResult.success(buildBlankTaskVo(simType));
  356. }
  357. /**
  358. * @param simType
  359. * @return tree style
  360. */
  361. public TaskVo buildBlankTaskVo(final String simType) {
  362. List<FaultTreeVo> ftList = faultService.listAllListTreeStyleBySimType(simType);
  363. TaskVo t = new TaskVo();
  364. t.setTaskId(null);
  365. t.setSimType(simType);
  366. t.setTaskType(Task.Type.TEACHER_ADD);
  367. t.setSelectedData(ftList);
  368. return t;
  369. }
  370. /**
  371. * 新增任务附带选择故障
  372. *
  373. * @param task 任务
  374. * @return 结果
  375. */
  376. @Transactional
  377. public long insertTaskWithFault(Task task) {
  378. Long taskId = task.getTaskId();
  379. if (selectTaskByTaskId(taskId) != null) {
  380. // 已经存在
  381. }
  382. task.setCreateTime(DateUtils.getNowDate());
  383. task.setUpdateTime(DateUtils.getNowDate());
  384. return taskMapper.insertTask(task);
  385. }
  386. }