From 90b5097312247ee2de517fcaf91b83926e180fbb Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Wed, 9 Nov 2022 10:34:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=8C=81=E5=88=9B=E5=BB=BA=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/hand/rest/YYHandController.java | 103 +++++++ .../org/nl/hand/service/YYHandService.java | 62 +++++ .../java/org/nl/hand/service/dto/HandDto.java | 80 ++++++ .../hand/service/impl/YYHandServiceImpl.java | 253 ++++++++++++++++++ .../java/org/nl/hand/wql/QHAND_QUERY002.wql | 174 ++++++++++++ .../java/org/nl/modules/system/wql/sys.xls | Bin 223744 -> 227328 bytes 6 files changed, 672 insertions(+) create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/rest/YYHandController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/service/YYHandService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/service/dto/HandDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/service/impl/YYHandServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/wql/QHAND_QUERY002.wql diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/rest/YYHandController.java b/acs/nladmin-system/src/main/java/org/nl/hand/rest/YYHandController.java new file mode 100644 index 0000000..4aa3d7e --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/rest/YYHandController.java @@ -0,0 +1,103 @@ + +package org.nl.hand.rest; + + +import cn.dev33.satoken.annotation.SaIgnore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.hand.service.YYHandService; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.system.service.UserService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author qxuan + * @date 2021-07-21 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "手持接口") +@RequestMapping("/api/axr/hand") +@Slf4j +public class YYHandController { + private final UserService userService; + private final YYHandService HandService; + + @PostMapping("/task") + @Log("创建任务") + @ApiOperation("创建任务") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity createTask(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.createTask(whereJson), HttpStatus.OK); + } + + @PostMapping("/matrial") + @Log("查询物料信息") + @ApiOperation("查询物料信息") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryMaterial() { + return new ResponseEntity<>(HandService.queryMaterial(), HttpStatus.OK); + } + + @PostMapping("/routeplan_type") + @Log("查询路由类型") + @ApiOperation("查询路由类型") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryRouteplanType() { + return new ResponseEntity<>(HandService.queryRouteplanType(), HttpStatus.OK); + } + + + @PostMapping("/point") + @Log("查询设备编号及状态") + @ApiOperation("查询设备编号及状态") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryPoint() { + return new ResponseEntity<>(HandService.queryPointByArea(), HttpStatus.OK); + } + + @PostMapping("/point/storage") + @Log("查询设备扩展属性") + @ApiOperation("查询设备扩展属性") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryDeviceAugmentabilityByCode(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.queryDeviceAugmentabilityByCode(whereJson), HttpStatus.OK); + } + + + @PostMapping("/task_type") + @Log("查询任务类型") + @ApiOperation("查询任务类型") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryTaskType() { + return new ResponseEntity<>(HandService.queryTaskType(), HttpStatus.OK); + } + + @PostMapping("/handlogin") + @Log("手持登陆验证") + @ApiOperation("手持登陆验证") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity handlogin(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.handleLogin(whereJson), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/YYHandService.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/YYHandService.java new file mode 100644 index 0000000..5d28941 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/YYHandService.java @@ -0,0 +1,62 @@ + +package org.nl.hand.service; + + +import java.util.Map; + +/** + * @author qxuan + * @description 服务接口 + * @date 2021-07-21 + **/ +public interface YYHandService { + + + /** + * 根据区域查点位 + * + * @return Map + */ + Map queryPointByArea(); + + /** + * 查询设备扩展性 + * + * @param deviceCode + * @return + */ + Map queryDeviceAugmentabilityByCode(Map deviceCode); + + /** + * 查询任务状态 + * + * @return + */ + Map queryTaskType(); + + /** + * 查询路由类型 + * + * @return + */ + Map queryRouteplanType(); + + + /** + * 查询任务 + * + * @param jsonObject 条件 + * @return Map + */ + Map createTask(Map jsonObject); + + /** + * 查询无聊 + * + * @return Map + */ + Map queryMaterial(); + + public Map handleLogin(Map jsonObject); + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/HandDto.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/HandDto.java new file mode 100644 index 0000000..e705856 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/dto/HandDto.java @@ -0,0 +1,80 @@ +package org.nl.hand.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author qxuan + * @description / + * @date 2021-07-21 + **/ +@Data +public class HandDto implements Serializable { + + /** + * 库区标识 + */ + private String sect_uuid; + + /** + * 库区编码 + */ + private String sect_code; + + /** + * 库区名称 + */ + private String sect_name; + + /** + * 库区简称 + */ + private String simple_name; + + /** + * 库区类型 + */ + private String sect_type; + + /** + * 顺序号 + */ + private BigDecimal order_seq; + + /** + * 仓库标识 + */ + private String store_uuid; + + /** + * 是否启用 + */ + private String is_active; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 创建者 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改者 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/YYHandServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/YYHandServiceImpl.java new file mode 100644 index 0000000..149524d --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/service/impl/YYHandServiceImpl.java @@ -0,0 +1,253 @@ + +package org.nl.hand.service.impl; + + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.task.service.impl.TaskServiceImpl; +import org.nl.hand.service.YYHandService; +import org.nl.modules.common.config.RsaProperties; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RsaUtils; +import org.nl.modules.system.service.UserService; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +/** + * @author qxuan + * @description 服务实现 + * @date 2021-07-21 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class YYHandServiceImpl implements YYHandService { + private final UserService userService; + private final DeviceService deviceService; + InstructionService instructionService = null; + + @Override + public Map queryPointByArea() { + JSONArray resultArr = new JSONArray(); + JSONObject resultJson = new JSONObject(); + //根据value值去查所有的设备 + //JSONArray acs_deviceja = WQLObject.getWQLObject("ACS_DEVICE").query("device_type='conveyor'", "seq_num,device_name").getResultJSONArray(0); + JSONArray acs_deviceja = WQLObject.getWQLObject("ACS_DEVICE").query("", "seq_num,device_name").getResultJSONArray(0); + JSONArray acs_storage = WQLObject.getWQLObject("acs_storage_cell").query("x>0 AND y>0 AND z>0 AND is_active = '1' AND is_delete = '0'", "address").getResultJSONArray(0); +// JSONArray storage_rows = new JSONArray(); +// for (int i = 0; i < acs_storage.size(); i++) { +// JSONObject acs_jo = acs_storage.getJSONObject(i); +// acs_jo.put("device_code", acs_jo.getString("storage_code")); +// acs_jo.put("device_id", acs_jo.getString("storage_id")); +// storage_rows.add(acs_jo); +// } +// acs_deviceja.addAll(storage_rows); + for (int i = 0; i < acs_deviceja.size(); i++) { + JSONObject jo = new JSONObject(); + JSONObject devicejo = acs_deviceja.getJSONObject(i); + jo.put("device_id", devicejo.getString("device_id")); + jo.put("device_code", devicejo.getString("device_code")); + jo.put("device_name", devicejo.getString("device_name")); + jo.put("device_type", devicejo.getString("device_type")); + resultArr.add(jo); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", resultArr); + return resultJson; + } + + @Override + public Map queryDeviceAugmentabilityByCode(Map whereMap) { + String deviceCode = whereMap.get("device_code").toString(); + JSONObject resultJson = new JSONObject(); + JSONObject jo = new JSONObject(); + JSONObject acs_device = WQLObject.getWQLObject("ACS_DEVICE").query("device_code = '" + deviceCode + "'").pageResult(); + JSONObject acsDevice = (JSONObject) acs_device.getJSONArray("content").get(0); + //判断设备类型是不是storage + if (!"storage".equals(acsDevice.getString("device_type"))) { + resultJson.put("code", "0"); + resultJson.put("desc", "该设备不是货架"); + resultJson.put("result", ""); + return resultJson; + } + JSONObject jsonObject = deviceService.queryStorageExtra(deviceCode); + jo.put("device_id", acsDevice.getString("device_id")); + jo.put("device_code", deviceCode); + jo.put("device_name", acsDevice.getString("device_name")); + jo.put("device_type", acsDevice.getString("device_type")); + jo.put("maxY", jsonObject.getString("maxY")); + jo.put("minY", jsonObject.getString("minY")); + jo.put("maxZ", jsonObject.getString("maxZ")); + jo.put("minZ", jsonObject.getString("minZ")); + + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", jo); + return resultJson; + } + + @Override + public Map queryRouteplanType() { + JSONObject resultJson = new JSONObject(); + JSONObject jo = WQLObject.getWQLObject("acs_route_plan").query().pageResult(); + JSONArray arr = new JSONArray(); + JSONArray content = jo.getJSONArray("content"); + for (int i = 0; i < content.size(); i++) { + JSONObject jsonObject = (JSONObject) content.get(i); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("value", jsonObject.getString("plan_code")); + jsonObject1.put("label", jsonObject.getString("plan_name")); + arr.add(jsonObject1); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", arr); + return resultJson; + } + + @Override + public Map queryTaskType() { + JSONObject resultJson = new JSONObject(); + JSONObject jo = WQLObject.getWQLObject("sys_dict_detail").query("name = 'task_type'").pageResult(); + JSONArray arr = new JSONArray(); + JSONArray content = jo.getJSONArray("content"); + for (int i = 0; i < content.size(); i++) { + JSONObject jsonObject = (JSONObject) content.get(i); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("value", jsonObject.getString("value")); + jsonObject1.put("label", jsonObject.getString("label")); + arr.add(jsonObject1); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", arr); + return resultJson; + } + + + @Override + public Map createTask(Map jsonObject) { + String start_devicecode = jsonObject.get("start_devicecode"); + String next_devicecode = jsonObject.get("next_devicecode"); + String material_type = jsonObject.get("material_type"); + String task_type = jsonObject.get("task_type"); + String routeplan_type = jsonObject.get("routeplan_type"); + String priority = jsonObject.get("priority"); + String carrier = jsonObject.get("carrier"); + JSONObject resultJson = new JSONObject(); + if (StrUtil.isEmpty(start_devicecode)) { + throw new BadRequestException("起点不能为空!"); + } + if (StrUtil.isEmpty(next_devicecode)) { + throw new BadRequestException("终点点不能为空!"); + } + if (StrUtil.isEmpty(routeplan_type)) { + throw new BadRequestException("路由方案类型不能为空!"); + } + if (StrUtil.isEmpty(priority)) { + priority = "1"; + } + + if (start_devicecode.equals(next_devicecode)) { + resultJson.put("code", "0"); + resultJson.put("desc", "起点和终点不能是同一设备【" + next_devicecode + "】"); + resultJson.put("result", ""); + return resultJson; + } + + TaskService taskService = SpringContextHolder.getBean(TaskServiceImpl.class); + TaskDto dto = new TaskDto(); + dto.setIs_active("1"); + dto.setIs_delete("0"); + dto.setMaterial(material_type); + dto.setStart_point_code(start_devicecode); + dto.setNext_point_code(next_devicecode); + dto.setMaterial(material_type); + dto.setTask_type(task_type); + dto.setRoute_plan_code(routeplan_type); + dto.setPriority(priority); + dto.setVehicle_code(carrier); + try { + taskService.create(dto); + } catch (Exception e) { + resultJson.put("code", "2"); + resultJson.put("desc", e.getMessage()); + resultJson.put("result", ""); + return resultJson; + } + + resultJson.put("code", "1"); + resultJson.put("desc", "生成成功!"); + resultJson.put("result", ""); + return resultJson; + + } + + @Override + public Map queryMaterial() { + JSONArray resultArr = WQL.getWO("QHAND_QUERY002").addParam("flag", "5").process().getResultJSONArray(0); + JSONObject jo = new JSONObject(); + jo.put("code", "1"); + jo.put("desc", "查询成功"); + jo.put("result", resultArr); + return jo; + } + + @SneakyThrows + @Override + public Map handleLogin(Map jsonObject) { + JSONObject resultJson = new JSONObject(); + String user = jsonObject.get("user"); + String password = jsonObject.get("password"); + if (StrUtil.isEmpty("user")) { + resultJson.put("code", "1"); + resultJson.put("desc", "用户不能为空"); + return resultJson; + } + if (StrUtil.isEmpty("password")) { + resultJson.put("code", "1"); + resultJson.put("desc", "密码不能为空!"); + return resultJson; + } + boolean is_match = false; + Long account_id = 0L; + try { + String pwd = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, password); + UserDto userDto = userService.findByName(user); + account_id = userDto.getId(); + is_match = true; + + } catch (Exception e) { + e.printStackTrace(); + } + + if (is_match) { + resultJson.put("code", "1"); + resultJson.put("desc", "登陆成功"); + } else { + resultJson.put("code", "2"); + resultJson.put("desc", "登陆失败!"); + } + JSONObject jo = new JSONObject(); + jo.put("user_name", user); + jo.put("account_id", account_id); + resultJson.put("result", jo); + return resultJson; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/wql/QHAND_QUERY002.wql b/acs/nladmin-system/src/main/java/org/nl/hand/wql/QHAND_QUERY002.wql new file mode 100644 index 0000000..ee8a980 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/wql/QHAND_QUERY002.wql @@ -0,0 +1,174 @@ +[交易说明] + 交易名: 手持接口查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.key TYPEAS s_string + 输入.keyword TYPEAS s_string + 输入.start_devicecode TYPEAS s_string + 输入.next_devicecode TYPEAS s_string + 输入.detail_id TYPEAS s_string + + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + dtl.detail_id as region_id, + dtl.label as region_name, + dtl.value as region_code + FROM + sys_dict sys + LEFT JOIN sys_dict_detail dtl ON dtl.dict_id = sys.dict_id + WHERE + sys.NAME = "region_type" + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + task.task_id AS task_uuid, + task.task_code AS task_no, + task.start_point_code AS start_devicecode, + task.next_point_code AS next_devicecode, + task.task_type AS task_type, + sys2.VALUE AS material_type_name, + sys2.label AS material_type, + sys.VALUE AS task_status_name, + sys.label AS task_status, + task.vehicle_code AS carrier, + task.create_time, + task.priority + FROM + acs_task task + LEFT JOIN sys_dict_detail sys ON sys.label = task.task_status + AND sys.NAME = 'task_status' + LEFT JOIN sys_dict_detail sys2 ON sys2.VALUE = task.material + AND sys2.NAME = 'material_type' + where + ( task.task_status ='1' or task.task_status ='0' ) + and + ( task.task_id IN (select inst.task_id FROM acs_instruction inst where inst.is_delete<>1 and (instruction_status<>'1' and instruction_status <>'2' and instruction_status <>'0')) or task.task_id not in (select inst.task_id FROM acs_instruction inst where inst.is_delete<>1 + )) + OPTION 输入.key <> "" + (task.task_code like 输入.key or task.task_status like 输入.key) + ENDOPTION + OPTION 输入.start_point <> "" + task.start_point_code = 输入.start_point + ENDOPTION + OPTION 输入.next_point <> "" + task.next_point_code = 输入.next_point + ENDOPTION + ORDER BY task.create_time + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + * + FROM + sys_dict_detail detl + WHERE + 1=1 + OPTION 输入.detail_id <> "" + detl.detail_id = 输入.detail_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + inst.instruction_id AS inst_uuid, + inst.task_code AS task_no, + inst.instruction_code AS inst_no, + inst.start_point_code AS start_devicecode, + inst.next_point_code AS next_devicecode, + inst.instruction_status AS inst_status, + dtl.VALUE AS inst_status_name, + inst.execute_message AS inst_step, + inst.vehicle_code AS carrier, + inst.carno, + inst.priority, + inst.create_time, + inst.material AS material_type, + dtl2.VALUE AS material_type_name + FROM + acs_instruction inst + LEFT JOIN sys_dict_detail AS dtl ON dtl.label = inst.instruction_status + AND dtl.NAME = 'inst_status' + LEFT JOIN sys_dict_detail AS dtl2 ON dtl2.label = inst.material + AND dtl2.NAME = 'material_type' + WHERE + inst.is_delete = '0' + AND inst.instruction_status <> '2' + AND inst.instruction_status <> '3' + OPTION 输入.keyword <> "" + (inst.instruction_code like 输入.keyword + or + inst.task_code like 输入.keyword + or inst.execute_device_code like 输入.keyword) + ENDOPTION + OPTION 输入.start_devicecode <> "" + inst.start_point_code = 输入.start_devicecode + ENDOPTION + OPTION 输入.next_devicecode <> "" + inst.next_point_code = 输入.next_devicecode + ENDOPTION + ORDER BY inst.create_time desc + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + detl.label AS label, + detl.VALUE AS value + FROM + sys_dict_detail detl + WHERE + detl.name = 'material_type' + order by + dict_sort + ENDSELECT + ENDQUERY + ENDIF 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 a73514e742fd336ef67fc966b2897443e62d08c3..c77a7532f81097011f42a39a96474b894905684e 100644 GIT binary patch delta 15520 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 OxRmc>D$i!i`TqqQDg+b& delta 12576 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 mv*Lm1DyP`bNp5cWX9KpUiH;OK;MsjoTbJ