From 93992ebfdf3a53ac7abac1318c606c42a2e07ef3 Mon Sep 17 00:00:00 2001 From: lyd <1419499670@qq.com> Date: Thu, 17 Nov 2022 11:04:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9E=9A=E4=B8=BE=E3=80=81?= =?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/AcsToWmsController.java | 28 +++ .../wms/ext/acs/service/AcsToWmsService.java | 29 +++ .../acs/service/impl/AcsToWmsServiceImpl.java | 167 ++++++++++++++++++ .../org/nl/wms/sch/manage/WorkOrderEnum.java | 31 ++++ .../callMaterial/SzCallMaterialTask.java | 7 +- .../tasks/sendEmpty/DpSendEmpVehicleTask.java | 16 +- .../src/main/java/org/nl/wms/wms.xls | Bin 278528 -> 280064 bytes 7 files changed, 268 insertions(+), 10 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/WorkOrderEnum.java diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index b4d50f1..52ee1d3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -64,6 +64,34 @@ public class AcsToWmsController { return new ResponseEntity<>(result, HttpStatus.OK); } + @PostMapping("/ispackage") + @Log("ACS给WMS请求是否优先包装") + @ApiOperation("ACS给WMS请求是否优先包装") + public ResponseEntity ispackage(@RequestBody Map whereJson) { + return new ResponseEntity<>(acsToWmsService.ispackage(whereJson), HttpStatus.OK); + } + + @PostMapping("/getEmptyVehicle_code") + @Log("获取空木托盘号") + @ApiOperation("获取空木托盘号") + public ResponseEntity getEmptyVehicle_code(@RequestBody Map whereJson) { + return new ResponseEntity<>(acsToWmsService.getEmptyVehicle_code(whereJson), HttpStatus.OK); + } + + @PostMapping("/sureProduceTask") + @Log("排产单确认") + @ApiOperation("排产单确认") + public ResponseEntity sureProduceTask(@RequestBody Map whereJson) { + return new ResponseEntity<>(acsToWmsService.sureWorkOrder(whereJson), HttpStatus.OK); + } + + @PostMapping("/getDevicecodeByVehicletype") + @Log("根据木托盘类型获取对应所在的点位") + @ApiOperation("根据木托盘类型获取对应的点位") + public ResponseEntity getDevicecodeByVehicle_ype(@RequestBody Map whereJson) { + return new ResponseEntity<>(acsToWmsService.getDeviceCodeByVehicleType(whereJson), HttpStatus.OK); + } + @PostMapping("/againApply") @Log("二次申请任务") @ApiOperation("二次申请任务") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 800a8c6..a516363 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -57,4 +57,33 @@ public interface AcsToWmsService { * @param whereJson */ void manipulatorApply(Map whereJson); + + /** + * ACS给WMS请求是否优先包装 + * @param whereJson + * @return + */ + Map ispackage(Map whereJson); + + /** + * 获取空木托盘号 + * @param whereJson + * @return + */ + Map getEmptyVehicle_code(Map whereJson); + + /** + * 排产单确认 + * @param whereJson + * @return + */ + Map sureWorkOrder(Map whereJson); + + /** + * 根据木托盘类型获取对应所在的点位 + * + * @param jsonObject 条件 + * @return Map + */ + Map getDeviceCodeByVehicleType(Map jsonObject); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 5d376da..7e04169 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -4,18 +4,22 @@ 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.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; import org.nl.wms.log.LokiLog; import org.nl.wms.log.LokiLogType; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.WorkOrderEnum; import org.nl.wms.sch.service.TaskService; import org.nl.wms.sch.tasks.callEmpty.FjCallEmptyVehicleTask; import org.nl.wms.sch.tasks.callEmpty.HnCallEmptyVehicleTask; @@ -391,6 +395,169 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { this.apply((JSONObject) jsonObject); } + /** + * ACS给WMS请求是否优先包装 + * + * @param jsonObject + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map ispackage(Map jsonObject) { + String vehicle_code = (String) jsonObject.get("vehicle_code"); + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("托盘条码不能为空!"); + } + // 组盘表 + JSONObject vehicleObj = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code='" + vehicle_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(vehicleObj)) { + throw new BadRequestException("未找到托盘号为'" + vehicle_code + "'的组盘信息!"); + } + // 获取工单 + String workorder_id = vehicleObj.getString("producetask_id"); + JSONObject taskObj = WQLObject.getWQLObject("PDM_BD_WorkOrder").query("workorder_id='" + workorder_id + "'").uniqueResult(0); + //1代表去出窑,2 是优先包装 + String is_package = "1"; + if (StrUtil.equals(taskObj.getString("is_package"), "1")) { + is_package = "2"; + } + JSONObject returnjo = new JSONObject(); + returnjo.put("is_package", is_package); + return returnjo; + } + + /** + * 获取空木托盘号 + * + * @param jsonObject + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map getEmptyVehicle_code(Map jsonObject) { + //获取一个空的托盘号 + String code = "VEHICCLE_CODE_MTP"; + String vehicle_type = "03"; // todo + WQLObject vehicle_table = WQLObject.getWQLObject("MD_PB_Vehicle"); + VehicleDto dto = new VehicleDto(); + dto.setVehicle_id(IdUtil.getSnowflake(1, 1).nextId()); + String vehicle_code = CodeUtil.getNewCode(code); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setVehicle_code(vehicle_code); + dto.setCreate_id(currentUserId); + dto.setVehicle_name(vehicle_code); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setVehicle_type(vehicle_type); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + vehicle_table.insert(json); + JSONObject returnjo = new JSONObject(); + returnjo.put("vehicle_code", vehicle_code); + returnjo.put("status", HttpStatus.OK.value()); + //将起点终点确定不下发的任务查出来,将木托盘点位解锁,起点改为扫描点,is_auto_issue 改为1, + String device_code = (String) jsonObject.get("device_code"); + WQLObject task_Table = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = task_Table.query("task_status='" + TaskStatusEnum.START_AND_POINT.getCode() +"' and is_auto_issue='0'", "create_time desc").uniqueResult(0); + String start_point_code = taskObj.getString("point_code1"); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject startObj = pointTable.query("point_code ='" + start_point_code + "'").uniqueResult(0); + startObj.put("lock_type", "1"); + pointTable.update(startObj); + taskObj.put("point_code1", device_code); + taskObj.put("is_auto_issue", "1"); + taskObj.put("vehicle_code", vehicle_code); + task_Table.update(taskObj); + return returnjo; + } + + /** + * 排产单确认 + * + * @param jsonObject + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map sureWorkOrder(Map jsonObject) { + // 工单编号、设备编号、物料编号、数量、类型 + String workorder_code = (String) jsonObject.get("workorder_code"); + String device_code = (String) jsonObject.get("device_code"); + String material_code = (String) jsonObject.get("material_code"); + String qty = String.valueOf(jsonObject.get("qty")); + String type = (String) jsonObject.get("type"); + if (StrUtil.isEmpty(type)) { + throw new BadRequestException("类型不能为空!"); + } + WQLObject taskTable = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject orderObj = taskTable.query("workorder_code = '" + workorder_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(orderObj)) { + throw new BadRequestException("未找到工单号为'" + workorder_code + "'的工单信息!"); + } + JSONObject materialObj = WQLObject.getWQLObject("MD_ME_MaterialBase").query("material_code = '" + material_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(materialObj)) throw new BadRequestException("当前物料不存在!"); + //1为确认 + //2为生产中 + //3为完成 + if (StrUtil.equals(type, "1")) { + if (StrUtil.isEmpty(workorder_code)) { + throw new BadRequestException("工单号不能为空!"); + } + if (StrUtil.isEmpty(device_code)) { + throw new BadRequestException("设备点位不能为空!"); + } + if (StrUtil.isEmpty(material_code)) { + throw new BadRequestException("物料编码不能为空!"); + } + + if (!StrUtil.equals(materialObj.getString("material_id"), orderObj.getString("material_id"))) { + throw new BadRequestException("物料标识不一样!"); + } + orderObj.put("order_status", WorkOrderEnum.ORDER_STATUS_DELIVERED.getCode()); + + } + if (StrUtil.equals("2", type)) { + orderObj.put("producetask_status", WorkOrderEnum.ORDER_STATUS_PRODUCING.getCode()); + } + if (StrUtil.equals("3", type)) { + orderObj.put("producetask_status", WorkOrderEnum.ORDER_STATUS_FINISH.getCode()); + orderObj.put("real_qty", qty); + } + taskTable.update(orderObj); + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + result.put("data", new JSONObject()); + return result; + } + + /** + * 根据木托盘类型获取对应所在的点位 + * + * @param jsonObject 条件 + * @return Map + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map getDeviceCodeByVehicleType(Map jsonObject) { + String vehicle_type = (String) jsonObject.get("vehicle_type"); + if (StrUtil.isEmpty(vehicle_type)) { + throw new BadRequestException("托盘类型不能为空!"); + } + WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); + JSONObject pointObj = point_table.query("vehicle_type='" + vehicle_type + "' and region_code = 'FMQ'").uniqueResult(0); + if (ObjectUtil.isEmpty(pointObj)) { + throw new BadRequestException("为找到类型为'" + vehicle_type + "' 的设备点位"); + } + JSONObject returnjo = new JSONObject(); + returnjo.put("device_code", pointObj.getString("point_code")); + return returnjo; + } + private JSONObject getProduceInfoByCode(String code) { //根据 设备点位去找生产任务信息 //1 根据点位去找设备,去找对应的设备信息 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/WorkOrderEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/WorkOrderEnum.java new file mode 100644 index 0000000..913b1f2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/WorkOrderEnum.java @@ -0,0 +1,31 @@ +package org.nl.wms.sch.manage; + +/** + * @author: lyd + * @description: 工单枚举 + * @Date: 2022/11/17 + */ +public enum WorkOrderEnum { + // 工单状态 + ORDER_STATUS_UNPRODUCED("1", "未生产"), + ORDER_STATUS_DELIVERED("2", "已下发"), + ORDER_STATUS_PRODUCING("3", "生产中"), + ORDER_STATUS_STOP("4", "停止"), + ORDER_STATUS_FINISH("5", "完成") + ; + private final String code; + private final String name; + + WorkOrderEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java index 5ca6a3a..9125628 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java @@ -16,6 +16,7 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.UpdateTaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; @@ -82,7 +83,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { // 物料点 JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); //任务取消 - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); @@ -98,7 +99,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { } } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); taskObj.put("update_time", DateUtil.now()); @@ -106,7 +107,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("update_time", DateUtil.now()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java index c8b57e5..e25b657 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java @@ -16,8 +16,10 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.UpdateTaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -43,13 +45,14 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { /** * @param taskObj 代表一条任务对象 - * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + * @param status 代表wcs任务完成状态: //0:acs,取消,1:执行中,2:完成 * @return * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 * @author ldjun * @created 2019年4月17日 下午8:51:50 */ @Override + @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); @@ -59,7 +62,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { String point_code2 = taskObj.getString("point_code2"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); @@ -76,7 +79,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { taskTab.update(jsonTask); } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); jsonTask.put("update_time", DateUtil.now()); @@ -84,7 +87,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { taskTab.update(jsonTask); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { // 更改任务状态为完成 jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); @@ -95,7 +98,6 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); point_2.put("lock_type", "1"); - point_2.put("point_status", "2"); point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); point_2.put("vehicle_qty", NumberUtil.add(point_2.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); point_2.put("instorage_time", DateUtil.now()); @@ -108,8 +110,6 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { // 起点设置为空位 JSONObject point_1 = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); point_1.put("point_status", "1"); - point_1.put("point_status", "1"); - point_1.put("point_status", "1"); pointTab.update(point_1); } } @@ -120,6 +120,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { * @return 返回任务标识 */ @Override + @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { // 送到KGTDDW01 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 @@ -151,6 +152,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { * @created 2020年6月12日 下午6:01:06 */ @Override + @Transactional(rollbackFor = Exception.class) public void findNextPoint() { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 4c147a0f8187da09794a2528da2162c5e2bb3710..6bdbc77777b8cffd2750b0713b129c9373ef6072 100644 GIT binary patch delta 11562 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 delta 10867 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 E0A14xg#Z8m