From 308e175176aaeb987b4941a3f5ea2327f7ae3ac7 Mon Sep 17 00:00:00 2001 From: liuxy Date: Thu, 25 Aug 2022 17:30:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/ext/acs/rest/AcsToLmsController.java | 39 -- .../wms/ext/acs/rest/AcsToWmsController.java | 19 +- .../wms/ext/acs/rest/WmsToAcsController.java | 9 +- .../wms/ext/acs/service/AcsToLmsService.java | 26 -- .../wms/ext/acs/service/AcsToWmsService.java | 20 +- .../wms/ext/acs/service/WmsToAcsService.java | 6 + .../acs/service/impl/AcsToLmsServiceImpl.java | 341 --------------- .../acs/service/impl/AcsToWmsServiceImpl.java | 412 ++++++++++++++++-- .../acs/service/impl/WmsToAcsServiceImpl.java | 6 + .../org/nl/wms/ext/auto/AutoQueryTask.java | 140 ++++++ .../org/nl/wms/ext/wql/AUTO_QUERYTASK.wql | 92 ++++ .../nl/wms/sch/manage/AbstractAcsTask.java | 6 +- .../sch/service/impl/PointServiceImpl.java | 1 + .../java/org/nl/wms/sch/service/wql/sch.xls | Bin 205312 -> 169472 bytes .../nl/wms/sch/tasks/CallEmpVehicleTask.java | 27 +- .../nl/wms/sch/tasks/CallMaterialTask.java | 6 + .../nl/wms/sch/tasks/PointToPointTask.java | 74 ++-- .../nl/wms/sch/tasks/SendEmpVehicleTask.java | 27 +- .../nl/wms/sch/tasks/SendMaterialTask.java | 21 +- .../service/impl/RegionioInServiceImpl.java | 2 +- 20 files changed, 757 insertions(+), 517 deletions(-) delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToLmsController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToLmsService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToLmsServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToLmsController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToLmsController.java deleted file mode 100644 index 1374af4..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToLmsController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nl.wms.ext.acs.rest; - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.ext.acs.service.AcsToLmsService; -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; - - -@RestController -@RequiredArgsConstructor -@Api(tags = "acs接收wms") -@RequestMapping("/api/acsToLms/task") -@Slf4j -public class AcsToLmsController { - private final AcsToLmsService acsToLmsService; - - @PostMapping("/taskResult") - @Log("任务反馈") - @ApiOperation("任务反馈") - public ResponseEntity taskResult(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(acsToLmsService.taskResult(whereJson), HttpStatus.OK); - } - - @PostMapping("/apply") - @Log("申请任务") - @ApiOperation("申请任务") - public ResponseEntity apply(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(acsToLmsService.apply(whereJson), HttpStatus.OK); - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 37e474e..b789bf8 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -2,6 +2,7 @@ package org.nl.wms.ext.acs.rest; +import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -23,19 +24,12 @@ import java.util.Map; **/ @RestController @RequiredArgsConstructor -@Api(tags = "acs接收wms") -@RequestMapping("/api/acsToWms/task") +@Api(tags = "acs接收lms") +@RequestMapping("/api/wms/task") @Slf4j public class AcsToWmsController { private final AcsToWmsService acsToWmsService; - @PostMapping("/apply") - @Log("ACS给WMS发送任务") - @ApiOperation("ACS给WMS发送任务") - public ResponseEntity receiveTaskFromAcs(@RequestBody Map whereJson) { - return new ResponseEntity<>(acsToWmsService.receiveTaskFromAcs(whereJson), HttpStatus.OK); - } - @PostMapping("/status") @Log("ACS给WMS反馈任务状态") @ApiOperation("ACS给WMS反馈任务状态") @@ -49,4 +43,11 @@ public class AcsToWmsController { public ResponseEntity orderFinish(@RequestBody String string) { return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK); } + + @PostMapping("/apply") + @Log("申请任务") + @ApiOperation("申请任务") + public ResponseEntity apply(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); + } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index eec803c..14877fc 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -27,7 +27,7 @@ import java.util.Map; @RestController @RequiredArgsConstructor @Api(tags = "wms发送acs") -@RequestMapping("/api/wmsToAcs/task") +@RequestMapping("/api/wms/task") @Slf4j public class WmsToAcsController { private final WmsToAcsService wmsToAcsService; @@ -72,5 +72,12 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.orderStatusUpdate(arr), HttpStatus.OK); } + @PostMapping("/querydevice") + @Log("WMS向acs发送获取点位状态") + @ApiOperation("WMS向acs发送获取点位状态") + public ResponseEntity getPointStatus(@RequestBody JSONArray whereJson) { + return new ResponseEntity<>(wmsToAcsService.getPointStatus(whereJson), HttpStatus.OK); + } + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToLmsService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToLmsService.java deleted file mode 100644 index 81de6d0..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToLmsService.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.nl.wms.ext.acs.service; - -import com.alibaba.fastjson.JSONObject; - -import java.util.Map; - -public interface AcsToLmsService { - - /** - * ACS客户端--->LMS服务端 - * 任务反馈 - * - * @param whereJson 条件 - * @return JSONObject - */ - JSONObject taskResult(JSONObject whereJson); - - /** - * ACS客户端--->LMS服务端 - * 任务申请 - * - * @param whereJson 条件 - * @return JSONObject - */ - JSONObject apply(JSONObject whereJson); -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index f3193a1..a82f446 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -1,18 +1,11 @@ package org.nl.wms.ext.acs.service; +import com.alibaba.fastjson.JSONObject; + import java.util.Map; public interface AcsToWmsService { - /** - * ACS客户端--->WMS服务端 - * ACS向WMS申请任务 - * - * @param jsonObject 条件 - * @return Map - */ - - Map receiveTaskFromAcs(Map jsonObject); /** * ACS客户端--->WMS服务端 @@ -39,4 +32,13 @@ public interface AcsToWmsService { * @return */ Map orderFinish(String string); + + /** + * ACS客户端--->LMS服务端 + * 任务申请 + * + * @param whereJson 条件 + * @return JSONObject + */ + JSONObject apply(JSONObject whereJson); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 0b34d75..3735345 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -49,4 +49,10 @@ public interface WmsToAcsService { * @return */ Map orderStatusUpdate(JSONArray arr); + + /** + * 获取点位状态 + * @return + */ + JSONObject getPointStatus(JSONArray whereJson); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToLmsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToLmsServiceImpl.java deleted file mode 100644 index fc85099..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToLmsServiceImpl.java +++ /dev/null @@ -1,341 +0,0 @@ -package org.nl.wms.ext.acs.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 com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.catalina.security.SecurityUtil; -import org.nl.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.utils.SecurityUtils; -import org.nl.utils.SpringContextHolder; -import org.nl.wms.ext.acs.service.AcsToLmsService; -import org.nl.wms.pdm.service.DeviceService; -import org.nl.wms.pdm.service.dto.DeviceDto; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.tasks.CallEmpVehicleTask; -import org.nl.wms.sch.tasks.CallMaterialTask; -import org.nl.wms.sch.tasks.SendEmpVehicleTask; -import org.nl.wms.sch.tasks.SendMaterialTask; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.core.engine.object.WO; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class AcsToLmsServiceImpl implements AcsToLmsService { - - @Override - public JSONObject taskResult(JSONObject whereJson) { - return null; - } - - @Override - @Transactional - public JSONObject apply(JSONObject whereJson) { - String type = whereJson.getString("type"); - String point_code = whereJson.getString("point_code"); - String vehicle_num = whereJson.getString("vehicle_num"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); - if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - - WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 - WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); // 区域出入库表 - - /* - * 根据type判断是什么业务类型: - * 1.共挤线申请空盘 - * 2.共挤线满托入库 - * 3.油漆线申请空盘 - * 4.油漆线申请物料 - * 5.油漆线空盘入库 - * 6.一楼空盘入库 (有载具号) - */ - JSONObject resuft = new JSONObject(); - try { - if (StrUtil.equals(type, "1")) { - // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("next_point_code", point_code); - param.put("qty", vehicle_num); - // 创建任务 - String task_id = SpringContextHolder.getBean(CallEmpVehicleTask.class).createTask(param); - - // 插入空载具作业记录表 - JSONObject jsonEmpParam = new JSONObject(); - jsonEmpParam.put("vehicle_qty",vehicle_num); - jsonEmpParam.put("task_id",task_id); - jsonEmpParam.put("io_type","1"); - this.createEmp(jsonEmpParam); - //TODO 下发 - - // 成功返回 - resuft.put("status", "200"); - resuft.put("message", ""); - } else if (StrUtil.equals(type, "2")) { - // 2.共挤线满托入库: 调用物料入库处理类创建任务 - if (ObjectUtil.isEmpty(qty)) throw new BadRequestException("物料数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("start_point_code", point_code); - String task_id = SpringContextHolder.getBean(SendMaterialTask.class).createTask(param); - - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - // 插入区域出入库表 - param.put("next_point_code", jsonTask.getString("next_point_code")); - param.put("qty", qty); - param.put("task_id", task_id); - param.put("io_type", "0"); - JSONObject json = this.inCreateRegion(param); - // 回显任务载具类型 - jsonTask.put("vehicle_type", json.getString("vehicle_type")); - taskTab.update(jsonTask); - //TODO 下发 - - // 返回成功 - resuft.put("status", "200"); - resuft.put("message", ""); - } else if (StrUtil.equals(type, "3")) { - // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("next_point_code", point_code); - param.put("qty", vehicle_num); - // 创建任务 - String task_id = SpringContextHolder.getBean(CallEmpVehicleTask.class).createTask(param); - - // 插入空载具作业记录表 - JSONObject jsonEmpParam = new JSONObject(); - jsonEmpParam.put("vehicle_qty",vehicle_num); - jsonEmpParam.put("task_id",task_id); - jsonEmpParam.put("io_type","1"); - this.createEmp(jsonEmpParam); - //TODO 下发 - - // 成功返回 - resuft.put("status", "200"); - resuft.put("message", ""); - } else if (StrUtil.equals(type, "4")) { - // 4.油漆线申请物料: 调用物料出库库处理类创建任务 - JSONObject param = new JSONObject(); - param.put("next_point_code",point_code); - param.put("io_type","1"); - // 插入区域出库单 - JSONObject json = this.outCreateRegion(param); - - param.put("vehicle_type", json.getString("vehicle_type")); - param.put("material_id", json.getString("material_id")); - param.put("create_mode", json.getString("create_mode")); - param.put("iostorinv_id", json.getString("iostorinv_id")); - // 创建任务 - String task_id = SpringContextHolder.getBean(CallMaterialTask.class).createTask(param); - - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - // 回显出库单:起始点位、起始区域、任务id - JSONObject jsonRegion = regionTab.query("iostorinv_id = '" + json.getString("iostorinv_id") + "'").uniqueResult(0); - jsonRegion.put("start_point_code", jsonTask.getString("start_point_code")); - Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); - jsonRegion.put("start_region_id", String.valueOf(start_region_id)); - jsonRegion.put("task_id", Long.valueOf(task_id)); - regionTab.update(jsonRegion); - //TODO 下发 - - // 成功返回 - resuft.put("status", "200"); - resuft.put("message", ""); - } else if (StrUtil.equals(type, "5")) { - // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("start_point_code", point_code); - param.put("qty", vehicle_num); - // 创建任务 - String task_id = SpringContextHolder.getBean(SendEmpVehicleTask.class).createTask(param); - - // 插入空载具作业记录表 - JSONObject jsonEmpParam = new JSONObject(); - jsonEmpParam.put("vehicle_qty",vehicle_num); - jsonEmpParam.put("task_id",task_id); - jsonEmpParam.put("io_type","0"); - this.createEmp(jsonEmpParam); - //TODO 下发 - - // 成功返回 - resuft.put("status", "200"); - resuft.put("message", ""); - } else if (StrUtil.equals(type, "6")) { - // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); - - JSONObject param = new JSONObject(); - param.put("start_point_code", point_code); - param.put("qty", vehicle_num); - param.put("vehicle_code", vehicle_code); - // 创建任务 - String task_id = SpringContextHolder.getBean(SendEmpVehicleTask.class).createTask(param); - - // 插入空载具作业记录表 - JSONObject jsonEmpParam = new JSONObject(); - jsonEmpParam.put("vehicle_qty",vehicle_num); - jsonEmpParam.put("task_id",task_id); - jsonEmpParam.put("io_type","0"); - this.createEmp(jsonEmpParam); - //TODO 下发 - - // 成功返回 - resuft.put("status", "200"); - resuft.put("message", ""); - } - } catch (Exception e) { - resuft.put("status",((BadRequestException) e).getStatus()); - resuft.put("message",e.getMessage()); - } - return resuft; - } - - @Transactional - public void createEmp(JSONObject json) { - String vehicle_qty = json.getString("vehicle_qty"); - String task_id = json.getString("task_id"); - String io_type = json.getString("io_type"); - - WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 - - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - JSONObject jsonEmp = new JSONObject(); - jsonEmp.put("record_uuid", IdUtil.getSnowflake(1,1).nextId()); - jsonEmp.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); - jsonEmp.put("io_type", io_type); - jsonEmp.put("bill_status", "20"); - jsonEmp.put("vehicle_qty", vehicle_qty); - jsonEmp.put("start_point_code", jsonTask.getString("start_point_code")); - Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); - jsonEmp.put("start_region_id", start_region_id); - jsonEmp.put("next_point_code", jsonTask.getString("next_point_code")); - Long next_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("next_point_code")).getRegion_id(); - jsonEmp.put("end_region_id", next_region_id); - jsonEmp.put("task_uuid", task_id); - jsonEmp.put("create_id", SecurityUtils.getCurrentUserId()); - jsonEmp.put("create_name", SecurityUtils.getNickName()); - jsonEmp.put("create_time", DateUtil.now()); - empTab.insert(jsonEmp); - } - - @Transactional - public JSONObject inCreateRegion(JSONObject json) { - String start_point_code = json.getString("start_point_code"); - String next_point_code = json.getString("next_point_code"); - String qty = json.getString("qty"); - Long task_id = json.getLongValue("task_id"); - String io_type = json.getString("io_type"); - - WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); - WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); - WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); - - - JSONObject jsonRegion = new JSONObject(); - jsonRegion.put("iostorinv_id",IdUtil.getSnowflake(1,1).nextId()); - jsonRegion.put("bill_code",CodeUtil.getNewCode("IN_STORE_CODE")); - jsonRegion.put("io_type",io_type); - jsonRegion.put("bill_status","20"); - // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 - String device_code = start_point_code.substring(0, start_point_code.indexOf("-")); - - DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); - DeviceDto deviceDto = deviceBean.findByCode(device_code); - if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); - JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); - - jsonRegion.put("material_id",jsonOrder.getString("material_id")); - jsonRegion.put("qty",qty); - JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); - jsonRegion.put("qty_unit_id",jsonMater.getString("base_unit_id")); - - jsonRegion.put("start_point_code",start_point_code); - Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(start_point_code).getRegion_id(); - jsonRegion.put("start_region_id",String.valueOf(start_region_id)); - jsonRegion.put("end_point_code",next_point_code); - Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); - jsonRegion.put("end_region_id",String.valueOf(end_region_id)); - - jsonRegion.put("create_mode","02"); - jsonRegion.put("task_id",task_id); - jsonRegion.put("create_id",SecurityUtils.getCurrentUserId()); - jsonRegion.put("create_name",SecurityUtils.getNickName()); - jsonRegion.put("create_time",DateUtil.now()); - regionTab.insert(jsonRegion); - - JSONObject resuft = new JSONObject(); - resuft.put("vehicle_type", jsonOrder.getString("vehicle_type")); - resuft.put("material_id", jsonRegion.getString("material_id")); - resuft.put("create_mode", jsonRegion.getString("create_mode")); - return resuft; - } - - @Transactional - public JSONObject outCreateRegion(JSONObject json) { - String next_point_code = json.getString("next_point_code"); - String io_type = json.getString("io_type"); - - WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); - WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); - WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); - - JSONObject jsonRegion = new JSONObject(); - jsonRegion.put("iostorinv_id",IdUtil.getSnowflake(1,1).nextId()); - jsonRegion.put("bill_code",CodeUtil.getNewCode("OUT_STORE_CODE")); - jsonRegion.put("io_type",io_type); - jsonRegion.put("bill_status","20"); - // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 - String device_code = next_point_code.substring(0, next_point_code.indexOf("-")); - - DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); - DeviceDto deviceDto = deviceBean.findByCode(device_code); - if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); - JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); - - jsonRegion.put("material_id",jsonOrder.getString("material_id")); - jsonRegion.put("qty","100"); // 暂时先按照100 - JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); - jsonRegion.put("qty_unit_id",jsonMater.getString("base_unit_id")); - - jsonRegion.put("end_point_code",next_point_code); - Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); - jsonRegion.put("end_region_id",String.valueOf(end_region_id)); - - jsonRegion.put("create_mode","02"); - jsonRegion.put("create_id",SecurityUtils.getCurrentUserId()); - jsonRegion.put("create_name",SecurityUtils.getNickName()); - jsonRegion.put("create_time",DateUtil.now()); - regionTab.insert(jsonRegion); - - // 需回显起始点位、起始区域、任务id - JSONObject resuft = new JSONObject(); - resuft.put("iostorinv_id",jsonRegion.getString("iostorinv_id")); - resuft.put("vehicle_type",jsonOrder.getString("vehicle_type")); - resuft.put("create_mode",jsonRegion.getString("create_mode")); - resuft.put("material_id",jsonOrder.getString("material_id")); - return resuft; - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 6245386..910cd9a 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -2,20 +2,31 @@ package org.nl.wms.ext.acs.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SecurityUtils; +import org.nl.utils.SpringContextHolder; import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.TaskService; import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.wms.sch.tasks.*; import org.nl.wql.core.bean.WQLObject; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -27,31 +38,6 @@ import java.util.Map; public class AcsToWmsServiceImpl implements AcsToWmsService { private final TaskService taskService; - @Override - public Map receiveTaskFromAcs(Map jsonObject) { - JSONObject result = new JSONObject(); - //{"point_code":"1002","container_code":"T666666","param":{"height":2,"weight":0}} - //更新分配表生成出入库单局,生成指令 - JSONObject.parseObject(JSON.toJSONString(jsonObject)).getJSONObject("param"); - - //点位编码 - String point_code = MapUtil.getStr(jsonObject, "device_code"); - //载具号 - String vehicle_code = MapUtil.getStr(jsonObject, "container_code"); - JSONObject param = JSONObject.parseObject(JSON.toJSONString(jsonObject.get("param"))); - //高度 - String height = param.getString("height"); - //重量 - String weight = param.getString("weight"); - - result.put("status", HttpStatus.OK.value()); - - result.put("message", "ACS向WMS申请任务成功!"); - result.put("data", new JSONObject()); - result.put("errArr", new JSONArray()); - return result; - } - /** * task_uuid:任务标识 * task_code:任务编码 @@ -67,7 +53,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONArray errArr = new JSONArray(); for (int i = 0; i < array.size(); i++) { JSONObject row = array.getJSONObject(i); - String task_uuid = row.getString("task_uuid"); + String task_uuid = row.getString("task_id"); TaskDto taskDto = taskService.findById(task_uuid); String processing_class = taskDto.getHandle_class(); //1:执行中,2:完成 ,3:acs取消 @@ -80,6 +66,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if ("2".equals(acs_task_status)) { status = TaskStatusEnum.FINISHED.getCode(); } + if ("3".equals(acs_task_status)) { + status = "0"; + } // 任务处理类 try { Class clz = Class.forName(processing_class); @@ -132,22 +121,385 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { public Map orderFinish(String string) { JSONObject orderJson = JSONObject.parseObject(string); String ext_order_id = orderJson.getString("ext_order_id"); - // JSONArray array = JSONArray.parseArray(string); + // JSONArray array = JSONArray.parseArray(string); String now = DateUtil.now(); WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); JSONObject map = new JSONObject(); - map.put("produceorder_id",ext_order_id); - map.put("order_status","04"); + map.put("produceorder_id", ext_order_id); + map.put("order_status", "04"); map.put("update_optid", 1111111111); map.put("device_id", ""); map.put("update_optname", "acs"); map.put("update_time", now); map.put("realproduceend_date", now); - wo.update(map,"produceorder_id = '"+ext_order_id+"'"); + wo.update(map, "produceorder_id = '" + ext_order_id + "'"); JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); result.put("message", "任务状态反馈成功!"); return result; } + @Override + @Transactional + public JSONObject apply(JSONObject whereJson) { + String type = whereJson.getString("type"); + String point_code = whereJson.getString("point_code"); + String vehicle_num = whereJson.getString("vehicle_num"); + String vehicle_type = whereJson.getString("vehicle_type"); + String vehicle_code = whereJson.getString("vehicle_code"); + String qty = whereJson.getString("qty"); + + if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); + + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); // 区域出入库表 + + + /* + * 根据type判断是什么业务类型: + * 1.共挤线申请空盘 + * 2.共挤线满托入库 + * 3.油漆线申请空盘 + * 4.油漆线申请物料 + * 5.油漆线空盘入库 + * 6.一楼空盘入库 (有载具号) + * 7.油漆线->输送线 + */ + JSONObject resuft = new JSONObject(); + try { + if (StrUtil.equals(type, "1")) { + // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + CallEmpVehicleTask taskBean = SpringContextHolder.getBean(CallEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "1"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + + } else if (StrUtil.equals(type, "2")) { + // 2.共挤线满托入库: 调用物料入库处理类创建任务 + if (ObjectUtil.isEmpty(qty) || (StrUtil.equals(qty, "0"))) throw new BadRequestException("物料数量不能为空或者为0"); + + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + SendMaterialTask taskBean = SpringContextHolder.getBean(SendMaterialTask.class); + String task_id = taskBean.createTask(param); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 插入区域出入库表 + param.put("next_point_code", jsonTask.getString("next_point_code")); + param.put("qty", qty); + param.put("task_id", task_id); + param.put("io_type", "0"); + JSONObject json = this.inCreateRegion(param); + // 回显任务载具类型 + jsonTask.put("vehicle_type", json.getString("vehicle_type")); + taskTab.update(jsonTask); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "3")) { + // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + CallEmpVehicleTask taskBean = SpringContextHolder.getBean(CallEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "1"); + this.createEmp(jsonEmpParam); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "4")) { + // 4.油漆线申请物料: 调用物料出库库处理类创建任务 + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("io_type", "1"); + // 插入区域出库单 + JSONObject json = this.outCreateRegion(param); + + param.put("vehicle_type", json.getString("vehicle_type")); + param.put("material_id", json.getString("material_id")); + param.put("create_mode", json.getString("create_mode")); + param.put("iostorinv_id", json.getString("iostorinv_id")); + // 创建任务 + CallMaterialTask taskBean = SpringContextHolder.getBean(CallMaterialTask.class); + String task_id = taskBean.createTask(param); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 回显出库单:起始点位、起始区域、任务id + JSONObject jsonRegion = regionTab.query("iostorinv_id = '" + json.getString("iostorinv_id") + "'").uniqueResult(0); + jsonRegion.put("start_point_code", jsonTask.getString("start_point_code")); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); + jsonRegion.put("start_region_id", String.valueOf(start_region_id)); + jsonRegion.put("task_id", Long.valueOf(task_id)); + regionTab.update(jsonRegion); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "5")) { + // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + SendEmpVehicleTask taskBean = SpringContextHolder.getBean(SendEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "0"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + + } else if (StrUtil.equals(type, "6")) { + // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); + + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + param.put("qty", vehicle_num); + param.put("vehicle_code", vehicle_code); + // 创建任务 + SendEmpVehicleTask taskBean = SpringContextHolder.getBean(SendEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "0"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "7")) { + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + // 1.生成起点确定的任务 + SpringContextHolder.getBean(PointToPointTask.class).createTask(param); + + resuft.put("status", "200"); + resuft.put("message", ""); + } + } catch (Exception e) { + resuft.put("status", ((BadRequestException) e).getStatus()); + resuft.put("message", e.getMessage()); + } + return resuft; + } + + @Transactional + public void createEmp(JSONObject json) { + String vehicle_qty = json.getString("vehicle_qty"); + String task_id = json.getString("task_id"); + String io_type = json.getString("io_type"); + + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + JSONObject jsonEmp = new JSONObject(); + jsonEmp.put("record_uuid", IdUtil.getSnowflake(1,1).nextId()); + jsonEmp.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); + jsonEmp.put("io_type", io_type); + jsonEmp.put("bill_status", "20"); + jsonEmp.put("vehicle_qty", vehicle_qty); + jsonEmp.put("start_point_code", jsonTask.getString("start_point_code")); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); + jsonEmp.put("start_region_id", start_region_id); + jsonEmp.put("next_point_code", jsonTask.getString("next_point_code")); + Long next_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("next_point_code")).getRegion_id(); + jsonEmp.put("end_region_id", next_region_id); + jsonEmp.put("task_uuid", task_id); + jsonEmp.put("create_id", SecurityUtils.getCurrentUserId()); + jsonEmp.put("create_name", SecurityUtils.getNickName()); + jsonEmp.put("create_time", DateUtil.now()); + empTab.insert(jsonEmp); + } + + @Transactional + public JSONObject inCreateRegion(JSONObject json) { + String start_point_code = json.getString("start_point_code"); + String next_point_code = json.getString("next_point_code"); + String qty = json.getString("qty"); + Long task_id = json.getLongValue("task_id"); + String io_type = json.getString("io_type"); + + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + + + JSONObject jsonRegion = new JSONObject(); + jsonRegion.put("iostorinv_id",IdUtil.getSnowflake(1,1).nextId()); + jsonRegion.put("bill_code",CodeUtil.getNewCode("IN_STORE_CODE")); + jsonRegion.put("io_type",io_type); + jsonRegion.put("bill_status","20"); + // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 + String device_code = start_point_code.substring(0, start_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + + jsonRegion.put("material_id",jsonOrder.getString("material_id")); + jsonRegion.put("qty",qty); + JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); + jsonRegion.put("qty_unit_id",jsonMater.getString("base_unit_id")); + + jsonRegion.put("start_point_code",start_point_code); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(start_point_code).getRegion_id(); + jsonRegion.put("start_region_id",String.valueOf(start_region_id)); + jsonRegion.put("end_point_code",next_point_code); + Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); + jsonRegion.put("end_region_id",String.valueOf(end_region_id)); + + jsonRegion.put("create_mode","02"); + jsonRegion.put("task_id",task_id); + jsonRegion.put("create_id",SecurityUtils.getCurrentUserId()); + jsonRegion.put("create_name",SecurityUtils.getNickName()); + jsonRegion.put("create_time",DateUtil.now()); + regionTab.insert(jsonRegion); + + JSONObject resuft = new JSONObject(); + resuft.put("vehicle_type", jsonOrder.getString("vehicle_type")); + resuft.put("material_id", jsonRegion.getString("material_id")); + resuft.put("create_mode", jsonRegion.getString("create_mode")); + return resuft; + } + + @Transactional + public JSONObject outCreateRegion(JSONObject json) { + String next_point_code = json.getString("next_point_code"); + String io_type = json.getString("io_type"); + + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + + JSONObject jsonRegion = new JSONObject(); + jsonRegion.put("iostorinv_id",IdUtil.getSnowflake(1,1).nextId()); + jsonRegion.put("bill_code",CodeUtil.getNewCode("OUT_STORE_CODE")); + jsonRegion.put("io_type",io_type); + jsonRegion.put("bill_status","20"); + // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 + String device_code = next_point_code.substring(0, next_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + + jsonRegion.put("material_id",jsonOrder.getString("material_id")); + jsonRegion.put("qty","100"); // 暂时先按照100 + JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); + jsonRegion.put("qty_unit_id",jsonMater.getString("base_unit_id")); + + jsonRegion.put("end_point_code",next_point_code); + Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); + jsonRegion.put("end_region_id",String.valueOf(end_region_id)); + + jsonRegion.put("create_mode","02"); + jsonRegion.put("create_id",SecurityUtils.getCurrentUserId()); + jsonRegion.put("create_name",SecurityUtils.getNickName()); + jsonRegion.put("create_time",DateUtil.now()); + regionTab.insert(jsonRegion); + + // 需回显起始点位、起始区域、任务id + JSONObject resuft = new JSONObject(); + resuft.put("iostorinv_id",jsonRegion.getString("iostorinv_id")); + resuft.put("vehicle_type",jsonOrder.getString("vehicle_type")); + resuft.put("create_mode",jsonRegion.getString("create_mode")); + resuft.put("material_id",jsonOrder.getString("material_id")); + return resuft; + } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index c602b0a..9c28278 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -48,4 +48,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return AcsUtil.notifyAcs(api, arr); } + @Override + public JSONObject getPointStatus(JSONArray whereJson) { + String api = "api/wms/querydevice"; + return AcsUtil.notifyAcs(api, whereJson); + } + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java new file mode 100644 index 0000000..a7d036e --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java @@ -0,0 +1,140 @@ +package org.nl.wms.ext.auto; + +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.utils.SpringContextHolder; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.sch.tasks.PointToPointTask; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AutoQueryTask { + + private final WmsToAcsService wmsToAcsService; + + @Transactional + public void run() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + + PointToPointTask pointTaskBean = SpringContextHolder.getBean(PointToPointTask.class); + + // 1.查找起点为油漆线 物料下料位的任务 + JSONArray taskArr = WQL.getWO("AUTO_QUERYTASK").addParam("flag", "1").process().getResultJSONArray(0); + + for (int i = 0; i < taskArr.size(); i++) { + JSONObject jsonTask = taskArr.getJSONObject(i); + /* + * 1.查找输送线有没有空位 输送线1对1关系 调用获取点位状态接口 + * 2.判断有空位的输送线是否有任务:起点和终点都要判断 + * 输送线点位:SSX01A1 - SSX01A2 ,SSX01B1 - SSX01B2 + */ + // 2.查找输送线空位,调用获取点位状态接口 + JSONArray paramArr = new JSONArray(); + + JSONObject pointA1 = new JSONObject(); + pointA1.put("device_code", "SSX01A1"); + paramArr.add(pointA1); + + JSONObject pointA2 = new JSONObject(); + pointA2.put("device_code", "SSX01A2"); + paramArr.add(pointA2); + + JSONObject pointB1 = new JSONObject(); + pointB1.put("device_code", "SSX01B1"); + paramArr.add(pointB1); + + JSONObject pointB2 = new JSONObject(); + pointB2.put("device_code", "SSX01B2"); + paramArr.add(pointB2); + + JSONObject result = wmsToAcsService.getPointStatus(paramArr); + + if (StrUtil.equals(result.getString("status"), "200")) { + JSONObject jsonPointAfter = new JSONObject(); // 处理后的json + + JSONArray dataArr = result.getJSONArray("data"); + // 3.处理返回的数据,处理后为json,key为点位编码,value为状态 + for (int j = 0; j < dataArr.size(); j++) { + JSONObject jsonObject = dataArr.getJSONObject(j); + + String device_code = jsonObject.getString("barcode"); + switch (device_code) { + case "SSX01A1" : + jsonPointAfter.put("SSX01A1",jsonObject.getString("move")); + break; + case "SSX01A2" : + jsonPointAfter.put("SSX01A2",jsonObject.getString("move")); + break; + case "SSX01B1" : + jsonPointAfter.put("SSX01B1",jsonObject.getString("move")); + break; + case "SSX01B2" : + jsonPointAfter.put("SSX01B2",jsonObject.getString("move")); + break; + } + } + JSONObject map = new JSONObject(); + // 4.1判断SSX01A1 、 SSX01A2是否是空位 无任务 + if (StrUtil.equals(jsonPointAfter.getString("SSX01A1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX01A2"), "0")) { + // 4.2如果都是空位 则判断是否有正在进行的任务 + map.put("flag", "2"); + map.put("start_point_code", "('SSX01A1','SSX01A2')"); + // 查找起点是否有任务 + JSONArray is_stara = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + // 查询终点是否有任务 + map.put("flag", "3"); + map.put("end_point_code", "('SSX01A1','SSX01A2')"); + JSONArray is_end = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + + if (ObjectUtil.isEmpty(is_stara) && ObjectUtil.isEmpty(is_end)) { + // 4.3.更新任务终点点位 + jsonTask.put("next_point_code", "SSX01A2"); + taskTab.update(jsonTask); + // 4.4.下发ACS + JSONObject jsonResultAcs = pointTaskBean.renotifyAcs(jsonTask.getString("task_id")); + + if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { + // 4.5.下发成功、更新任务状态 + jsonTask.put("task_status", "02"); + taskTab.update(jsonTask); + } + } + // 5.1判断SSX01B1 、 SSX01B2是否是空位 无任务 + } else if (StrUtil.equals(jsonPointAfter.getString("SSX01B1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX01B2"), "0")) { + // 5.2如果都是空位 则判断是否有正在进行的任务 + map.put("flag", "2"); + map.put("start_point_code", "('SSX01B1','SSX01B2')"); + // 查找起点是否有任务 + JSONArray is_stara = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + // 查询终点是否有任务 + map.put("flag", "3"); + map.put("end_point_code", "('SSX01B1','SSX01B2')"); + JSONArray is_end = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + + if (ObjectUtil.isEmpty(is_stara) && ObjectUtil.isEmpty(is_end)) { + // 5.3.更新任务终点点位 + jsonTask.put("next_point_code", "SSX01B2"); + taskTab.update(jsonTask); + // 5.4.下发ACS + JSONObject jsonResultAcs = pointTaskBean.renotifyAcs(jsonTask.getString("task_id")); + + if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { + // 4.5.下发成功、更新任务状态 + jsonTask.put("task_status", "02"); + taskTab.update(jsonTask); + } + } + } + } + } + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql new file mode 100644 index 0000000..a381a99 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql @@ -0,0 +1,92 @@ +[交易说明] + 交易名: 二楼到一楼业务 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.start_point_code TYPEAS s_string + 输入.end_point_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status = '01' + AND task.start_point_code in ('YQX01_WX','YQX02_WX') + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status <> '99' + + OPTION 输入.start_point_code <> "" + task.start_point_code in 输入.start_point_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status <> '99' + + OPTION 输入.end_point_code <> "" + task.next_point_code in 输入.end_point_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index e303713..b00cfd4 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -115,11 +115,13 @@ public abstract class AbstractAcsTask { AcsTaskDto taskDto = new AcsTaskDto(); taskDto.setTask_id(json.getString("task_id")); taskDto.setTask_code(json.getString("task_code")); - taskDto.setTask_type("1"); - taskDto.setRoute_plan_code("normal"); taskDto.setStart_device_code(json.getString("start_point_code")); taskDto.setNext_device_code(json.getString("next_point_code")); + taskDto.setPriority("1"); taskDto.setVehicle_code(json.getString("vehicle_code")); + taskDto.setTask_type("1"); + taskDto.setRoute_plan_code("normal"); + jsonArray.add(JSONObject.parse(JSON.toJSONString(taskDto))); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index 5af69dc..7606859 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -215,6 +215,7 @@ public class PointServiceImpl implements PointService { structMap.put("region_id", json.getString("region_id")); structMap.put("source_id", json.getString("struct_id")); structMap.put("point_type", "01"); + structMap.put("is_host", "0"); structMap.put("is_used", json.getString("is_used")); structMap.put("create_id", currentUserId); structMap.put("create_name", nickName); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/sch.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/sch.xls index bf2bc1fe613927fa33b0f20b0272e19d9bba3cc7..281a5db4669387c9259bcbda4463221cad93615f 100644 GIT binary patch delta 10113 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 F{tqN77d`+0 delta 40676 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'99' and taskdtl_id='" + taskdtl_id + "'").uniqueResult(0); - if (task == null) { - throw new BadRequestException("查询不到可以完成的任务记录!"); - } - JSONObject jo = new JSONObject(); - jo.put("taskdtl_id", taskdtl_id); - this.updateTaskStatus(jo, "2"); + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); } @Override diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java index bcb256e..f2ade01 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java @@ -24,6 +24,7 @@ import org.nl.wms.sch.service.dto.PointDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.HashMap; @@ -35,15 +36,30 @@ public class SendEmpVehicleTask extends AbstractAcsTask { private final String THIS_CLASS = SendEmpVehicleTask.class.getName(); @Override + @Transactional public void updateTaskStatus(JSONObject taskObj, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - // 完成任务 + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + if(StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { // 更改任务状态为完成 - JSONObject jsonTask = taskTab.query("task_id = '" + taskObj.getString("task_id") + "'").uniqueResult(0); jsonTask.put("task_status",TaskStatusEnum.FINISHED.getCode()); jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); @@ -61,7 +77,7 @@ public class SendEmpVehicleTask extends AbstractAcsTask { if (ObjectUtil.isEmpty(nextDto)) throw new BadRequestException("未找到可用点位:" + nextDto); // 1.更新点位数量 2.解锁点位 - JSONObject jsonEmp = empTab.query("task_uuid = '" + taskObj.getString("task_id") + "'").uniqueResult(0); + JSONObject jsonEmp = empTab.query("task_uuid = '" + task_id + "'").uniqueResult(0); int vehicle_qty = JSONObject.parseObject(JSON.toJSONString(nextDto)).getIntValue("vehicle_qty"); BigDecimal vehicle_qty_point = NumberUtil.add(String.valueOf(vehicle_qty), String.valueOf(jsonEmp.getIntValue("vehicle_qty"))); @@ -92,6 +108,7 @@ public class SendEmpVehicleTask extends AbstractAcsTask { } @Override + @Transactional public String createTask(JSONObject form) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); @@ -169,6 +186,7 @@ public class SendEmpVehicleTask extends AbstractAcsTask { } @Override + @Transactional public void forceFinish(String task_id) { JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); @@ -184,6 +202,7 @@ public class SendEmpVehicleTask extends AbstractAcsTask { } + @Transactional public JSONObject findEndPoint(JSONObject json) { String start_point_code = json.getString("start_point_code"); String vehicle_qty = json.getString("vehicle_qty"); @@ -204,7 +223,7 @@ public class SendEmpVehicleTask extends AbstractAcsTask { // 根据起点找到对应设备,根据设备查询工单表中 - 正在运行的工单中的载具类型 String device_code = ""; if (ObjectUtil.isEmpty(vehicle_code)) { - device_code = start_point_code.substring(0, start_point_code.indexOf("-")); + device_code = start_point_code.substring(0, start_point_code.indexOf("_")); } String vehicle_type = ""; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java index 473801e..4726413 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java @@ -46,6 +46,12 @@ public class SendMaterialTask extends AbstractAcsTask { String task_id = taskObj.getString("task_id"); WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { //更新任务状态为执行中 jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); @@ -60,21 +66,6 @@ public class SendMaterialTask extends AbstractAcsTask { WQLObject.getWQLObject("ST_IVT_regionIO").update(map, "task_id='" + jsonTask.getString("task_id") + "'"); } - if (TaskStatusEnum.ISSUE.getCode().equals(status)) { - // 下发任务 - this.renotifyAcs(task_id); - // 更新任务状态和单据状态 - jsonTask.put("task_status",TaskStatusEnum.ISSUE.getCode()); - jsonTask.put("car_no", taskObj.getString("car_no")); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_regionIO"); - JSONObject mstObj = mstTab.query("task_id='" + task_id + "' and is_delete='0'").uniqueResult(0); - mstObj.put("bill_status","30"); - mstTab.update(mstObj); - } - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { // 更新任务状态为完成 jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java index 32ebe54..60b1df5 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java @@ -210,7 +210,7 @@ public class RegionioInServiceImpl implements RegionioInService { form.put("iostorinv_id", iostorinv_id); // 根据起点点位 找到对应设备,根据设备找到对应工单,根据工单获取载具类型 - String device_code = start_point_code.substring(0, start_point_code.indexOf("-")); + String device_code = start_point_code.substring(0, start_point_code.indexOf("_")); DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); DeviceDto deviceDto = deviceBean.findByCode(device_code);