From 779650407bbddfe7c4511f8cdf851018c5740e6f Mon Sep 17 00:00:00 2001 From: tuqiang <437016993@qq.com> Date: Fri, 15 Dec 2023 18:05:07 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=96=B0=E5=A2=9E=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=AE=BE=E5=A4=87=E7=8A=B6=E6=80=81=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E7=82=B9=E4=BD=8D=E8=A7=92=E5=BA=A6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/acs/agv/rest/AgvController.java | 5 +- .../org/nl/acs/agv/server/AgvWaitUtil.java | 7 +- .../org/nl/acs/agv/server/dto/AgvDto.java | 18 +- .../acs/agv/server/impl/AgvServiceImpl.java | 193 ++++++++++------- .../angle/rest/AcsPointAngleController.java | 87 ++++++++ .../angle/service/AcsPointAngleService.java | 86 ++++++++ .../angle/service/dto/AcsPointAngleDto.java | 61 ++++++ .../impl/AcsPointAngleServiceImpl.java | 149 +++++++++++++ .../service/impl/DeviceServiceImpl.java | 27 ++- .../java/org/nl/acs/device/wql/device.xls | Bin 259072 -> 206848 bytes .../java/org/nl/acs/device/wql/task_inst.xls | Bin 155648 -> 157696 bytes .../acs/ext/wms/rest/AcsToWmsController.java | 5 +- .../acs/ext/wms/rest/WmsToAcsController.java | 7 + .../acs/ext/wms/service/WmsToAcsService.java | 3 + .../wms/service/impl/WmsToAcsServiceImpl.java | 32 +++ .../service/impl/InstructionServiceImpl.java | 16 +- .../quartz/task/QueryXZAgvDeviceStatus.java | 14 +- .../nl/modules/quartz/task/ToAgvDevice.java | 1 + .../auto/run/NDCSocketConnectionAutoRun.java | 33 +-- qd/src/api/acs/angle/acsPointAngle.js | 35 ++++ qd/src/views/acs/angle/index.vue | 197 ++++++++++++++++++ 21 files changed, 865 insertions(+), 111 deletions(-) create mode 100644 hd/nladmin-system/src/main/java/org/nl/acs/angle/rest/AcsPointAngleController.java create mode 100644 hd/nladmin-system/src/main/java/org/nl/acs/angle/service/AcsPointAngleService.java create mode 100644 hd/nladmin-system/src/main/java/org/nl/acs/angle/service/dto/AcsPointAngleDto.java create mode 100644 hd/nladmin-system/src/main/java/org/nl/acs/angle/service/impl/AcsPointAngleServiceImpl.java create mode 100644 qd/src/api/acs/angle/acsPointAngle.js create mode 100644 qd/src/views/acs/angle/index.vue diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/agv/rest/AgvController.java b/hd/nladmin-system/src/main/java/org/nl/acs/agv/rest/AgvController.java index 19f0b9a..58694b9 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/agv/rest/AgvController.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/agv/rest/AgvController.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils; import org.nl.acs.agv.server.AgvService; import org.nl.acs.device.service.DeviceService; import org.nl.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -22,7 +23,9 @@ import java.util.Enumeration; @RequestMapping("/api") @Slf4j public class AgvController { - private final AgvService agvService; + @Autowired + AgvService agvService; + @Autowired private final DeviceService deviceService; diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java index 2522e96..9071ff8 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/AgvWaitUtil.java @@ -11,6 +11,7 @@ import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.LogServer; import org.nl.exception.BadRequestException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; /** @@ -20,7 +21,11 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor @Slf4j public class AgvWaitUtil { - private final AcsToWmsService acsToWmsService; + + @Lazy + @Autowired + AcsToWmsService acsToWmsService; + @Autowired LogServer logServer; diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java index eb2eec1..5beb551 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java @@ -57,17 +57,17 @@ public class AgvDto implements Serializable { /** * 角度 */ - private String positionAngle; + private float positionAngle; /** * X坐标 */ - private String positionX; + private float positionX; /** * Y坐标 */ - private String positionY; + private float positionY; /** * 当前任务号 @@ -79,6 +79,11 @@ public class AgvDto implements Serializable { */ private String battery_temp; + /** + * 电池电量 + */ + private float battery_level; + /** * 是否阻挡 */ @@ -92,7 +97,12 @@ public class AgvDto implements Serializable { /** * 是否充电 */ - private String charging; + private Boolean charging; + + /** + * 机器人连接状态,0表示断连,1表示连接上 + */ + private Integer connection_status; /** * 控制器温度 diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/AgvServiceImpl.java b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/AgvServiceImpl.java index f81bb09..9f8f6e7 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/AgvServiceImpl.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/AgvServiceImpl.java @@ -12,6 +12,8 @@ import net.sf.json.JSONObject; import org.nl.acs.agv.server.AgvService; import org.nl.acs.agv.server.AgvWaitUtil; import org.nl.acs.agv.server.dto.AgvDto; +import org.nl.acs.angle.service.AcsPointAngleService; +import org.nl.acs.angle.service.dto.AcsPointAngleDto; import org.nl.acs.config.AcsConfig; import org.nl.acs.config.server.AcsConfigService; import org.nl.acs.device.service.DeviceService; @@ -47,10 +49,14 @@ import org.nl.start.auto.run.NDCSocketConnectionAutoRun; import org.nl.utils.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DateFormat; +import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Function; @@ -62,10 +68,13 @@ import java.util.stream.Stream; @RequiredArgsConstructor public class AgvServiceImpl implements AgvService { + protected BusinessLogger execute_log; @Autowired DeviceAppService deviceAppService; + + @Lazy @Autowired TaskService taskService; @Autowired @@ -78,6 +87,8 @@ public class AgvServiceImpl implements AgvService { AcsToWmsService acsToWmsService; @Autowired DeviceService deviceService; + @Autowired + private static AcsPointAngleService acsPointAngleService; private final LogServer logServer; @@ -220,7 +231,7 @@ public class AgvServiceImpl implements AgvService { * demo:destination("cz14", "JackUnload", "3", "") * @return */ - public static JSONObject destination2(String locationName, String operation, String propertiesType, String pro) { + public static JSONObject destination2(String locationName, String operation, String propertiesType, String pro,Instruction dto) { //新增业务订单 JSONObject destinationOrder = new JSONObject(); //目标工作站 @@ -235,10 +246,16 @@ public class AgvServiceImpl implements AgvService { properties.add(pro2); destinationOrder.put("properties", properties); } else if (propertiesType.equals("2")) {//Spin转动 + AcsPointAngleDto acsPointAngleDto = new AcsPointAngleDto(); + acsPointAngleDto = getAcsPointAngleDto(dto); + if (ObjectUtil.isEmpty(acsPointAngleDto)){ + throw new RuntimeException("沒有找到内容,无法下发"); + } + BigDecimal next_point_angle = acsPointAngleDto.getNext_point_angle(); JSONArray properties = new JSONArray(); JSONObject pro1 = new JSONObject(); pro1.put("key", "global_spin_angle");//坐标系类型,global_spin_angle为全局坐标系 - pro1.put("value", pro);//弧度值,如3.14 + pro1.put("value", next_point_angle);//弧度值,如3.14 properties.add(pro1); JSONObject pro2 = new JSONObject(); pro2.put("key", "spin_direction");//固定值 @@ -272,6 +289,21 @@ public class AgvServiceImpl implements AgvService { return destinationOrder; } + private static AcsPointAngleDto getAcsPointAngleDto(Instruction dto) { + List list = acsPointAngleService.queryAll(new HashMap()); + AcsPointAngleDto acsPointAngleDto = new AcsPointAngleDto(); + for (int i = 0; i < list.size(); i++) { + acsPointAngleDto = list.get(i); + String start_device_code = acsPointAngleDto.getStart_device_code(); + String next_device_code = acsPointAngleDto.getNext_device_code(); + String is_active = acsPointAngleDto.getIs_active(); + if (!(dto.getStart_device_code().equals(start_device_code) && dto.getNext_device_code().equals(next_device_code) && is_active == "1")) { + break; + } + } + return acsPointAngleDto; + } + @Override public HttpResponse sendAgvInstToMagic(Instruction inst) throws Exception { JSONArray ja = new JSONArray(); @@ -539,14 +571,16 @@ public class AgvServiceImpl implements AgvService { String positionAngle = jo.getString("positionAngle"); String positionX = jo.getString("positionX"); String positionY = jo.getString("positionY"); + String current_map = jo.getString("current_map"); AgvDto dto = new AgvDto(); dto.setName(name); dto.setEnergyLevel(energyLevel); dto.setState(state); - dto.setPositionAngle(positionAngle); - dto.setPositionX(positionX); - dto.setPositionY(positionY); +// dto.setPositionAngle(positionAngle); +// dto.setPositionX(positionX); +// dto.setPositionY(positionY); dto.setTransportOrder(transportOrder); + dto.setCurrent_map(current_map); if (AGVDeviceStatus.containsKey(name)) { AGVDeviceStatus.remove(name); @@ -599,52 +633,61 @@ public class AgvServiceImpl implements AgvService { @Override public HttpResponse queryXZAgvDeviceStatus() { - if (StrUtil.equals(acsConfigService.findConfigFromCache().get(AcsConfig.FORKAGV).toString(), "1")) { - String agvurl = acsConfigService.findConfigFromCache().get(AcsConfig.AGVURL); - String agvport = acsConfigService.findConfigFromCache().get(AcsConfig.AGVPORT); - + if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.FORKAGV).getValue().toString(), "1")) { + String agvurl = acsConfigService.findByCode(AcsConfig.AGVURL).getValue(); + String agvport = acsConfigService.findByCode(AcsConfig.AGVPORT).getValue(); - String agvurl1 = agvurl + ":" + agvport + "/api/route/vehicles"; - String agvurl2 = agvurl + ":" + agvport + "/api/route/vehicleDetails"; + agvurl = agvurl + ":" + agvport + "/robotsStatus"; - HttpResponse result = HttpRequest.get(agvurl1) - .timeout(20000)//超时,毫秒 - .execute(); - - - HttpResponse result2 = HttpRequest.get(agvurl2) + HttpResponse result = HttpRequest.get(agvurl) .timeout(20000)//超时,毫秒 .execute(); System.out.println("查询agv状态数据:" + result.body()); if (result.getStatus() == 200) { - com.alibaba.fastjson.JSONArray ja = (com.alibaba.fastjson.JSONArray) com.alibaba.fastjson.JSONArray.parse(result.body()); - + com.alibaba.fastjson.JSONObject body = com.alibaba.fastjson.JSONObject.parseObject(result.body()); + com.alibaba.fastjson.JSONArray ja = body.getJSONArray("report"); for (int i = 0; i < ja.size(); i++) { - com.alibaba.fastjson.JSONObject jo = (com.alibaba.fastjson.JSONObject) ja.get(i); - String name = jo.getString("name"); - String state = jo.getString("state"); - String energyLevel = jo.getString("energyLevel"); - String transportOrder = jo.getString("transportOrder"); - com.alibaba.fastjson.JSONObject detailjo = (com.alibaba.fastjson.JSONObject) com.alibaba.fastjson.JSONObject.parse(result2.body()); - com.alibaba.fastjson.JSONObject item = (com.alibaba.fastjson.JSONObject) detailjo.get(name); - String x = item.getString("x"); - String y = item.getString("y"); - String angle = item.getString("angle"); + com.alibaba.fastjson.JSONObject jo = ja.getJSONObject(i); + //机器人编码 + String agv_code = jo.getString("uuid"); + //机器人详细状态信息 + com.alibaba.fastjson.JSONObject rbk_report = jo.getJSONObject("rbk_report"); + //是否正在充电 + Boolean charging = rbk_report.getBoolean("charging"); + //电池电量 + float battery_level = rbk_report.getFloatValue("battery_level"); + //当前地图 + String current_map = rbk_report.getString("current_map"); + //角度 + float angle = rbk_report.getFloatValue("angle"); + //执行运单信息 + com.alibaba.fastjson.JSONObject current_order = jo.getJSONObject("current_order"); + Integer connectionStatus = jo.getInteger("connection_status"); + String inst_code = current_order.getString("id"); + String taskNo= "0"; + if (StrUtil.isNotEmpty(inst_code)) { + Instruction inst = instructionService.findByCodeFromCache(inst_code); + if (ObjectUtil.isNotEmpty(inst)) { + //任务号 + taskNo = inst.getTask_code(); + } + } + //x坐标 + float x = rbk_report.getFloatValue("x"); + //y坐标 + float y = rbk_report.getFloatValue("y"); AgvDto dto = new AgvDto(); - dto.setName(name); - dto.setEnergyLevel(energyLevel); - dto.setState(state); - dto.setTransportOrder(transportOrder); - dto.setPositionAngle(angle); + dto.setName(agv_code); + dto.setCurrent_map(current_map); + dto.setCharging(charging); + dto.setBattery_level(battery_level); + dto.setTransportOrder(taskNo); dto.setPositionX(x); dto.setPositionY(y); - if (AGVDeviceStatus.containsKey(name)) { - AGVDeviceStatus.remove(name); - AGVDeviceStatus.put(name, dto); - } else { - AGVDeviceStatus.put(name, dto); - } + dto.setPositionAngle(angle); + dto.setConnection_status(connectionStatus); + AGVDeviceStatus.put(agv_code, dto); } } return result; @@ -1773,18 +1816,18 @@ public class AgvServiceImpl implements AgvService { MachinesSiteDeviceDriver machinesSiteDeviceDriver; if (device.getDeviceDriver() instanceof MachinesSiteDeviceDriver) { ja.add(destination2(device_code + "IN", "Wait", "1", device_code + "IN" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(device_code, "Wait", "1", device_code - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(device_code + "OUT", "Wait", "1", device_code + "OUT" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } else { - ja.add(destination2(device_code, "Wait", "1", device_code + "-" + inst_code + "-" + "01")); + ja.add(destination2(device_code, "Wait", "1", device_code + "-" + inst_code + "-" + "01",inst)); } } - ja.add(destination2(inst.getNext_point_code(), "Wait", "1", inst.getNext_point_code() + "-" + inst_code + "-" + "01")); + ja.add(destination2(inst.getNext_point_code(), "Wait", "1", inst.getNext_point_code() + "-" + inst_code + "-" + "01",inst)); } else { String startAddress = inst.getStart_device_code(); @@ -1795,25 +1838,25 @@ public class AgvServiceImpl implements AgvService { MachinesSiteDeviceDriver machinesSiteDeviceDriver; if (device.getDeviceDriver() instanceof MachinesSiteDeviceDriver) { ja.add(destination2(startAddress, "Wait", "5", startAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress + "IN", "Wait", "1", nextAddress + "IN" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress, "Wait", "1", nextAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress + "OUT", "Wait", "1", nextAddress + "OUT" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } else { ja.add(destination2(startAddress, "Wait", "1", startAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress, "Wait", "1", nextAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } } else { ja.add(destination2(startAddress, "Wait", "1", startAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress, "Wait", "1", nextAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } } break; @@ -1830,33 +1873,33 @@ public class AgvServiceImpl implements AgvService { if (ObjectUtil.equal(standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("is_pickup_spin"), "true") && ObjectUtil.isNotEmpty(standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("pickup_spin"))) { ja.add(destination2(startAddress + "IQ", "Spin", "2", - standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("pickup_spin").toString())); + standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("pickup_spin").toString(),inst)); } ja.add(destination2(startAddress + "IQ", "Wait", "1", startAddress + "IQ" - + "-" + inst_code + "-" + "07")); + + "-" + inst_code + "-" + "07",inst)); ja.add(destination2(startAddress + "IN", "Wait", "1", startAddress + "IN" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(startAddress, "JackLoad", "3", startAddress - + "-" + inst_code + "-" + "02")); + + "-" + inst_code + "-" + "02",inst)); ja.add(destination2(startAddress + "OUT", "Wait", "1", startAddress + "OUT" - + "-" + inst_code + "-" + "05")); + + "-" + inst_code + "-" + "05",inst)); ja.add(destination2(startAddress + "OQ", "Wait", "1", startAddress + "OQ" - + "-" + inst_code + "-" + "08")); + + "-" + inst_code + "-" + "08",inst)); } else if (startdevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { ja.add(destination2(startAddress + "IN", "Wait", "1", startAddress + "IN" - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(startAddress, "JackLoad", "3", startAddress - + "-" + inst_code + "-" + "02")); + + "-" + inst_code + "-" + "02",inst)); ja.add(destination2(startAddress + "OUT", "Wait", "1", startAddress + "OUT" - + "-" + inst_code + "-" + "05")); + + "-" + inst_code + "-" + "05",inst)); } else { ja.add(destination2(nextAddress, "Wait", "1", startAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(startAddress, "JackLoad", "3", startAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } //终点 @@ -1865,31 +1908,31 @@ public class AgvServiceImpl implements AgvService { if (ObjectUtil.equal(standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("is_release_spin"), "true") && ObjectUtil.isNotEmpty(standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("release_spin"))) { ja.add(destination2(nextAddress + "IQ", "Spin", "2", - standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("release_spin").toString())); + standardManipulatorInspectSiteDeviceDriver.getExtraValue().get("release_spin").toString(),inst)); } ja.add(destination2(nextAddress + "IQ", "Wait", "1", nextAddress + "IQ" - + "-" + inst_code + "-" + "07")); + + "-" + inst_code + "-" + "07",inst)); ja.add(destination2(nextAddress + "IN", "Wait", "1", nextAddress + "IN" - + "-" + inst_code + "-" + "03")); + + "-" + inst_code + "-" + "03",inst)); ja.add(destination2(nextAddress, "JackUnload", "3", nextAddress - + "-" + inst_code + "-" + "04")); + + "-" + inst_code + "-" + "04",inst)); ja.add(destination2(nextAddress + "OUT", "Wait", "1", nextAddress + "OUT" - + "-" + inst_code + "-" + "06")); + + "-" + inst_code + "-" + "06",inst)); ja.add(destination2(nextAddress + "OQ", "Wait", "1", nextAddress + "OQ" - + "-" + inst_code + "-" + "08")); + + "-" + inst_code + "-" + "08",inst)); } else if (nextdevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { ja.add(destination2(nextAddress + "IN", "Wait", "1", nextAddress + "IN" - + "-" + inst_code + "-" + "03")); + + "-" + inst_code + "-" + "03",inst)); ja.add(destination2(nextAddress, "JackUnload", "3", nextAddress - + "-" + inst_code + "-" + "04")); + + "-" + inst_code + "-" + "04",inst)); ja.add(destination2(nextAddress + "OUT", "Wait", "1", nextAddress + "OUT" - + "-" + inst_code + "-" + "06")); + + "-" + inst_code + "-" + "06",inst)); } else { ja.add(destination2(nextAddress, "Wait", "1", nextAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); ja.add(destination2(nextAddress, "JackUnload", "3", nextAddress - + "-" + inst_code + "-" + "01")); + + "-" + inst_code + "-" + "01",inst)); } break; } diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/angle/rest/AcsPointAngleController.java b/hd/nladmin-system/src/main/java/org/nl/acs/angle/rest/AcsPointAngleController.java new file mode 100644 index 0000000..980f886 --- /dev/null +++ b/hd/nladmin-system/src/main/java/org/nl/acs/angle/rest/AcsPointAngleController.java @@ -0,0 +1,87 @@ +package org.nl.acs.angle.rest; + + +import org.nl.acs.angle.service.dto.AcsPointAngleDto; +import org.nl.acs.angle.service.AcsPointAngleService; +import org.springframework.data.domain.Pageable; +import lombok.RequiredArgsConstructor; +import org.nl.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.*; + +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author tuq + * @date 2023-12-11 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "点位角度管理") +@RequestMapping("/api/acsPointAngle") +@Slf4j +public class AcsPointAngleController { + + private final AcsPointAngleService acsPointAngleService; + + @GetMapping + @Log("查询点位角度") + @ApiOperation("查询点位角度") +//@PreAuthorize("@el.check('acsPointAngle:list')") + public ResponseEntity + query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(acsPointAngleService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增点位角度") + @ApiOperation("新增点位角度") + //@PreAuthorize("@el.check('acsPointAngle:add')") + public ResponseEntity + create(@Validated @RequestBody AcsPointAngleDto dto) { + acsPointAngleService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改点位角度") + @ApiOperation("修改点位角度") + //@PreAuthorize("@el.check('acsPointAngle:edit')") + public ResponseEntity + update(@Validated @RequestBody AcsPointAngleDto dto) { + acsPointAngleService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除点位角度") + @ApiOperation("删除点位角度") + //@PreAuthorize("@el.check('acsPointAngle:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + acsPointAngleService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("导出点位角度") + @ApiOperation("导出点位角度") + @GetMapping(value = "/download") + //@PreAuthorize("@el.check('acsPointAngle:list')") + public void download(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + acsPointAngleService.download(acsPointAngleService.queryAll(whereJson), response); + } + @GetMapping("/updateActive") + @Log("是否启用") + @ApiOperation("是否启用") + public ResponseEntity updateOn(@RequestParam String id, @RequestParam String is_active) { + acsPointAngleService.updateOn(id, is_active); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/AcsPointAngleService.java b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/AcsPointAngleService.java new file mode 100644 index 0000000..1abfe83 --- /dev/null +++ b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/AcsPointAngleService.java @@ -0,0 +1,86 @@ +package org.nl.acs.angle.service; + +import org.nl.acs.angle.service.dto.AcsPointAngleDto; +import org.springframework.data.domain.Pageable; + +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** + * @author tuq + * @description 服务接口 + * @date 2023-12-11 + **/ +public interface AcsPointAngleService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + * + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + * + */ + List queryAll(Map whereJson); + + + /** + * 根据ID查询 + * + * @param id ID + * @return AcsPointAngle + */ + AcsPointAngleDto findById(String id); + + /** + * 根据编码查询 + * + * @param code code + * @return AcsPointAngle + */ + AcsPointAngleDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(AcsPointAngleDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(AcsPointAngleDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 导出数据 + * + * @param dtos 待导出的数据 + * @param response / + * @throws IOException / + */ + void download(List dtos, HttpServletResponse response) throws IOException; + + void updateOn(String id, String is_active); +} diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/dto/AcsPointAngleDto.java b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/dto/AcsPointAngleDto.java new file mode 100644 index 0000000..13f0963 --- /dev/null +++ b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/dto/AcsPointAngleDto.java @@ -0,0 +1,61 @@ +package org.nl.acs.angle.service.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import java.io.Serializable; + +/** + * @author tuq + * @description / + * @date 2023-12-11 + **/ +@Data +public class AcsPointAngleDto implements Serializable { + + /** + * id标识 + */ + private String id; + + /** + * 起始设备编码 + */ + private String start_device_code; + + /** + * 目标设备编码 + */ + private String next_device_code; + + + /** + * 目标点位角度 + */ + private BigDecimal next_point_angle; + + /** + * 是否启用 + */ + private String is_active; + + /** + * 创建者 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改者 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/impl/AcsPointAngleServiceImpl.java b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/impl/AcsPointAngleServiceImpl.java new file mode 100644 index 0000000..97e1244 --- /dev/null +++ b/hd/nladmin-system/src/main/java/org/nl/acs/angle/service/impl/AcsPointAngleServiceImpl.java @@ -0,0 +1,149 @@ +package org.nl.acs.angle.service.impl; + + +import lombok.RequiredArgsConstructor; +import org.nl.acs.angle.service.AcsPointAngleService; +import org.nl.acs.angle.service.dto.AcsPointAngleDto; +import org.nl.exception.BadRequestException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.bean.BeanUtil; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.nl.utils.SecurityUtils; +import org.nl.wql.core.bean.ResultBean; +import org.nl.wql.core.bean.WQLObject; +import org.nl.wql.util.WqlUtil; +import org.nl.utils.FileUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author tuq + * @description 服务实现 + * @date 2023-12-11 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class AcsPointAngleServiceImpl implements AcsPointAngleService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "", "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = JSONArray.toList(arr, AcsPointAngleDto.class); + return list; + } + + + @Override + public AcsPointAngleDto findById(String id) { + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONObject json = wo.query("id ='" + id + "'").uniqueResult(0); + final AcsPointAngleDto obj = (AcsPointAngleDto) JSONObject.toBean(json, AcsPointAngleDto.class); + return obj; + } + + @Override + public AcsPointAngleDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + final AcsPointAngleDto obj = (AcsPointAngleDto) JSONObject.toBean(json, AcsPointAngleDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(AcsPointAngleDto dto) { + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + + dto.setId(IdUtil.simpleUUID()); + dto.setCreate_by(currentUsername); + dto.setUpdate_by(currentUsername); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONObject json = JSONObject.fromObject(dto); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(AcsPointAngleDto dto) { + AcsPointAngleDto entity = this.findById(dto.getId()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_by(currentUsername); + + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONObject json = JSONObject.fromObject(dto); + wo.update(json); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + for (String id : ids) { + wo.delete("id = '" + id + "'"); + } + } + + @Override + public void download(List all, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (AcsPointAngleDto acsPointAngle : all) { + Map map = new LinkedHashMap<>(); + map.put("起始设备编码", acsPointAngle.getStart_device_code()); + map.put("目标设备编码", acsPointAngle.getNext_device_code()); + map.put("目标点位角度", acsPointAngle.getNext_point_angle()); + map.put("是否启用", acsPointAngle.getIs_active()); + map.put("创建者", acsPointAngle.getCreate_by()); + map.put("创建时间", acsPointAngle.getCreate_time()); + map.put("修改者", acsPointAngle.getUpdate_by()); + map.put("修改时间", acsPointAngle.getUpdate_time()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } + + @Override + public void updateOn(String id, String is_active) { + AcsPointAngleDto entity = this.findById(id); + entity.setIs_active(is_active); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + entity.setUpdate_by(currentUsername); + entity.setUpdate_time(now); + WQLObject wo = WQLObject.getWQLObject("acs_point_angle"); + JSONObject json = JSONObject.fromObject(entity); + wo.update(json); + } +} diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java b/hd/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java index e8b872e..a1c3061 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java @@ -66,13 +66,26 @@ import java.util.*; @RequiredArgsConstructor @Slf4j public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial { - private final DeviceExtraService deviceExtraService; - private final OpcService opcService; - private final RedisUtils redisUtils; - private final OpcPlcService opcPlcService; - private final DeviceDriverDefinationAppService deviceDriverDefinationAppService; - private final DeviceAppService deviceAppService; - private final AcsConfigService acsConfigService; + @Autowired + DeviceExtraService deviceExtraService; + + @Autowired + OpcService opcService; + + @Autowired + RedisUtils redisUtils; + + @Autowired + OpcPlcService opcPlcService; + + @Autowired + DeviceDriverDefinationAppService deviceDriverDefinationAppService; + + @Autowired + DeviceAppService deviceAppService; + + @Autowired + AcsConfigService acsConfigService; @Autowired TaskService taskService; diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/device.xls b/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/device.xls index a228f66f18ac5ad685ed308d0f00f4216054015a..3c94ef22cee998e1d09f93f4b63db2025b570627 100644 GIT binary patch delta 63603 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 X%RS{@_MUz1rfq!bDs&I0o|L}>YL>z1 diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls b/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls index a8d1d30795bbef7e55fbdb1b89cc416331323351..d7e2130732e1fd16c2e208cb1b739d4c7d9fda77 100644 GIT binary patch delta 13532 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 delta 12016 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 z gccCancelTask(@RequestBody String whereJson) { return new ResponseEntity<>(wmstoacsService.gccCancelTask(whereJson), HttpStatus.OK); } + + @PostMapping("/queryAgvDeviceStatus") + @Log("查询XZAGV设备状态") + @ApiOperation("查询XZAGV设备状态") + public ResponseEntity queryAgvDeviceStatus() { + return new ResponseEntity<>(wmstoacsService.queryAgvDeviceStatus(), HttpStatus.OK); + } } diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index ede3947..00056ef 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -1,5 +1,6 @@ package org.nl.acs.ext.wms.service; +import com.alibaba.fastjson.JSONArray; import net.sf.json.JSONObject; import java.util.Map; @@ -54,4 +55,6 @@ public interface WmsToAcsService { Map queryDevice(String jsonObject) throws Exception; Map gccCancelTask(String whereJson); + + JSONArray queryAgvDeviceStatus(); } diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index bd39488..2b4fefc 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -7,6 +7,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.nl.acs.agv.server.AgvService; +import org.nl.acs.agv.server.dto.AgvDto; import org.nl.acs.config.AcsConfig; import org.nl.acs.config.server.AcsConfigService; import org.nl.acs.device.service.DeviceService; @@ -65,6 +67,9 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { private final RouteLineService RouteLineService; @Autowired LogServer logServer; + @Autowired + AgvService agvService; + @Override public Map createFromWms(String param) { @@ -997,4 +1002,31 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { log.info("gccCancelTask 响应参数:{}", resultJson); return resultJson; } + + @Override + public com.alibaba.fastjson.JSONArray queryAgvDeviceStatus() { + JSONObject json = new JSONObject(); + Map agv_map = agvService.findAllAgvFromCache(); + if(ObjectUtil.isEmpty(agv_map)){ + System.out.println("AGV设备数据为空,无法反馈"); + return new com.alibaba.fastjson.JSONArray(); + } +// JSONArray agv_rows = new JSONArray(); + com.alibaba.fastjson.JSONArray agv_rows = new com.alibaba.fastjson.JSONArray(); + JSONObject row = new JSONObject(); + + for (AgvDto agvDto : agv_map.values()) { + row.put("device_code", agvDto.getName()); + row.put("battery_level", agvDto.getBattery_level()); + row.put("device_status",agvDto.getConnection_status()); + row.put("transportOrder", agvDto.getTransportOrder()); + row.put("positionX", agvDto.getPositionX()); + row.put("positionY", agvDto.getPositionY()); + row.put("positionAngle", agvDto.getPositionAngle()); + row.put("current_map", agvDto.getCurrent_map()); + agv_rows.add(row); + } + log.info("queryAgvDeviceStatus--------------:输出参数" + agv_rows.toString()); + return agv_rows; + } } diff --git a/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index a4c35d5..713c00d 100644 --- a/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -4,6 +4,7 @@ package org.nl.acs.instruction.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpResponse; import lombok.RequiredArgsConstructor; @@ -12,6 +13,8 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang3.ObjectUtils; import org.nl.acs.agv.server.AgvService; +import org.nl.acs.angle.service.AcsPointAngleService; +import org.nl.acs.angle.service.dto.AcsPointAngleDto; import org.nl.acs.config.AcsConfig; import org.nl.acs.config.server.AcsConfigService; import org.nl.acs.device.service.DeviceService; @@ -51,6 +54,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.math.BigDecimal; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -79,6 +83,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu TaskService taskService; + @Override public void autoInitial() { this.reload(); @@ -465,6 +470,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu } + + @Override @Transactional(rollbackFor = Exception.class) public void createAgain(Instruction dto) throws Exception { @@ -669,7 +676,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu } else { jo1.put("hasGoodStatus", "2"); } - jo1.put("put_goods_time",DateUtil.now()); + jo1.put("put_goods_time", DateUtil.now()); jo1.put("material_type", startdevice.getMaterial_type()); jo1.put("quantity", startdevice.getQuantity()); jo1.put("remark", startdevice.getRemark()); @@ -871,7 +878,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu // != 0 为agv任务 1=magic 2=NDC 3=XZ if (!StrUtil.equals(type, "0")) { if (StrUtil.equals(acsConfigService.findConfigFromCache().get(AcsConfig.AGVTYPE).toString(), "1") - && !StrUtil.equals(entity.getSend_status(),"2")) { + && !StrUtil.equals(entity.getSend_status(), "2")) { agvService.deleteAgvInst(entity.getInstruction_code()); flag = true; @@ -883,7 +890,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu flag = true; } } else if (StrUtil.equals(acsConfigService.findConfigFromCache().get(AcsConfig.AGVTYPE).toString(), "3") - && !StrUtil.equals(entity.getSend_status(),"2")) { + && !StrUtil.equals(entity.getSend_status(), "2")) { agvService.deleteXZAgvInst(entity.getInstruction_code()); flag = true; } else { @@ -1037,7 +1044,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu return inst; } } - return null; } + return null; + } @Override public Instruction findByIdFromCache(String id) { diff --git a/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java b/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java index ff38808..bddf23d 100644 --- a/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java +++ b/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java @@ -1,13 +1,16 @@ package org.nl.modules.quartz.task; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import net.sf.json.JSONArray; -import net.sf.json.JSONObject; import org.nl.acs.agv.server.AgvService; import org.nl.acs.device_driver.electric_fence.ElectricFenceDeviceDriver; import org.nl.acs.device_driver.feedback_agv_status_site.FeedbackAGVStatusSiteDeviceDriver; import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; @@ -15,6 +18,9 @@ import org.nl.utils.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.math.RoundingMode; +import java.text.DecimalFormat; + /** * 查询先工AGV设备状态 */ @@ -28,9 +34,11 @@ public class QueryXZAgvDeviceStatus { @Autowired AgvService agvService; + @Autowired + DeviceAppService deviceAppService; + public void run() throws Exception { HttpResponse response = agvService.queryXZAgvDeviceStatus(); } - } diff --git a/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/ToAgvDevice.java b/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/ToAgvDevice.java index 72fa923..71b3448 100644 --- a/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/ToAgvDevice.java +++ b/hd/nladmin-system/src/main/java/org/nl/modules/quartz/task/ToAgvDevice.java @@ -45,6 +45,7 @@ public class ToAgvDevice { row.put("positionX", agvDto.getPositionX()); row.put("positionY", agvDto.getPositionY()); row.put("positionAngle", agvDto.getPositionAngle()); + row.put("current_map", agvDto.getCurrent_map()); agv_rows.add(row); } // json.put("agv_rows", agv_rows); diff --git a/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java b/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java index a679fd5..4a574a2 100644 --- a/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java +++ b/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java @@ -83,14 +83,17 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); } + @Override public String getCode() { return NDCSocketConnectionAutoRun.class.getSimpleName(); } + @Override public String getName() { return "NDC在线连接"; } + @Override public void autoRun() { try { @@ -780,7 +783,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); + dto.setPositionX(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //Y坐标 @@ -794,7 +797,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); + dto.setPositionY(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //角度 @@ -808,7 +811,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); + dto.setPositionAngle(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //电量 @@ -1407,7 +1410,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); + dto.setPositionX(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //Y坐标 @@ -1420,7 +1423,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); + dto.setPositionY(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //角度 @@ -1434,7 +1437,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); + dto.setPositionAngle(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } @@ -1826,7 +1829,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); + dto.setPositionX(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //Y坐标 @@ -1839,7 +1842,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); + dto.setPositionY(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //角度 @@ -1853,7 +1856,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); + dto.setPositionAngle(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } @@ -2946,7 +2949,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); + dto.setPositionX(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //Y坐标 @@ -2959,7 +2962,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); + dto.setPositionY(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //角度 @@ -2973,7 +2976,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); + dto.setPositionAngle(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } @@ -3596,7 +3599,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); + dto.setPositionX(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //Y坐标 @@ -3610,7 +3613,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); + dto.setPositionY(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //角度 @@ -3624,7 +3627,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { dto = new AgvDto(); } dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); + dto.setPositionAngle(Float.valueOf(ikey)); AgvService.updateAgvFromCache(dto); } //电量 diff --git a/qd/src/api/acs/angle/acsPointAngle.js b/qd/src/api/acs/angle/acsPointAngle.js new file mode 100644 index 0000000..c09f5aa --- /dev/null +++ b/qd/src/api/acs/angle/acsPointAngle.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/acsPointAngle', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/acsPointAngle/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/acsPointAngle', + method: 'put', + data + }) +} + +export function updateOn(id, is_active) { + console.log(is_active) + return request({ + url: '/api/acsPointAngle/updateActive?id=' + id + '&is_active=' + is_active, + method: 'get' + }) +} + +export default { add, edit, del, updateOn } diff --git a/qd/src/views/acs/angle/index.vue b/qd/src/views/acs/angle/index.vue new file mode 100644 index 0000000..bec1eb5 --- /dev/null +++ b/qd/src/views/acs/angle/index.vue @@ -0,0 +1,197 @@ + + + + +