package com.qyft.ms.app.service; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.qyft.ms.app.common.constant.WebSocketMessageType; import com.qyft.ms.app.common.generator.PathGenerator; import com.qyft.ms.app.common.result.CMDResultCode; import com.qyft.ms.app.model.entity.OperationLog; import com.qyft.ms.app.model.form.CMDForm; import com.qyft.ms.app.model.vo.ExecutionResult; import com.qyft.ms.device.service.DeviceTcpCMDService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.awt.*; import java.util.*; import java.util.List; import java.util.function.Function; import java.util.function.Supplier; import static com.qyft.ms.app.common.generator.PathGenerator.generatePathPoints; @Slf4j @RequiredArgsConstructor @Service public class CMDService { private final WebSocketService webSocketService; private final DeviceTcpCMDService deviceTcpCMDService; private final OperationLogService operationLogService; private final MatrixCraftService matrixCraftService; private void initExecutorThread(List> cmdList, CMDForm form) { new Thread(() -> run(cmdList, form)).start(); } // 电机移动 public boolean moveMotorToPosition(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); String axis = (String) params.get("axis"); double position = Optional.ofNullable(params.get("position")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition(axis, position)); initExecutorThread(cmdList, form); return true; }; // 切换清洗管路/喷涂管路 public boolean switchThreeWayValve(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); String type = (String) params.get("type"); if (type.equals("clean")) { cmdList.add(deviceTcpCMDService::switchThreeWayValveToSubstrate); } else if (type.equals("spray")) { cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray); } initExecutorThread(cmdList, form); return true; } // 除湿阀、清洗阀、喷嘴阀控制方法 public boolean controlValve(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); if(params.get("valveType") !=null && params.get("isOpen") !=null) { String valveType = (String) params.get("valveType"); boolean isOpen = (boolean) params.get("isOpen"); cmdList.add(() -> deviceTcpCMDService.controlValve(valveType,isOpen)); } initExecutorThread(cmdList, form); return true; } // 以指定电压值开启高压电 public boolean turnOnHighVoltage(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); double voltage = Optional.ofNullable(params.get("voltage")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage(voltage)); initExecutorThread(cmdList, form); return true; } // 关闭高压电 public boolean turnOffHighVoltage(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); cmdList.add(deviceTcpCMDService::turnOffHighVoltage); initExecutorThread(cmdList, form); return true; } // 以指定转速、方向和时间开启注射泵 public boolean turnOnSyringePump(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); double time = Optional.ofNullable(params.get("time")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); String direction = (String) params.get("direction"); cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(rotationSpeed, direction, time)); initExecutorThread(cmdList, form); return true; } // 停止注射泵 public boolean turnOffSyringePump(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); cmdList.add(deviceTcpCMDService::turnOffSyringePump); initExecutorThread(cmdList, form); return true; } // 设置指定轴的电机运行时电流 public boolean setMotorRunningCurrent(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); String axis = (String) params.get("axis"); double current = Optional.ofNullable(params.get("current")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); cmdList.add(() -> deviceTcpCMDService.setMotorRunningCurrent(axis, current)); initExecutorThread(cmdList, form); return true; } // 开始喷涂 public boolean startWork(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); // 托盘位置 Map trayPosition = new HashMap<>(); trayPosition.put("x", 0); trayPosition.put("y", 0); trayPosition.put("z", 0); int space = (Integer) params.get("space"); List> position = (List>) params.get("position"); Map p1 = position.get(0); Map p2 = position.get(1); // 托盘点位 x y z int left = trayPosition.get("x")+ p1.get("x"); int right = trayPosition.get("x") + p2.get("x"); int top = trayPosition.get("y") + p2.get("y"); int bottom = trayPosition.get("y") + p1.get("y"); // 获取轨迹list int direction = (Integer) params.get("direction"); List horizontalPath = generatePathPoints( left, right, bottom, top, space, direction == 1 ? PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN : PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT ); // 将三通阀转至喷涂管路 cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray); // 设置指定轴的电机的运行速度 int setMotorSpeed = (Integer) params.get("setMotorSpeed"); cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("x", setMotorSpeed)); cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("y", setMotorSpeed)); cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("z", setMotorSpeed)); // 移动到指定高度(位置) int height = (Integer) params.get("height"); cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("z",trayPosition.get("z") + height )); cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", left)); cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", top)); // 是否加电 电压 Object voltage = params.get("voltage"); if (voltage instanceof Integer) { cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage( (Integer) voltage)); } // 开启喷嘴阀 cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true)); // 推注射泵 cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(100, "right", 5000)); // 插入日志 cmdList.add( () -> { OperationLog operationLog = new OperationLog(); operationLog.setStatus(0); operationLog.setMatrixId((Long) params.get("matrixCraftId")); operationLog.setMatrixInfo(JSON.toJSONString(params)); operationLogService.add(operationLog); return true; }); // 执行轨迹 double curX = left; double curY = top; for (Point point : horizontalPath) { double nextX = (int) point.getX(); double nextY = (int) point.getY(); double distanceX = nextX - curX; double distanceY = nextY - curY; cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", distanceX)); cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", distanceY)); curX = nextX; curY = nextY; } // 停止喷涂 cmdList.add(deviceTcpCMDService::turnOffSyringePump); // 关闭喷嘴阀 cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true)); // 回到原点 cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X")); cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Y")); cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z")); // 结束日志 cmdList.add( () -> { OperationLog operationLog = operationLogService.getIng(); operationLog.setStatus(1); operationLogService.updateById(operationLog); return true; }); initExecutorThread(cmdList, form); return true; } // 结束喷涂 public boolean stopWork(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); // 停止喷涂 cmdList.add(deviceTcpCMDService::turnOffSyringePump); // 关闭喷嘴阀 cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true)); // 回到原点 cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X")); cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z")); initExecutorThread(cmdList, form); return true; } // 测试轴转动 public boolean rotate(CMDForm form) { Map params = form.getParams(); List> cmdList = new ArrayList<>(); String axis = (String) params.get("axis"); double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed")) .filter(Number.class::isInstance) .map(Number.class::cast) .map(Number::doubleValue) .orElse(0.0); int time = (Integer) params.get("time"); cmdList.add(() -> deviceTcpCMDService.rotate(axis, rotationSpeed, time)); initExecutorThread(cmdList, form); return true; } private void run(List> cmdList, CMDForm form) { ExecutionResult executionResult = new ExecutionResult(); executionResult.setCommandId(form.getCommandId()); executionResult.setCommandName(form.getCommandName()); // 执行所有命令 for (Supplier command : cmdList) { boolean result = command.get(); if (!result) { log.error("指令执行异常: {}", JSONUtil.toJsonStr(form)); executionResult.setStatus(CMDResultCode.FAILURE.getCode()); executionResult.setMessage(CMDResultCode.FAILURE.getMsg()); webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult); return; } } log.info("指令执行成功: {}", JSONUtil.toJsonStr(form)); executionResult.setStatus(CMDResultCode.SUCCESS.getCode()); executionResult.setMessage(CMDResultCode.SUCCESS.getMsg()); webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult); } }