From cf745020437ed6120f7b9447e83a78a2b743ff15 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Tue, 27 Jun 2023 09:35:09 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=96=B0=E5=A2=9Emes=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=B2=B9=E6=BC=86=E7=BA=BF=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8F=98=E5=8A=A8=EF=BC=8C=E5=BA=9F=E5=BC=83=E6=B2=B9?= =?UTF-8?q?=E6=BC=86=E7=BA=BF=E7=BC=93=E5=AD=98=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/MaterialbaseServiceImpl.java | 6 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 30 +- .../wms/ext/mes/rest/MesToWmsController.java | 37 +- .../wms/ext/mes/rest/WmsToMesController.java | 13 +- .../wms/ext/mes/service/MesToWmsService.java | 8 +- .../wms/ext/mes/service/WmsToMesService.java | 7 +- .../mes/service/impl/MesToWmsServiceImpl.java | 126 +++- .../mes/service/impl/WmsToMesServiceImpl.java | 13 +- .../rest/SSXSendMaterialController.java | 55 ++ .../service/SSXSendMaterialService.java | 16 + .../impl/SSXSendMaterialServiceImpl.java | 77 +++ .../autoTask/YqxhcqCallMaterialTask.java | 646 +++++++++--------- .../callEmpty/GjxCallEmpVehicleTask.java | 17 +- .../callMaterial/YqxCallMaterialTask.java | 169 ++++- .../nl/wms/sch/tasks/callMaterial/backup.txt | 242 +++++++ .../wql/QSCH_yqxCallMAterial_01.wql | 4 +- .../org/nl/wms/sch/tasks/cpOut/CpOutTask.java | 95 ++- .../tasks/sendEmpty/HtSendEmpVehicleTask.java | 6 - .../sendMaterial/BZXSendMaterialTask.java | 199 ++++++ .../sendMaterial/BzssxSendMaterialTask.java | 203 ++++++ .../sendMaterial/GjxSendMaterialTask.java | 34 +- .../sendMaterial/HkxSendMaterialTask.java | 25 +- .../src/main/java/org/nl/wms/wms.xls | Bin 259584 -> 297984 bytes .../resources/config/application-prod.yml | 12 +- 24 files changed, 1572 insertions(+), 468 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/rest/SSXSendMaterialController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/SSXSendMaterialService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/impl/SSXSendMaterialServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/backup.txt create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BZXSendMaterialTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BzssxSendMaterialTask.java diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java index 01307b7..bccff8e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java @@ -137,6 +137,11 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { Long currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + JSONObject jsonObject = wo.query("material_code = '" + dto.getMaterial_code() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("物料柜号不能重复"); + } dto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId()); dto.setCreate_id(currentUserId); @@ -146,7 +151,6 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { dto.setUpdate_time(now); dto.setCreate_time(now); dto.setBase_unit_id(15); - WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); wo.insert(json); } 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 f523cef..e71d39f 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 @@ -21,10 +21,7 @@ import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask; import org.nl.wms.sch.tasks.sendEmpty.DpxwSendEmpVehicleTask; import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask; import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.HtSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.YqxSendMaterialTask; +import org.nl.wms.sch.tasks.sendMaterial.*; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -171,7 +168,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Transactional(rollbackFor = Exception.class) public JSONObject apply(JSONObject whereJson) { String type = whereJson.getString("type"); - String point_code = whereJson.getString("point_code"); + String point_code = ObjectUtil.isNotEmpty(whereJson.getString("point_code")) + ? whereJson.getString("point_code") + : whereJson.getString("device_code"); String vehicle_type = whereJson.getString("vehicle_type"); String vehicle_code = whereJson.getString("vehicle_code"); //载具数量 @@ -194,6 +193,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { * 8.豪凯自动线下料入库 * 9.碟盘限位送空盘到输送线 * 10.一楼货梯送料 + * 11.新增包装输送线送料 + * 12.新增包装输送线送料入库 */ if (StrUtil.equals(type, "1")) { // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 @@ -218,6 +219,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("qty", material_num); // 满料位 param.put("vehicle_type", vehicle_type); param.put("vehicle_code", vehicle_code); + param.put("task_code", whereJson.getString("task_code")); GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); String task_id = taskBean.createTask(param); // 创建任务 @@ -240,6 +242,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_type", vehicle_type); param.put("vehicle_code", vehicle_code); param.put("material_num", material_num); + param.put("task_code", whereJson.getString("task_code")); // 创建任务 YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class); String task_id = taskBean.createTask(param); @@ -281,6 +284,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_code", vehicle_code); param.put("vehicle_type", vehicle_type); param.put("qty", material_num); + param.put("task_code", whereJson.getString("task_code")); HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class); String task_id = taskBean.createTask(param); @@ -300,6 +304,22 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("task_id", whereJson.getString("task_id")); HtSendMaterialTask taskBean = SpringContextHolder.getBean(HtSendMaterialTask.class); String task_id = taskBean.createTask(param); + } else if (StrUtil.equals(type, "11")) { + // 11.新增包装输送线送料 + JSONObject param = new JSONObject(); + param.put("point_code1", point_code); + param.put("vehicle_type", vehicle_type); + param.put("qty", material_num); + param.put("material_id", whereJson.getString("material_id")); + BzssxSendMaterialTask taskBean = SpringContextHolder.getBean(BzssxSendMaterialTask.class); + String task_id = taskBean.createTask(param); + } else if (StrUtil.equals(type, "12")) { + // 12.新增包装输送线送料入库 + JSONObject param = new JSONObject(); + param.put("point_code1", point_code); + param.put("task_id", whereJson.getString("task_id")); + BZXSendMaterialTask taskBean = SpringContextHolder.getBean(BZXSendMaterialTask .class); + String task_id = taskBean.createTask(param); } return null; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java index e0f7a36..ff51ee4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToWmsController.java @@ -23,22 +23,21 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @Api(tags = "mes请求wms") -@RequestMapping("/api/to/wms") +@RequestMapping("/api") @Slf4j @SaIgnore public class MesToWmsController { private final MesToWmsService mesToWmsService; - @PostMapping("/workWorder") + @PostMapping("/workOrder") @Log("mes下发工单") @ApiOperation("mes下发工单") @SaIgnore public ResponseEntity issueWorkOrderForMes(@RequestBody JSONObject param) { - mesToWmsService.issueWorkOrderForMes(param); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); + return new ResponseEntity<>(mesToWmsService.issueWorkOrderForMes(param), HttpStatus.OK); } - @PostMapping("/workWorder/finish") + @PostMapping("/workOrder/finish") @Log("mes获取工单反馈") @ApiOperation("mes获取工单反馈") @SaIgnore @@ -54,11 +53,35 @@ public class MesToWmsController { return new ResponseEntity<>(mesToWmsService.gjxAutomaticForMes(param), HttpStatus.OK); } + @PostMapping("/yqxUp") + @Log("油漆线上料") + @ApiOperation("油漆线上料") + @SaIgnore + public ResponseEntity yqxAutomaticForMes(@RequestBody JSONObject param) { + return new ResponseEntity<>(mesToWmsService.yqxAutomaticForMes(param), HttpStatus.OK); + } + @PostMapping("/hkxDown") - @Log("豪凯自动线下料") - @ApiOperation("豪凯自动线下料") + @Log("1.5成品入库") + @ApiOperation("1.5成品入库") @SaIgnore public ResponseEntity hawKeAutomaticForMes(@RequestBody JSONObject param) { return new ResponseEntity<>(mesToWmsService.hawKeAutomaticForMes(param), HttpStatus.OK); } + + @PostMapping("/finishMaterialOut") + @Log("1.5成品出库") + @ApiOperation("1.5成品出库") + @SaIgnore + public ResponseEntity finishMaterialOut(@RequestBody JSONObject param) { + return new ResponseEntity<>(mesToWmsService.finishMaterialOut(param), HttpStatus.OK); + } + @PostMapping("/releaseCpPointArea") + @Log("成品出库区域释放") + @ApiOperation("成品出库区域释放") + @SaIgnore + public ResponseEntity releaseCpPointArea(@RequestBody JSONObject param) { + return new ResponseEntity<>(mesToWmsService.releaseCpPointArea(param), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/WmsToMesController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/WmsToMesController.java index ca4dc21..6c4cf6a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/WmsToMesController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/WmsToMesController.java @@ -1,6 +1,7 @@ package org.nl.wms.ext.mes.rest; import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -21,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @Api(tags = "wms请求mes") -@RequestMapping("/api/to/wms") +@RequestMapping("/api") @Slf4j @SaIgnore public class WmsToMesController { @@ -45,12 +46,12 @@ public class WmsToMesController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } - @PostMapping("/device") - @Log("从MES系统获取设备基础信息") - @ApiOperation("从MES系统获取设备基础信息") + @PostMapping("/task/feedback") + @Log("任务反馈") + @ApiOperation("任务反馈") @SaIgnore - public ResponseEntity getDeviceInfoForMes() { - wmsToMesService.getDeviceInfoForMes(); + public ResponseEntity taskFeedback(JSONObject param) { + wmsToMesService.taskFeedback(param); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java index 898bb8a..434ef13 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToWmsService.java @@ -12,11 +12,17 @@ public interface MesToWmsService { /** * mes下发工单 */ - void issueWorkOrderForMes(JSONObject param); + JSONObject issueWorkOrderForMes(JSONObject param); JSONObject feedbackWorkOrderToMes(JSONObject param); JSONObject hawKeAutomaticForMes(JSONObject param); JSONObject gjxAutomaticForMes(JSONObject param); + + JSONObject yqxAutomaticForMes(JSONObject param); + + JSONObject finishMaterialOut(JSONObject param); + + JSONObject releaseCpPointArea(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/WmsToMesService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/WmsToMesService.java index 6b8cb9e..ef6b7ae 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/WmsToMesService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/WmsToMesService.java @@ -1,5 +1,7 @@ package org.nl.wms.ext.mes.service; +import com.alibaba.fastjson.JSONObject; + /** * @Author: lyd * @Description: wms对接mes的业务层 @@ -17,8 +19,5 @@ public interface WmsToMesService { */ void getUnitInfoForMes(); - /** - * 设备 - */ - void getDeviceInfoForMes(); + void taskFeedback(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java index d3ed894..9d1fb9a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java @@ -1,10 +1,28 @@ package org.nl.wms.ext.mes.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; 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.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.ext.acs.service.AcsToWmsService; import org.nl.wms.ext.mes.service.MesToWmsService; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; +import org.nl.wms.sch.tasks.cpOut.CpOutTask; +import org.slf4j.MDC; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; /** * @Author: lyd @@ -15,28 +33,126 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor @Slf4j public class MesToWmsServiceImpl implements MesToWmsService { + private final AcsToWmsService acsToWmsService; + private final MaterialbaseService materialbaseService; @Override - public void issueWorkOrderForMes(JSONObject param) { - // + @Transactional + public JSONObject issueWorkOrderForMes(JSONObject param) { + MDC.put("log_file_type", "MES下发工单"); + log.info("mes传来工单信息:" + param); + WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder"); + WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device"); + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("工单不能为空"); + } + MaterialbaseDto materialCode = materialbaseService.findByCode(param.getString("material_code")); + JSONObject deviceCode = deviceTab.query("extend_code = '" + param.getString("device_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(deviceCode)) { + throw new BadRequestException("设备编码错误!"); + } + param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); + param.put("plan_qty", param.getString("qty")); + param.put("order_status", param.getString("workorder_status")); + param.put("material_id", materialCode.getMaterial_id()); + param.put("device_id", deviceCode.getString("device_id")); + param.put("device_code", deviceCode.getString("device_code")); + param.put("produce_date", DateUtil.format(new Date(), "yyyy-MM-dd")); + param.put("create_id", "3"); + param.put("create_name", "MES系统"); + param.put("create_time", param.getString("create_time")); + workOrderTab.insert(param); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + MDC.remove("log_file_type"); + return result; } @Override public JSONObject feedbackWorkOrderToMes(JSONObject param) { - return null; + log.info("mes传来工单信息:", param); + WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder"); + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("工单不能为空"); + } + JSONObject jsonObject = workOrderTab + .query("workorder_code = '" + param.getString("workorder_code") + "'") + .uniqueResult(0); + jsonObject.put("order_status", param.getString("workorder_status")); + jsonObject.put("update_optid", "3"); + jsonObject.put("update_optname", "MES系统"); + jsonObject.put("update_time", DateUtil.now()); + jsonObject.put("realproduceend_date", DateUtil.now()); + workOrderTab.update(jsonObject); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + return result; } @Override public JSONObject hawKeAutomaticForMes(JSONObject param) { - return null; + log.info("mes成品入库参数:" + param); + param.put("type", "8"); + acsToWmsService.apply(param); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + return result; } @Override public JSONObject gjxAutomaticForMes(JSONObject param) { log.info("mes供给线下料参数:" + param); + param.put("type", "2"); + acsToWmsService.apply(param); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + return result; + } + + @Override + public JSONObject yqxAutomaticForMes(JSONObject param) { + log.info("mes油漆线上料参数:" + param); + param.put("type", "4"); + acsToWmsService.apply(param); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + return result; + } + + @Override + public JSONObject finishMaterialOut(JSONObject param) { + // 创建任务 + CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class); + taskBean.createTask(param); + JSONObject result = new JSONObject(); + result.put("status", 200); + result.put("message", "操作成功"); + return result; + } + + @Override + public JSONObject releaseCpPointArea(JSONObject param) { + if (ObjectUtil.isEmpty(param) || ObjectUtil.isEmpty(param.getString("out_store_order"))) { + throw new BadRequestException("参数不能为空"); + } + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + JSONObject entity = new JSONObject(); + entity.put("point_status", "1"); + entity.put("material_id", ""); + entity.put("pcsn", ""); + entity.put("ivt_qty", "0"); + entity.put("instorage_time", ""); + entity.put("vehicle_type", ""); + entity.put("vehicle_code", ""); + entity.put("update_time", DateUtil.now()); + pointTab.update(entity, "region_code = 'CPCKQ01' and lock_type = '1'"); JSONObject result = new JSONObject(); result.put("status", 200); result.put("message", "操作成功"); - result.put("data", param); return result; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java index 326d8fb..ccf4912 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.ext.mes.service.impl; import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.wms.ext.mes.service.WmsToMesService; @@ -31,9 +32,13 @@ public class WmsToMesServiceImpl implements WmsToMesService { } @Override - public void getDeviceInfoForMes() { - String url = http + "api/device"; - String result = HttpUtil.post(url, ""); - System.out.println(result); + public void taskFeedback(JSONObject param) { + String url = http + "api/task"; + try { +// String result = HttpUtil.post(url, param); + } catch (Exception e) { + log.error("反馈MES异常"); + } } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/rest/SSXSendMaterialController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/rest/SSXSendMaterialController.java new file mode 100644 index 0000000..41456e5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/rest/SSXSendMaterialController.java @@ -0,0 +1,55 @@ +package org.nl.wms.pda.ssxsendmaterial.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +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.modules.logging.annotation.Log; +import org.nl.wms.pda.ssxsendmaterial.service.SSXSendMaterialService; +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; + +/** + * @Author: lyd + * @Description: 包装输送线送料 + * @Date: 2023/6/15 + */ + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持送料") +@RequestMapping("api/pda/ssx/sendMaterial") +@Slf4j +public class SSXSendMaterialController { + + private final SSXSendMaterialService sendMaterialService; + @PostMapping("/queryMaterial") + @Log("查询物料") + @ApiOperation("查询物料") + @SaIgnore + public ResponseEntity queryMaterial() { + return new ResponseEntity<>(sendMaterialService.queryMaterial(), HttpStatus.OK); + } + + @PostMapping("/queryVehicle") + @Log("查询载具类型") + @ApiOperation("查询载具类型") + @SaIgnore + public ResponseEntity queryVehicle() { + return new ResponseEntity<>(sendMaterialService.queryVehicle(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("送料确定") + @ApiOperation("送料确定") + @SaIgnore + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(sendMaterialService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/SSXSendMaterialService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/SSXSendMaterialService.java new file mode 100644 index 0000000..e50b8c5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/SSXSendMaterialService.java @@ -0,0 +1,16 @@ +package org.nl.wms.pda.ssxsendmaterial.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/6/15 + */ +public interface SSXSendMaterialService { + JSONObject queryMaterial(); + + JSONObject confirm(JSONObject whereJson); + + JSONObject queryVehicle(); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/impl/SSXSendMaterialServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/impl/SSXSendMaterialServiceImpl.java new file mode 100644 index 0000000..89b1eb7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/ssxsendmaterial/service/impl/SSXSendMaterialServiceImpl.java @@ -0,0 +1,77 @@ +package org.nl.wms.pda.ssxsendmaterial.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.ssxsendmaterial.service.SSXSendMaterialService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Author: lyd + * @Description: 输送线送料 + * @Date: 2023/6/15 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class SSXSendMaterialServiceImpl implements SSXSendMaterialService { + private final AcsToWmsService acsToWmsService; + @Override + public JSONObject queryMaterial() { + JSONObject result = new JSONObject(); + JSONArray mdMeMaterialbase = WQLObject.getWQLObject("md_me_materialbase").query("is_used = '1' and is_delete = '0'").getResultJSONArray(0); + result.put("result", mdMeMaterialbase); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject param) { + JSONObject result = new JSONObject(); + String materialId = param.getString("material_id"); + String vehicle_type = param.getString("value"); + String qty = param.getString("qty"); + if (ObjectUtil.isEmpty(materialId)) { + // 物料不能为空 + throw new BadRequestException("物料不能为空"); + } + // 执行创建任务并下发给acs: 1001 -> 1004 + param.put("point_code", "BZSSX1001"); + param.put("material_id", materialId); + param.put("vehicle_type", vehicle_type); + param.put("qty", qty); + param.put("type", "11");// 组盘信息:task_id + // 2、调用接口 + JSONObject json = acsToWmsService.apply(param); + if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) { + result.put("result", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + } else { + result.put("result", ""); + result.put("code", "0"); + result.put("desc", "操作失败:" + json.getString("message")); + } + return result; + } + + @Override + public JSONObject queryVehicle() { + JSONObject result = new JSONObject(); + WQLObject dictTab = WQLObject.getWQLObject("sys_dict_detail"); + JSONArray dictSort = dictTab.query("name = 'vehicle_type' and value in ('4','5','6')", "dict_sort").getResultJSONArray(0); + result.put("result", dictSort); + result.put("code", "1"); + result.put("desc", "操作成功"); + return result; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java index e9852b6..e6d5e59 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/YqxhcqCallMaterialTask.java @@ -1,323 +1,323 @@ -package org.nl.wms.sch.tasks.autoTask; - -import cn.hutool.core.date.DateUtil; -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.config.MapOf; -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.WQL; -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.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * @Author: lyd - * @Description: 油漆线缓存区自动叫料 - * @Date: 2023/2/25 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxhcqCallMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxhcqCallMaterialTask.class.getName(); - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = json.getString("point_code1"); - if (ObjectUtil.isEmpty(point_code)) { - // 证明是等待点 - point_code = json.getString("point_code3"); - } - String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(newPoint) - .next_device_code(json.getString("point_code2")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - // 物料点 - JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - if (ObjectUtil.isEmpty(material_point)) return; - // 点位解锁 - material_point.put("lock_type", "1"); - pointTab.update(material_point); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - //完成后 - // 物料点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - material_point.put("material_id", ""); - material_point.put("vehicle_type", ""); - material_point.put("vehicle_code", ""); - pointTab.update(material_point); - - // 油漆线缓存点位更新 - JSONObject yqx_point = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); - yqx_point.put("point_status", "3"); - yqx_point.put("material_id", taskObj.getString("material_id")); - yqx_point.put("vehicle_type", taskObj.getString("vehicle_type")); - yqx_point.put("material_qty", taskObj.getString("material_qty")); - yqx_point.put("vehicle_qty", taskObj.getString("vehicle_qty")); - pointTab.update(yqx_point); - - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("remark", "任务完成"); - taskTab.update(taskObj); - - if (ObjectUtil.isEmpty(material_point)) return; - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "2"); - regionIoObj.put("region_id", material_point.getString("region_id")); - regionIoObj.put("region_code", material_point.getString("region_code")); - regionIoObj.put("region_name", material_point.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", taskObj.getString("material_qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code2")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void autoCreate() { - // 自动叫料 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - // 找终点:四个缓存区按顺序获取一个 - JSONObject endPoint = WQL.getWO("YQX_AUTOTASK").addParamMap(MapOf.of("flag","1")).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) return; - String point_code2 = endPoint.getString("point_code"); - // 判断任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); - // 判断工单 - JSONObject workOrderObj = workOrderTab.query("device_code = '" + endPoint.getString("device_code") + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - // 创建任务 - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线叫料") - .acs_task_type("2")//2楼AGV普通任务 - .priority("7") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .vehicle_qty(1) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .remark("任务创建成功") - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - // 到养生A区找起点:根据物料、载具类型去查找,均在工单中 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject queryParam = new JSONObject(); - queryParam.put("flag", "1"); - queryParam.put("material_id", material_id); - queryParam.put("region_code", "YSQA01"); - queryParam.put("vehicle_type", vehicle_type ); - // 查找养生A区,如果最后一个位置有货,直接搬走,如果没货,就作为等待点。先让agv到达等待点 - // 1、根据物料id查找养生A区物料点 - JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(materialPoint)) { - // 2、判断是否在等待点,如果不是,先去等待点,是直接搬运 - // 2.1、获取当前快排列的等待点 row:排 - JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01") - .addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"), - "row_num", materialPoint.getString("row_num"), - "region_code", "YSQA01")).process() - .uniqueResult(0); - if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线缓存区判断等待点异常!"); - // 2.2、判断等待点 - if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) { - // 获取等待点 - JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " + - "AND row_num = '" + materialPoint.getString("row_num") + "' " + - "AND col_num = '" + waitPoint.getString("waitcol") + "' " + - "AND is_used = '1' " + - "AND is_delete = '0' " + - "AND lock_type = '1' " + - "AND region_code = 'YSQA01'").uniqueResult(0); - if (ObjectUtil.isEmpty(waitPoints)) { - taskObj.put("remark", "等待点已被占用"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - continue; - } - // 等待点上锁 -// waitPoints.put("lock_type", "2"); - pointTab.update(waitPoints); - - taskObj.put("point_code3", waitPoints.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "3"); - taskObj.put("remark", "等待点"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - continue; - } - // 是等待点直接搬走 - // 物料点位上锁 - materialPoint.put("lock_type", "2"); - pointTab.update(materialPoint); - - taskObj.put("point_code1", materialPoint.getString("point_code")); - taskObj.put("material_qty", materialPoint.getString("ivt_qty")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); - taskObj.put("remark", "等待点搬运物料"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("remark", "养生A区无所需物料"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - - } - } - - @Override - public String createTask(JSONObject whereJson) { - return null; - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!"); - this.updateTaskStatus(taskObj,"2"); - } - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); - this.updateTaskStatus(taskObj,"0"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String againApply(String task_id) { - // 二次下发任务 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!"); - JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!"); - JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of( - "flag", "3", "material_id", hcTask.getString("material_id"), - "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"), - "block_num", hcTask.getString("block_num"), "col_num", hcTask.getString("col_num") - )).process().uniqueResult(0); - if (ObjectUtil.isEmpty(materialPoint)) throw new BadRequestException("养生A区暂无所需物料!"); - String pointCode = materialPoint.getString("point_code"); - // 修改任务 - hcTask.put("point_code1", pointCode); - hcTask.put("remark", "养生A区:" + pointCode); - taskTab.update(hcTask); - // 锁住点位 - materialPoint.put("lock_type", "2"); - pointTab.update(materialPoint); - // 点位处理 - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812 - String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10); - return newPoint; - } -} +//package org.nl.wms.sch.tasks.autoTask; +// +//import cn.hutool.core.date.DateUtil; +//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.config.MapOf; +//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.WQL; +//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.tasks.AcsTaskDto; +//import org.nl.wms.util.IdUtil; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.util.ArrayList; +//import java.util.List; +// +///** +// * @Author: lyd +// * @Description: 油漆线缓存区自动叫料 +// * @Date: 2023/2/25 +// */ +//@Service +//@RequiredArgsConstructor +//@Slf4j +//public class YqxhcqCallMaterialTask extends AbstractAcsTask { +// private final String THIS_CLASS = YqxhcqCallMaterialTask.class.getName(); +// @Override +// public List addTask() { +// /* +// * 下发给ACS时需要特殊处理 +// */ +// JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); +// +// ArrayList acsTaskArr = new ArrayList<>(); +// for (int i = 0; i < arr.size(); i++) { +// JSONObject json = arr.getJSONObject(i); +// //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) +// String point_code = json.getString("point_code1"); +// if (ObjectUtil.isEmpty(point_code)) { +// // 证明是等待点 +// point_code = json.getString("point_code3"); +// } +// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); +// +// AcsTaskDto dto = AcsTaskDto.builder() +// .task_id(json.getString("task_id")) +// .task_code(json.getString("task_code")) +// .task_type(json.getString("acs_task_type")) +// .start_device_code(newPoint) +// .next_device_code(json.getString("point_code2")) +// .vehicle_code(json.getString("vehicle_code")) +// .vehicle_type(json.getString("vehicle_type")) +// .priority(json.getString("priority")) +// .remark(json.getString("remark")) +// .build(); +// acsTaskArr.add(dto); +// } +// return acsTaskArr; +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void updateTaskStatus(JSONObject task, String status) { +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); +// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); +// +// String task_id = task.getString("task_id"); +// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); +// // 物料点 +// JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); +// //任务取消 +// if (StrUtil.equals(status, "0")) { +// // 取消删除任务 +// if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { +// throw new BadRequestException("已完成不能取消!"); +// } +// taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); +// taskObj.put("remark", "已取消"); +// taskTab.update(taskObj); +// +// if (ObjectUtil.isEmpty(material_point)) return; +// // 点位解锁 +// material_point.put("lock_type", "1"); +// pointTab.update(material_point); +// } +// +// if ("1".equals(status)) { +// // 更新任务状态为执行中 +// taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); +// taskObj.put("update_time", DateUtil.now()); +// taskObj.put("car_no", taskObj.getString("car_no")); +// taskTab.update(taskObj); +// } +// +// if (StrUtil.equals(status, "2")) { +// //完成后 +// // 物料点位解锁 并设置空位 +// material_point.put("lock_type", "1"); +// material_point.put("point_status", "1"); +// material_point.put("material_id", ""); +// material_point.put("vehicle_type", ""); +// material_point.put("vehicle_code", ""); +// pointTab.update(material_point); +// +// // 油漆线缓存点位更新 +// JSONObject yqx_point = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0); +// yqx_point.put("point_status", "3"); +// yqx_point.put("material_id", taskObj.getString("material_id")); +// yqx_point.put("vehicle_type", taskObj.getString("vehicle_type")); +// yqx_point.put("material_qty", taskObj.getString("material_qty")); +// yqx_point.put("vehicle_qty", taskObj.getString("vehicle_qty")); +// pointTab.update(yqx_point); +// +// // 更改任务状态为完成 +// taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); +// taskObj.put("update_time", DateUtil.now()); +// taskObj.put("remark", "任务完成"); +// taskTab.update(taskObj); +// +// if (ObjectUtil.isEmpty(material_point)) return; +// +// //区域出入表【st_ivt_regionIO】 +// WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); +// JSONObject regionIoObj = new JSONObject(); +// regionIoObj.put("iostorinv_id", IdUtil.getLongId()); +// regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); +// regionIoObj.put("buss_date", DateUtil.today()); +// regionIoObj.put("io_type", "2"); +// regionIoObj.put("region_id", material_point.getString("region_id")); +// regionIoObj.put("region_code", material_point.getString("region_code")); +// regionIoObj.put("region_name", material_point.getString("region_name")); +// regionIoObj.put("material_id", taskObj.getString("material_id")); +// regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); +// regionIoObj.put("qty", taskObj.getString("material_qty")); +// regionIoObj.put("bill_status", "3"); +// regionIoObj.put("start_point_code", taskObj.getString("point_code1")); +// regionIoObj.put("end_point_code", taskObj.getString("point_code2")); +// regionIoObj.put("create_mode", "2"); +// regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); +// regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); +// regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); +// regionIoObj.put("create_time", DateUtil.now()); +// regionIoTab.insert(regionIoObj); +// } +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void autoCreate() { +// // 自动叫料 +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); +// WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); +// // 找终点:四个缓存区按顺序获取一个 +// JSONObject endPoint = WQL.getWO("YQX_AUTOTASK").addParamMap(MapOf.of("flag","1")).process().uniqueResult(0); +// if (ObjectUtil.isEmpty(endPoint)) return; +// String point_code2 = endPoint.getString("point_code"); +// // 判断任务 +// JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); +// if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); +// // 判断工单 +// JSONObject workOrderObj = workOrderTab.query("device_code = '" + endPoint.getString("device_code") + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); +// if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); +// // 创建任务 +// SchTaskDto dto = SchTaskDto.builder() +// .task_id(IdUtil.getLongId()) +// .task_code(CodeUtil.getNewCode("TASK_CODE")) +// .task_type("task_type") +// .task_name("油漆线叫料") +// .acs_task_type("2")//2楼AGV普通任务 +// .priority("7") +// .task_status(TaskStatusEnum.SURE_END.getCode()) +// .point_code2(point_code2) +// .vehicle_qty(1) +// .material_info_id(workOrderObj.getLong("workorder_id")) +// .material_id(workOrderObj.getLong("material_id")) +// .vehicle_type(workOrderObj.getString("vehicle_type")) +// .handle_class(THIS_CLASS) +// .create_time(DateUtil.now()) +// .remark("任务创建成功") +// .build(); +// JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); +// taskTab.insert(json); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void findStartPoint() { +// // 到养生A区找起点:根据物料、载具类型去查找,均在工单中 +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 +// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 +// JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); +// for (int i = 0; i < taskArr.size(); i++) { +// JSONObject taskObj = taskArr.getJSONObject(i); +// String material_id = taskObj.getString("material_id"); +// String vehicle_type = taskObj.getString("vehicle_type"); +// JSONObject queryParam = new JSONObject(); +// queryParam.put("flag", "1"); +// queryParam.put("material_id", material_id); +// queryParam.put("region_code", "YSQA01"); +// queryParam.put("vehicle_type", vehicle_type ); +// // 查找养生A区,如果最后一个位置有货,直接搬走,如果没货,就作为等待点。先让agv到达等待点 +// // 1、根据物料id查找养生A区物料点 +// JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); +// if (ObjectUtil.isNotEmpty(materialPoint)) { +// // 2、判断是否在等待点,如果不是,先去等待点,是直接搬运 +// // 2.1、获取当前快排列的等待点 row:排 +// JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01") +// .addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"), +// "row_num", materialPoint.getString("row_num"), +// "region_code", "YSQA01")).process() +// .uniqueResult(0); +// if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线缓存区判断等待点异常!"); +// // 2.2、判断等待点 +// if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) { +// // 获取等待点 +// JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " + +// "AND row_num = '" + materialPoint.getString("row_num") + "' " + +// "AND col_num = '" + waitPoint.getString("waitcol") + "' " + +// "AND is_used = '1' " + +// "AND is_delete = '0' " + +// "AND lock_type = '1' " + +// "AND region_code = 'YSQA01'").uniqueResult(0); +// if (ObjectUtil.isEmpty(waitPoints)) { +// taskObj.put("remark", "等待点已被占用"); +// taskObj.put("update_time", DateUtil.now()); +// taskTab.update(taskObj); +// continue; +// } +// // 等待点上锁 +//// waitPoints.put("lock_type", "2"); +// pointTab.update(waitPoints); +// +// taskObj.put("point_code3", waitPoints.getString("point_code")); +// taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); +// taskObj.put("acs_task_type", "3"); +// taskObj.put("remark", "等待点"); +// taskObj.put("update_time", DateUtil.now()); +// taskTab.update(taskObj); +// continue; +// } +// // 是等待点直接搬走 +// // 物料点位上锁 +// materialPoint.put("lock_type", "2"); +// pointTab.update(materialPoint); +// +// taskObj.put("point_code1", materialPoint.getString("point_code")); +// taskObj.put("material_qty", materialPoint.getString("ivt_qty")); +// taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); +// taskObj.put("acs_task_type", "2"); +// taskObj.put("remark", "等待点搬运物料"); +// taskObj.put("update_time", DateUtil.now()); +// taskTab.update(taskObj); +// } else { +// taskObj.put("remark", "养生A区无所需物料"); +// taskObj.put("update_time", DateUtil.now()); +// taskTab.update(taskObj); +// } +// +// } +// } +// +// @Override +// public String createTask(JSONObject whereJson) { +// return null; +// } +// +// @Override +// public void forceFinish(String task_id) { +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); +// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); +// if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!"); +// this.updateTaskStatus(taskObj,"2"); +// } +// +// @Override +// public void cancel(String task_id) { +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); +// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); +// if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); +// this.updateTaskStatus(taskObj,"0"); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public String againApply(String task_id) { +// // 二次下发任务 +// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 +// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 +// JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); +// if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!"); +// JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0); +// if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!"); +// JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of( +// "flag", "3", "material_id", hcTask.getString("material_id"), +// "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"), +// "block_num", hcTask.getString("block_num"), "col_num", hcTask.getString("col_num") +// )).process().uniqueResult(0); +// if (ObjectUtil.isEmpty(materialPoint)) throw new BadRequestException("养生A区暂无所需物料!"); +// String pointCode = materialPoint.getString("point_code"); +// // 修改任务 +// hcTask.put("point_code1", pointCode); +// hcTask.put("remark", "养生A区:" + pointCode); +// taskTab.update(hcTask); +// // 锁住点位 +// materialPoint.put("lock_type", "2"); +// pointTab.update(materialPoint); +// // 点位处理 +// //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812 +// String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10); +// return newPoint; +// } +//} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java index 1955215..fdd40bd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java @@ -10,7 +10,6 @@ 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.WQL; import org.nl.modules.wql.core.bean.WQLObject; @@ -38,7 +37,6 @@ import java.util.Map; public class GjxCallEmpVehicleTask extends AbstractAcsTask { private final String THIS_CLASS = GjxCallEmpVehicleTask.class.getName(); - @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject taskObj, String status) { @@ -47,7 +45,6 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { String task_id = taskObj.getString("task_id"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - if (StrUtil.equals(status, "0")) { /* * 取消删除 @@ -61,6 +58,13 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { String point_code1 = jsonTask.getString("point_code1"); String point_code2 = jsonTask.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code1)) { + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + return; + } + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); // 终点在叠盘架 if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { @@ -117,7 +121,12 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask { // 判断终点在哪里 String point_code1 = jsonTask.getString("point_code1"); String point_code2 = jsonTask.getString("point_code2"); - + if (ObjectUtil.isEmpty(point_code1)) { + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + return; + } JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); // 终点在叠盘架 if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java index e58795c..a138fa0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java @@ -8,16 +8,20 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.config.MapOf; 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.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.WmsToMesService; 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.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; +import org.slf4j.MDC; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,10 +38,10 @@ import java.util.List; public class YqxCallMaterialTask extends AbstractAcsTask { private final String THIS_CLASS = YqxCallMaterialTask.class.getName(); - @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { + WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); @@ -45,6 +49,8 @@ public class YqxCallMaterialTask extends AbstractAcsTask { JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); // 物料点 JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + JSONObject feedback = new JSONObject(); + feedback.put("task_code", taskObj.getString("task_code")); //任务取消 if (StrUtil.equals(status, "0")) { // 取消删除任务 @@ -53,13 +59,11 @@ public class YqxCallMaterialTask extends AbstractAcsTask { } taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("remark", "已取消"); - taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); - // 点位解锁 if (ObjectUtil.isEmpty(material_point)) return; + // 点位解锁 material_point.put("lock_type", "1"); - material_point.put("update_time", DateUtil.now()); pointTab.update(material_point); } @@ -69,15 +73,35 @@ public class YqxCallMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskObj.put("car_no", taskObj.getString("car_no")); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + feedback.put("struct_code", taskObj.getString("point_code1")); + wmsToMesService.taskFeedback(feedback); } if (StrUtil.equals(status, "2")) { + //完成后 + // 物料点位解锁 并设置空位 + material_point.put("lock_type", "1"); + material_point.put("point_status", "1"); + material_point.put("material_id", ""); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + pointTab.update(material_point); + // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "任务完成"); taskTab.update(taskObj); -// JSONObject requestObj = task.getJSONObject("request_param"); + // 通知mes + feedback.put("task_status", TaskStatusEnum.FINISHED.getCode()); + feedback.put("struct_code", taskObj.getString("point_code1")); + wmsToMesService.taskFeedback(feedback); + + + if (ObjectUtil.isEmpty(material_point)) return; //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); @@ -101,26 +125,14 @@ public class YqxCallMaterialTask extends AbstractAcsTask { regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); regionIoObj.put("create_time", DateUtil.now()); regionIoTab.insert(regionIoObj); - - //完成后 - // 物料点位解锁 并设置空位 - if (ObjectUtil.isEmpty(material_point)) return; - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - material_point.put("material_id", ""); - material_point.put("vehicle_type", ""); - material_point.put("vehicle_code", ""); - material_point.put("update_time", DateUtil.now()); - pointTab.update(material_point); } } @Override public void findStartPoint() { - /* - * 根据业务找对应的起点 - */ + MDC.put("log_file_type", "YqxCallMaterial"); + // 到养生A区找起点:根据物料、载具类型去查找,均在工单中 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); @@ -128,28 +140,76 @@ public class YqxCallMaterialTask extends AbstractAcsTask { JSONObject taskObj = taskArr.getJSONObject(i); String material_id = taskObj.getString("material_id"); String vehicle_type = taskObj.getString("vehicle_type"); - // 直接到缓存区获取物料 - JSONObject material_point = pointTab.query("region_code = 'YQXHCQ' AND material_id = '" + material_id + "' " + - "AND vehicle_type = '" + vehicle_type + "' AND is_used = '1' AND lock_type = '1' AND is_delete = '0'", "point_code").uniqueResult(0); - if (ObjectUtil.isNotEmpty(material_point)) { - // 拿到点位 - material_point.put("lock_type", "2"); - pointTab.update(material_point); + JSONObject queryParam = new JSONObject(); + queryParam.put("flag", "1"); + queryParam.put("material_id", material_id); + queryParam.put("region_code", "YSQA01"); + queryParam.put("vehicle_type", vehicle_type ); + // 查找养生A区,如果最后一个位置有货,直接搬走,如果没货,就作为等待点。先让agv到达等待点 + // 1、根据物料id查找养生A区物料点 + JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(materialPoint)) { + // 2、判断是否在等待点,如果不是,先去等待点,是就直接搬运 + // 2.1、获取当前快排列的等待点 row:排 + JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01") + .addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"), + "row_num", materialPoint.getString("row_num"), + "region_code", "YSQA01")).process() + .uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoint)) { + log.error("油漆线缓存区判断等待点异常!"); + throw new BadRequestException("油漆线缓存区判断等待点异常!"); + } + // 2.2、判断等待点 + if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) { + // 获取等待点 + JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " + + "AND row_num = '" + materialPoint.getString("row_num") + "' " + + "AND col_num = '" + waitPoint.getString("waitcol") + "' " + + "AND is_used = '1' " + + "AND is_delete = '0' " + + "AND lock_type = '1' " + + "AND region_code = 'YSQA01'").uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoints)) { + log.info("等待点已被占用"); + taskObj.put("remark", "等待点已被占用"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + // 等待点上锁 +// waitPoints.put("lock_type", "2"); + pointTab.update(waitPoints); - taskObj.put("point_code1", material_point.getString("point_code")); - taskObj.put("material_qty", material_point.getString("ivt_qty")); + taskObj.put("point_code3", waitPoints.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "3"); + taskObj.put("remark", "等待点"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + // 是等待点直接搬走 + // 物料点位上锁 + materialPoint.put("lock_type", "2"); + pointTab.update(materialPoint); + log.info("等待点搬运物料"); + taskObj.put("point_code1", materialPoint.getString("point_code")); + taskObj.put("material_qty", materialPoint.getString("ivt_qty")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskObj.put("acs_task_type", "2"); - taskObj.put("remark", ""); + taskObj.put("remark", "等待点搬运物料"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { - taskObj.put("remark", "油漆线缓存区无所需物料"); + log.info("养生A区无所需物料"); + taskObj.put("remark", "养生A区无所需物料"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } } + MDC.remove("log_file_type"); } @Override @@ -163,14 +223,18 @@ public class YqxCallMaterialTask extends AbstractAcsTask { for (int i = 0; i < arr.size(); i++) { JSONObject json = arr.getJSONObject(i); //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code =json.getString("point_code1"); -// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); + String point_code = json.getString("point_code1"); + if (ObjectUtil.isEmpty(point_code)) { + // 证明是等待点 + point_code = json.getString("point_code3"); + } + String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); AcsTaskDto dto = AcsTaskDto.builder() .task_id(json.getString("task_id")) .task_code(json.getString("task_code")) .task_type(json.getString("acs_task_type")) - .start_device_code(point_code) + .start_device_code(newPoint) .next_device_code(json.getString("point_code2")) .vehicle_code(json.getString("vehicle_code")) .vehicle_type(json.getString("vehicle_type")) @@ -185,7 +249,10 @@ public class YqxCallMaterialTask extends AbstractAcsTask { @Override public String createTask(JSONObject whereJson) { String point_code2 = whereJson.getString("point_code2"); - + String task_code = CodeUtil.getNewCode("TASK_CODE"); + if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) { + task_code = whereJson.getString("task_code"); + } //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); //任务表【SCH_BASE_Task】 @@ -201,7 +268,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_code(task_code) .task_type("task_type") .task_name("油漆线叫料") .acs_task_type("2")//2楼AGV普通任务 @@ -239,4 +306,36 @@ public class YqxCallMaterialTask extends AbstractAcsTask { if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); this.updateTaskStatus(taskObj,"0"); } + + @Override + @Transactional(rollbackFor = Exception.class) + public String againApply(String task_id) { + // 二次下发任务 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!"); + JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!"); + JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of( + "flag", "3", "material_id", hcTask.getString("material_id"), + "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"), + "block_num", waitPoint.getString("block_num"), "row_num", waitPoint.getString("row_num") + )).process().uniqueResult(0); + if (ObjectUtil.isEmpty(materialPoint)) { + throw new BadRequestException("养生A区暂无所需物料!"); // 此时车会停止 + } + String pointCode = materialPoint.getString("point_code"); + // 修改任务 + hcTask.put("point_code1", pointCode); + hcTask.put("remark", "养生A区:" + pointCode); + taskTab.update(hcTask); + // 锁住点位 + materialPoint.put("lock_type", "2"); + pointTab.update(materialPoint); + // 点位处理 + //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812 + String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10); + return newPoint; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/backup.txt b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/backup.txt new file mode 100644 index 0000000..e58795c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/backup.txt @@ -0,0 +1,242 @@ +package org.nl.wms.sch.tasks.callMaterial; + +import cn.hutool.core.date.DateUtil; +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.WQL; +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.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + + +/** + *油漆线叫料 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YqxCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YqxCallMaterialTask.class.getName(); + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 物料点 + JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + // 点位解锁 + if (ObjectUtil.isEmpty(material_point)) return; + material_point.put("lock_type", "1"); + material_point.put("update_time", DateUtil.now()); + pointTab.update(material_point); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + +// JSONObject requestObj = task.getJSONObject("request_param"); + + //区域出入表【st_ivt_regionIO】 + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", "2"); + regionIoObj.put("region_id", material_point.getString("region_id")); + regionIoObj.put("region_code", material_point.getString("region_code")); + regionIoObj.put("region_name", material_point.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", taskObj.getString("material_qty")); + regionIoObj.put("bill_status", "3"); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", "2"); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + + //完成后 + // 物料点位解锁 并设置空位 + if (ObjectUtil.isEmpty(material_point)) return; + material_point.put("lock_type", "1"); + material_point.put("point_status", "1"); + material_point.put("material_id", ""); + material_point.put("vehicle_type", ""); + material_point.put("vehicle_code", ""); + material_point.put("update_time", DateUtil.now()); + pointTab.update(material_point); + } + + } + + @Override + public void findStartPoint() { + /* + * 根据业务找对应的起点 + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String material_id = taskObj.getString("material_id"); + String vehicle_type = taskObj.getString("vehicle_type"); + // 直接到缓存区获取物料 + JSONObject material_point = pointTab.query("region_code = 'YQXHCQ' AND material_id = '" + material_id + "' " + + "AND vehicle_type = '" + vehicle_type + "' AND is_used = '1' AND lock_type = '1' AND is_delete = '0'", "point_code").uniqueResult(0); + if (ObjectUtil.isNotEmpty(material_point)) { + // 拿到点位 + material_point.put("lock_type", "2"); + pointTab.update(material_point); + + taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("material_qty", material_point.getString("ivt_qty")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("acs_task_type", "2"); + taskObj.put("remark", ""); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "油漆线缓存区无所需物料"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) + String point_code =json.getString("point_code1"); +// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10); + + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(point_code) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + @Override + public String createTask(JSONObject whereJson) { + String point_code2 = whereJson.getString("point_code2"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("油漆线叫料") + .acs_task_type("2")//2楼AGV普通任务 + .priority("8") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .vehicle_type(workOrderObj.getString("vehicle_type")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj,"2"); + } + + + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!"); + this.updateTaskStatus(taskObj,"0"); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql index 5cbe9de..1b34b35 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql @@ -106,8 +106,8 @@ SCH_BASE_Point p WHERE p.is_used = '1' - AND is_delete = '0' - AND lock_type='1' + AND p.is_delete = '0' + AND p.lock_type='1' OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java index 92dbc1f..894850e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java @@ -13,10 +13,13 @@ import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.WmsToMesService; 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.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.utils.PointUpdateUtil; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,13 +41,15 @@ public class CpOutTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { + WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - + JSONObject requestParam = JSONObject.parseObject(taskObj.getString("request_param")); + JSONObject feedback = new JSONObject(); + feedback.put("task_code", taskObj.getString("task_code")); //任务取消 if (StrUtil.equals(status, "0")) { // 取消删除任务 @@ -76,6 +81,10 @@ public class CpOutTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskObj.put("car_no", taskObj.getString("car_no")); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); } if (StrUtil.equals(status, "2")) { @@ -84,40 +93,32 @@ public class CpOutTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.FINISHED.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); + // 任务表的点位1:成品库区点 String point_code1 = taskObj.getString("point_code1"); // 起点编码 JSONObject point1Obj = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0);// 起点 - //table_fk_id = 单据id - JSONObject regionIoObject = regionIoTab.query("iostorinv_id = '" + taskObj.getString("table_fk_id") + "'").uniqueResult(0); - String point_code2 = taskObj.getString("point_code2"); // 终点编码:出库点位 JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);// 终点 - // 修改区域出入库 - 起点点位解锁、点位状态更新 - 终点上锁、更新状态 - //区域出入表【st_ivt_regionIO】 - regionIoObject.put("end_point_code", point_code2); - regionIoObject.put("start_region_id", point1Obj.getString("region_id")); // 起点区域 - regionIoObject.put("end_region_id", point2Obj.getString("region_id")); // 终点区域 - regionIoObject.put("bill_status", "3"); // 单据状态 - regionIoObject.put("task_id", task_id); // 任务id - regionIoObject.put("update_optid", SecurityUtils.getCurrentUserId()); - regionIoObject.put("update_optname", SecurityUtils.getCurrentNickName()); - regionIoObject.put("update_time", DateUtil.now()); - regionIoTab.update(regionIoObject); - //完成后修改点位 // 点位解锁 并设置空位 // 货位点 - point2Obj.put("lock_type", "2"); - point2Obj.put("point_status", "3"); - point2Obj.put("material_id", point1Obj.getString("material_id")); - point2Obj.put("pcsn", point1Obj.getString("pcsn")); - point2Obj.put("ivt_qty", point1Obj.getString("ivt_qty")); - point2Obj.put("instorage_time", point1Obj.getString("instorage_time")); - point2Obj.put("vehicle_type", point1Obj.getString("vehicle_type")); - point2Obj.put("vehicle_code", point1Obj.getString("vehicle_code")); - point2Obj.put("standing_time", point1Obj.getString("standing_time")); + if (ObjectUtil.isNotEmpty(point2Obj)) { + point2Obj.put("lock_type", "1"); + point2Obj.put("point_status", "3"); + point2Obj.put("material_id", point1Obj.getString("material_id")); + point2Obj.put("pcsn", requestParam.getString("out_store_order")); + point2Obj.put("ivt_qty", point1Obj.getString("ivt_qty")); + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("vehicle_type", point1Obj.getString("vehicle_type")); + point2Obj.put("vehicle_code", point1Obj.getString("vehicle_code")); + point2Obj.put("update_time", DateUtil.now()); + } // 起点 point1Obj.put("lock_type", "1"); point1Obj.put("point_status", "1"); @@ -128,6 +129,7 @@ public class CpOutTask extends AbstractAcsTask { point1Obj.put("vehicle_type", ""); point1Obj.put("vehicle_code", ""); point1Obj.put("standing_time", 0); + point1Obj.put("update_time", DateUtil.now()); pointTab.update(point1Obj); pointTab.update(point2Obj); @@ -145,11 +147,10 @@ public class CpOutTask extends AbstractAcsTask { JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); + JSONObject requestParam = JSONObject.parseObject(taskObj.getString("request_param")); JSONObject param1 = new JSONObject(); param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "CPCKQ01"); + param1.put("region_code", requestParam.getString("end_area_code")); //1、找空位的终点 JSONObject endPoint = WQL.getWO("QSCH_cpOut_01").addParamMap(param1).process().uniqueResult(0); if (ObjectUtil.isNotEmpty(endPoint)) { @@ -161,15 +162,14 @@ public class CpOutTask extends AbstractAcsTask { //锁住终点 endPoint.put("task_id", taskObj.getString("task_id")); + taskObj.put("remark", ""); endPoint.put("lock_type", "2"); pointTab.update(endPoint); } else { taskObj.put("remark", "成品出库区无可用货位"); taskObj.put("update_time", DateUtil.now()); } - taskTab.update(taskObj); - } } @@ -202,19 +202,27 @@ public class CpOutTask extends AbstractAcsTask { @Override public String createTask(JSONObject whereJson) { WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - - String point_code1 = whereJson.getString("point_code1"); // 起点 + WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + String point_code1 = whereJson.getString("start_struct_code"); // 起点 String vehicle_code = whereJson.getString("vehicle_code"); - String iostorinv_id = whereJson.getString("iostorinv_id"); - String material_id = whereJson.getString("material_id"); + JSONObject materialCode = materialTab.query("material_code = '" + whereJson.getString("material_code") + "'").uniqueResult(0); + String material_id = materialCode.getString("material_id"); + String taskCode = CodeUtil.getNewCode("TASK_CODE"); + if (ObjectUtil.isNotEmpty(whereJson.get("task_code"))) { + taskCode = whereJson.getString("task_code"); + } + // 校验任务 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); JSONObject point = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); String vehicle_type = point.getString("vehicle_type"); SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_code(taskCode) .task_type("task_type") .task_name("成品区出库") .task_status(TaskStatusEnum.SURE_END.getCode()) @@ -225,23 +233,10 @@ public class CpOutTask extends AbstractAcsTask { .material_id(Long.valueOf(material_id)) .create_time(DateUtil.now()) .request_param(whereJson.toJSONString()) - .table_name("st_ivt_regionIO") - .table_fk("iostorinv_id") - .table_fk_id(Long.valueOf(iostorinv_id)) .build(); - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); - // 单据设置执行中 - JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - iostorinv.put("bill_status", "2"); - iostorinv.put("update_optid", SecurityUtils.getCurrentUserId()); - iostorinv.put("update_optname", SecurityUtils.getCurrentNickName()); - iostorinv.put("update_time", DateUtil.now()); - regionIoTab.update(iostorinv); - //创建好立即下发 this.immediateNotifyAcs(); return String.valueOf(dto.getTask_id()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java index 0891f3a..2e3e4ef 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java @@ -209,12 +209,6 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask { for (int i = 0; i < taskArr.size(); i++) { JSONObject jsonTask = taskArr.getJSONObject(i); String pointCode1 = jsonTask.getString("point_code1"); - JSONObject jsonObject = pointTab.query("point_code = '" + pointCode1 + "'").uniqueResult(0); - if (jsonObject.getString("lock_type").equals("2")) { // 查看是否被锁住 - jsonTask.put("remark", "货梯已被锁住!"); - taskTab.update(jsonTask); - continue; - } String point_code_ht = ""; // 查找组盘信息 JSONObject groupObj = groupTab.query("vehicle_code = '" + jsonTask.getString("vehicle_code") + "'").uniqueResult(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BZXSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BZXSendMaterialTask.java new file mode 100644 index 0000000..9482f8b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BZXSendMaterialTask.java @@ -0,0 +1,199 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +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.system.util.CodeUtil; +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.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: lyd + * @Description: 包装入库->成品区 + * @Date: 2023/6/25 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class BZXSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = BZXSendMaterialTask.class.getName(); + @Override + public List addTask() { + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code2 = taskObj.getString("point_code2"); + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + if (ObjectUtil.isEmpty(endPoint)) return; + endPoint.put("lock_type", "1"); + endPoint.put("update_time", DateUtil.now()); + pointTab.update(endPoint); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "任务执行完成"); + taskTab.update(taskObj); + if (ObjectUtil.isNotEmpty(endPoint)) { + // 终点解锁并赋值 + endPoint.put("lock_type", "1"); + endPoint.put("point_status", "3"); + endPoint.put("material_id", taskObj.getString("material_id")); + endPoint.put("vehicle_type", taskObj.getString("vehicle_type")); + endPoint.put("update_time", DateUtil.now()); + pointTab.update(endPoint); + } + } + } + + @Override + public String createTask(JSONObject whereJson) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + String startPointCode = whereJson.getString("point_code1"); + String taskId = whereJson.getString("task_id"); + // 根据上个任务的载具类型寻找起点 + JSONObject taskObj = taskTab.query("task_id = '" + taskId + "'").uniqueResult(0); + // 找起点 + if (taskObj.getString("vehicle_type").equals("4")) { + // 1.3选择第一位 + startPointCode = startPointCode + "01"; + } else { + startPointCode = startPointCode + "02"; + } + //判断当前点是否有未完成的任务 + JSONObject taskEntity = taskTab.query("is_delete='0' and point_code1 = '" + startPointCode + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskEntity)) throw new BadRequestException("当前点位" + startPointCode + "存在未完成的任务"); + // 创建任务 + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("包装输送线入库") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(startPointCode) + .acs_task_type("1")//1楼AGV普通任务 + .material_qty(taskObj.getString("material_qty")) + .material_id(taskObj.getLong("material_id")) + .vehicle_type(taskObj.getString("vehicle_type")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + public void findNextPoint() { + // 从立库中查找一个空位 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' " + + "and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + JSONObject pointObj = pointTab.query("region_code = 'CPQYA01' AND is_delete = '0' " + + "AND is_used = '1' AND lock_type = '1' AND point_status = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(pointObj)) { + taskObj.put("remark", "暂无可用的点位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("remark", ""); + taskObj.put("point_code2", pointObj.getString("point_code")); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + //锁住相关货位 + pointObj.put("lock_type", "2"); + pointTab.update(pointObj); + } + } + + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + this.updateTaskStatus(taskObj, "2"); + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + + } + + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + this.updateTaskStatus(taskObj, "0"); + } else { + throw new BadRequestException("任务已完成不能取消!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BzssxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BzssxSendMaterialTask.java new file mode 100644 index 0000000..6a41dad --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/BzssxSendMaterialTask.java @@ -0,0 +1,203 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +import cn.hutool.core.date.DateUtil; +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.system.util.CodeUtil; +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.tasks.AcsTaskDto; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: lyd + * @Description: 包装输送线送料 + * @Date: 2023/6/25 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class BzssxSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = BzssxSendMaterialTask.class.getName(); + @Override + public List addTask() { + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + @Override + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject materialtaskgroupTab = WQLObject.getWQLObject("md_pb_materialtaskgroup"); + String task_id = task.getString("task_id"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code2 = taskObj.getString("point_code2"); + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + if (ObjectUtil.isEmpty(endPoint)) return; + endPoint.put("lock_type", "1"); + endPoint.put("update_time", DateUtil.now()); + pointTab.update(endPoint); + } + + if ("1".equals(status)) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("car_no", taskObj.getString("car_no")); + taskTab.update(taskObj); + // 终点解锁 + endPoint.put("lock_type", "1"); + endPoint.put("update_time", DateUtil.now()); + pointTab.update(endPoint); + } + + if (StrUtil.equals(status, "2")) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "任务执行完成"); + taskTab.update(taskObj); + if (ObjectUtil.isNotEmpty(endPoint)) { + // 组盘 + JSONObject group = new JSONObject(); + group.put("task_material_id", cn.hutool.core.util.IdUtil.getSnowflake(1,1).nextIdStr()); + group.put("material_id", taskObj.getString("material_id")); + group.put("task_id", taskObj.getString("task_id")); + group.put("qty", taskObj.getString("material_qty")); + group.put("vehicle_type", taskObj.getString("vehicle_type")); + materialtaskgroupTab.insert(group); + } + } + } + + @Override + public String createTask(JSONObject whereJson) { + String point_code1 = whereJson.getString("point_code1"); + String vehicle_type = whereJson.getString("vehicle_type"); + Long materialId = whereJson.getLong("material_id"); + String qty = whereJson.getString("qty"); + + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("进入包装线") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .acs_task_type("1")//1楼AGV普通任务 + .material_qty(qty) + .material_id(materialId) + .vehicle_type(vehicle_type) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + @Transactional + public void findNextPoint() { + //判断共挤线是否有执行中的任务,如果任务数>=3,则不生成任务 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + // 找BZSSX04, 先查看是否锁住 + JSONObject point = pointTab.query("point_code = 'BZSSX1005' AND lock_type = '1' AND is_used = '1' AND is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(point)) { + taskObj.put("remark", "暂无可用的点位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + continue; + } + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("remark", ""); + taskObj.put("point_code2", point.getString("point_code")); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + //锁住相关货位 + point.put("lock_type", "2"); + pointTab.update(point); + } + + } + + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + this.updateTaskStatus(taskObj, "2"); + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + + } + + @Override + public void cancel(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + this.updateTaskStatus(taskObj, "0"); + } else { + throw new BadRequestException("任务已完成不能取消!"); + } + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java index f6ab1b1..471540c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java @@ -13,6 +13,8 @@ import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.WmsToMesService; import org.nl.wms.log.LokiLogType; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; @@ -45,7 +47,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { - + WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); WQLObject orderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); @@ -53,6 +55,8 @@ public class GjxSendMaterialTask extends AbstractAcsTask { String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); String workOrderId = taskObj.getString("material_info_id"); + JSONObject feedback = new JSONObject(); + feedback.put("task_code", taskObj.getString("task_code")); //任务取消 if (StrUtil.equals(status, "0")) { // 取消删除任务 @@ -79,6 +83,10 @@ public class GjxSendMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskObj.put("car_no", taskObj.getString("car_no")); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); } if (StrUtil.equals(status, "2")) { @@ -121,6 +129,11 @@ public class GjxSendMaterialTask extends AbstractAcsTask { taskObj.put("remark", "任务执行完成"); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.FINISHED.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); + //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); JSONObject regionIoObj = new JSONObject(); @@ -163,11 +176,10 @@ public class GjxSendMaterialTask extends AbstractAcsTask { String task_id = taskObj.getString("task_id"); String material_id = taskObj.getString("material_id"); String vehicle_type = taskObj.getString("vehicle_type"); - String workOrderId = taskObj.getString("material_info_id"); // 工单号 // 获取工单判断是去养生区还是货梯口 - JSONObject workOrder = orderTab.query("workorder_id = '" + workOrderId + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrder)) throw new BadRequestException("工单不能为空"); - if (workOrder.getString("workorder_type").equals("1")) { // 机采去货梯扣 + JSONObject areaType = JSONObject.parseObject(taskObj.getString("request_param")); + if (ObjectUtil.isNotEmpty(areaType.getString("end_area_type")) + && areaType.getString("end_area_type").equals("1")) { // 机采去货梯扣 // 更新点位 JSONArray ssxArray = WQL.getWO("QSCH_yqxSendMaterial_01").addParam("flag", "2").process().getResultJSONArray(0); PointUpdateUtil.updatePoint(ssxArray); @@ -316,8 +328,12 @@ public class GjxSendMaterialTask extends AbstractAcsTask { public String createTask(JSONObject whereJson) { String point_code1 = whereJson.getString("point_code1"); String vehicle_code = whereJson.getString("vehicle_code"); + String vehicle_type = whereJson.getString("vehicle_type"); String qty = whereJson.getString("qty"); - + String task_code = CodeUtil.getNewCode("TASK_CODE"); + if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) { + task_code = whereJson.getString("task_code"); + } //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); //点位基础表【SCH_BASE_Point】 @@ -331,14 +347,13 @@ public class GjxSendMaterialTask extends AbstractAcsTask { String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_code(task_code) .task_type("task_type") .task_name("共挤线满料") .task_status(TaskStatusEnum.SURE_START.getCode()) @@ -348,7 +363,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask { .material_qty(qty) .material_info_id(workOrderObj.getLong("workorder_id")) .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(workOrderObj.getString("vehicle_type")) + .vehicle_type(vehicle_type) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) .request_param(whereJson.toJSONString()) @@ -374,7 +389,6 @@ public class GjxSendMaterialTask extends AbstractAcsTask { } - @Override public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java index 2daff91..86a8b49 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java @@ -13,6 +13,8 @@ import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.WmsToMesService; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; @@ -39,12 +41,14 @@ public class HkxSendMaterialTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { + WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - + JSONObject feedback = new JSONObject(); + feedback.put("task_code", taskObj.getString("task_code")); //任务取消 if (StrUtil.equals(status, "0")) { // 取消删除任务 @@ -69,6 +73,10 @@ public class HkxSendMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskObj.put("car_no", taskObj.getString("car_no")); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); } if (StrUtil.equals(status, "2")) { @@ -77,9 +85,14 @@ public class HkxSendMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); + // 通知mes + feedback.put("task_status", TaskStatusEnum.FINISHED.getCode()); + feedback.put("struct_code", taskObj.getString("point_code2")); + wmsToMesService.taskFeedback(feedback); + String point_code2 = taskObj.getString("point_code2"); JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); + JSONObject requestObj = JSONObject.parseObject(taskObj.getString("request_param")); //工单标识 String workorder_id = requestObj.getString("material_info_id"); //生产工单表【PDM_BD_WorkOrder】 @@ -151,6 +164,7 @@ public class HkxSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } else { taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", ""); taskObj.put("point_code2", endPoint.getString("point_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskTab.update(taskObj); @@ -197,7 +211,10 @@ public class HkxSendMaterialTask extends AbstractAcsTask { String vehicle_type = whereJson.getString("vehicle_type"); String vehicle_code = whereJson.getString("vehicle_code"); String qty = whereJson.getString("qty"); - + String task_code = CodeUtil.getNewCode("TASK_CODE"); + if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) { + task_code = whereJson.getString("task_code"); + } //任务表【SCH_BASE_Task】 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); @@ -216,7 +233,7 @@ public class HkxSendMaterialTask extends AbstractAcsTask { SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_code(task_code) .task_type("task_type") .task_name("豪凯线满料") .material_qty(qty) 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 7c5e2f1e997406d306a638a714a2152377c8aecf..858a3bcdb93c3b563cc91c69232f8bc2b859262e 100644 GIT binary patch delta 50679 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 LO1#3MIuZN^mx(sP delta 17779 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 N?OdjDYYlkie*iLFTmJw6 diff --git a/lms/nladmin-system/src/main/resources/config/application-prod.yml b/lms/nladmin-system/src/main/resources/config/application-prod.yml index 61eaff1..a2db56e 100644 --- a/lms/nladmin-system/src/main/resources/config/application-prod.yml +++ b/lms/nladmin-system/src/main/resources/config/application-prod.yml @@ -59,6 +59,16 @@ spring: password: ${REDIS_PWD:} #连接超时时间 timeout: 5000 + redisson: + config: | + threads: 4 + nettyThreads: 4 + singleServerConfig: + connectionMinimumIdleSize: 8 + connectionPoolSize: 8 + address: redis://127.0.0.1:6379 + idleConnectionTimeout: 10000 + timeout: 3000 # 登录相关配置 login: # 登录缓存 @@ -162,4 +172,4 @@ sa-token: loki: url: http://localhost:3100/loki/api/v1 - systemName: lms \ No newline at end of file + systemName: lms