40 changed files with 1853 additions and 140 deletions
Binary file not shown.
@ -0,0 +1,49 @@ |
|||
package org.nl.acs.device_driver.basedriver.elevator; |
|||
|
|||
import org.nl.acs.device_driver.DeviceDriver; |
|||
import org.nl.acs.device_driver.DeviceDriverDefinition; |
|||
import org.nl.acs.opc.Device; |
|||
import org.nl.acs.opc.DeviceType; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 电梯 |
|||
*/ |
|||
@Service |
|||
public class ElevatorDefinition implements DeviceDriverDefinition { |
|||
@Override |
|||
public String getDriverCode() { |
|||
return "standard_elevator"; |
|||
} |
|||
|
|||
@Override |
|||
public String getDriverName() { |
|||
return "电梯"; |
|||
} |
|||
|
|||
@Override |
|||
public String getDriverDescription() { |
|||
return "电梯"; |
|||
} |
|||
|
|||
@Override |
|||
public DeviceDriver getDriverInstance(Device device) { |
|||
return (new ElevatorDeviceDriver()).setDevice(device).setDriverDefinition(this); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public Class<? extends DeviceDriver> getDeviceDriverType() { |
|||
return ElevatorDeviceDriver.class; |
|||
} |
|||
|
|||
@Override |
|||
public List<DeviceType> getFitDeviceTypes() { |
|||
List<DeviceType> types = new LinkedList(); |
|||
types.add(DeviceType.elevator); |
|||
return types; |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
package org.nl.acs.device_driver.basedriver.elevator; |
|||
|
|||
import lombok.Getter; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.Setter; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.acs.device_driver.DeviceDriver; |
|||
import org.nl.acs.device_driver.RouteableDeviceDriver; |
|||
import org.nl.acs.device_driver.driver.AbstractDeviceDriver; |
|||
|
|||
|
|||
/** |
|||
* 电梯 |
|||
*/ |
|||
@Slf4j |
|||
@Getter |
|||
@Setter |
|||
@RequiredArgsConstructor |
|||
public class ElevatorDeviceDriver extends AbstractDeviceDriver implements DeviceDriver, RouteableDeviceDriver { |
|||
} |
|||
|
@ -0,0 +1,38 @@ |
|||
package org.nl.acs.device_driver.rgv.enums; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Getter; |
|||
|
|||
/** |
|||
* @Description TODO |
|||
* @Author Gengby |
|||
* @Date 2024/4/25 |
|||
*/ |
|||
@Getter |
|||
@AllArgsConstructor |
|||
public enum PositionEnum { |
|||
P_1(1, "充电位"), |
|||
P_11(11, "工位1"), |
|||
P_21(21, "工位2"), |
|||
P_31(31, "工位3"), |
|||
P_41(41, "工位4"), |
|||
P_51(51, "工位5"), |
|||
P_61(61, "工位6"), |
|||
P_71(71, "充电位"), |
|||
P_81(81, "工位7"), |
|||
P_91(91, "工位8"), |
|||
P_101(101, "工位9"), |
|||
P_111(111, "工位10"); |
|||
|
|||
private final Integer value; |
|||
private final String label; |
|||
|
|||
public static String getLabel(Integer value) { |
|||
for (PositionEnum strategy : PositionEnum.values()) { |
|||
if (strategy.getValue().equals(value)) { |
|||
return strategy.getLabel(); |
|||
} |
|||
} |
|||
return "工位"; |
|||
} |
|||
} |
@ -0,0 +1,51 @@ |
|||
package org.nl.acs.ext.xg.rest; |
|||
|
|||
import cn.dev33.satoken.annotation.SaIgnore; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import io.swagger.annotations.Api; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.acs.ext.log.OthersToInterfaceLog; |
|||
import org.nl.acs.ext.xg.service.XgToAcsService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.http.HttpStatus; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
/** |
|||
* @Description TODO |
|||
* @Author Gengby |
|||
* @Date 2024/8/8 |
|||
*/ |
|||
@RestController |
|||
@RequiredArgsConstructor |
|||
@Api(tags = "仙工调用接口") |
|||
@RequestMapping("/api/elevator") |
|||
@Slf4j |
|||
@SaIgnore |
|||
public class XgToAcsController { |
|||
|
|||
@Autowired |
|||
private XgToAcsService xgToAcsService; |
|||
|
|||
@PostMapping("/call") |
|||
@OthersToInterfaceLog("AGV->ACS") |
|||
public ResponseEntity<Object> call(@RequestBody JSONObject param) { |
|||
return new ResponseEntity<>(xgToAcsService.call(param), HttpStatus.OK); |
|||
} |
|||
|
|||
@PostMapping("/status") |
|||
@OthersToInterfaceLog("AGV->ACS") |
|||
public ResponseEntity<Object> status(@RequestBody JSONObject param) { |
|||
return new ResponseEntity<>(xgToAcsService.status(param), HttpStatus.OK); |
|||
} |
|||
|
|||
@PostMapping("/setDoor") |
|||
@OthersToInterfaceLog("AGV->ACS") |
|||
public ResponseEntity<Object> setDoor(@RequestBody JSONObject param) { |
|||
return new ResponseEntity<>(xgToAcsService.setDoor(param), HttpStatus.OK); |
|||
} |
|||
} |
@ -0,0 +1,37 @@ |
|||
package org.nl.acs.ext.xg.service; |
|||
|
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
|
|||
/** |
|||
* @Description TODO |
|||
* @Author Gengby |
|||
* @Date 2024/8/8 |
|||
*/ |
|||
public interface XgToAcsService { |
|||
|
|||
/** |
|||
* 呼叫楼层 |
|||
* |
|||
* @param param |
|||
* @return |
|||
*/ |
|||
JSONObject call(JSONObject param); |
|||
|
|||
/** |
|||
* 查看电梯状态 |
|||
* |
|||
* @param param |
|||
* @return |
|||
*/ |
|||
JSONArray status(JSONObject param); |
|||
|
|||
|
|||
/** |
|||
* 开关门 |
|||
* |
|||
* @param param |
|||
* @return |
|||
*/ |
|||
JSONObject setDoor(JSONObject param); |
|||
} |
@ -0,0 +1,295 @@ |
|||
package org.nl.acs.ext.xg.service.impl; |
|||
|
|||
import cn.hutool.core.collection.CollectionUtil; |
|||
import cn.hutool.core.util.StrUtil; |
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.acs.ext.xg.service.XgToAcsService; |
|||
import org.nl.acs.opc.Device; |
|||
import org.nl.acs.opc.DeviceAppService; |
|||
import org.nl.acs.opc.DeviceType; |
|||
import org.nl.modules.common.exception.BadRequestException; |
|||
import org.nl.start.auto.run.ElevatorSocketConnectionAutoRun; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.List; |
|||
|
|||
|
|||
/** |
|||
* @Description TODO |
|||
* @Author Gengby |
|||
* @Date 2024/8/8 |
|||
*/ |
|||
@Service |
|||
@RequiredArgsConstructor |
|||
@Slf4j |
|||
public class XgToAcsServiceImpl implements XgToAcsService { |
|||
|
|||
@Autowired |
|||
private DeviceAppService deviceAppService; |
|||
|
|||
@Override |
|||
public JSONObject call(JSONObject param) { |
|||
//电梯编号
|
|||
String elevatorCode = param.getString("elevatorCode"); |
|||
if (StrUtil.isEmpty(elevatorCode)) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "电梯编号不能为空!"); |
|||
return resp; |
|||
} |
|||
//目标楼层
|
|||
Integer floor = param.getInteger("floor"); |
|||
if (floor == null) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "目标楼层不能为空!"); |
|||
return resp; |
|||
} |
|||
String doorStatusMsg = "00110000000601039CAC0001"; |
|||
int[] doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); |
|||
boolean doorStatus = determineDoorStatus(doorStatusRec); |
|||
if (doorStatus) { |
|||
String currentFloorHexMsg = "00050000000601039C410001"; |
|||
int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); |
|||
int currentFloor = determineFloor(currentFloorRec); |
|||
if (currentFloor == floor) { |
|||
String openDoorHexMsg = "002B0000000601069C7A0001"; |
|||
ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "电梯已开门,已继续下发开门信号"); |
|||
return resp; |
|||
} else { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "电梯门已打开,无法呼叫楼层!"); |
|||
return resp; |
|||
} |
|||
} |
|||
//下发目标楼层
|
|||
String callFloorHexMsg = ""; |
|||
if (floor == 1) { |
|||
callFloorHexMsg = "001A0000000601069C580001"; |
|||
} else if (floor == 2) { |
|||
callFloorHexMsg = "00170000000601069C580002"; |
|||
} else if (floor == 3) { |
|||
callFloorHexMsg = "00200000000601069C580004"; |
|||
} else { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "呼叫楼层号错误!"); |
|||
return resp; |
|||
} |
|||
int[] callFloorRec = ElevatorSocketConnectionAutoRun.write("呼叫楼层", callFloorHexMsg); |
|||
int callFloorRecInt = determineCallFloorRec(callFloorRec); |
|||
if (callFloorRecInt != floor) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "呼叫楼层响应报文信息楼层与下发楼层信息不一致!"); |
|||
return resp; |
|||
} |
|||
String currentFloorHexMsg = "00050000000601039C410001"; |
|||
int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); |
|||
int currentFloor = determineFloor(currentFloorRec); |
|||
if (currentFloor != floor) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "当前电梯所在楼层与呼叫楼层不一致!"); |
|||
return resp; |
|||
} |
|||
// String doorStatusMsg = "00110000000601039CAC0001";
|
|||
doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); |
|||
doorStatus = determineDoorStatus(doorStatusRec); |
|||
if (!doorStatus) { |
|||
String openDoorHexMsg = "002B0000000601069C7A0001"; |
|||
ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "当前电梯门状态为关门中状态!"); |
|||
return resp; |
|||
} |
|||
String openDoorHexMsg = "002B0000000601069C7A0001"; |
|||
ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 200); |
|||
resp.put("message", "ok"); |
|||
return resp; |
|||
} |
|||
|
|||
@Override |
|||
public JSONArray status(JSONObject param) { |
|||
JSONArray array = new JSONArray(); |
|||
String elevatorCode = param.getString("elevatorCode"); |
|||
if (StrUtil.isEmpty(elevatorCode)) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "电梯编号不能为空"); |
|||
array.add(resp); |
|||
return array; |
|||
} |
|||
if (!StrUtil.isEmpty(elevatorCode)) { |
|||
String doorStatusMsg = "00110000000601039CAC0001"; |
|||
int[] doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); |
|||
boolean doorStatus = determineDoorStatus(doorStatusRec); |
|||
String currentFloorHexMsg = "00050000000601039C410001"; |
|||
int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); |
|||
int currentFloor = determineFloor(currentFloorRec); |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("elevatorCode", elevatorCode); |
|||
resp.put("floor", currentFloor); |
|||
resp.put("status", doorStatus ? 1 : 0); |
|||
resp.put("move", doorStatus ? 1 : 0); |
|||
array.add(resp); |
|||
return array; |
|||
} |
|||
List<Device> devices = deviceAppService.findDeviceByType(DeviceType.elevator); |
|||
if (CollectionUtil.isEmpty(devices)) { |
|||
return array; |
|||
} |
|||
for (Device device : devices) { |
|||
// String doorStatusMsg = "00110000000601039CAC0001";
|
|||
// ElevatorSocketConnectionAutoRun.write(doorStatusMsg);
|
|||
// boolean doorStatus = elevatorSocketConnectionAutoRun.isCurrentFloorStatus();
|
|||
// String currentFloorHexMsg = "00050000000601039C410001";
|
|||
// ElevatorSocketConnectionAutoRun.write(currentFloorHexMsg);
|
|||
// int currentFloor = elevatorSocketConnectionAutoRun.getCurrentFloor();
|
|||
// JSONObject resp = new JSONObject();
|
|||
// resp.put("elevatorCode", elevatorCode);
|
|||
// resp.put("floor", currentFloor);
|
|||
// resp.put("status", doorStatus ? 1 : 0);
|
|||
// resp.put("move", doorStatus ? 0 : 1);
|
|||
// array.add(resp);
|
|||
} |
|||
return array; |
|||
} |
|||
|
|||
@Override |
|||
public JSONObject setDoor(JSONObject param) { |
|||
//电梯编号
|
|||
String elevatorCode = param.getString("elevatorCode"); |
|||
if (StrUtil.isEmpty(elevatorCode)) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "电梯编号不能为空!"); |
|||
return resp; |
|||
} |
|||
Integer status = param.getInteger("status"); |
|||
if (status == null) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "开关门状态不能为空!"); |
|||
return resp; |
|||
} |
|||
if (status == 1) { |
|||
//开门
|
|||
String openDoorHexMsg = "002B0000000601069C7A0001"; |
|||
int[] openDoor = ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); |
|||
boolean flag = parseOpenResponse(openDoor); |
|||
if (!flag) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "下发开门状态响应报文有误!"); |
|||
return resp; |
|||
} |
|||
} else if (status == 0) { |
|||
//关门
|
|||
String closeDoorHexMsg = "002D0000000601069C7A0008"; |
|||
int[] closeDoor = ElevatorSocketConnectionAutoRun.write("关门", closeDoorHexMsg); |
|||
boolean flag = parseCloseResponse(closeDoor); |
|||
if (!flag) { |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 400); |
|||
resp.put("message", "下发关门状态响应报文有误!"); |
|||
return resp; |
|||
} |
|||
} |
|||
JSONObject resp = new JSONObject(); |
|||
resp.put("code", 200); |
|||
resp.put("message", "ok"); |
|||
return resp; |
|||
} |
|||
|
|||
public static boolean parseOpenResponse(int[] binaryArray) { |
|||
int keyByte = binaryArray[1]; |
|||
if (keyByte == 0x2B) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
public static boolean parseCloseResponse(int[] binaryArray) { |
|||
int keyByte = binaryArray[1]; |
|||
if (keyByte == 0x2D) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 解析当前楼层 |
|||
* |
|||
* @param binaryArray |
|||
* @return |
|||
*/ |
|||
public static int determineFloor(int[] binaryArray) { |
|||
if (binaryArray.length < 8) { |
|||
throw new BadRequestException("结果有误!"); |
|||
} |
|||
int floorByte = binaryArray[9]; |
|||
if (floorByte == 0x31) { |
|||
return 1; |
|||
} else if (floorByte == 0x32) { |
|||
return 2; |
|||
} else if (floorByte == 0x33) { |
|||
return 3; |
|||
} |
|||
return -1; |
|||
} |
|||
|
|||
/** |
|||
* 解析开门关门状态 |
|||
* |
|||
* @param binaryArray |
|||
* @return |
|||
*/ |
|||
public static boolean determineDoorStatus(int[] binaryArray) { |
|||
if (binaryArray.length < 8) { |
|||
throw new IllegalArgumentException("结果有误!"); |
|||
} |
|||
int lastByte = binaryArray[binaryArray.length - 1]; |
|||
if (lastByte == 0x10) { |
|||
return true; |
|||
} else if (lastByte == 0x00) { |
|||
return false; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 解析呼叫楼层 |
|||
* |
|||
* @param binaryArray |
|||
* @return |
|||
*/ |
|||
public static int determineCallFloorRec(int[] binaryArray) { |
|||
if (binaryArray.length < 8) { |
|||
throw new IllegalArgumentException("结果有误!"); |
|||
} |
|||
int floorByte = binaryArray[1]; |
|||
if (floorByte == 0x1A) { |
|||
return 1; |
|||
} else if (floorByte == 0x17) { |
|||
return 2; |
|||
} else if (floorByte == 0x20) { |
|||
return 3; |
|||
} |
|||
return -1; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,162 @@ |
|||
package org.nl.acs.socket.elevator; |
|||
|
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.modules.common.exception.BadRequestException; |
|||
|
|||
import java.io.*; |
|||
import java.net.Socket; |
|||
import java.net.SocketTimeoutException; |
|||
import java.util.Arrays; |
|||
|
|||
/** |
|||
* @Description TODO |
|||
* @Author Gengby |
|||
* @Date 2024/8/8 |
|||
*/ |
|||
@Slf4j |
|||
public class ElevatorSocketUtil { |
|||
//private static Socket socket;
|
|||
//private static DataOutputStream outToServer;
|
|||
//private static BufferedReader inFromServer;
|
|||
//private static String ipAddress = "192.168.8.236";
|
|||
//private static int portNumber = 502;
|
|||
|
|||
public static synchronized boolean startConnection(String ip, int port) { |
|||
// try {
|
|||
// ipAddress = ip;
|
|||
// portNumber = port;
|
|||
// Socket socket = new Socket(ip, port);
|
|||
// DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
|
|||
// BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
|||
// socket.setSoTimeout(10000);
|
|||
// return true;
|
|||
// } catch (IOException e) {
|
|||
// e.printStackTrace();
|
|||
// return false;
|
|||
// }
|
|||
return false; |
|||
} |
|||
|
|||
private static synchronized boolean ensureConnection(String ip, int port) { |
|||
// if (socket == null || socket.isClosed() || !socket.isConnected()) {
|
|||
// return startConnection(ip, port);
|
|||
// }
|
|||
// return true;
|
|||
return false; |
|||
} |
|||
|
|||
public static synchronized int[] sendMessageAndGetResponse(String ip, int port, String hexMessage) { |
|||
Socket socket = null; |
|||
DataOutputStream outToServer = null; |
|||
BufferedReader inFromServer = null; |
|||
String message = null; |
|||
try { |
|||
log.info("{}:{},开始连接; 下发报文:{}", ip, port, hexMessage); |
|||
socket = new Socket(ip, port); |
|||
outToServer = new DataOutputStream(socket.getOutputStream()); |
|||
inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
|||
socket.setSoTimeout(5000); |
|||
//sendMessage(outToServer, hexMessage);
|
|||
byte[] messageBytes = hexStringToByteArray(hexMessage); |
|||
outToServer.write(messageBytes); |
|||
//String message = receiveMessage(socket);
|
|||
try (InputStream inputStream = socket.getInputStream(); |
|||
ByteArrayOutputStream buffer = new ByteArrayOutputStream()) { |
|||
byte[] data = new byte[1024]; |
|||
int nRead; |
|||
while ((nRead = inputStream.read(data, 0, data.length)) != -1) { |
|||
buffer.write(data, 0, nRead); |
|||
if (nRead < 1024) { |
|||
break; |
|||
} |
|||
} |
|||
buffer.flush(); |
|||
message = byteArrayToHexString(buffer.toByteArray()); |
|||
log.info("{}:{},开始连接; 读取报文:{}", ip, port, message); |
|||
} |
|||
if (ObjectUtil.isEmpty(message)) { |
|||
return new int[]{-1}; |
|||
} |
|||
return binary(message); |
|||
} catch (IOException e) { |
|||
log.error("{}:{},连接失败; 失败原因:{}", ip, port, e.getMessage()); |
|||
log.error("{}:{},连接失败; 堆栈信息:{}", ip, port, Arrays.toString(e.getStackTrace())); |
|||
e.printStackTrace(); |
|||
throw new BadRequestException(e.getMessage()); |
|||
} finally { |
|||
if (socket != null) { |
|||
try { |
|||
socket.close(); |
|||
} catch (IOException ex) { |
|||
log.error("{}:{},连接失败; 失败原因:{}", ip, port, ex.getMessage()); |
|||
log.error("{}:{},连接失败; 堆栈信息:{}", ip, port, Arrays.toString(ex.getStackTrace())); |
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
private static void sendMessage(DataOutputStream out, String hexMessage) throws IOException { |
|||
byte[] messageBytes = hexStringToByteArray(hexMessage); |
|||
out.write(messageBytes); |
|||
} |
|||
|
|||
private static String receiveMessage(Socket socket) throws IOException { |
|||
try (InputStream inputStream = socket.getInputStream(); |
|||
ByteArrayOutputStream buffer = new ByteArrayOutputStream()) { |
|||
byte[] data = new byte[1024]; |
|||
int nRead; |
|||
while ((nRead = inputStream.read(data, 0, data.length)) != -1) { |
|||
buffer.write(data, 0, nRead); |
|||
if (nRead < 1024) { |
|||
break; |
|||
} |
|||
} |
|||
buffer.flush(); |
|||
return byteArrayToHexString(buffer.toByteArray()); |
|||
} catch (SocketTimeoutException e) { |
|||
e.printStackTrace(); |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
private static byte[] hexStringToByteArray(String s) { |
|||
int length = s.length(); |
|||
byte[] data = new byte[length / 2]; |
|||
for (int i = 0; i < length; i += 2) { |
|||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) |
|||
+ Character.digit(s.charAt(i + 1), 16)); |
|||
} |
|||
return data; |
|||
} |
|||
|
|||
private static String byteArrayToHexString(byte[] bytes) { |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
sb.append(String.format("%02X", b)); |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
|
|||
public static int[] binary(String hexString) { |
|||
hexString = hexString.replaceAll(" ", ""); |
|||
int[] intArray = new int[hexString.length() / 2]; |
|||
for (int i = 0; i < hexString.length(); i += 2) { |
|||
String byteString = hexString.substring(i, i + 2); |
|||
intArray[i / 2] = Integer.parseInt(byteString, 16); |
|||
} |
|||
return intArray; |
|||
} |
|||
|
|||
|
|||
public static void reverseArray(int[] array) { |
|||
int temp; |
|||
int n = array.length; |
|||
for (int i = 0; i < n / 2; i++) { |
|||
temp = array[i]; |
|||
array[i] = array[n - i - 1]; |
|||
array[n - i - 1] = temp; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
package org.nl.modules.quartz.task; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.acs.auto.run.AutoRunService; |
|||
import org.nl.modules.system.service.ParamService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* 电梯自动重连 |
|||
*/ |
|||
@Slf4j |
|||
@Component |
|||
public class ElevatorAutoReconnection { |
|||
|
|||
@Autowired |
|||
ParamService paramService; |
|||
|
|||
@Autowired |
|||
AutoRunService autoRunService; |
|||
|
|||
public void run(String threadCode) throws Exception { |
|||
String[] threadCodes = threadCode.split(","); |
|||
for (String code : threadCodes) { |
|||
if (!autoRunService.getThreadByCode(code).isAlive()) { |
|||
autoRunService.startThread(code); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,156 @@ |
|||
package org.nl.start.auto.run; |
|||
|
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import lombok.Data; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.acs.auto.run.AbstractAutoRunnable; |
|||
import org.nl.modules.system.service.ParamService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.io.*; |
|||
import java.net.InetSocketAddress; |
|||
import java.net.Socket; |
|||
import java.util.Arrays; |
|||
import java.util.Date; |
|||
|
|||
@Slf4j |
|||
@Component |
|||
@Data |
|||
public class ElevatorSocketConnectionAutoRun extends AbstractAutoRunnable { |
|||
|
|||
|
|||
private int recordTimeOut = 10000; |
|||
private Date recordTime; |
|||
private static Socket socket; |
|||
private static DataOutputStream dos; |
|||
private static BufferedReader dis; |
|||
private boolean bConnected = true; |
|||
|
|||
|
|||
@Autowired |
|||
private ParamService paramService; |
|||
|
|||
|
|||
public ElevatorSocketConnectionAutoRun() { |
|||
this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); |
|||
} |
|||
|
|||
@Override |
|||
public String getCode() { |
|||
return ElevatorSocketConnectionAutoRun.class.getSimpleName(); |
|||
} |
|||
|
|||
@Override |
|||
public String getName() { |
|||
return "电梯在线Socket连接"; |
|||
} |
|||
|
|||
@Override |
|||
public void autoRun() throws IOException, InterruptedException { |
|||
System.out.println("电梯链接开始"); |
|||
String ip = "192.168.8.236"; |
|||
int port = 502; |
|||
InetSocketAddress socketAddress = new InetSocketAddress(ip, port); |
|||
socket = new Socket(); |
|||
socket.connect(socketAddress, 2 * 1000); |
|||
socket.setKeepAlive(true); |
|||
dos = new DataOutputStream(socket.getOutputStream()); |
|||
dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
|||
while (bConnected) { |
|||
String heartbeat = "00060000000601039C430001"; |
|||
int[] heartRec = write("心跳", heartbeat); |
|||
if (heartRec.length < 8) { |
|||
log.error("PLC端开连接......"); |
|||
throw new IllegalArgumentException("PLC端开连接!"); |
|||
} |
|||
Thread.sleep(5000); |
|||
} |
|||
} |
|||
|
|||
|
|||
@Override |
|||
public void stop() { |
|||
super.after(); |
|||
try { |
|||
socket.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
|
|||
public static synchronized int[] write(String name, String hexMessage) { |
|||
String message = null; |
|||
try { |
|||
log.info("下发{}报文:{}", name, hexMessage); |
|||
dos = new DataOutputStream(socket.getOutputStream()); |
|||
dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
|||
socket.setSoTimeout(5000); |
|||
byte[] messageBytes = hexStringToByteArray(hexMessage); |
|||
dos.write(messageBytes); |
|||
dos.flush(); |
|||
InputStream inputStream = socket.getInputStream(); |
|||
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); |
|||
byte[] data = new byte[1024]; |
|||
int nRead; |
|||
while ((nRead = inputStream.read(data, 0, data.length)) != -1) { |
|||
buffer.write(data, 0, nRead); |
|||
if (nRead < 1024) { |
|||
break; |
|||
} |
|||
} |
|||
buffer.flush(); |
|||
message = byteArrayToHexString(buffer.toByteArray()); |
|||
log.info("读取{}报文:{}", name, message); |
|||
if (ObjectUtil.isEmpty(message)) { |
|||
return new int[]{-1}; |
|||
} |
|||
return binary(message); |
|||
} catch (IOException e) { |
|||
log.error("失败原因:{}", e.getMessage()); |
|||
log.error("堆栈信息:{}", Arrays.toString(e.getStackTrace())); |
|||
e.printStackTrace(); |
|||
if (ObjectUtil.isNotEmpty(socket)) { |
|||
try { |
|||
dis.close(); |
|||
dos.close(); |
|||
socket.close(); |
|||
log.error("连接出现异常,已关闭连接"); |
|||
} catch (IOException ex) { |
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
} |
|||
return new int[]{-1}; |
|||
} |
|||
|
|||
private static byte[] hexStringToByteArray(String s) { |
|||
int length = s.length(); |
|||
byte[] data = new byte[length / 2]; |
|||
for (int i = 0; i < length; i += 2) { |
|||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) |
|||
+ Character.digit(s.charAt(i + 1), 16)); |
|||
} |
|||
return data; |
|||
} |
|||
|
|||
private static String byteArrayToHexString(byte[] bytes) { |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
sb.append(String.format("%02X", b)); |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
|
|||
|
|||
public static int[] binary(String hexString) { |
|||
hexString = hexString.replaceAll(" ", ""); |
|||
int[] intArray = new int[hexString.length() / 2]; |
|||
for (int i = 0; i < hexString.length(); i += 2) { |
|||
String byteString = hexString.substring(i, i + 2); |
|||
intArray[i / 2] = Integer.parseInt(byteString, 16); |
|||
} |
|||
return intArray; |
|||
} |
|||
} |
@ -0,0 +1,33 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<included> |
|||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/> |
|||
<property name="LOG_HOME" value="${logPath}"/> |
|||
<!-- 按照每天生成日志文件 --> |
|||
<appender name="Elevator" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> |
|||
<!--日志文件输出的文件名--> |
|||
<FileNamePattern>${LOG_HOME}/电梯/%d{yyyy-MM-dd}.%i.log</FileNamePattern> |
|||
<!--日志文件保留天数--> |
|||
<maxHistory>15</maxHistory> |
|||
<!--单个日志最大容量 至少10MB才能看得出来--> |
|||
<maxFileSize>200MB</maxFileSize> |
|||
<!--所有日志最多占多大容量--> |
|||
<totalSizeCap>2GB</totalSizeCap> |
|||
</rollingPolicy> |
|||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> |
|||
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> |
|||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|||
<charset>${log.charset}</charset> |
|||
</encoder> |
|||
|
|||
</appender> |
|||
|
|||
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender"> |
|||
<appender-ref ref="Elevator"/> |
|||
<!-- 设置队列大小,根据您的需求调整 --> |
|||
<queueSize>512</queueSize> |
|||
</appender> |
|||
<logger name="org.nl.start.auto.run.ElevatorSocketConnectionAutoRun" level="info" additivity="true"> |
|||
<appender-ref ref="asyncFileAppender"/> |
|||
</logger> |
|||
</included> |
@ -0,0 +1,33 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<included> |
|||
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/> |
|||
<property name="LOG_HOME" value="${logPath}"/> |
|||
<!-- 按照每天生成日志文件 --> |
|||
<appender name="ElevatorSocketUtil" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> |
|||
<!--日志文件输出的文件名--> |
|||
<FileNamePattern>${LOG_HOME}/电梯请求报文信息/%d{yyyy-MM-dd}.%i.log</FileNamePattern> |
|||
<!--日志文件保留天数--> |
|||
<maxHistory>15</maxHistory> |
|||
<!--单个日志最大容量 至少10MB才能看得出来--> |
|||
<maxFileSize>200MB</maxFileSize> |
|||
<!--所有日志最多占多大容量--> |
|||
<totalSizeCap>2GB</totalSizeCap> |
|||
</rollingPolicy> |
|||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> |
|||
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> |
|||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
|||
<charset>${log.charset}</charset> |
|||
</encoder> |
|||
|
|||
</appender> |
|||
|
|||
<appender name="asyncFileAppender" class="ch.qos.logback.classic.AsyncAppender"> |
|||
<appender-ref ref="ElevatorSocketUtil"/> |
|||
<!-- 设置队列大小,根据您的需求调整 --> |
|||
<queueSize>512</queueSize> |
|||
</appender> |
|||
<logger name="org.nl.acs.socket.elevator.ElevatorSocketUtil" level="info" additivity="true"> |
|||
<appender-ref ref="asyncFileAppender"/> |
|||
</logger> |
|||
</included> |
@ -0,0 +1,111 @@ |
|||
<template> |
|||
<!--agv单工位--> |
|||
<div> |
|||
<el-card class="box-card" shadow="never"> |
|||
<div slot="header" class="clearfix"> |
|||
<span class="role-span">指令相关:</span> |
|||
</div> |
|||
<el-form ref="form" :inline="true" :model="form" size="small" label-width="95px"> |
|||
<el-row> |
|||
<el-col :span="8"> |
|||
<el-form-item label="ip地址" prop="ip_address"> |
|||
<el-input |
|||
v-model="form.ip_address" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
<el-col :span="8"> |
|||
<el-form-item label="端口号" prop="ip_port"> |
|||
<el-input |
|||
v-model="form.ip_port" |
|||
/> |
|||
</el-form-item> |
|||
</el-col> |
|||
</el-row> |
|||
</el-form> |
|||
</el-card> |
|||
<el-card class="box-card" shadow="never"> |
|||
<div slot="header" class="clearfix"> |
|||
<span class="role-span" /> |
|||
<el-button |
|||
:loading="false" |
|||
icon="el-icon-check" |
|||
size="mini" |
|||
style="float: right; padding: 6px 9px" |
|||
type="primary" |
|||
@click="doSubmit" |
|||
>保存 |
|||
</el-button> |
|||
</div> |
|||
</el-card> |
|||
|
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { |
|||
queryDriverConfig, |
|||
updateConfig |
|||
} from '@/api/acs/device/driverConfig' |
|||
import crud from '@/mixins/crud' |
|||
|
|||
export default { |
|||
name: 'StandardConveyorControl', |
|||
mixins: [crud], |
|||
props: { |
|||
parentForm: { |
|||
type: Object, |
|||
require: true |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
form: { |
|||
ip_address: '', |
|||
ip_port: null |
|||
} |
|||
} |
|||
}, |
|||
created() { |
|||
this.$nextTick(() => { |
|||
// 从父表单获取设备编码 |
|||
this.device_id = this.$props.parentForm.device_id |
|||
this.device_code = this.$props.parentForm.device_code |
|||
queryDriverConfig(this.device_id, this.$props.parentForm.driver_code).then(data => { |
|||
// 给表单赋值,并且属性不能为空 |
|||
if (data.form) { |
|||
const arr = Object.keys(data.form) |
|||
// 不为空 |
|||
if (arr.length > 0) { |
|||
this.form = data.form |
|||
} |
|||
} |
|||
this.sliceItem() |
|||
}) |
|||
}) |
|||
}, |
|||
methods: { |
|||
doSubmit() { |
|||
this.$refs['form'].validate((valid) => { |
|||
if (valid) { |
|||
this.configLoading = true |
|||
// 根据驱动类型判断是否为路由设备 |
|||
const parentForm = this.parentForm |
|||
parentForm.is_route = true |
|||
updateConfig(parentForm, this.form, this.modeform, this.data1, this.data2).then(res => { |
|||
this.notify('保存成功', 'success') |
|||
this.configLoading = false |
|||
}).catch(err => { |
|||
this.configLoading = false |
|||
console.log(err.response.data.message) |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
|
|||
</style> |
@ -0,0 +1,212 @@ |
|||
package org.nl.wms.sch.task_manage.task.tasks.xkbs; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|||
import org.nl.common.exception.BadRequestException; |
|||
import org.nl.system.service.notice.ISysNoticeService; |
|||
import org.nl.wms.sch.point.service.ISchBasePointService; |
|||
import org.nl.wms.sch.point.service.dao.SchBasePoint; |
|||
import org.nl.wms.sch.region.service.RegionEnum; |
|||
import org.nl.wms.sch.task.service.ISchBaseTaskService; |
|||
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService; |
|||
import org.nl.wms.sch.task.service.dao.SchBaseTask; |
|||
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; |
|||
import org.nl.wms.sch.task_manage.AbstractTask; |
|||
import org.nl.wms.sch.task_manage.GeneralDefinition; |
|||
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; |
|||
import org.nl.wms.sch.task_manage.enums.PointStatusEnum; |
|||
import org.nl.wms.sch.task_manage.enums.PointTypeEnum; |
|||
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum; |
|||
import org.nl.wms.sch.task_manage.task.TaskType; |
|||
import org.nl.wms.sch.task_manage.task.core.TaskStatus; |
|||
import org.nl.wms.util.PointUtils; |
|||
import org.nl.wms.util.TaskUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Component; |
|||
import org.springframework.transaction.annotation.Transactional; |
|||
|
|||
import java.util.Arrays; |
|||
import java.util.List; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 型壳焙烧区空托位送空托盘到空托盘缓存1区或者蜡模制备空托位 |
|||
* |
|||
* @author onepiece |
|||
*/ |
|||
@Component(value = "XKBSSKTask") |
|||
@TaskType("XKBSSKTask") |
|||
public class XKBSSKTask extends AbstractTask { |
|||
private static final String TASK_CONFIG_CODE = "XKBSSKTask"; |
|||
@Autowired |
|||
private ISchBasePointService pointService; |
|||
@Autowired |
|||
private ISchBaseTaskService taskService; |
|||
@Autowired |
|||
private ISchBaseTaskconfigService taskConfigService; |
|||
@Autowired |
|||
private ISysNoticeService noticeService; |
|||
|
|||
@Override |
|||
public void create() throws BadRequestException { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
@Transactional(rollbackFor = Exception.class) |
|||
public void createCompletion(SchBaseTask task) { |
|||
// 配置信息
|
|||
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
|||
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
|||
TaskUtils.setUpdateByAcs(task); |
|||
List<String> nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")) |
|||
.collect(Collectors.toList()); |
|||
// 找终点
|
|||
SchBasePoint point = findEndPoint(nextRegionStr); |
|||
if (ObjectUtil.isEmpty(point)) { |
|||
// 消息通知
|
|||
noticeService.createNotice("空托盘缓存1区或者蜡模制备区空托位未找到终点空位!", TASK_CONFIG_CODE + task.getPoint_code2(), |
|||
NoticeTypeEnum.WARN.getCode()); |
|||
throw new BadRequestException("空托盘缓存1区或者蜡模制备区空托位未找到终点空位!"); |
|||
} |
|||
|
|||
// 设置终点并修改创建成功状态
|
|||
task.setPoint_code2(point.getPoint_code()); |
|||
String point_code1 = task.getPoint_code1(); |
|||
SchBasePoint point1 = pointService.getById(point_code1); |
|||
if (point1 != null) { |
|||
task.setVehicle_code(point1.getVehicle_code()); |
|||
task.setVehicle_type(point1.getVehicle_type()); |
|||
} |
|||
task.setRemark(""); |
|||
task.setVehicle_qty(1); |
|||
task.setTask_status(TaskStatus.CREATED.getCode()); |
|||
task.setCreate_mode(GeneralDefinition.HAND_CREATION); |
|||
taskService.save(task); |
|||
// 点位更新
|
|||
point.setIng_task_code(task.getTask_code()); |
|||
PointUtils.setUpdateByAcs(point); |
|||
pointService.updateById(point); |
|||
} |
|||
|
|||
/** |
|||
* 找空位 |
|||
* |
|||
* @param nextRegionStr |
|||
* @return |
|||
*/ |
|||
private SchBasePoint findEndPoint(List<String> nextRegionStr) { |
|||
LambdaQueryWrapper<SchBasePoint> lam = new LambdaQueryWrapper<>(); |
|||
// 默认一直都有载具
|
|||
lam.in(SchBasePoint::getRegion_code, nextRegionStr) |
|||
// 点位状态是空位
|
|||
.eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) |
|||
// 当前执行的任务为空或者NULL,有数据表示锁住
|
|||
.and(la -> la.isNull(SchBasePoint::getIng_task_code) |
|||
.or() |
|||
.eq(SchBasePoint::getIng_task_code, "")) |
|||
.eq(SchBasePoint::getIs_used, true); |
|||
List<SchBasePoint> schBasePoints = pointService.list(lam); |
|||
SchBasePoint next_point = schBasePoints.stream() |
|||
.filter(point -> RegionEnum.LMZB.getRegion_code().equals(point.getRegion_code())) |
|||
.filter(point -> PointTypeEnum.EMPTY_POINT.getCode().equals(point.getPoint_type())) |
|||
.findFirst() |
|||
.orElse(null); |
|||
if (ObjectUtil.isEmpty(next_point)) { |
|||
next_point = schBasePoints.stream().filter(point -> RegionEnum.KTPHC1.getRegion_code().equals(point.getRegion_code())) |
|||
.findFirst().orElse(null); |
|||
} |
|||
return ObjectUtil.isNotEmpty(schBasePoints) ? next_point : null; |
|||
} |
|||
|
|||
@Override |
|||
protected void updateStatus(String task_code, TaskStatus status) { |
|||
// 校验任务
|
|||
SchBaseTask taskObj = taskService.getByCode(task_code); |
|||
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { |
|||
throw new BadRequestException("该任务已完成!"); |
|||
} |
|||
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { |
|||
throw new BadRequestException("该任务已取消!"); |
|||
} |
|||
// 根据传来的类型去对任务进行操作
|
|||
if (status.equals(TaskStatus.EXECUTING)) { |
|||
taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); |
|||
taskObj.setRemark("执行中"); |
|||
TaskUtils.setUpdateByAcs(taskObj); |
|||
taskService.updateById(taskObj); |
|||
} |
|||
if (status.equals(TaskStatus.FINISHED)) { |
|||
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); |
|||
} |
|||
if (status.equals(TaskStatus.CANCELED)) { |
|||
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void forceFinish(String task_code) { |
|||
SchBaseTask taskObj = taskService.getByCode(task_code); |
|||
if (ObjectUtil.isEmpty(taskObj)) { |
|||
throw new BadRequestException("该任务不存在"); |
|||
} |
|||
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); |
|||
} |
|||
|
|||
@Override |
|||
public void cancel(String task_code) { |
|||
SchBaseTask taskObj = taskService.getByCode(task_code); |
|||
if (ObjectUtil.isEmpty(taskObj)) { |
|||
throw new BadRequestException("该任务不存在"); |
|||
} |
|||
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC); |
|||
} |
|||
|
|||
@Transactional(rollbackFor = Exception.class) |
|||
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { |
|||
// 获取参数
|
|||
SchBasePoint startPointObj = pointService.getById(taskObj.getPoint_code1()); |
|||
// 起点清空
|
|||
if (ObjectUtil.isNotEmpty(startPointObj)) { |
|||
PointUtils.setUpdateByType(startPointObj, taskFinishedType); |
|||
PointUtils.clearPoint(startPointObj); |
|||
pointService.updateById(startPointObj); |
|||
} |
|||
//更新终点的点位信息
|
|||
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2()); |
|||
if (ObjectUtil.isNotEmpty(endPointObj)) { |
|||
endPointObj.setIng_task_code(""); |
|||
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode()); |
|||
endPointObj.setVehicle_code(taskObj.getVehicle_code()); |
|||
endPointObj.setVehicle_type(taskObj.getVehicle_type()); |
|||
endPointObj.setVehicle_qty(taskObj.getVehicle_qty()); |
|||
endPointObj.setUpdate_time(DateUtil.now()); |
|||
PointUtils.setUpdateByType(endPointObj, taskFinishedType); |
|||
pointService.updateById(endPointObj); |
|||
} |
|||
// 任务完成
|
|||
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); |
|||
taskObj.setRemark(GeneralDefinition.TASK_FINISH); |
|||
taskObj.setFinished_type(taskFinishedType.getCode()); |
|||
TaskUtils.setUpdateByType(taskObj, taskFinishedType); |
|||
taskService.updateById(taskObj); |
|||
} |
|||
|
|||
@Transactional(rollbackFor = Exception.class) |
|||
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) { |
|||
// 获取参数
|
|||
SchBasePoint endPointObj = pointService.getById(taskObj.getPoint_code2()); |
|||
// 终点解锁
|
|||
if (ObjectUtil.isNotEmpty(endPointObj)) { |
|||
endPointObj.setIng_task_code(""); |
|||
PointUtils.setUpdateByType(endPointObj, taskFinishedType); |
|||
pointService.updateById(endPointObj); |
|||
} |
|||
taskObj.setTask_status(TaskStatus.CANCELED.getCode()); |
|||
taskObj.setRemark(GeneralDefinition.TASK_CANCEL); |
|||
taskObj.setFinished_type(taskFinishedType.getCode()); |
|||
TaskUtils.setUpdateByType(taskObj, taskFinishedType); |
|||
taskService.updateById(taskObj); |
|||
} |
|||
} |
Loading…
Reference in new issue