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.

415 lines
16 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
  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.*;
  8. import com.dreamworks.boditech.mapper.*;
  9. import com.dreamworks.boditech.utils.AppError;
  10. import com.dreamworks.boditech.utils.AppRuntimeException;
  11. import com.dreamworks.boditech.utils.MyCommon;
  12. import jakarta.annotation.PostConstruct;
  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. import java.util.Objects;
  22. @Service
  23. public class TestService {
  24. @Resource
  25. private TestMapper testMapper;
  26. @Resource
  27. private TestStepMapper testStepMapper;
  28. @Resource
  29. private TestTubeRackTestTaskMapper testTubeRackTestTaskMapper;
  30. @Resource
  31. private TestTubeRackTestTaskTubeMapper testTubeRackTestTaskTubeMapper;
  32. @Resource
  33. private EmergencyTestTaskMapper emergencyTestTaskMapper;
  34. @Resource
  35. @Lazy
  36. private AccountService accountService;
  37. @Resource
  38. private ActionLogService actionLog;
  39. @Resource
  40. @Lazy
  41. private DeviceService deviceService;
  42. // batch id
  43. private Long batchId = null;
  44. @PostConstruct
  45. public void init() {
  46. this.batchId = System.currentTimeMillis();
  47. }
  48. // fetch task from database
  49. public List<Task> fetchTask() {
  50. // find emergency task first
  51. MdbEmergencyTestTask test = this.emergencyTestTaskMapper.findExecutableTask();
  52. if ( null != test ) {
  53. List<Integer> projectIds = (List<Integer>)MyCommon.jsonToObject(test.projectIds, List.class);
  54. if (Objects.equals(test.projectDetectType, MdbEmergencyTestTask.PROJECT_DETECT_TYPE_AUTO)) {
  55. // @TODO : 这里需要从 LIS 获取项目信息之类的数据了, 这里先模拟个hsCRP
  56. projectIds = List.of(1);
  57. test.sampleType = "WB";
  58. }
  59. if ( projectIds.isEmpty() ) {
  60. throw new AppRuntimeException(AppError.TEST_NO_PROJECT_ASSIGNED);
  61. }
  62. List<Task> tasks = new ArrayList<>();
  63. for (Integer projectId : projectIds) {
  64. TaskTestEmergency task = new TaskTestEmergency();
  65. task.setMdbEmergencyTestTask(test);
  66. task.setProjectId(projectId);
  67. tasks.add(task);
  68. }
  69. return tasks;
  70. }
  71. // find test tube rack task
  72. MdbTestTubeRackTestTask rack = this.testTubeRackTestTaskMapper.findExecutableTask();
  73. if ( null != rack ) {
  74. List<Task> tasks = new ArrayList<>();
  75. TaskTestTubeRackPrepare prepare = new TaskTestTubeRackPrepare();
  76. prepare.setTestService(this);
  77. prepare.setMdbTestTubeRackTestTask(rack);
  78. tasks.add(prepare);
  79. return tasks;
  80. }
  81. return new ArrayList<>();
  82. }
  83. // test tube rack task save
  84. public MdbTestTubeRackTestTask testTubeRackTaskSave(ParamTestTubeRackTaskSave param) {
  85. if ( null == param.id ) {
  86. return this.testTubeRackTaskSaveInsert(param);
  87. } else {
  88. return this.testTubeRackTaskSaveUpdate(param);
  89. }
  90. }
  91. // test tube rack task save insert
  92. private MdbTestTubeRackTestTask testTubeRackTaskSaveInsert (ParamTestTubeRackTaskSave param) {
  93. this.actionLog.log("test-tube-rack-task.insert", param.tubeType);
  94. MdbTestTubeRackTestTask task = new MdbTestTubeRackTestTask();
  95. task.status = "CONFIGURING";
  96. task.editable = true;
  97. task.createdAt = System.currentTimeMillis();
  98. task.createdBy = this.accountService.getCurrentAccountId();
  99. task.tubeTypeDetectType = param.tubeTypeDetectType;
  100. task.tubeType = param.tubeType;
  101. this.testTubeRackTestTaskMapper.insert(task);
  102. this.testTubeRackTaskSaveUpdateTubes(task, param);
  103. return task;
  104. }
  105. // test tube rack task save update
  106. private MdbTestTubeRackTestTask testTubeRackTaskSaveUpdate (ParamTestTubeRackTaskSave param) {
  107. this.actionLog.log("test-tube-rack-task.update", param.tubeType);
  108. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(param.id);
  109. if ( null == task ) {
  110. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  111. }
  112. if ( !task.editable ) {
  113. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_EDITABLE");
  114. }
  115. task.tubeTypeDetectType = param.tubeTypeDetectType;
  116. task.tubeType = param.tubeType;
  117. task.updatedAt = System.currentTimeMillis();
  118. task.updatedBy = this.accountService.getCurrentAccountId();
  119. this.testTubeRackTestTaskMapper.update(task);
  120. this.testTubeRackTaskSaveUpdateTubes(task, param);
  121. return task;
  122. }
  123. // test tube rack task save update tubes
  124. private void testTubeRackTaskSaveUpdateTubes(MdbTestTubeRackTestTask task, ParamTestTubeRackTaskSave param) {
  125. this.testTubeRackTestTaskTubeMapper.deleteAllByRackId(task.id);
  126. for (ParamTestTubeRackTaskSaveTube tube : param.tubes) {
  127. MdbTestTubeRackTestTaskTube item = new MdbTestTubeRackTestTaskTube();
  128. item.rackId = task.id;
  129. item.index = tube.index;
  130. item.projectDetectType = tube.projectDetectType;
  131. item.sampleTypeDetectType = tube.sampleTypeDetectType;
  132. item.sampleType = tube.sampleType;
  133. item.sampleUid = tube.sampleUid;
  134. item.barCode = tube.barCode;
  135. item.attenuation = tube.attenuation;
  136. item.projectIds = MyCommon.objectToJson(tube.projectIds);
  137. item.status = MdbTestTubeRackTestTaskTube.STATUS_NEW;
  138. this.testTubeRackTestTaskTubeMapper.insert(item);
  139. }
  140. }
  141. // test tube rack task tube list
  142. public List<MdbTestTubeRackTestTaskTube> testTubeRackTaskTubeListByRackId(Integer rackId) {
  143. return this.testTubeRackTestTaskTubeMapper.findAllByRackId(rackId);
  144. }
  145. // test tube rack task delete
  146. public void testTubeRackTaskDeleteById(Integer id) {
  147. this.actionLog.log("test-tube-rack-task.delete", id);
  148. this.testTubeRackTestTaskMapper.deleteById(id);
  149. this.testTubeRackTestTaskTubeMapper.deleteAllByRackId(id);
  150. }
  151. // test tube rack task lock
  152. public void testTubeRackTestLock(Integer id) {
  153. if ( !this.deviceService.isExecutorRunning() ) {
  154. throw new AppRuntimeException(AppError.DEVICE_EXECUTING_REQUIRED);
  155. }
  156. this.actionLog.log("test-tube-rack-task.lock", id);
  157. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(id);
  158. if ( null == task ) {
  159. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  160. }
  161. if ( !task.editable ) {
  162. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_EDITABLE");
  163. }
  164. task.editable = false;
  165. task.status = "WAITING";
  166. task.updatedAt = System.currentTimeMillis();
  167. task.updatedBy = this.accountService.getCurrentAccountId();
  168. this.testTubeRackTestTaskMapper.updateLock(task);
  169. this.deviceService.getTaskExecutor().newTaskNotify();
  170. }
  171. // test tube rack task unlock
  172. public void testTubeRackTestUnlock(Integer id) {
  173. this.actionLog.log("test-tube-rack-task.unlock", id);
  174. MdbTestTubeRackTestTask task = this.testTubeRackTestTaskMapper.findById(id);
  175. if ( null == task ) {
  176. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_FOUND");
  177. }
  178. if ( task.editable ) {
  179. throw new RuntimeException("TEST_TUBE_RACK_TASK_NOT_LOCKED");
  180. }
  181. task.editable = true;
  182. task.status = "CONFIGURING";
  183. task.updatedAt = System.currentTimeMillis();
  184. task.updatedBy = this.accountService.getCurrentAccountId();
  185. this.testTubeRackTestTaskMapper.updateLock(task);
  186. }
  187. // emergency task save
  188. public void emergencyTaskSave(ParamEmergencyTaskSave param) {
  189. MdbEmergencyTestTask task = new MdbEmergencyTestTask();
  190. task.index = param.index;
  191. task.enable = param.enable;
  192. task.isSlotLocked = true;
  193. task.projectDetectType = param.projectDetectType;
  194. task.sampleTypeDetectType = param.sampleTypeDetectType;
  195. task.sampleType = param.sampleType;
  196. task.sampleUid = param.sampleUid;
  197. task.barCode = param.barCode;
  198. task.attenuation = param.attenuation;
  199. task.updatedAt = System.currentTimeMillis();
  200. task.updatedBy = this.accountService.getCurrentAccountId();
  201. task.projectIds = MyCommon.objectToJson(param.projectIds);
  202. task.status = "WAITING";
  203. task.createdAt = System.currentTimeMillis();
  204. task.createdBy = this.accountService.getCurrentAccountId();
  205. this.emergencyTestTaskMapper.insert(task);
  206. this.deviceService.getTaskExecutor().newTaskNotify();
  207. }
  208. // emergency task status get
  209. public MdbEmergencyTestTask activeEmergencyTaskGetBySlot(Integer slotIndex) {
  210. return this.emergencyTestTaskMapper.activeEmergencyTaskGetBySlot(slotIndex);
  211. }
  212. // emergency task start
  213. public void emergencyTaskStart( MdbEmergencyTestTask task ) {
  214. task.status = MdbEmergencyTestTask.STATUS_EXECUTING;
  215. task.execStartedAt = System.currentTimeMillis();
  216. this.emergencyTestTaskMapper.executeStart(task);
  217. }
  218. // emergency task end
  219. public void emergencyTaskEnd( MdbEmergencyTestTask task ) {
  220. Integer finishCount = this.testMapper.countFinishedTestsByTaskId(task.id, "emergency");
  221. if ( finishCount < task.getProjectIdList().size() ) {
  222. return ;
  223. }
  224. task.status = MdbEmergencyTestTask.STATUS_FINISHED;
  225. task.execFinishedAt = System.currentTimeMillis();
  226. this.emergencyTestTaskMapper.executeEnd(task);
  227. }
  228. // emergency task cancel
  229. public void emergencyTaskCancel( MdbEmergencyTestTask task ) {
  230. task.status = MdbEmergencyTestTask.STATUS_CANCELED;
  231. task.execFinishedAt = System.currentTimeMillis();
  232. this.emergencyTestTaskMapper.executeCancel(task);
  233. }
  234. // test tube rack task current get
  235. public MdbTestTubeRackTestTask testTubeRackTaskCurrentGet() {
  236. return this.testTubeRackTestTaskMapper.findCurrentTask();
  237. }
  238. // update test tube rack task
  239. public void regularTaskUpdate( MdbTestTubeRackTestTask task ) {
  240. this.testTubeRackTestTaskMapper.update(task);
  241. }
  242. // test tube rack task list
  243. public List<MdbTestTubeRackTestTask> regularTaskEditableList() {
  244. return this.testTubeRackTestTaskMapper.findAllEditableTasks();
  245. }
  246. // regular task start
  247. public void regularTaskStart( MdbTestTubeRackTestTask task ) {
  248. task.status = MdbTestTubeRackTestTask.STATUS_EXECUTING;
  249. task.execStartedAt = System.currentTimeMillis();
  250. this.testTubeRackTestTaskMapper.testStart(task);
  251. }
  252. // regular task tube update
  253. public void regularTaskTubeUpdate( MdbTestTubeRackTestTaskTube tube ) {
  254. this.testTubeRackTestTaskTubeMapper.update(tube);
  255. }
  256. // test tube rack task tube status update
  257. public void regularTaskTubeStatusUpdate( MdbTestTubeRackTestTaskTube tube ) {
  258. this.testTubeRackTestTaskTubeMapper.statusUpdate(tube);
  259. }
  260. // regular task tube start
  261. public void regularTaskTubeStart( MdbTestTubeRackTestTask task, MdbTestTubeRackTestTaskTube tube ) {
  262. tube.status = MdbTestTubeRackTestTaskTube.STATUS_EXECUTING;
  263. tube.execStartedAt = System.currentTimeMillis();
  264. this.testTubeRackTestTaskTubeMapper.testStart(tube);
  265. }
  266. // emergency task end
  267. public void regularTaskTubeEnd( MdbTestTubeRackTestTask task, MdbTestTubeRackTestTaskTube tube ) {
  268. tube.status = MdbTestTubeRackTestTaskTube.STATUS_FINISHED;
  269. tube.execFinishedAt = System.currentTimeMillis();
  270. this.testTubeRackTestTaskTubeMapper.testEnd(tube);
  271. Integer finishedCount = this.testTubeRackTestTaskTubeMapper.countByRackIdAndStatus(task.id, MdbTestTubeRackTestTaskTube.STATUS_FINISHED);
  272. Integer ignoredCount = this.testTubeRackTestTaskTubeMapper.countByRackIdAndStatus(task.id, MdbTestTubeRackTestTaskTube.STATUS_IGNORED);
  273. Integer totalCount = this.testTubeRackTestTaskTubeMapper.countByRackId(task.id);
  274. if ( finishedCount + ignoredCount >= totalCount ) {
  275. task.status = MdbTestTubeRackTestTask.STATUS_FINISHED;
  276. task.execFinishedAt = System.currentTimeMillis();
  277. this.testTubeRackTestTaskMapper.testFinish(task);
  278. }
  279. }
  280. // emergency task cancel
  281. public void regularTaskCancel( MdbTestTubeRackTestTask task ) {
  282. task.status = MdbTestTubeRackTestTask.STATUS_CANCELED;
  283. task.execFinishedAt = System.currentTimeMillis();
  284. this.testTubeRackTestTaskMapper.testCancel(task);
  285. }
  286. // test update
  287. public void testUpdate( MdbTest test ) {
  288. this.testMapper.update(test);
  289. }
  290. // test end
  291. public void testEnd(MdbTest test) {
  292. test.status = "FINISHED";
  293. this.testMapper.statusUpdate(test);
  294. }
  295. // test cancel
  296. public void testCancel(MdbTest test) {
  297. test.status = "CANCELED";
  298. this.testMapper.statusUpdate(test);
  299. }
  300. // test search
  301. public List<MdbTest> testSearch (ParamTestSearch param) {
  302. return this.testMapper.search(param);
  303. }
  304. // test count
  305. public Integer testCount( ParamTestSearch param ) {
  306. return this.testMapper.count(param);
  307. }
  308. // test list
  309. public List<MdbTest> testActiveBatchList() {
  310. return this.testMapper.activeBatchList(this.batchId);
  311. }
  312. public void testBatchDeleteById(ParamBatchDeleteById param) {
  313. this.actionLog.log("test.batch-delete");
  314. this.testMapper.batchDeleteById(param.idList);
  315. }
  316. // create test
  317. public void insert(MdbTest test) {
  318. Calendar calendar = Calendar.getInstance();
  319. calendar.set(Calendar.HOUR_OF_DAY, 0);
  320. calendar.set(Calendar.MINUTE, 0);
  321. calendar.set(Calendar.SECOND, 0);
  322. calendar.set(Calendar.MILLISECOND, 0);
  323. Long startTime = calendar.getTimeInMillis();
  324. int count = this.testMapper.countByTimeRange(startTime, System.currentTimeMillis());
  325. test.serialCode = String.format("%s_%03d", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMdd")), count + 1);
  326. test.batchId = this.batchId;
  327. test.startedBy = this.accountService.getCurrentAccountId();
  328. test.startedAt = System.currentTimeMillis();
  329. this.testMapper.insert(test);
  330. }
  331. // update test
  332. public void statusUpdate(MdbTest test) {
  333. this.testMapper.statusUpdate(test);
  334. }
  335. // update test
  336. public void resultUpdate(MdbTest test) {
  337. this.testMapper.resultUpdate(test);
  338. }
  339. // log step start
  340. public void logStepStart(MdbTest test, TestStepLogEntry entry ) {
  341. entry.testId = test.id;
  342. entry.startedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  343. this.testStepMapper.insert(entry);
  344. }
  345. // log step end
  346. public void logStepEnd(TestStepLogEntry entry) {
  347. entry.finishedAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  348. this.testStepMapper.update(entry);
  349. }
  350. // cancel all tasks
  351. public void cancelAllTasks() {
  352. this.testTubeRackTestTaskMapper.cancelAllTasks();
  353. this.testTubeRackTestTaskTubeMapper.cancelAllTasks();
  354. this.emergencyTestTaskMapper.cancelAllTasks();
  355. this.testMapper.cancelAllTasks();
  356. }
  357. }