From a142f6ed7cb6a37219e3447cc71f945bfa7672f4 Mon Sep 17 00:00:00 2001 From: tuqiang <437016993@qq.com> Date: Mon, 11 May 2026 08:48:41 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=96=B0=E5=A2=9E=E4=BA=A7?= =?UTF-8?q?=E7=BA=BFmes=E5=8F=AB=E6=96=99=E4=BB=A5=E5=8F=8A=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=89=98=E7=9B=98=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=89=8B=E6=8C=81=E7=BB=84=E7=9B=98=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E7=82=B9=E4=BD=8D=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/nl/acs/device.xls | Bin 174592 -> 175104 bytes .../nl/acs/device/service/DeviceService.java | 11 + .../nl/acs/device/service/dto/DeviceDto.java | 2 + .../service/impl/DeviceServiceImpl.java | 16 ++ .../StandardInspectSiteDeviceDriver.java | 29 ++ .../StandardOrdinarySiteDeviceDriver.java | 12 + .../acs/ext/wms/rest/HJXToAcsController.java | 41 +++ .../acs/ext/wms/service/HJXToAcsService.java | 9 + .../wms/service/impl/HJXToAcsServiceImpl.java | 260 ++++++++++++++++++ .../service/impl/InstructionServiceImpl.java | 7 +- .../org/nl/acs/task/service/TaskService.java | 2 + .../task/service/impl/TaskServiceImpl.java | 83 +++++- .../acs/vehicle/rest/VehicleController.java | 61 ++++ .../acs/vehicle/service/VehicleService.java | 32 +++ .../acs/vehicle/service/dto/VehicleDto.java | 54 ++++ .../service/impl/VehicleServiceImpl.java | 121 ++++++++ .../java/org/nl/acs/vehicle/wql/group.wql | 53 ++++ .../java/org/nl/hand/rest/PadController.java | 36 ++- .../java/org/nl/hand/service/PadService.java | 9 + .../org/nl/hand/service/dto/GroupPad.java | 21 ++ .../nl/hand/service/impl/PadServiceImpl.java | 204 ++++++++++++-- .../java/org/nl/modules/system/wql/sys.xls | Bin 100864 -> 104448 bytes .../main/resources/config/application-dev.yml | 2 +- .../resources/config/application-prod.yml | 2 +- .../src/main/resources/config/application.yml | 4 + .../src/main/resources/logback-spring.xml | 2 + .../src/main/resources/sql/228.sql | 22 +- acs/nladmin-ui/.env.production | 4 +- acs/nladmin-ui/src/api/acs/Group.js | 27 ++ .../src/views/acs/device/group/index.vue | 127 +++++++++ acs/nladmin-ui/src/views/acs/device/index.vue | 5 + 31 files changed, 1204 insertions(+), 54 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/HJXToAcsController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/HJXToAcsService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/HJXToAcsServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/vehicle/rest/VehicleController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/VehicleService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/dto/VehicleDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/impl/VehicleServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/vehicle/wql/group.wql create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/service/dto/GroupPad.java create mode 100644 acs/nladmin-ui/src/api/acs/Group.js create mode 100644 acs/nladmin-ui/src/views/acs/device/group/index.vue diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device.xls b/acs/nladmin-system/src/main/java/org/nl/acs/device.xls index 1664120a47755e9baa48eb70ec5a1fe8c6add6cb..223213a7e15e0f0a1c3ab97abf13435d439a38c2 100644 GIT binary patch delta 7256 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 diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/DeviceService.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/DeviceService.java index 9e8c664..7d89cc3 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/DeviceService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/DeviceService.java @@ -74,6 +74,15 @@ public interface DeviceService { */ DeviceDto findByCode(String code); + + /** + * 根据载具编码查询 + * + * @param code code + * @return Device + */ + DeviceDto findByVehicleCode(String code); + /** * 创建 * @@ -300,4 +309,6 @@ public interface DeviceService { * @param request */ void excelImport(MultipartFile file, HttpServletRequest request); + + List findByRegionCode(String region); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/DeviceDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/DeviceDto.java index 7289085..d45e235 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/DeviceDto.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/dto/DeviceDto.java @@ -116,4 +116,6 @@ public class DeviceDto implements Serializable { * 地址号 */ private String address; + + private String vehicle_code; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java index 293f59e..e549344 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java @@ -162,6 +162,14 @@ public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial return obj; } + @Override + public DeviceDto findByVehicleCode(String code) { + WQLObject wo = WQLObject.getWQLObject("acs_device"); + JSONObject json = wo.query("vehicle_code ='" + code + "'").uniqueResult(0); + final DeviceDto obj = JSON.parseObject(String.valueOf(json), DeviceDto.class); + return obj; + } + @Override @Transactional(rollbackFor = Exception.class) public void create(DeviceDto dto) { @@ -1952,6 +1960,14 @@ public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial } } + @Override + public List findByRegionCode(String region) { + WQLObject wo = WQLObject.getWQLObject("acs_device"); + JSONArray arr = wo.query("region ='" + region + "'", "seq_num").getResultJSONArray(0); + List list = arr.toJavaList(DeviceDto.class); + return list; + } + public Map getValue1(JSONArray wss, int j, Integer dbInterval, int i) { int size = wss.size(); Map map = new ListOrderedMap<>(); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java index f8d541d..c6ada05 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import net.dreamlu.mica.core.utils.StringUtil; import org.apache.commons.lang3.ObjectUtils; import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device.service.dto.DeviceDto; import org.nl.acs.device.service.dto.StorageCellDto; import org.nl.acs.device.service.impl.StorageCellServiceImpl; import org.nl.acs.device_driver.DeviceDriver; @@ -32,6 +33,8 @@ import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; import org.nl.modules.lucene.service.LuceneExecuteLogService; import org.nl.modules.lucene.service.dto.LuceneLogDto; import org.nl.modules.system.util.CodeUtil; @@ -67,6 +70,7 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp AcsToHJXService acsToHJXService = SpringContextHolder.getBean(AcsToHJXService.class); AcsToMesService acsToMesService = SpringContextHolder.getBean(AcsToMesService.class); AcsToNDCService acsToNDCService = SpringContextHolder.getBean(AcsToNDCService.class); + VehicleService vehicleService = SpringContextHolder.getBean(VehicleService.class); String container; String container_type_desc; @@ -358,6 +362,12 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp if (ObjectUtils.isEmpty(result1) || result1.getStatus() != 200) { return; } else { + //取货完成 清除托盘信息 + String start_point_code = instruction.getStart_point_code(); + DeviceDto deviceDto = deviceservice.findByCode(start_point_code); + cleanVehicleInfo(deviceDto); + deviceDto.setVehicle_code(""); + deviceservice.update(deviceDto); resetInstTask(agvphase); } } else { @@ -476,6 +486,11 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp if (ObjectUtils.isEmpty(result1) || result1.getStatus() != 200) { return; } else { + //请求放货需要把托盘绑定 + String next_point_code = instruction.getNext_point_code(); + DeviceDto deviceDto = deviceservice.findByCode(next_point_code); + deviceDto.setVehicle_code(instruction.getVehicle_code()); + deviceservice.update(deviceDto); resetInstTask(agvphase); } } else { @@ -663,6 +678,20 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp } + public void cleanVehicleInfo(DeviceDto deviceDto) { + String vehicle_code = deviceDto.getVehicle_code(); + List vehicleDtos = vehicleService.findByVehicleCode(vehicle_code); + if (vehicleDtos.size() > 0) { + for (int i = 0; i < vehicleDtos.size(); i++) { + VehicleDto vehicleDto = vehicleDtos.get(i); + vehicleDto.setOrder_code(null); + vehicleDto.setQty(null); + vehicleDto.setOrder_code(null); + vehicleService.update(vehicleDto); + } + } + } + public boolean exe_error() { if (this.error == 0) { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index e4002e3..f298939 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device.service.dto.DeviceDto; import org.nl.acs.device.service.dto.StorageCellDto; import org.nl.acs.device.service.impl.StorageCellServiceImpl; import org.nl.acs.device_driver.DeviceDriver; @@ -25,6 +26,7 @@ import org.nl.acs.opc.DeviceAppService; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.vehicle.service.VehicleService; import org.nl.modules.lucene.service.LuceneExecuteLogService; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; @@ -58,6 +60,7 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); + VehicleService vehicleService = SpringContextHolder.getBean(VehicleService.class); LuceneExecuteLogService luceneExecuteLogService = SpringContextHolder.getBean(LuceneExecuteLogService.class); //外部系统交互 AcsToZDWmsService acsToZDWmsService = SpringContextHolder.getBean(AcsToZDWmsService.class); @@ -203,6 +206,11 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { return; } else { + //取货完成 解除起点与托盘的绑定关系 + String start_point_code = instruction.getStart_point_code(); + DeviceDto deviceDto = deviceservice.findByCode(start_point_code); + deviceDto.setVehicle_code(""); + deviceservice.update(deviceDto); resetInstTask(agvphase); } } @@ -293,6 +301,10 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple } catch (Exception e) { e.printStackTrace(); } + String next_point_code = instruction.getNext_point_code(); + DeviceDto deviceDto = deviceservice.findByCode(next_point_code); + deviceDto.setVehicle_code(instruction.getVehicle_code()); + deviceservice.update(deviceDto); resetInstTask(agvphase); } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/HJXToAcsController.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/HJXToAcsController.java new file mode 100644 index 0000000..0c6ad94 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/HJXToAcsController.java @@ -0,0 +1,41 @@ +package org.nl.acs.ext.wms.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.wms.service.HJXToAcsService; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.logging.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@Api(tags = "产线mes回传回传接口") +@RequestMapping("/api/hjxToAcs") +@Slf4j +public class HJXToAcsController { + private final HJXToAcsService hjxToAcsService; + + @SaIgnore + @PostMapping("/agvCallback") + @Log("产线mes->ACS") + public ResponseEntity agvCallback(@RequestBody JSONObject obj) throws Exception{ + log.info("---产线mes发起叫料请求---"+obj.toString()); + return new ResponseEntity<>(hjxToAcsService.call(obj), HttpStatus.OK); + } + + @SaIgnore + @PostMapping("/getVehicleInfo") + @Log("产线mes->ACS") + public ResponseEntity getVehicleInfo(@RequestBody JSONObject obj) throws Exception{ + log.info("---产线mes发起获取托盘信息请求---"+obj.toString()); + return new ResponseEntity<>(hjxToAcsService.getVehicleInfo(obj), HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/HJXToAcsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/HJXToAcsService.java new file mode 100644 index 0000000..31e7189 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/HJXToAcsService.java @@ -0,0 +1,9 @@ +package org.nl.acs.ext.wms.service; + +import com.alibaba.fastjson.JSONObject; + +public interface HJXToAcsService { + JSONObject call(JSONObject obj); + + JSONObject getVehicleInfo(JSONObject obj); +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/HJXToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/HJXToAcsServiceImpl.java new file mode 100644 index 0000000..badfabc --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/HJXToAcsServiceImpl.java @@ -0,0 +1,260 @@ +package org.nl.acs.ext.wms.service.impl; + +import cn.hutool.core.util.ObjectUtil; +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.device.service.DeviceService; +import org.nl.acs.device.service.dto.DeviceDto; +import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; +import org.nl.acs.ext.wms.service.HJXToAcsService; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; +import org.nl.modules.system.util.CodeUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class HJXToAcsServiceImpl implements HJXToAcsService { + @Autowired + DeviceAppService deviceAppservice; + @Autowired + DeviceService deviceService; + @Autowired + private TaskService taskService; + @Autowired + VehicleService vehicleService; + + @Override + public JSONObject call(JSONObject obj) { + JSONObject resp = new JSONObject(); + String lineCode = obj.getString("LineCode"); + String portCode = obj.getString("PortCode"); + String orderCode = obj.getString("OrderCode"); + String requestedCode = obj.getString("RequestedCode"); + if (StrUtil.isEmpty(lineCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "lineCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + if (StrUtil.isEmpty(portCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "portCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + if (StrUtil.isEmpty(orderCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "orderCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + if (StrUtil.isEmpty(requestedCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "requestedCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + String endCode = ""; + String startCode = ""; + DeviceDto dto = deviceService.findByCode(portCode); + if (ObjectUtil.isEmpty(dto)) { + resp.put("ResultCode", -1); + resp.put("Message", "未找到设备!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + switch (requestedCode) { + case "1": + case "3": + List deviceDtoList = deviceService.findByRegionCode("23"); + for (DeviceDto deviceDto : deviceDtoList) { + if (StrUtil.isEmpty(deviceDto.getVehicle_code())) { + endCode = deviceDto.getDevice_code(); + break; + } + } + if (StrUtil.isEmpty(endCode)) { + TaskDto taskDto = new TaskDto(); + taskDto.setTask_code(CodeUtil.getNewCode("TASK_NO")); + taskDto.setStart_device_code(portCode); + taskDto.setStart_point_code(portCode); + taskDto.setNext_device_code(endCode); + taskDto.setNext_point_code(endCode); + taskDto.setVehicle_code(dto.getVehicle_code()); + taskDto.setVehicle_type(requestedCode); + if (requestedCode.equals("1")){ + taskDto.setCompound_task(orderCode); + } + taskService.create(taskDto); + } else { + resp.put("ResultCode", -1); + resp.put("Message", "当前上料口关联的位置都有货!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + break; + case "2": + List vehicleDtos = vehicleService.findBySLKCode(portCode); + if (vehicleDtos.size() == 0) { + resp.put("ResultCode", -1); + resp.put("Message", "未找到上料口的配置信息!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + Set vehicleCodes = vehicleDtos.stream() + .map(VehicleDto::getVehicle_code) + .collect(Collectors.toSet()); + List deviceDtos = vehicleCodes.stream() + .map(vehicleCode -> deviceService.findByVehicleCode(vehicleCode)) + .filter(deviceDto -> deviceDto != null) + .collect(Collectors.toList()); + if (deviceDtos.size() == 0) { + resp.put("ResultCode", -1); + resp.put("Message", "没有可用的满料位置!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + deviceDtos.sort(Comparator.comparing(DeviceDto::getSeq_num, Comparator.nullsLast(Comparator.naturalOrder()))); + + List VehicleDtoList = new ArrayList<>(); + for (DeviceDto deviceDto : deviceDtos) { + if (StrUtil.isNotEmpty(deviceDto.getVehicle_code())) { + VehicleDtoList = vehicleService.findByVehicleCode(deviceDto.getVehicle_code()); + if (VehicleDtoList.size() == 0) { + continue; + } + startCode = deviceDto.getDevice_code(); + break; + } + } + for (VehicleDto vehicleDto : VehicleDtoList) { + vehicleDto.setOrder_code(orderCode); + } + if (StrUtil.isEmpty(startCode)) { + DeviceDto startDeviceDto = deviceService.findByCode(startCode); + TaskDto taskDto = new TaskDto(); + taskDto.setTask_code(CodeUtil.getNewCode("TASK_NO")); + taskDto.setStart_device_code(startCode); + taskDto.setStart_point_code(startCode); + taskDto.setNext_device_code(portCode); + taskDto.setNext_point_code(portCode); + taskDto.setVehicle_code(startDeviceDto.getVehicle_code()); + taskDto.setVehicle_type(requestedCode); + taskService.create(taskDto); + } else { + resp.put("ResultCode", -1); + resp.put("Message", "当前上料口关联的位置都为空!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + break; + default: + resp.put("ResultCode", -1); + resp.put("Message", "requestedCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + resp.put("ResultCode", 0); + resp.put("Message", "下发成功"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + + @Override + public JSONObject getVehicleInfo(JSONObject obj) { + JSONObject resp = new JSONObject(); + String lineCode = obj.getString("LineCode"); + String containerCode = obj.getString("ContainerCode"); + if (StrUtil.isEmpty(lineCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "lineCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + if (StrUtil.isEmpty(containerCode)) { + resp.put("ResultCode", -1); + resp.put("Message", "containerCode参数异常"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + List vehicleDtos = vehicleService.findByVehicleCode(containerCode); + if (vehicleDtos.size() == 0) { + resp.put("ResultCode", -1); + resp.put("Message", "未找到托盘信息!"); + resp.put("Result", ""); + log.info("---响应产线mes请求---" + resp.toString()); + return resp; + } + //查询托盘最小的物料数量 + vehicleDtos.sort(Comparator.comparing(VehicleDto::getQty, Comparator.nullsLast(Comparator.naturalOrder()))); + VehicleDto vehicleDto = vehicleDtos.get(0); + BigDecimal ParparingQty = vehicleDto.getQty(); + + JSONArray resultArray = new JSONArray(); + JSONObject jo = new JSONObject(); + TaskDto taskDto = taskService.findByContainer(containerCode); + DeviceDto deviceDto = deviceService.findByVehicleCode(containerCode); + + jo.put("TaskCode", taskDto.getTask_code()); + jo.put("LineCode", lineCode); + jo.put("LoadPort", deviceDto.getDevice_code()); + jo.put("ContainerCode", containerCode); + jo.put("ParparingQty", ParparingQty != null ? ParparingQty.intValue() : 0); + jo.put("CreatedOn", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date())); + + JSONArray itemsArray = new JSONArray(); + for (int i = 0; i < vehicleDtos.size(); i++) { + VehicleDto dto = vehicleDtos.get(i); + JSONObject item = new JSONObject(); + item.put("ItemNo", String.valueOf(i + 1)); + item.put("OrderCode", dto.getOrder_code()); + item.put("OrderQty", 1); + item.put("MaterialCode", dto.getMaterial_code()); + item.put("DrawNo", dto.getMaterial_code()); + item.put("BatchNo", ""); + item.put("BomQty", dto.getQty().intValue()); + item.put("RequireQty", dto.getQty().intValue()); + item.put("ParparedQty", (dto.getQty().intValue())); + item.put("Id", java.util.UUID.randomUUID().toString().replace("-", "")); + itemsArray.add(item); + } + jo.put("Items", itemsArray); + jo.put("Id", java.util.UUID.randomUUID().toString().replace("-", "")); + + resultArray.add(jo); + resp.put("ResultCode", 0); + resp.put("Message", "下发成功"); + resp.put("Result", resultArray); + return resp; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index e9d983a..086b667 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -29,6 +29,7 @@ import org.nl.acs.ext.wms.service.AcsToLiKuService; import org.nl.acs.ext.wms.service.AcsToNDCService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.instruction.service.dto.InstructionDto; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; @@ -590,7 +591,11 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu // =0 则不用再次请求 if (StrUtil.equals(obj.getRequest_again(), "0")) { if (StrUtil.equals(obj.getNext_device_code(), instnextdevice)) { - taskService.finish(obj.getTask_id()); + if (StrUtil.isNotEmpty(obj.getVehicle_type())&&StrUtil.equals(obj.getVehicle_type(),"1")){ + taskService.finishAndCreateNextTask(entity); + }else { + taskService.finish(obj.getTask_id()); + } } else { finishAndCreateNextInst(entity); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/TaskService.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/TaskService.java index 556fb4a..810b5b1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/TaskService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/TaskService.java @@ -351,4 +351,6 @@ public interface TaskService { List queryAllByCache(); void download1(TaskQuery query, HttpServletResponse response) throws IOException; + + void finishAndCreateNextTask(Instruction entity); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 6884591..5c5ffc3 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -20,7 +20,9 @@ import org.nl.acs.device.service.DeviceAssignedService; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.StorageCellService; import org.nl.acs.device.service.dto.DeviceAssignedDto; +import org.nl.acs.device.service.dto.DeviceDto; import org.nl.acs.device.service.impl.DeviceServiceImpl; +import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.ext.wms.service.AcsToHJXService; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.AcsToMesService; @@ -37,6 +39,8 @@ import org.nl.acs.task.service.TaskFeedbackService; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.task.service.dto.TaskQuery; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; import org.nl.common.utils.MapOf; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.FileUtil; @@ -98,6 +102,12 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { StorageCellService storageCellService; @Autowired private TaskService taskService; + @Autowired + DeviceAppService deviceAppservice; + @Autowired + DeviceService deviceService; + @Autowired + VehicleService vehicleService; @Override public void autoInitial() throws Exception { @@ -315,7 +325,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { JSONObject jsonObject1 = WQL.getWO("QTASK_QUERY") .addParamMap(map) - .pageQuery(0,1000, "create_time desc"); + .pageQuery(0, 1000, "create_time desc"); JSONArray array = jsonObject1.getJSONArray("content"); List list = array.toJavaList(TaskDto.class); return list; @@ -815,13 +825,14 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { // } // } } + @Override public void forchCancel(String taskCode) { - if (StringUtils.isNotEmpty(taskCode)){ + if (StringUtils.isNotEmpty(taskCode)) { HashMap of = MapOf.of("update_time", DateUtil.now() , "update_by", SecurityUtils.getCurrentUsername() , "task_status", "3"); - WQLObject.getWQLObject("acs_task").update(of,"task_code = '"+taskCode+"'"); + WQLObject.getWQLObject("acs_task").update(of, "task_code = '" + taskCode + "'"); } } @@ -1300,7 +1311,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { } catch (Exception e) { acsTask.setRemark(e.getMessage()); } - if (acsTask.getTask_status().equals("0")){ + if (acsTask.getTask_status().equals("0")) { acsTask.setTask_status("1"); taskService.update(acsTask); } @@ -1730,7 +1741,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { @Override public void download1(TaskQuery query, HttpServletResponse response) throws IOException { List taskDtos = taskService.queryAll(query); - if (CollUtil.isEmpty(taskDtos)){ + if (CollUtil.isEmpty(taskDtos)) { throw new RuntimeException("没有数据!"); } List> list = new ArrayList<>(); @@ -1750,4 +1761,66 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { } FileUtil.downloadExcel(list, response); } + + @Override + public void finishAndCreateNextTask(Instruction instruction) { + TaskDto entity = this.findById(instruction.getTask_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + InstructionService instructionservice = SpringContextHolder.getBean("instructionServiceImpl"); + InstructionDto instdto = instructionservice.findByTaskid(instruction.getInstruction_id(), "instruction_status <2 "); + if (instdto != null) throw new BadRequestException("有指令未完成!"); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + entity.setUpdate_time(now); + entity.setUpdate_by(currentUsername); + entity.setTask_status("2"); + WQLObject wo = WQLObject.getWQLObject("acs_task"); + JSONObject json = (JSONObject) JSONObject.toJSON(entity); + wo.update(json); + List vehicleDtos = vehicleService.findBySLKCode(entity.getStart_device_code()); + if (vehicleDtos.size() == 0) { + throw new BadRequestException("未找到上料口的配置信息!"); + } + Set vehicleCodes = vehicleDtos.stream() + .map(VehicleDto::getVehicle_code) + .collect(Collectors.toSet()); + List deviceDtos = vehicleCodes.stream() + .map(vehicleCode -> deviceService.findByVehicleCode(vehicleCode)) + .filter(deviceDto -> deviceDto != null) + .collect(Collectors.toList()); + if (deviceDtos.size() == 0) { + throw new BadRequestException("没有可用的满料位置!"); + } + deviceDtos.sort(Comparator.comparing(DeviceDto::getSeq_num, Comparator.nullsLast(Comparator.naturalOrder()))); + List VehicleDtoList = new ArrayList<>(); + String startCode = ""; + for (DeviceDto deviceDto : deviceDtos) { + if (StrUtil.isNotEmpty(deviceDto.getVehicle_code())) { + VehicleDtoList = vehicleService.findByVehicleCode(deviceDto.getVehicle_code()); + if (VehicleDtoList.size() == 0) { + continue; + } + startCode = deviceDto.getDevice_code(); + break; + } + } + for (VehicleDto vehicleDto : VehicleDtoList) { + vehicleDto.setOrder_code(entity.getCompound_task()); + } + + if (StrUtil.isEmpty(startCode)) { + DeviceDto startDeviceDto = deviceService.findByCode(startCode); + TaskDto taskDto = new TaskDto(); + taskDto.setTask_code(CodeUtil.getNewCode("TASK_NO")); + taskDto.setStart_device_code(startCode); + taskDto.setStart_point_code(startCode); + taskDto.setNext_device_code(entity.getStart_device_code()); + taskDto.setNext_point_code(entity.getStart_device_code()); + taskDto.setVehicle_code(startDeviceDto.getVehicle_code()); + taskService.create(taskDto); + removeByCodeFromCache(entity.getTask_code()); + } else { + throw new BadRequestException("当前上料口关联的位置都为空!!"); + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/rest/VehicleController.java b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/rest/VehicleController.java new file mode 100644 index 0000000..b0f47a5 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/rest/VehicleController.java @@ -0,0 +1,61 @@ +package org.nl.acs.vehicle.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.service.dto.TaskConfigDto; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; +import org.nl.modules.logging.annotation.Log; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@Api(tags = "组盘管理") +@RequestMapping("/api/group") +@Slf4j +public class VehicleController { + private final VehicleService vehicleService; + + @GetMapping + @Log("查询组盘信息") + @ApiOperation("查询组盘信息") + //@PreAuthorize("@el.check('Address:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(vehicleService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增组盘信息") + @ApiOperation("新增组盘信息") + //@PreAuthorize("@el.check('Address:add')") + public ResponseEntity create(@Validated @RequestBody VehicleDto dto) { + vehicleService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改组盘信息") + @ApiOperation("修改组盘信息") + //@PreAuthorize("@el.check('Address:edit')") + public ResponseEntity update(@Validated @RequestBody VehicleDto dto) { + vehicleService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除组盘信息") + @ApiOperation("删除组盘信息") + //@PreAuthorize("@el.check('Address:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + vehicleService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/VehicleService.java b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/VehicleService.java new file mode 100644 index 0000000..1c31039 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/VehicleService.java @@ -0,0 +1,32 @@ +package org.nl.acs.vehicle.service; + +import org.nl.acs.vehicle.service.dto.VehicleDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +public interface VehicleService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + void create(VehicleDto dto); + + VehicleDto findByVehicleCodeAndMaterialCode(String vehicle_code, String material_code); + + void update(VehicleDto dto); + + void deleteAll(String[] ids); + + List findByVehicleCode(String vehicle_code); + + void deleteByVehicleCode(String vehicle_code); + + List findBySLKCode(String portCode); +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/dto/VehicleDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/dto/VehicleDto.java new file mode 100644 index 0000000..39fbfbb --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/dto/VehicleDto.java @@ -0,0 +1,54 @@ +package org.nl.acs.vehicle.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VehicleDto implements Serializable { + /** + * 组盘标识 + */ + private String group_id; + + private String vehicle_code; + + private String material_code; + + private BigDecimal qty; + + private String order_code; + /** + * 上料口 + */ + private String device_code; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + /** + * 修改人 + */ + private Long update_id; + /** + * 修改人姓名 + */ + private String update_name; + /** + * 修改时间 + */ + private String update_time; + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/impl/VehicleServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/impl/VehicleServiceImpl.java new file mode 100644 index 0000000..e3eca6f --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/service/impl/VehicleServiceImpl.java @@ -0,0 +1,121 @@ +package org.nl.acs.vehicle.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.service.dto.TaskConfigDto; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class VehicleServiceImpl implements VehicleService { + @Override + public Map queryAll(Map whereJson, Pageable page) { + String blurry = ""; + if (whereJson.get("blurry") != null) { + blurry = (String) whereJson.get("blurry"); + } + JSONObject jo = WQL.getWO("group").addParam("flag", "1").addParam("blurry", blurry).pageQuery(WqlUtil.getHttpContext(page), "update_time desc"); + return jo; + } + + @Override + public void create(VehicleDto dto) { + String vehicle_code = dto.getVehicle_code(); + String material_code = dto.getMaterial_code(); + VehicleDto vehicleDto = this.findByVehicleCodeAndMaterialCode(vehicle_code, material_code); + if (vehicleDto != null) { + throw new RuntimeException("托盘和物料已绑定!"); + } + Long userId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + dto.setGroup_id(IdUtil.simpleUUID()); + dto.setCreate_id(userId); + dto.setCreate_name(currentUsername); + dto.setCreate_time(now); + dto.setUpdate_id(userId); + dto.setUpdate_name(currentUsername); + dto.setUpdate_time(now); + WQLObject wo = WQLObject.getWQLObject("group_record"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.insert(json); + + + } + + @Override + public VehicleDto findByVehicleCodeAndMaterialCode(String vehicle_code, String material_code) { + WQLObject wo = WQLObject.getWQLObject("group_record"); + JSONObject json = wo.query("vehicle_code ='" + vehicle_code + "' AND material_code = '" + material_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) { + return null; + } + final VehicleDto obj = json.toJavaObject(VehicleDto.class); + return obj; + } + + @Override + public void update(VehicleDto dto) { + VehicleDto entity = this.findByVehicleCodeAndMaterialCode(dto.getVehicle_code(), dto.getMaterial_code()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + Long userId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + dto.setUpdate_id(userId); + dto.setUpdate_name(currentUsername); + dto.setUpdate_time(now); + WQLObject wo = WQLObject.getWQLObject("group_record"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.update(json); + } + + @Override + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("group_record"); + for (String group_id : ids) { + wo.delete("group_id = '" + group_id + "'"); + } + } + + @Override + public List findByVehicleCode(String vehicle_code) { + WQLObject wo = WQLObject.getWQLObject("group_record"); + JSONArray arr = wo.query("vehicle_code ='" + vehicle_code + "'").getResultJSONArray(0); + List list = arr.toJavaList(VehicleDto.class); + return list; + } + + @Override + public void deleteByVehicleCode(String vehicle_code) { + List dtoList = this.findByVehicleCode(vehicle_code); + for (VehicleDto dto : dtoList) { + this.deleteAll(new String[]{dto.getGroup_id()}); + } + } + + @Override + public List findBySLKCode(String portCode) { + WQLObject wo = WQLObject.getWQLObject("group_record"); + JSONArray arr = wo.query("device_code ='" + portCode + "'").getResultJSONArray(0); + List list = arr.toJavaList(VehicleDto.class); + return list; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/wql/group.wql b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/wql/group.wql new file mode 100644 index 0000000..291f4d6 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/vehicle/wql/group.wql @@ -0,0 +1,53 @@ +[交易说明] + 交易名: 设备基础信息查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + //模糊查询 + 输入.blurry TYPEAS s_string +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + PAGEQUERY + SELECT + * + FROM + group_record as g + WHERE + 1=1 + OPTION 输入.blurry <> "" + g.vehicle_code like "%" 输入.blurry "%" + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/rest/PadController.java b/acs/nladmin-system/src/main/java/org/nl/hand/rest/PadController.java index 65af370..73962ba 100644 --- a/acs/nladmin-system/src/main/java/org/nl/hand/rest/PadController.java +++ b/acs/nladmin-system/src/main/java/org/nl/hand/rest/PadController.java @@ -6,12 +6,11 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.nl.acs.device.service.TaskConfigService; import org.nl.acs.device.service.dto.TaskConfigDto; -import org.nl.common.utils.MapOf; import org.nl.common.utils.TableDataInfo; import org.nl.hand.service.PadService; +import org.nl.hand.service.dto.GroupPad; import org.nl.hand.service.dto.TaskPad; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.logging.annotation.Log; @@ -19,7 +18,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; import java.util.Map; @RestController @@ -114,4 +112,36 @@ public class PadController { padService.callTask(taskPad); return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK); } + + @PostMapping("/getMaterialsByVehicleCode") + @Log("根据载具号查询物料信息") + @ApiOperation("根据载具号查询物料信息") + @SaIgnore + public ResponseEntity getMaterialsByVehicleCode(@RequestBody GroupPad groupPad) { + return new ResponseEntity<>(padService.getMaterialsByVehicleCode(groupPad), HttpStatus.OK); + } + + @PostMapping("/group") + @Log("组盘") + @ApiOperation("组盘") + @SaIgnore + public ResponseEntity group(@RequestBody GroupPad groupPad) { + return new ResponseEntity<>(padService.group(groupPad), HttpStatus.OK); + } + + @PostMapping("/getVehicleByPointCode") + @Log("根据点位查询载具号") + @ApiOperation("根据点位查询载具号") + @SaIgnore + public ResponseEntity getVehicleByPointCode(@RequestBody GroupPad groupPad) { + return new ResponseEntity<>(padService.getVehicleByPointCode(groupPad), HttpStatus.OK); + } + + @PostMapping("/clean") + @Log("清空") + @ApiOperation("清空") + @SaIgnore + public ResponseEntity clean(@RequestBody GroupPad groupPad) { + return new ResponseEntity<>(padService.clean(groupPad), HttpStatus.OK); + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/PadService.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/PadService.java index f19d665..f7a2836 100644 --- a/acs/nladmin-system/src/main/java/org/nl/hand/service/PadService.java +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/PadService.java @@ -1,5 +1,6 @@ package org.nl.hand.service; +import org.nl.hand.service.dto.GroupPad; import org.nl.hand.service.dto.TaskPad; import java.util.List; @@ -48,4 +49,12 @@ public interface PadService { void callTask(TaskPad pad); void signalInteract(TaskPad pad); + + Map getMaterialsByVehicleCode(GroupPad groupPad); + + Map group(GroupPad groupPad); + + Map getVehicleByPointCode(GroupPad groupPad); + + Map clean(GroupPad groupPad); } diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/GroupPad.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/GroupPad.java new file mode 100644 index 0000000..2c2a4d9 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/GroupPad.java @@ -0,0 +1,21 @@ +package org.nl.hand.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +@Data +public class GroupPad implements Serializable { + String point_code; + String vehicle_code; + String material_code; + + /** + * 扩展属性 + */ + Map data = new HashMap<>(); + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/PadServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/PadServiceImpl.java index f016f45..951ee8b 100644 --- a/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/PadServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/PadServiceImpl.java @@ -1,5 +1,8 @@ package org.nl.hand.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 com.alibaba.fastjson.JSONObject; @@ -7,6 +10,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device.service.dto.DeviceDto; import org.nl.acs.device.service.dto.StorageCellDto; import org.nl.acs.device.service.impl.StorageCellServiceImpl; import org.nl.acs.ext.wms.service.AcsToHJXService; @@ -16,17 +21,24 @@ import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.vehicle.service.VehicleService; +import org.nl.acs.vehicle.service.dto.VehicleDto; import org.nl.common.utils.MapOf; import org.nl.hand.service.PadService; +import org.nl.hand.service.dto.GroupPad; import org.nl.hand.service.dto.TaskPad; import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -43,6 +55,10 @@ public class PadServiceImpl implements PadService { private DeviceAppService deviceAppService; @Autowired private AcsToHJXService acsToHJXService; + @Autowired + private VehicleService vehicleService; + @Autowired + DeviceService deviceService; @Override @@ -129,15 +145,15 @@ public class PadServiceImpl implements PadService { } @Override - public Listinsts(TaskPad pad) { + public List insts(TaskPad pad) { String carNo = pad.getCar_no(); String containerCode = pad.getVehicle_code(); String query = "instruction_status < 2 and is_delete = 0 "; - if (StringUtils.isNotEmpty(carNo)){ - query = query+" and carno = '"+carNo+"'"; + if (StringUtils.isNotEmpty(carNo)) { + query = query + " and carno = '" + carNo + "'"; } - if (StringUtils.isNotEmpty(containerCode)){ - query = query+" and vehicle_code = '"+containerCode+"'"; + if (StringUtils.isNotEmpty(containerCode)) { + query = query + " and vehicle_code = '" + containerCode + "'"; } List result = instructionService.queryAll(query); return result; @@ -149,9 +165,11 @@ public class PadServiceImpl implements PadService { //任务操作码:"1"任务取消"2"任务完成"3"车辆暂停"4"车辆恢复 String instId = pad.getInst_id(); if (StrUtil.isEmpty(operation)) { - throw new BadRequestException("操作类型不能为空");} + throw new BadRequestException("操作类型不能为空"); + } if (StrUtil.isEmpty(instId)) { - throw new BadRequestException("指令ID不能为空");} + throw new BadRequestException("指令ID不能为空"); + } if (operation.equals("1")) { Instruction entity = instructionService.findById(instId); if (entity == null) { @@ -161,10 +179,10 @@ public class PadServiceImpl implements PadService { taskService.forchCancel(entity.getTask_code()); } else if (operation.equals("2")) { instructionService.finish(instId); - }else if (operation.equals("3")) { + } else if (operation.equals("3")) { //调用套件 instructionService.pause(instId); - }else if (operation.equals("4")) { + } else if (operation.equals("4")) { instructionService.recover(instId); } } @@ -173,7 +191,7 @@ public class PadServiceImpl implements PadService { public void callTask(TaskPad pad) { String start = pad.getStart(); String end = pad.getEnd(); - if (StringUtils.isEmpty(start) || StringUtils.isEmpty(end)){ + if (StringUtils.isEmpty(start) || StringUtils.isEmpty(end)) { throw new BadRequestException("任务搬运起点或者终点不能为空"); } Device startDevice = deviceAppService.findDeviceByCode(start); @@ -191,7 +209,7 @@ public class PadServiceImpl implements PadService { taskDto.setNext_device_code(end); taskDto.setNext_point_code(end); taskDto.setNext_parent_code(end); - if (StringUtils.isNotEmpty(pad.getVehicle_code())){ + if (StringUtils.isNotEmpty(pad.getVehicle_code())) { taskDto.setVehicle_code(pad.getContainerCode()); } taskService.create(taskDto); @@ -203,12 +221,12 @@ public class PadServiceImpl implements PadService { String vehicle_code = pad.getVehicle_code(); String type = pad.getType(); Device device = deviceAppService.findDeviceByCode(point); - if (device ==null){ - throw new BadRequestException("当前安全交互位未配置驱动信息"+point); + if (device == null) { + throw new BadRequestException("当前安全交互位未配置驱动信息" + point); } Object url = device.getExtraValue().get("address"); if (url == null) { - throw new BadRequestException("当前安全交互位未配置交互地址"+point); + throw new BadRequestException("当前安全交互位未配置交互地址" + point); } HashMap of = MapOf.of("point", point , "type", type @@ -216,25 +234,25 @@ public class PadServiceImpl implements PadService { , "url", url); //1.请求取货2取货完成3请求放货4放货完成 HttpResponse result = null; - switch (type){ + switch (type) { case "1": case "3": - if (type.equals("3")){ + if (type.equals("3")) { of.put("type", "2"); } result = acsToHJXService.actionRequest(new JSONObject(of)); break; case "2": case "4": - if (type.equals("2")){ + if (type.equals("2")) { of.put("type", "3"); } result = acsToHJXService.actionFinish(new JSONObject(of)); - break; + break; default: - throw new BadRequestException(result+"当前交互类型不存在"); + throw new BadRequestException(result + "当前交互类型不存在"); } - if (result == null){ + if (result == null) { throw new BadRequestException("交互异常"); } JSONObject response = JSONObject.parseObject(result.body()); @@ -243,4 +261,150 @@ public class PadServiceImpl implements PadService { throw new BadRequestException("交互异常"); } } + + @Override + public Map getMaterialsByVehicleCode(GroupPad groupPad) { + JSONObject resultJson = new JSONObject(); + String vehicle_code = groupPad.getVehicle_code(); + if (StrUtil.isEmpty(vehicle_code)) { + resultJson.put("code", "400"); + resultJson.put("message", "托盘编码不能为空!"); + return resultJson; + } + List vehicleDtos = vehicleService.findByVehicleCode(vehicle_code); + if (vehicleDtos.size() == 0) { + resultJson.put("code", "400"); + resultJson.put("message", "该托盘还未绑定物料!"); + return resultJson; + } + JSONObject jo = new JSONObject(); + List materialCodes = vehicleDtos.stream().map(VehicleDto::getMaterial_code).collect(Collectors.toList()); + for (int i = 0; i < materialCodes.size(); i++) { + String materialCode = materialCodes.get(i); + jo.put("material_code" + (i + 1), materialCode); + } + resultJson.put("code", 200); + resultJson.put("data", jo); + resultJson.put("message", "查询成功!"); + return resultJson; + } + + @Override + public Map group(GroupPad groupPad) { + JSONObject resultJson = new JSONObject(); + String vehicle_code = groupPad.getVehicle_code(); + String point_code = groupPad.getPoint_code(); + Map params = groupPad.getData(); + if (StrUtil.isEmpty(vehicle_code)) { + resultJson.put("code", "400"); + resultJson.put("message", "托盘编码不能为空!"); + return resultJson; + } + if (StrUtil.isEmpty(point_code)) { + resultJson.put("code", "400"); + resultJson.put("message", "点位编码不能为空!"); + return resultJson; + } + if (ObjectUtil.isEmpty(params)) { + resultJson.put("code", "400"); + resultJson.put("message", "物料信息不能为空!"); + return resultJson; + } + // 获取所有int类型的key + Long userId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + Set keys = params.keySet(); + for (Long key : keys) { + String material_code = String.valueOf(key); + String value = params.get(key); + if (StrUtil.isNotEmpty(value)) { + VehicleDto vehicleDto = vehicleService.findByVehicleCodeAndMaterialCode(vehicle_code, material_code); + vehicleDto.setQty(new BigDecimal(value)); + vehicleDto.setUpdate_id(userId); + vehicleDto.setUpdate_name(currentUsername); + vehicleDto.setUpdate_time(now); + vehicleService.update(vehicleDto); + } + } + DeviceDto deviceDto = deviceService.findByCode(point_code); + if (deviceDto == null) { + resultJson.put("code", "400"); + resultJson.put("message", "库位编码不存在!"); + return resultJson; + } + deviceDto.setVehicle_code(vehicle_code); + deviceDto.setUpdate_time(DateUtil.now()); + deviceService.update(deviceDto); + resultJson.put("code", 200); + resultJson.put("data", ""); + resultJson.put("message", "绑定成功!"); + return resultJson; + } + + @Override + public Map getVehicleByPointCode(GroupPad groupPad) { + JSONObject resultJson = new JSONObject(); + String point_code = groupPad.getPoint_code(); + if (StrUtil.isEmpty(point_code)) { + resultJson.put("code", "400"); + resultJson.put("message", "点位编码不能为空!"); + return resultJson; + } + DeviceDto deviceDto = deviceService.findByCode(point_code); + if (ObjectUtil.isEmpty(deviceDto)){ + resultJson.put("code", "400"); + resultJson.put("message", "库位编码不存在!"); + return resultJson; + } + JSONObject jo = new JSONObject(); + if (StrUtil.isEmpty(deviceDto.getVehicle_code())){ + jo.put("vehicle_code", ""); + } + jo.put("vehicle_code", deviceDto.getVehicle_code()); + resultJson.put("code", 200); + resultJson.put("data", jo); + resultJson.put("message", "查询成功!"); + return resultJson; + } + + @Override + public Map clean(GroupPad groupPad) { + JSONObject resultJson = new JSONObject(); + String point_code = groupPad.getPoint_code(); + if (StrUtil.isEmpty(point_code)) { + resultJson.put("code", "400"); + resultJson.put("message", "点位编码不能为空!"); + return resultJson; + } + DeviceDto deviceDto = deviceService.findByCode(point_code); + if (ObjectUtil.isEmpty(deviceDto)){ + resultJson.put("code", "400"); + resultJson.put("message", "库位编码不存在!"); + return resultJson; + } + String vehicle_code = deviceDto.getVehicle_code(); + Long userId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + if (StrUtil.isEmpty(vehicle_code)){ + }else { + List vehicleDtoList = vehicleService.findByVehicleCode(vehicle_code); + for (VehicleDto vehicleDto : vehicleDtoList) { + vehicleDto.setQty(BigDecimal.ZERO); + vehicleDto.setOrder_code(null); + vehicleDto.setUpdate_id(userId); + vehicleDto.setUpdate_name(currentUsername); + vehicleDto.setUpdate_time(now); + vehicleService.update(vehicleDto); + } + deviceDto.setVehicle_code(null); + deviceDto.setUpdate_time(DateUtil.now()); + deviceService.update(deviceDto); + } + resultJson.put("code", 200); + resultJson.put("data", "jo"); + resultJson.put("message", "清空成功!"); + return resultJson; + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls b/acs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls index df4b178fafd30b408c250964e94631da8c126521..a3b896edeca51c560517312fd09c2e29f2317838 100644 GIT binary patch literal 104448 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 literal 100864 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 Cm`P;- diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index 50fc7c8..78f6b90 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -7,7 +7,7 @@ spring: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3307}/${DB_NAME:gaosheng_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl5q}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nl5_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 diff --git a/acs/nladmin-system/src/main/resources/config/application-prod.yml b/acs/nladmin-system/src/main/resources/config/application-prod.yml index f85281d..e531129 100644 --- a/acs/nladmin-system/src/main/resources/config/application-prod.yml +++ b/acs/nladmin-system/src/main/resources/config/application-prod.yml @@ -6,7 +6,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl5q}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nl5_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 diff --git a/acs/nladmin-system/src/main/resources/config/application.yml b/acs/nladmin-system/src/main/resources/config/application.yml index 9ad5ac6..2f5497b 100644 --- a/acs/nladmin-system/src/main/resources/config/application.yml +++ b/acs/nladmin-system/src/main/resources/config/application.yml @@ -83,6 +83,10 @@ security: - /api/localStorage/pictures # 参数 - /api/param/getValueByCode + +lucene: + index: + path: D:\acs\lucene\index mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/acs/nladmin-system/src/main/resources/logback-spring.xml b/acs/nladmin-system/src/main/resources/logback-spring.xml index 5de518f..ea96efd 100644 --- a/acs/nladmin-system/src/main/resources/logback-spring.xml +++ b/acs/nladmin-system/src/main/resources/logback-spring.xml @@ -111,6 +111,8 @@ https://juejin.cn/post/6844903775631572999 + + diff --git a/acs/nladmin-system/src/main/resources/sql/228.sql b/acs/nladmin-system/src/main/resources/sql/228.sql index c986f99..f513419 100644 --- a/acs/nladmin-system/src/main/resources/sql/228.sql +++ b/acs/nladmin-system/src/main/resources/sql/228.sql @@ -9,27 +9,7 @@ CREATE TABLE `base_data_device` ( `file_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '图标文件ID', `region` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属区域', `x` int DEFAULT NULL COMMENT 'x', - CREATE TABLE `base_data_device` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT 'key', - `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '编码', - `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '设备名称', - `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备类型', - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备描述', - `edit_param` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备扩展信息', - `icon` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '图标地址', - `file_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '图标文件ID', - `region` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属区域', - `x` int DEFAULT NULL COMMENT 'x', - `y` int DEFAULT NULL COMMENT 'y', - `angle` int DEFAULT NULL COMMENT '角度', - `size` int DEFAULT NULL COMMENT '放大比例', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建用户', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '修改用户', - `is_used` tinyint(1) DEFAULT '1' COMMENT '是否启用', - PRIMARY KEY (`id`) - ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='设备信息表' `y` int DEFAULT NULL COMMENT 'y', + `y` int DEFAULT NULL COMMENT 'y', `angle` int DEFAULT NULL COMMENT '角度', `size` int DEFAULT NULL COMMENT '放大比例', `create_time` datetime DEFAULT NULL COMMENT '创建时间', diff --git a/acs/nladmin-ui/.env.production b/acs/nladmin-ui/.env.production index 69019ce..a87c45c 100644 --- a/acs/nladmin-ui/.env.production +++ b/acs/nladmin-ui/.env.production @@ -2,6 +2,6 @@ ENV = 'production' # 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置 # 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http -VUE_APP_BASE_API = 'http:// 172.30.15.231:8011' +VUE_APP_BASE_API = 'http://172.30.15.231:8011' # 如果接口是 http 形式, wss 需要改为 ws -VUE_APP_WS_API = 'ws:// 172.30.15.231:8011' +VUE_APP_WS_API = 'ws://172.30.15.231:8011' diff --git a/acs/nladmin-ui/src/api/acs/Group.js b/acs/nladmin-ui/src/api/acs/Group.js new file mode 100644 index 0000000..e927e8f --- /dev/null +++ b/acs/nladmin-ui/src/api/acs/Group.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/group', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/group/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/group', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/acs/nladmin-ui/src/views/acs/device/group/index.vue b/acs/nladmin-ui/src/views/acs/device/group/index.vue new file mode 100644 index 0000000..57a87d3 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/device/group/index.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/acs/nladmin-ui/src/views/acs/device/index.vue b/acs/nladmin-ui/src/views/acs/device/index.vue index 7c14774..37eefdd 100644 --- a/acs/nladmin-ui/src/views/acs/device/index.vue +++ b/acs/nladmin-ui/src/views/acs/device/index.vue @@ -109,6 +109,9 @@ + + + @@ -154,6 +157,7 @@ +