You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
13 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. package com.dreamworks.boditech.service;
  2. import com.dreamworks.boditech.driver.task.Task;
  3. import com.dreamworks.boditech.driver.task.TaskTestEmergency;
  4. import com.dreamworks.boditech.driver.task.TaskTestRegular;
  5. import com.dreamworks.boditech.driver.task.TaskTestTubeRackPrepare;
  6. import com.dreamworks.boditech.entity.*;
  7. import com.dreamworks.boditech.entity.parameter.ParamEmergencyTaskSave;
  8. import com.dreamworks.boditech.entity.parameter.ParamTestSearch;
  9. import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave;
  10. import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSaveTube;
  11. import com.dreamworks.boditech.mapper.*;
  12. import com.dreamworks.boditech.utils.MyCommon;
  13. import jakarta.annotation.Resource;
  14. import org.springframework.context.annotation.Lazy;
  15. import org.springframework.stereotype.Service;
  16. import java.time.LocalDateTime;
  17. import java.time.format.DateTimeFormatter;
  18. import java.util.ArrayList;
  19. import java.util.Calendar;
  20. import java.util.List;
  21. @Service
  22. public class TestService {
  23. @Resource
  24. private TestMapper testMapper;
  25. @Resource
  26. private TestStepMapper testStepMapper;
  27. @Resource
  28. private TestTubeRackTestTaskMapper testTubeRackTestTaskMapper;
  29. @Resource
  30. private TestTubeRackTestTaskTubeMapper testTubeRackTestTaskTubeMapper;
  31. @Resource
  32. private EmergencyTestTaskMapper emergencyTestTaskMapper;
  33. @Resource
  34. @Lazy
  35. private AccountService accountService;
  36. @Resource
  37. private ActionLogService actionLog;
  38. @Resource
  39. @Lazy
  40. private DeviceService deviceService;
  41. // fetch task from database
  42. public List<Task> fetchTask() {
  43. // find emergency task first
  44. // MdbEmergencyTestTask test = this.emergencyTestTaskMapper.findExecutableTask();
  45. // if ( null != test ) {
  46. // List<Integer> projectIds = (List<Integer>)MyCommon.jsonToObject(test.projectIds, List.class);
  47. // List<Task> tasks = new ArrayList<>();
  48. // for (Integer projectId : projectIds) {
  49. // TaskTestEmergency task = new TaskTestEmergency();
  50. // task.setMdbEmergencyTestTask(test);
  51. // task.setProjectId(projectId);
  52. // tasks.add(task);
  53. // }
  54. // return tasks;
  55. // }
  56. // find test tube rack task
  57. MdbTestTubeRackTestTask rack = this.testTubeRackTestTaskMapper.findExecutableTask();
  58. if ( null != rack ) {
  59. List<Task> tasks = new ArrayList<>();
  60. TaskTestTubeRackPrepare prepare = new TaskTestTubeRackPrepare();
  61. prepare.setTestService(this);
  62. prepare.setMdbTestTubeRackTestTask(rack);
  63. tasks.add(prepare);
  64. return tasks;
  65. }
  66. return new ArrayList<>();
  67. }
  68. // test tube rack task save
  69. public MdbTestTubeRackTestTask testTubeRackTaskSave(ParamTestTubeRackTaskSave param) {
  70. if ( null == param.id ) {
  71. return this.testTubeRackTaskSaveInsert(param);
  72. } else {
  73. return this.testTubeRackTaskSaveUpdate(param);
  74. }
  75. }
  76. // test tube rack task save insert
  77. private MdbTestTubeRackTestTask testTubeRackTaskSaveInsert (ParamTestTubeRackTaskSave param) {
  78. this.actionLog.log("test-tube-rack-task.insert", param.tubeType);
  79. MdbTestTubeRackTestTask task = new MdbTestTubeRackTestTask();
  80. task.status = "CONFIGURING";
  81. task.editable = true;
  82. task.createdAt = System.currentTimeMillis();
  83. task.createdBy = this.accountService.getCurrentAccountId();
  84. task.tubeTypeDetectType = param.tubeTypeDetectType;
  85. task.tubeType = param.tubeType;
  86. this.testTubeRackTestTaskMapper.insert(task);
  87. this.testTubeRackTaskSaveUpdateTubes(task, param);
  88. return task;
  89. }
  90. // test tube rack task save update
  91. private MdbTestTubeRackTestTask testTubeRackTaskSaveUpdate (ParamTestTubeRackTaskSave param) {
  92. this.actionLog.log("test-tube-rack-task.update", param.tubeType);
  93. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(param.id);
  94. if ( null == task ) {
  95. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  96. }
  97. if ( !task.editable ) {
  98. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_EDITABLE");
  99. }
  100. task.tubeTypeDetectType = param.tubeTypeDetectType;
  101. task.tubeType = param.tubeType;
  102. task.updatedAt = System.currentTimeMillis();
  103. task.updatedBy = this.accountService.getCurrentAccountId();
  104. this.testTubeRackTestTaskMapper.update(task);
  105. this.testTubeRackTaskSaveUpdateTubes(task, param);
  106. return task;
  107. }
  108. // test tube rack task save update tubes
  109. private void testTubeRackTaskSaveUpdateTubes(MdbTestTubeRackTestTask task, ParamTestTubeRackTaskSave param) {
  110. this.testTubeRackTestTaskTubeMapper.deleteAllByRackId(task.id);
  111. for (ParamTestTubeRackTaskSaveTube tube : param.tubes) {
  112. MdbTestTubeRackTestTaskTube item = new MdbTestTubeRackTestTaskTube();
  113. item.rackId = task.id;
  114. item.index = tube.index;
  115. item.projectDetectType = tube.projectDetectType;
  116. item.sampleTypeDetectType = tube.sampleTypeDetectType;
  117. item.sampleType = tube.sampleType;
  118. item.sampleUid = tube.sampleUid;
  119. item.barCode = tube.barCode;
  120. item.attenuation = tube.attenuation;
  121. item.projectIds = MyCommon.objectToJson(tube.projectIds);
  122. item.status = MdbTestTubeRackTestTaskTube.STATUS_NEW;
  123. this.testTubeRackTestTaskTubeMapper.insert(item);
  124. }
  125. }
  126. // test tube rack task list
  127. public List<MdbTestTubeRackTestTask> testTubeRackTaskList() {
  128. return this.testTubeRackTestTaskMapper.findAll();
  129. }
  130. // test tube rack task tube list
  131. public List<MdbTestTubeRackTestTaskTube> testTubeRackTaskTubeListByRackId(Integer rackId) {
  132. return this.testTubeRackTestTaskTubeMapper.findAllByRackId(rackId);
  133. }
  134. // test tube rack task tube status update
  135. public void testTubeRackTaskTubeStatusUpdate( MdbTestTubeRackTestTaskTube tube ) {
  136. this.testTubeRackTestTaskTubeMapper.statusUpdate(tube);
  137. }
  138. // test tube rack task delete
  139. public void testTubeRackTaskDeleteById(Integer id) {
  140. this.actionLog.log("test-tube-rack-task.delete", id);
  141. this.testTubeRackTestTaskMapper.deleteById(id);
  142. this.testTubeRackTestTaskTubeMapper.deleteAllByRackId(id);
  143. }
  144. // test tube rack task lock
  145. public void testTubeRackTestLock(Integer id) {
  146. this.actionLog.log("test-tube-rack-task.lock", id);
  147. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(id);
  148. if ( null == task ) {
  149. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  150. }
  151. if ( !task.editable ) {
  152. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_EDITABLE");
  153. }
  154. task.editable = false;
  155. task.status = "WAITING";
  156. task.updatedAt = System.currentTimeMillis();
  157. task.updatedBy = this.accountService.getCurrentAccountId();
  158. this.testTubeRackTestTaskMapper.updateLock(task);
  159. this.deviceService.getTaskExecutor().newTaskNotify();
  160. }
  161. // test tube rack task unlock
  162. public void testTubeRackTestUnlock(Integer id) {
  163. this.actionLog.log("test-tube-rack-task.unlock", id);
  164. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(id);
  165. if ( null == task ) {
  166. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  167. }
  168. if ( task.editable ) {
  169. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_LOCKED");
  170. }
  171. task.editable = true;
  172. task.status = "CONFIGURING";
  173. task.updatedAt = System.currentTimeMillis();
  174. task.updatedBy = this.accountService.getCurrentAccountId();
  175. this.testTubeRackTestTaskMapper.updateLock(task);
  176. }
  177. // emergency task save
  178. public void emergencyTaskSave(ParamEmergencyTaskSave param) {
  179. MdbEmergencyTestTask task = new MdbEmergencyTestTask();
  180. task.index = param.index;
  181. task.enable = param.enable;
  182. task.isSlotLocked = true;
  183. task.projectDetectType = param.projectDetectType;
  184. task.sampleTypeDetectType = param.sampleTypeDetectType;
  185. task.sampleType = param.sampleType;
  186. task.sampleUid = param.sampleUid;
  187. task.barCode = param.barCode;
  188. task.attenuation = param.attenuation;
  189. task.updatedAt = System.currentTimeMillis();
  190. task.updatedBy = this.accountService.getCurrentAccountId();
  191. task.projectIds = MyCommon.objectToJson(param.projectIds);
  192. task.status = "WAITING";
  193. task.createdAt = System.currentTimeMillis();
  194. task.createdBy = this.accountService.getCurrentAccountId();
  195. this.emergencyTestTaskMapper.insert(task);
  196. this.deviceService.getTaskExecutor().newTaskNotify();
  197. }
  198. // emergency task status get
  199. public MdbEmergencyTestTask activeEmergencyTaskGetBySlot(Integer slotIndex) {
  200. return this.emergencyTestTaskMapper.activeEmergencyTaskGetBySlot(slotIndex);
  201. }
  202. // emergency task start
  203. public void emergencyTaskStart( MdbEmergencyTestTask task ) {
  204. task.status = MdbEmergencyTestTask.STATUS_EXECUTING;
  205. task.execStartedAt = System.currentTimeMillis();
  206. this.emergencyTestTaskMapper.executeStart(task);
  207. }
  208. // emergency task end
  209. public void emergencyTaskEnd( MdbEmergencyTestTask task ) {
  210. Integer finishCount = this.testMapper.countFinishedTestsByTaskId(task.id, "emergency");
  211. if ( finishCount < task.getProjectIdList().size() ) {
  212. return ;
  213. }
  214. task.status = MdbEmergencyTestTask.STATUS_FINISHED;
  215. task.execFinishedAt = System.currentTimeMillis();
  216. this.emergencyTestTaskMapper.executeEnd(task);
  217. }
  218. // emergency task cancel
  219. public void emergencyTaskCancel( MdbEmergencyTestTask task ) {
  220. task.status = MdbEmergencyTestTask.STATUS_CANCELED;
  221. task.execFinishedAt = System.currentTimeMillis();
  222. this.emergencyTestTaskMapper.executeCancel(task);
  223. }
  224. // test tube rack task current get
  225. public MdbTestTubeRackTestTask testTubeRackTaskCurrentGet() {
  226. return this.testTubeRackTestTaskMapper.findCurrentTask();
  227. }
  228. // emergency task end
  229. public void regularTaskTubeEnd( MdbTestTubeRackTestTask task, MdbTestTubeRackTestTaskTube tube ) {
  230. // @TODO : implement this method later
  231. }
  232. // emergency task cancel
  233. public void regularTaskCancel( MdbTestTubeRackTestTask task ) {
  234. // @TODO : implement this method later
  235. }
  236. // test update
  237. public void testUpdate( MdbTest test ) {
  238. this.testMapper.update(test);
  239. }
  240. // test end
  241. public void testEnd(MdbTest test) {
  242. test.status = "FINISHED";
  243. this.testMapper.statusUpdate(test);
  244. }
  245. // test cancel
  246. public void testCancel(MdbTest test) {
  247. test.status = "CANCELED";
  248. this.testMapper.statusUpdate(test);
  249. }
  250. // test search
  251. public List<MdbTest> testSearch (ParamTestSearch param) {
  252. return this.testMapper.search(param);
  253. }
  254. // test count
  255. public Integer testCount( ParamTestSearch param ) {
  256. return this.testMapper.count(param);
  257. }
  258. // create test
  259. public void insert(MdbTest test) {
  260. Calendar calendar = Calendar.getInstance();
  261. calendar.set(Calendar.HOUR_OF_DAY, 0);
  262. calendar.set(Calendar.MINUTE, 0);
  263. calendar.set(Calendar.SECOND, 0);
  264. calendar.set(Calendar.MILLISECOND, 0);
  265. Long startTime = calendar.getTimeInMillis();
  266. int count = this.testMapper.countByTimeRange(startTime, System.currentTimeMillis());
  267. test.serialCode = String.format("%s_%03d", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMdd")), count + 1);
  268. // @TODO : startedBy should be set to the current user
  269. test.startedBy = 0;
  270. test.startedAt = System.currentTimeMillis();
  271. this.testMapper.insert(test);
  272. }
  273. // update test
  274. public void statusUpdate(MdbTest test) {
  275. this.testMapper.statusUpdate(test);
  276. }
  277. // update test
  278. public void resultUpdate(MdbTest test) {
  279. this.testMapper.resultUpdate(test);
  280. }
  281. // log step start
  282. public void logStepStart(MdbTest test, TestStepLogEntry entry ) {
  283. entry.testId = test.id;
  284. entry.startedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  285. this.testStepMapper.insert(entry);
  286. }
  287. // log step end
  288. public void logStepEnd(TestStepLogEntry entry) {
  289. entry.finishedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  290. this.testStepMapper.update(entry);
  291. }
  292. }