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.

609 lines
24 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. package com.qyft.ms.app.service;
  2. import cn.hutool.json.JSONUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.qyft.ms.app.common.constant.WebSocketMessageType;
  5. import com.qyft.ms.app.common.generator.PathGenerator;
  6. import com.qyft.ms.app.common.result.CMDResultCode;
  7. import com.qyft.ms.app.model.entity.OperationLog;
  8. import com.qyft.ms.app.model.entity.SysSettings;
  9. import com.qyft.ms.app.model.form.CMDForm;
  10. import com.qyft.ms.app.model.vo.ExecutionResult;
  11. import com.qyft.ms.device.model.bo.DeviceStatus;
  12. import com.qyft.ms.device.service.DeviceStatusService;
  13. import com.qyft.ms.device.service.DeviceTcpCMDService;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.stereotype.Service;
  17. import java.util.*;
  18. import java.util.function.Supplier;
  19. import static com.qyft.ms.app.common.generator.PathGenerator.generatePathPoints;
  20. @Slf4j
  21. @RequiredArgsConstructor
  22. @Service
  23. public class CMDService {
  24. private final WebSocketService webSocketService;
  25. private final DeviceTcpCMDService deviceTcpCMDService;
  26. private final OperationLogService operationLogService;
  27. private final ISysSettingsService sysSettingsService;
  28. private final DeviceStatusService deviceStatusService;
  29. private volatile boolean running = true;
  30. private void initExecutorThread(List<Supplier<Boolean>> cmdList, CMDForm form) {
  31. new Thread(() -> run(cmdList, form)).start();
  32. }
  33. // 电机移动
  34. public boolean moveMotorToPosition(CMDForm form) {
  35. Map<String, Object> params = form.getParams();
  36. if (params == null || !params.containsKey("axis") || !params.containsKey("position")) {
  37. return false;
  38. }
  39. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  40. String axis = (String) params.get("axis");
  41. double position = Optional.ofNullable(params.get("position"))
  42. .filter(Number.class::isInstance)
  43. .map(Number.class::cast)
  44. .map(Number::doubleValue)
  45. .orElse(0.0);
  46. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition(axis, position));
  47. initExecutorThread(cmdList, form);
  48. return true;
  49. };
  50. // 切换清洗管路/喷涂管路
  51. public boolean switchThreeWayValve(CMDForm form) {
  52. Map<String, Object> params = form.getParams();
  53. if (params == null || !params.containsKey("type")) {
  54. return false;
  55. }
  56. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  57. String type = (String) params.get("type");
  58. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve(type));
  59. initExecutorThread(cmdList, form);
  60. return true;
  61. }
  62. // 除湿阀、清洗阀、喷嘴阀控制方法
  63. public boolean controlValve(CMDForm form) {
  64. Map<String, Object> params = form.getParams();
  65. if (params == null || !params.containsKey("type") || !params.containsKey("isOpen")) {
  66. return false;
  67. }
  68. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  69. if(params.get("type") !=null && params.get("isOpen") !=null) {
  70. String type = (String) params.get("type");
  71. boolean isOpen = (boolean) params.get("isOpen");
  72. cmdList.add(() -> deviceTcpCMDService.controlValve(type,isOpen));
  73. }
  74. initExecutorThread(cmdList, form);
  75. return true;
  76. }
  77. // 以指定电压值开启高压电
  78. public boolean turnOnHighVoltage(CMDForm form) {
  79. Map<String, Object> params = form.getParams();
  80. if (params == null || !params.containsKey("voltage")) {
  81. return false;
  82. }
  83. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  84. int voltage = (int) params.get("voltage");
  85. if(voltage> 5000) {
  86. return false;
  87. }
  88. cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage(voltage));
  89. initExecutorThread(cmdList, form);
  90. return true;
  91. }
  92. // 关闭高压电
  93. public boolean turnOffHighVoltage(CMDForm form) {
  94. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  95. cmdList.add(deviceTcpCMDService::turnOffHighVoltage);
  96. initExecutorThread(cmdList, form);
  97. return true;
  98. }
  99. // 以指定转速开启注射泵
  100. public boolean turnOnSyringePump(CMDForm form) {
  101. Map<String, Object> params = form.getParams();
  102. if (params == null || !params.containsKey("rotationSpeed")) {
  103. return false;
  104. }
  105. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  106. double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed"))
  107. .filter(Number.class::isInstance)
  108. .map(Number.class::cast)
  109. .map(Number::doubleValue)
  110. .orElse(0.0);
  111. cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(rotationSpeed));
  112. initExecutorThread(cmdList, form);
  113. return true;
  114. }
  115. // 停止注射泵
  116. public boolean turnOffSyringePump(CMDForm form) {
  117. Map<String, Object> params = form.getParams();
  118. if (params == null) {
  119. return false;
  120. }
  121. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  122. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  123. initExecutorThread(cmdList, form);
  124. return true;
  125. }
  126. // 设置指定轴的电机运行时电流
  127. public boolean setMotorRunningCurrent(CMDForm form) {
  128. Map<String, Object> params = form.getParams();
  129. if (params == null || !params.containsKey("axis") || !params.containsKey("current")) {
  130. return false;
  131. }
  132. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  133. String axis = (String) params.get("axis");
  134. double current = Optional.ofNullable(params.get("current"))
  135. .filter(Number.class::isInstance)
  136. .map(Number.class::cast)
  137. .map(Number::doubleValue)
  138. .orElse(0.0);
  139. cmdList.add(() -> deviceTcpCMDService.setMotorRunningCurrent(axis, current));
  140. initExecutorThread(cmdList, form);
  141. return true;
  142. }
  143. // 开始喷涂
  144. public String startWork(CMDForm form) {
  145. Map<String, Object> params = form.getParams();
  146. if (
  147. params == null ||
  148. !params.containsKey("position") ||
  149. !params.containsKey("space") ||
  150. !params.containsKey("routeType") ||
  151. !params.containsKey("movementSpeed") ||
  152. !params.containsKey("height") ||
  153. !params.containsKey("matrixFlowVelocity") ||
  154. !params.containsKey("nitrogenFlowVelocity")
  155. ) {
  156. return "参数错误";
  157. }
  158. if ( operationLogService.getIng() != null) {
  159. return "当前有正在运行的任务";
  160. }
  161. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  162. // 托盘位置
  163. List<SysSettings> slidePositionList = sysSettingsService.getSlidePositionList();
  164. List<Map<String, Integer>> position = (List<Map<String, Integer>>) params.get("position");
  165. if (position == null) {
  166. return "position参数错误";
  167. }
  168. // 设置指定轴的电机的运行速度
  169. int movementSpeed = (Integer) params.get("movementSpeed");
  170. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("X", movementSpeed));
  171. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("Y", movementSpeed));
  172. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("Z", 10));
  173. // 回到原点
  174. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Z", 5));
  175. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("X", 5));
  176. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", 5));
  177. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
  178. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
  179. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Y"));
  180. for (int i = 0; i < position.size(); i++) {
  181. Map<String, Integer> p = position.get(i);
  182. if (p.get("x1") == null || p.get("y1") == null || p.get("x2") == null || p.get("y2") == null || p.get("index") == null) {
  183. return "position参数错误";
  184. }
  185. // 玻片的位置
  186. String p1 = slidePositionList.get(p.get("index")).getValue();
  187. String[] p1s = p1.split(",");
  188. double x = Double.parseDouble(p1s[0]);
  189. double y = Double.parseDouble(p1s[1]);
  190. double z = Double.parseDouble(p1s[2]);
  191. // 玻片范围的实际位置
  192. // 托盘点位 x y z
  193. double left =x+ p.get("x1");
  194. double right = x+ p.get("x2");
  195. double top = y+ p.get("y1");
  196. double bottom = y+ p.get("y2");
  197. int space = (Integer) params.get("space");
  198. int routeType = (Integer) params.get("routeType");
  199. List<PathGenerator.Points> horizontalPath = generatePathPoints(
  200. left, right, top, bottom, space, routeType == 1 ? PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN : PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT
  201. );
  202. log.info("horizontalPath:{}", horizontalPath);
  203. if(horizontalPath.isEmpty()) {
  204. return "路径规划失败";
  205. }
  206. // 将三通阀转至喷涂管路
  207. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve("clear_spray"));
  208. // 移动到指定高度(位置)
  209. int height = (Integer) params.get("height");
  210. if(height < 15) {
  211. return "高度设置太低,有撞针的风险";
  212. }
  213. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Z",z - height ));
  214. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("X", left));
  215. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", top));
  216. // 是否加电 电压
  217. Object voltage = params.get("voltage");
  218. if (voltage instanceof Integer) {
  219. cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage( (Integer) voltage));
  220. }
  221. // 开启喷嘴阀
  222. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  223. // 推注射泵
  224. int matrixFlowVelocity = (int) params.get("matrixFlowVelocity");
  225. cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(matrixFlowVelocity));
  226. // 插入日志
  227. if(i == 0) {
  228. cmdList.add( () -> {
  229. OperationLog operationLog = new OperationLog();
  230. operationLog.setStatus(0);
  231. operationLog.setMatrixId((Long) params.get("matrixCraftId"));
  232. operationLog.setMatrixInfo(JSON.toJSONString(params));
  233. operationLogService.add(operationLog);
  234. return true;
  235. });
  236. cmdList.add(() -> {
  237. sysSettingsService.updateWorkStatus("spraying");
  238. return true;
  239. });
  240. }
  241. // 执行轨迹
  242. for (PathGenerator.Points point : horizontalPath) {
  243. double nextX = (int) point.getX();
  244. double nextY = (int) point.getY();
  245. log.info("当前喷针位置x:{}, y:{}", nextX, nextY );
  246. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("X", nextX));
  247. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", nextY));
  248. }
  249. // 停止喷涂
  250. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  251. // 关闭喷嘴阀
  252. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  253. }
  254. // 关闭高压
  255. cmdList.add(deviceTcpCMDService::turnOffHighVoltage);
  256. // 回到原点
  257. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
  258. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Y"));
  259. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
  260. // 结束日志
  261. cmdList.add( () -> {
  262. OperationLog operationLog = operationLogService.getIng();
  263. operationLog.setStatus(1);
  264. operationLogService.updateById(operationLog);
  265. return true;
  266. });
  267. cmdList.add(() -> {
  268. sysSettingsService.updateWorkStatus("idle");
  269. Map<String, String> result = new HashMap<>();
  270. result.put("code", "spray_complete");
  271. result.put("msg", "喷涂任务已完成");
  272. webSocketService.pushMsg(WebSocketMessageType.WARN, result);
  273. return true;
  274. });
  275. new Thread(() -> {
  276. running = true;
  277. ExecutionResult executionResult = new ExecutionResult();
  278. executionResult.setCommandId(form.getCommandId());
  279. executionResult.setCommandName(form.getCommandName());
  280. // 执行所有命令
  281. for (Supplier<Boolean> command : cmdList) {
  282. boolean result = command.get();
  283. try {
  284. Thread.sleep(100);
  285. } catch (InterruptedException e) {
  286. throw new RuntimeException(e);
  287. }
  288. if(!running) {
  289. log.error("指令线程停止: {}", JSONUtil.toJsonStr(form));
  290. executionResult.setStatus(CMDResultCode.FAILURE.getCode());
  291. executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
  292. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  293. return;
  294. }
  295. // try {
  296. // Thread.sleep(5000);
  297. // } catch (InterruptedException e) {
  298. // throw new RuntimeException(e);
  299. // }
  300. if (!result) {
  301. log.error("指令执行异常: {}", JSONUtil.toJsonStr(form));
  302. executionResult.setStatus(CMDResultCode.FAILURE.getCode());
  303. executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
  304. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  305. return;
  306. }
  307. }
  308. log.info("指令执行成功: {}", JSONUtil.toJsonStr(form));
  309. executionResult.setStatus(CMDResultCode.SUCCESS.getCode());
  310. executionResult.setMessage(CMDResultCode.SUCCESS.getMsg());
  311. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  312. }).start();
  313. return "ok";
  314. }
  315. // 结束喷涂
  316. public boolean stopWork(CMDForm form) {
  317. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  318. cmdList.add(() -> {
  319. running = false;
  320. return true;
  321. });
  322. // 停止喷涂
  323. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  324. // 关闭高压
  325. cmdList.add(deviceTcpCMDService::turnOffHighVoltage);
  326. // 关闭喷嘴阀
  327. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  328. // 回到原点
  329. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
  330. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
  331. // 结束日志
  332. cmdList.add( () -> {
  333. OperationLog operationLog = operationLogService.getIng();
  334. operationLog.setStatus(1);
  335. operationLogService.updateById(operationLog);
  336. return true;
  337. });
  338. cmdList.add(() -> {
  339. sysSettingsService.updateWorkStatus("idle");
  340. return true;
  341. });
  342. initExecutorThread(cmdList, form);
  343. return true;
  344. }
  345. // 轴停止转动
  346. public boolean stopMotor(CMDForm form) {
  347. Map<String, Object> params = form.getParams();
  348. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  349. String axis = (String) params.get("axis");
  350. cmdList.add(() -> deviceTcpCMDService.stopMotor(axis));
  351. initExecutorThread(cmdList, form);
  352. return true;
  353. }
  354. // 开始清洗
  355. public boolean startWash(CMDForm form) {
  356. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  357. Map<String, Object> params = form.getParams();
  358. String type = (String) params.get("type");
  359. // type: "injector" | "nozzle"
  360. if(Objects.equals(type, "injector")) {
  361. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve("clear_spray"));
  362. cmdList.add(() -> deviceTcpCMDService.controlValve("Cleaning", true));
  363. } else if (Objects.equals(type, "nozzle")) {
  364. Map<String, Double> wasteLiquorPosition = sysSettingsService.getWasteLiquorPosition();
  365. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("X", wasteLiquorPosition.get("x")));
  366. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", wasteLiquorPosition.get("y")));
  367. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Z", wasteLiquorPosition.get("z")));
  368. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve("clear_nozzle"));
  369. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  370. }
  371. cmdList.add(() -> {
  372. sysSettingsService.updateWorkStatus("washing");
  373. return true;
  374. });
  375. initExecutorThread(cmdList, form);
  376. return true;
  377. }
  378. // 结束清洗
  379. public boolean stopWash(CMDForm form) {
  380. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  381. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve("close_all"));
  382. cmdList.add(() -> deviceTcpCMDService.controlValve("Cleaning", false));
  383. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", false));
  384. cmdList.add(() -> {
  385. sysSettingsService.updateWorkStatus("idle");
  386. return true;
  387. });
  388. initExecutorThread(cmdList, form);
  389. return true;
  390. }
  391. // 照明灯板控制方法
  392. /**
  393. * 以指定亮度开启照明灯板
  394. * brightness 亮度值范围 0 - 100
  395. * @return 操作是否成功
  396. */
  397. public boolean turnOnLightPanel(CMDForm form) {
  398. Map<String, Object> params = form.getParams();
  399. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  400. cmdList.add(() -> deviceTcpCMDService.turnOnLightPanel());
  401. initExecutorThread(cmdList, form);
  402. return true;
  403. }
  404. /**
  405. * 关闭照明灯板
  406. * @return 操作是否成功
  407. */
  408. public boolean turnOffLightPanel(CMDForm form) {
  409. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  410. cmdList.add(deviceTcpCMDService::turnOffLightPanel);
  411. initExecutorThread(cmdList, form);
  412. return true;
  413. }
  414. // 开始预充
  415. public boolean startPrefill(CMDForm form) {
  416. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  417. Map<String, Object> params = form.getParams();
  418. cmdList.add(() -> deviceTcpCMDService.switchThreeWayValve("clear_spray"));
  419. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
  420. cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump((Double) params.get("rotationSpeed")));
  421. cmdList.add(() -> {
  422. sysSettingsService.updateWorkStatus("prefilling");
  423. return true;
  424. });
  425. initExecutorThread(cmdList, form);
  426. return true;
  427. }
  428. // 停止预充
  429. public boolean stopPrefill(CMDForm form) {
  430. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  431. cmdList.add(deviceTcpCMDService::turnOffSyringePump);
  432. cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", false));
  433. cmdList.add(() -> {
  434. sysSettingsService.updateWorkStatus("idle");
  435. return true;
  436. });
  437. initExecutorThread(cmdList, form);
  438. return true;
  439. }
  440. // 电机回到原点
  441. public boolean motorMoveToHome(CMDForm form) {
  442. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  443. Map<String, Object> params = form.getParams();
  444. String axis = (String) params.get("axis");
  445. cmdList.add(() -> deviceTcpCMDService.motorMoveToHome(axis));
  446. initExecutorThread(cmdList, form);
  447. return true;
  448. }
  449. // 开始除湿
  450. public boolean startDehumidify(CMDForm form) {
  451. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  452. Map<String, Object> params = form.getParams();
  453. cmdList.add(() -> {
  454. sysSettingsService.updateWorkStatus("dehumidifying");
  455. return true;
  456. });
  457. double humidity = Optional.ofNullable(params.get("humidity"))
  458. .filter(Number.class::isInstance)
  459. .map(Number.class::cast)
  460. .map(Number::doubleValue)
  461. .orElse(0.0);
  462. cmdList.add(() -> deviceTcpCMDService.controlValve("Dehumidification", true));
  463. cmdList.add(() -> {
  464. sysSettingsService.updateTargetHumidity(humidity);
  465. while (true) {
  466. double targetHumidity = sysSettingsService.getTargetHumidity();
  467. DeviceStatus deviceStatus = deviceStatusService.getDeviceStatus();
  468. if (deviceStatus.getHumidity()<=targetHumidity ) {
  469. deviceTcpCMDService.controlValve("Dehumidification", false);
  470. sysSettingsService.updateWorkStatus("idle");
  471. Map<String, String> result = new HashMap<>();
  472. result.put("code", "dehumidify_complete");
  473. result.put("msg", "已达到目标湿度");
  474. webSocketService.pushMsg(WebSocketMessageType.WARN, result);
  475. break;
  476. }
  477. }
  478. return true;
  479. });
  480. initExecutorThread(cmdList, form);
  481. return true;
  482. }
  483. // 结束除湿
  484. public boolean stopDehumidify(CMDForm form) {
  485. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  486. cmdList.add(() -> deviceTcpCMDService.controlValve("Dehumidification", false));
  487. cmdList.add(() -> {
  488. sysSettingsService.updateWorkStatus("idle");
  489. return true;
  490. });
  491. initExecutorThread(cmdList, form);
  492. return true;
  493. }
  494. // 设置电机速度
  495. public boolean setMotorSpeed(CMDForm form) {
  496. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  497. Map<String, Object> params = form.getParams();
  498. String axis = (String) params.get("axis");
  499. double speed = Optional.ofNullable(params.get("speed"))
  500. .filter(Number.class::isInstance)
  501. .map(Number.class::cast)
  502. .map(Number::doubleValue)
  503. .orElse(0.0);
  504. cmdList.add(() -> deviceTcpCMDService.setMotorSpeed(axis, speed));
  505. initExecutorThread(cmdList, form);
  506. return true;
  507. }
  508. // 托盘推入
  509. public boolean trayOut(CMDForm form) {
  510. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  511. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", 150));
  512. initExecutorThread(cmdList, form);
  513. return true;
  514. }
  515. // 托盘推出
  516. public boolean trayIn(CMDForm form) {
  517. List<Supplier<Boolean>> cmdList = new ArrayList<>();
  518. cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("Y", 0));
  519. initExecutorThread(cmdList, form);
  520. return true;
  521. }
  522. public void run(List<Supplier<Boolean>> cmdList, CMDForm form) {
  523. ExecutionResult executionResult = new ExecutionResult();
  524. executionResult.setCommandId(form.getCommandId());
  525. executionResult.setCommandName(form.getCommandName());
  526. // 执行所有命令
  527. for (Supplier<Boolean> command : cmdList) {
  528. boolean result = command.get();
  529. // try {
  530. // Thread.sleep(5000);
  531. // } catch (InterruptedException e) {
  532. // throw new RuntimeException(e);
  533. // }
  534. if (!result) {
  535. log.error("指令执行异常: {}", JSONUtil.toJsonStr(form));
  536. executionResult.setStatus(CMDResultCode.FAILURE.getCode());
  537. executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
  538. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  539. return;
  540. }
  541. }
  542. log.info("指令执行成功: {}", JSONUtil.toJsonStr(form));
  543. executionResult.setStatus(CMDResultCode.SUCCESS.getCode());
  544. executionResult.setMessage(CMDResultCode.SUCCESS.getMsg());
  545. webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
  546. }
  547. }