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.

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