From 8cc98575cdeae97db9b104e13b7775fd09aad977 Mon Sep 17 00:00:00 2001 From: 18188916393 <2562295436@qq.com> Date: Wed, 24 Aug 2022 17:42:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=9Fmes=E5=AF=B9=E6=8E=A5=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/wms/common/PressureUtil.java | 51 +++++ .../java/org/nl/wms/common/SortingUtil.java | 6 +- .../org/nl/wms/common/wql/QSTRUCT_RULE.wql | 23 +++ .../wms/ext/acs/rest/AcsToWmsController.java | 8 +- .../wms/ext/acs/rest/WmsToJnController.java | 19 ++ .../wms/ext/acs/service/AcsToWmsService.java | 9 + .../wms/ext/acs/service/WmsToJnService.java | 17 ++ .../acs/service/impl/AcsToWmsServiceImpl.java | 34 +++- .../acs/service/impl/WmsToJnServiceImpl.java | 176 +++++++++++++++--- .../org/nl/wms/ext/acs/wql/ACSTOMES_001.wql | 65 +++++++ .../org/nl/wms/ext/acs/wql/WMSTOJN_001.wql | 83 ++++++++- .../org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql | 2 +- .../sch/manage/buss/CallEmptyVehicleTask.java | 12 ++ .../wms/sch/manage/buss/CallMaterialTask.java | 40 +++- .../org/nl/wms/sch/manage/buss/RgvTask.java | 8 + .../wms/sch/manage/buss/ToConveyorTask.java | 11 +- .../sch/task/AutoSynchronDeviceStausTask.java | 80 ++++++++ .../in/service/wql/ST_Workprocedureios_01.wql | 8 +- .../service/wql/ST_WorkprocedureiosOut_01.wql | 46 +++-- .../src/main/java/org/nl/wms/wms.xls | Bin 393216 -> 396800 bytes 20 files changed, 621 insertions(+), 77 deletions(-) create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PressureUtil.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoSynchronDeviceStausTask.java diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PressureUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PressureUtil.java new file mode 100644 index 0000000..2fa6466 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PressureUtil.java @@ -0,0 +1,51 @@ +package org.nl.wms.common; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.exception.BadRequestException; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; + +public class PressureUtil { + //记录不合格数量 返回记录标识 + public static String record(JSONObject whereJson) { + String device_code = (String) whereJson.get("device_code"); + String reason = (String) whereJson.get("reason"); + int qty = (int) whereJson.get("qty"); + String record_id = ""; + //根据设备查询当前设备以及排产单号 + JSONObject joo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("point_code", device_code).process().uniqueResult(0); + String producetask_id = joo.getString("producetask_id"); + if (StrUtil.isEmpty(producetask_id)) { + throw new BadRequestException("为找到生产任务!"); + } + WQLObject RecordTable = WQLObject.getWQLObject("st_buss_qualityRecord"); + JSONObject recordObj = RecordTable.query("producetask_id='" + producetask_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(recordObj)) { + recordObj.put("qty", qty + recordObj.getIntValue("qty")); + recordObj.put("reason", reason); + recordObj.put("update_time", DateUtil.now()); + record_id = recordObj.getString("record_id"); + RecordTable.update(recordObj); + } else { + //如果没有插入 + JSONObject Obj = new JSONObject(); + record_id = IdUtil.getSnowflake(1, 1).nextIdStr(); + Obj.put("record_id", record_id); + Obj.put("producetask_id", joo.getString("producetask_id")); + Obj.put("material_id", joo.getString("material_id")); + Obj.put("device_id", joo.getString("device_id")); + Obj.put("qty", qty); + Obj.put("update_time", DateUtil.now()); + Obj.put("reason", reason); + RecordTable.insert(Obj); + } + return record_id; + } + + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/SortingUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/SortingUtil.java index 2b6f21f..99170ca 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/SortingUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/SortingUtil.java @@ -14,6 +14,9 @@ public class SortingUtil { public static void record(JSONObject whereJson) { String device_code = (String) whereJson.get("device_code"); String vehicle_code = (String) whereJson.get("vehicle_code"); + if (StrUtil.isEmpty(vehicle_code)){ + return; + } //木托盘对应刚托盘记录主表【st_buss_vehicleRelaRecord】 WQLObject ehicleRelaRecordmst = WQLObject.getWQLObject("st_buss_vehicleRelaRecord"); //木托盘对应刚托盘记录明细【st_buss_vehicleRelaRecordtl】 @@ -40,7 +43,7 @@ public class SortingUtil { JSONObject jo = pointArr.getJSONObject(i); String Sl_vehicle_code = jo.getString("vehicle_code"); record_id = mstObj.getString("record_id"); - if(StrUtil.isEmpty(Sl_vehicle_code)) + if (StrUtil.isEmpty(Sl_vehicle_code)) continue; JSONObject dtljo = ehicleRelaRecordmstdtl.query("record_id='" + record_id + "' and vehicle_code ='" + Sl_vehicle_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(dtljo)) { @@ -61,5 +64,4 @@ public class SortingUtil { } - } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql index 4076201..59b7b07 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql @@ -23,6 +23,7 @@ 输入.is_full TYPEAS s_string 输入.material_id TYPEAS s_string 输入.next_point_code TYPEAS s_string + 输入.point_code TYPEAS s_string [临时表] @@ -344,4 +345,26 @@ IF 输入.flag = "11" ENDOPTION ENDSELECT ENDQUERY +ENDIF + +IF 输入.flag = "12" + QUERY + SELECT + point.point_code, + producetask.material_id, + producetask.producetask_id, + device.device_id + FROM + sch_base_point point + LEFT JOIN pdm_base_device device ON device.device_id = point.device_id + LEFT JOIN pdm_mg_producetask producetask ON producetask.device_id = device.device_id + AND producetask.producetask_status IN ( '04' ) + WHERE + 1=1 + + OPTION 输入.point_code <> "" + point.point_code = 输入.point_code + ENDOPTION + ENDSELECT + ENDQUERY ENDIF \ No newline at end of file diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 595ee67..8681184 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -2,8 +2,6 @@ package org.nl.wms.ext.acs.rest; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -111,4 +109,10 @@ public class AcsToWmsController { public ResponseEntity receiveTaskStatusAcs(@RequestBody String material_code) { return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(material_code), HttpStatus.OK); } + @PostMapping("/agv") + @Log("ACS给WMS反馈任务状态") + @ApiOperation("ACS给WMS反馈任务状态") + public ResponseEntity receiveAgvStatus(@RequestBody Map whereJson ) { + return new ResponseEntity<>(acsToWmsService.receiveAgvStatus( whereJson), HttpStatus.OK); + } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToJnController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToJnController.java index c523af5..61f53e5 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToJnController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToJnController.java @@ -44,30 +44,42 @@ public class WmsToJnController { return new ResponseEntity<>(WmsToJnService.synchroMaterial(whereJson), HttpStatus.OK); } + @PostMapping("/feedMaterial") + @Log("wms反馈jn同步了该物料") + @ApiOperation("wms反馈jn同步了该物料") + public ResponseEntity feedMaterial(@RequestBody Map whereJson) { + return new ResponseEntity<>(WmsToJnService.feedMaterial(whereJson), HttpStatus.OK); + } + + @PostMapping("/feedBackStatus") @Log("反馈设备状态") @ApiOperation("反馈设备状态") public ResponseEntity feedBackStatus(@RequestBody Map whereJson) { return new ResponseEntity<>(WmsToJnService.feedBackStatus(whereJson), HttpStatus.OK); } + @PostMapping("/feedBackCarryRecord") @Log("反馈搬运记录") @ApiOperation("反馈搬运记录") public ResponseEntity feedBackCarryRecord(@RequestBody Map whereJson) { return new ResponseEntity<>(WmsToJnService.feedBackCarryRecord(whereJson), HttpStatus.OK); } + @PostMapping("/feedBackInKiln") @Log("反馈进窑信息") @ApiOperation("反馈进窑信息") public ResponseEntity feedBackInKiln(@RequestBody Map whereJson) { return new ResponseEntity<>(WmsToJnService.feedBackInKiln(whereJson), HttpStatus.OK); } + @PostMapping("/feedBackOutKiln") @Log("反馈出窑信息") @ApiOperation("反馈出窑信息") public ResponseEntity feedBackOutKiln(@RequestBody Map whereJson) { return new ResponseEntity<>(WmsToJnService.feedBackOutKiln(whereJson), HttpStatus.OK); } + @PostMapping("/feedBackPackage") @Log("反馈包装信息") @ApiOperation("反馈包装信息") @@ -75,4 +87,11 @@ public class WmsToJnController { return new ResponseEntity<>(WmsToJnService.feedBackPackage(whereJson), HttpStatus.OK); } + @PostMapping("/feedBackQualityInfo") + @Log("返回不合格数量") + @ApiOperation("返回不合格数量") + public ResponseEntity feedBackQualityInfo(@RequestBody Map whereJson) { + return new ResponseEntity<>(WmsToJnService.feedBackQualityInfo((String) whereJson.get(" record_id")), HttpStatus.OK); + } + } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index e291c84..36df4e6 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -101,4 +101,13 @@ public interface AcsToWmsService { Map CribbingInfoByCode(String material_code); + /** + * ACS客户端--->WMS服务端 + * 反馈agv状态 + * + * @param string 条件 物料条码 + * @return Map + */ + Map receiveAgvStatus(Map jsonObject); + } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToJnService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToJnService.java index 6461c14..bb794c3 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToJnService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToJnService.java @@ -24,6 +24,15 @@ public interface WmsToJnService { */ Map synchroMaterial(Map whereJson); + + /** + * WMS同步jn物料 + * + * @param + * @return Map + */ + + Map feedMaterial(Map whereJson); /** * WMS 反馈设备状态(专机,agv) * @@ -68,6 +77,14 @@ public interface WmsToJnService { */ Map feedBackPackage(Map whereJson); + /** + * WMS 返回不合格数量 + * + * @param + * @return Map + */ + + Map feedBackQualityInfo(String record_id); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index d9068c8..eb4e092 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -16,6 +16,7 @@ import org.nl.utils.SpringContextHolder; import org.nl.wms.WorkProcedureEnum; import org.nl.wms.common.KilnUtil; import org.nl.wms.common.PointUpdateUtil; +import org.nl.wms.common.PressureUtil; import org.nl.wms.common.StructFindUtil; import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; @@ -75,12 +76,11 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("start_point_code", device_code); jsonObject.put("create_mode", "01"); jsonObject.put("group_id", group_id); - if (StrUtil.isEmpty(is_full)) { throw new BadRequestException("托盘是否满托不能为空!"); } String material_code = (String) jsonObject.get("material_code"); - String producetask_id = (String)jsonObject.get("producetask_id"); + String producetask_id = (String) jsonObject.get("producetask_id"); String material_id = ""; JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_code ='" + material_code + "'").uniqueResult(0); if (StrUtil.isEmpty(material_code) && (!StrUtil.equals(device_code, "CYSSX101"))) { @@ -103,14 +103,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("qty", vehicleObj.getString("qty")); jsonObject.put("vehicle_code", vehicle_code); } - jsonObject.put("producetask_id",producetask_id); + jsonObject.put("producetask_id", producetask_id); jsonObject.put("create_mode", "01"); jsonObject.put("material_id", material_id); JSONObject materiralObj = WQLObject.getWQLObject("md_me_material").query("material_id = '" + material_id + "'").uniqueResult(0); Double stewing_time = materiralObj.getDouble("stewing_time"); jsonObject.put("stewing_time", stewing_time); - //假如是压制下料的几个位置,则要考虑是入输送线 还是入立体库 String area_type = pointTable.query("point_code ='" + device_code + "'").uniqueResult(0).getString("area_type"); + + + //假如是压制下料的几个位置,则要考虑是入输送线 还是入立体库 if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode()) && stewing_time <= 0) { //1.首先更新所有输送线的点位状态 JSONArray pointarr = WQL.getWO("ACSTOMES_001").addParam("area_type", "07").addParam("flag", "4").process().getResultJSONArray(0); @@ -138,6 +140,17 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("vehicle_code", vehicle_code); } sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + //假如是压制下料的几个位置 需要记录不合格数量 + if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode())) { + /* JSONObject joo = new JSONObject(); + joo.put("qty", "qty"); + joo.put("device_code", device_code); + joo.put("reason", "reason"); + String record_id = PressureUtil.record(joo); + //回传不合格记录 + WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); + wmsToJnService.feedBackQualityInfo(record_id);*/ + } break; case "2": //叫料出库 @@ -179,7 +192,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { //叫料出库 jsonObject.put("next_point_code", device_code); jsonObject.put("create_mode", "01"); - jsonObject.put("pcsn", "pcsn"); jsonObject.put("material_id", material_id); jsonObject.put("is_full", "0"); jsonObject.put("workprocedure_id", WorkProcedureEnum.BZGX.getId()); @@ -214,7 +226,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } //寻找起点 //更新所有设备的点位的状态 - JSONArray pointConveyArr = pointTable.query("area_type='07' and device_point_type ='01' ").getResultJSONArray(0); + //JSONArray pointConveyArr = pointTable.query("area_type='07' and device_point_type ='01' ").getResultJSONArray(0); + JSONArray pointConveyArr = WQL.getWO("ACSTOMES_001").addParam("area_type", "07").addParam("flag", "4").process().getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointConveyArr); //假如没有设置哪个输送线先出,没有按照先进先出 JSONObject param = new JSONObject(); @@ -228,6 +242,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException("未找到合适的输送线可以出!"); } jsonObject.put("start_point_code", param.getString("point_code")); + jsonObject.put("vehicle_code", param.getString("vehicle_code")); rgvTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; } @@ -567,7 +582,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } //根据设备去找设备id - String device_id = WQLObject.getWQLObject("sch_base_point").query("point_code='" + device_code + "'").uniqueResult(0).getString("device_id"); + String device_id = WQLObject.getWQLObject("sch_base_point").query("point_code='" + device_code + "'").uniqueResult(0).getString("device_id"); //根据物料code 去找物料id JSONObject materiObj = WQLObject.getWQLObject("MD_ME_Material").query("material_code='" + material_code + "'").uniqueResult(0); if (!StrUtil.equals(device_id, taskObj.getString("device_id"))) { @@ -696,6 +711,11 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return result; } + @Override + public Map receiveAgvStatus(Map jsonObject) { + return null; + } + private JSONObject getProduceInfoByCode(String code) { //根据 设备点位去找生产任务信息 //1 根据点位去找设备,去找对应的设备信息 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToJnServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToJnServiceImpl.java index a56ba50..e62794d 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToJnServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToJnServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; import java.util.Map; @Service @@ -31,6 +32,11 @@ public class WmsToJnServiceImpl implements WmsToJnService { @Override public Map synchroDaySchedule(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + String methon = "/getshoporder"; String today = DateUtil.today(); //同步日计划 @@ -64,10 +70,10 @@ public class WmsToJnServiceImpl implements WmsToJnService { //压机编号 String SBDM = dayScheduleObj.getString("SBDM"); JSONObject materialObj = material_table.query("material_code ='" + ITEMCODE + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(materialObj)){ - this.synchroMaterial(new JSONObject()); - materialObj = material_table.query("material_code ='" + ITEMCODE + "'").uniqueResult(0); - } + if (ObjectUtil.isEmpty(materialObj)) { + this.synchroMaterial(new JSONObject()); + materialObj = material_table.query("material_code ='" + ITEMCODE + "'").uniqueResult(0); + } JSONObject deviceObj = device_Table.query("ext_device_code='" + SBDM + "'").uniqueResult(0); JSONObject scheduleObj = produceTaskTable.query("ext_shoporder_no='" + SHOPORDERNO + "'").uniqueResult(0); if (ObjectUtil.isEmpty(scheduleObj)) { @@ -99,12 +105,17 @@ public class WmsToJnServiceImpl implements WmsToJnService { JSONObject returnjo = new JSONObject(); returnjo.put("status", HttpStatus.OK.value()); returnjo.put("message", "任务状态反馈成功!"); - return result; + return returnjo; } @Override @Transactional(rollbackFor = Exception.class) public Map synchroMaterial(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + String methon = "/getItems"; /** * DM: "物料代码", @@ -179,10 +190,37 @@ public class WmsToJnServiceImpl implements WmsToJnService { materialObj.put("create_time", DateUtil.now()); material_table.insert(materialObj); } + //反馈嘉耐已经同步了该物料 + /* HashMap map = new HashMap(); + map.put("material_code", materialjo.getString("DM")); + this.feedMaterial(map);*/ } + + JSONObject returnjo = new JSONObject(); + returnjo.put("status", HttpStatus.OK.value()); + returnjo.put("message", "任务状态反馈成功!"); + return returnjo; + } + + @Override + public Map feedMaterial(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + String method = "setItems"; + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", JSONObject.toJSON(whereJson)); + log.info("诺力请求嘉耐反馈物料同步入参{}", obj.toString()); + String resultMsg = HttpRequest.post(URL + method) + .body(String.valueOf(obj)).timeout(timeout) + .execute().body(); + JSONObject result = JSONObject.parseObject(resultMsg); + log.info("诺力请求嘉耐反馈物料同步出参{}", resultMsg); //调用接口告诉wms 调用已经同步该物料 - /* String returnResultMsg = HttpRequest.post(URL) + String returnResultMsg = HttpRequest.post(URL) .body(String.valueOf(obj)).timeout(timeout) .execute().body(); JSONObject returnResult = JSONObject.parseObject(returnResultMsg); @@ -191,62 +229,156 @@ public class WmsToJnServiceImpl implements WmsToJnService { log.info("wms反馈嘉耐物料成功!"); } else { log.info("wms反馈嘉耐物料失败!"); - }*/ - JSONObject returnjo = new JSONObject(); - returnjo.put("status", HttpStatus.OK.value()); - returnjo.put("message", "任务状态反馈成功!"); - return result; + } + + + return null; } @Override public Map feedBackStatus(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + JSONArray results = WQL.getWO("WMSTOJN_001").addParam("flag", "7").process().getResultJSONArray(0); + String method = "upDEVStatus"; - return null; + for (int i = 0; i < results.size(); i++) { + JSONObject param = results.getJSONObject(0); + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", param); + log.info("诺力请求嘉耐回传不合格记录入参{}", obj.toString()); + String resultMsg = HttpRequest.post(URL + method) + .body(String.valueOf(obj)).timeout(timeout) + .execute().body(); + JSONObject result = JSONObject.parseObject(resultMsg); + log.info("诺力请求嘉耐回传不合格记录出参{}", resultMsg); + } + JSONObject returnjo = new JSONObject(); + returnjo.put("status", HttpStatus.OK.value()); + returnjo.put("message", "任务状态反馈成功!"); + return returnjo; } @Override public Map feedBackCarryRecord(Map whereJson) { String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); - //如果连接了嘉耐 则反馈搬运记录 - if (StrUtil.equals(value, "1")) { - String task_id = (String) whereJson.get("task_id"); - JSONObject jsonObject = WQL.getWO("WMSTOJN_001").addParam("flag", "1").addParam("task_id", task_id).process().uniqueResult(0); - String returnResultMsg = HttpRequest.post(URL) - .body(String.valueOf(jsonObject)).timeout(timeout) - .execute().body(); + if (StrUtil.equals(value, "0")) { + return null; } - + String method = "InsertPressInfo"; + String task_id = (String) whereJson.get("task_id"); + JSONObject jsonObject = WQL.getWO("WMSTOJN_001").addParam("flag", "1").addParam("task_id", task_id).process().uniqueResult(0); + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", jsonObject); + log.info("诺力请求嘉耐回传搬运记录入参{}", obj.toString()); + String returnResultMsg = HttpRequest.post(URL + method) + .body(String.valueOf(obj)).timeout(timeout) + .execute().body(); + log.info("诺力请求嘉耐回传搬运记录出参{}", returnResultMsg); return null; } @Override public Map feedBackInKiln(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + String method = "InKiln"; String vehicle_code = (String) whereJson.get("vehicle_code"); JSONObject jsonObject = WQL.getWO("WMSTOJN_001").addParam("flag", "2").addParam("vehicle_code", vehicle_code).process().uniqueResult(0); - String returnResultMsg = HttpRequest.post(URL) + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", jsonObject); + log.info("诺力请求嘉耐回传入窑信息入参{}", obj.toString()); + String returnResultMsg = HttpRequest.post(URL + method) .body(String.valueOf(jsonObject)).timeout(timeout) .execute().body(); + log.info("诺力请求嘉耐回传入窑信息出参{}", returnResultMsg); return null; } @Override public Map feedBackOutKiln(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } String vehicle_code = (String) whereJson.get("vehicle_code"); JSONObject jsonObject = WQL.getWO("WMSTOJN_001").addParam("flag", "3").addParam("vehicle_code", vehicle_code).process().uniqueResult(0); - String returnResultMsg = HttpRequest.post(URL) + String method = "OutKiln"; + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", jsonObject); + log.info("诺力请求嘉耐回传入窑信息入参{}", obj.toString()); + String returnResultMsg = HttpRequest.post(URL + method) .body(String.valueOf(jsonObject)).timeout(timeout) .execute().body(); + log.info("诺力请求嘉耐回传入窑信息出参{}", returnResultMsg); return null; } @Override public Map feedBackPackage(Map whereJson) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } //木托盘号码 String vehicle_code = (String) whereJson.get("vehicle_code"); if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("托盘编码不能为空!"); } + JSONObject mstObj = WQL.getWO("WMSTOJN_001").addParam("flag", "9").addParam("vehicle_code", vehicle_code).process().uniqueResult(0); + JSONArray dtlarr = WQL.getWO("WMSTOJN_001").addParam("flag", "8").addParam("record_id", mstObj.getString("record_id")).process().getResultJSONArray(0); + mstObj.put("DETAILS", dtlarr); + String method = ""; + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", mstObj); + log.info("诺力请求嘉耐回传组盘记录入参{}", obj.toString()); + String resultMsg = HttpRequest.post(URL + method) + .body(String.valueOf(obj)).timeout(timeout) + .execute().body(); + JSONObject result = JSONObject.parseObject(resultMsg); + log.info("诺力请求嘉耐回传组盘记录出参{}", resultMsg); + + return null; + } + + @Override + public Map feedBackQualityInfo(String record_id) { + String value = WQLObject.getWQLObject("sys_param").query("code='IS_CONNECT_JN'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + return null; + } + WQLObject recordTable = WQLObject.getWQLObject("st_buss_qualityRecord"); + JSONObject recordObj = WQL.getWO("WMSTOJN_001").addParam("flag", "6").addParam("record_id", record_id).process().uniqueResult(0); + if (ObjectUtil.isEmpty(recordObj)) { + throw new BadRequestException("未找到记录标识为'" + record_id + "'的记录"); + } + String method = "InsertQualityInfo"; + JSONObject obj = new JSONObject(); + obj.put("ticker", "WLXT"); + obj.put("stringData", recordObj); + log.info("诺力请求嘉耐回传不合格记录入参{}", obj.toString()); + String resultMsg = HttpRequest.post(URL + method) + .body(String.valueOf(obj)).timeout(timeout) + .execute().body(); + JSONObject result = JSONObject.parseObject(resultMsg); + log.info("诺力请求嘉耐回传不合格记录出参{}", resultMsg); + String status = result.getString("status"); + if (StrUtil.isNotEmpty(status) && status.equals("1")) { + log.info("诺力请求嘉耐回传不合格记录成功!"); + } else { + log.info("诺力请求嘉耐回传不合格记录失败!"); + } + return null; } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql index ed55d0d..0a36e55 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql @@ -125,3 +125,68 @@ ENDSELECT ENDQUERY ENDIF + + +IF 输入.flag = "5" + QUERY + SELECT + + point.point_code as device_code + + FROM + sch_base_point point + LEFT JOIN pdm_base_device device ON point.device_id = device.device_id + WHERE + point.area_type = '22' + AND point.point_code <> 'MDJXS101' + ENDSELECT + ENDQUERY +ENDIF + +IF 输入.flag = "6" + QUERY + SELECT + point.point_id, + point.point_code , + device.device_id, + device.device_code + FROM + sch_base_point point + LEFT JOIN pdm_base_device device ON point.device_id = device.device_id + WHERE + point.area_type = '22' + AND point.point_code <> 'MDJXS101' + OPTION 输入.point_code <> "" + point.point_code = 输入.point_code + ENDOPTION + ENDSELECT + ENDQUERY +ENDIF + + +IF 输入.flag = "7" + QUERY + SELECT + point.point_code as device_code, + point.vehicle_code + FROM + sch_base_point point + WHERE + point_code IN ( 'FJJXSXLW201', 'FJJXSXLW202' ) + ENDSELECT + ENDQUERY +ENDIF + + +IF 输入.flag = "8" + QUERY + SELECT + point.point_code as device_code, + point.vehicle_code + FROM + sch_base_point point + WHERE + point_code IN ( 'FJJXSXLW301', 'FJJXSXLW302' ) + ENDSELECT + ENDQUERY +ENDIF \ No newline at end of file diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/WMSTOJN_001.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/WMSTOJN_001.wql index ca4505a..4b51743 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/WMSTOJN_001.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/WMSTOJN_001.wql @@ -13,8 +13,10 @@ ################################################# ## 表字段对应输入参数 ################################################# - 输入.flag TYPEAS s_string + 输入.flag TYPEAS s_string 输入.task TYPEAS s_string + 输入.record_id TYPEAS s_string + 输入.vehicle_code TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -118,4 +120,83 @@ IF 输入.flag = "5" point.point_code IN ( 'FJJXSXLW201', 'FJJXSXLW202' ) ENDSELECT ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + producetask.ext_shoporder_no AS SHOPORDERNO, + material_code AS ITEMCODE, + device.device_code AS SBDM, + record.update_time AS CHECKTIME, + record.qty AS QTY, + record.reason AS BZ + FROM + st_buss_qualityRecord record + LEFT JOIN pdm_mg_producetask producetask ON producetask.producetask_id = record.producetask_id + LEFT JOIN md_me_material material ON material.material_id = record.material_id + LEFT JOIN pdm_base_device device ON device.device_id = record.device_id + where + 1=1 + OPTION 输入.record_id <> "" + record.record_id = 输入.record_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "7" + QUERY + SELECT + deviceStatus.device_code AS SBDM, + deviceStatus.device_status AS STATUS, + deviceStatus.update_time AS UPDATETIME, + "" AS BZ + FROM + st_buss_deviceStatus deviceStatus + ENDSELECT + ENDQUERY + ENDIF + +IF 输入.flag = "8" + QUERY + SELECT + dtl.material_move_id AS ID, + task.ext_shoporder_no AS SHOPORDERNO, + dtl.vehicle_code AS STOCKNO, + "0" AS QTY + FROM + st_buss_vehiclerelarecordtl dtl + LEFT JOIN st_buss_vehicleRelaRecord mst ON mst.record_id = dtl.record_id + LEFT JOIN pdm_mg_producetask task ON task.producetask_id = dtl.producetask_id + where + 1=1 + OPTION 输入.record_id <> "" + record.record_id = 输入.record_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + + IF 输入.flag = "9" + QUERY + SELECT + material.material_code AS ITEMCODE, + mst.pc AS pc, + mst.vehicle_code AS PROD_STOCKNO, + mst.packing_time AS RECORD_TIME, + vehiclegroup.qty AS TOTALQTY + FROM + st_buss_vehicleRelaRecord mst + LEFT JOIN st_buss_vehiclegroup vehiclegroup ON vehiclegroup.vehicle_code = mst.vehicle_code + LEFT JOIN md_me_material material ON material.material_id = mst.material_id + where + 1=1 + OPTION 输入.vehicle_code <> "" + mst.vehicle_code = 输入.vehicle_code + ENDOPTION + ENDSELECT + ENDQUERY ENDIF \ No newline at end of file diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql index b83bcd2..a8ef134 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_ProduceTask_01.wql @@ -115,7 +115,7 @@ FROM pdm_mg_producetask task LEFT JOIN sch_base_point point ON point.device_id = task.device_id - AND point.point_code <> 'MDJXS102' + AND point.point_code <> 'MDJXS101' LEFT JOIN md_me_material material ON material.material_id = task.material_id WHERE 1 =1 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java index c3fbc97..b3b5029 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java @@ -12,6 +12,7 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SecurityUtils; import org.nl.utils.SpringContextHolder; import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.SortingUtil; import org.nl.wms.common.StructFindUtil; import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.sch.manage.AbstractAcsTask; @@ -65,6 +66,17 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { WQLObject.getWQLObject("st_buss_EmptyVehicleRecord").update(map, "task_uuid='" + jsonTask.getString("task_id") + "'"); //解锁仓位,托盘信息,回写到点位上去 String vehicle_code = jsonTask.getString("vehicle_code"); + //插入刚托盘木托盘表 + String point_code = jsonTask.getString("next_point_code"); + String area_type = WQLObject.getWQLObject("sch_base_point").query("point_code='" + point_code + "'").uniqueResult(0).getString("area_type"); + if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + JSONObject jo = new JSONObject(); + jo.put("device_code", point_code); + jo.put("vehicle_code", vehicle_code); + SortingUtil.record(jo); + } + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); JSONObject endpointObj = pointTab.query("point_code='" + jsonTask.getString("next_point_code") + "'").uniqueResult(0); endpointObj.put("lock_type", "00"); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java index 042cd7b..bdc8069 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java @@ -11,6 +11,7 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SecurityUtils; import org.nl.utils.SpringContextHolder; import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.SortingUtil; import org.nl.wms.common.StructFindUtil; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.AreaEnum; @@ -113,6 +114,32 @@ public class CallMaterialTask extends AbstractAcsTask { paramTable.update(paramObj); } } + ////如果终点是分拣区域,则更新木托盘铁托盘记录表 + String next_area = nextPointDto.getArea_type(); + if (StrUtil.equals(next_area, AreaEnum.FJQY.getCode())) { + //如果是下料料位置 托盘则是木托盘 + if (StrUtil.equals(next_point_code, "FJJXSXLW201") || + StrUtil.equals(next_point_code, "FJJXSXLW202") || + StrUtil.equals(next_point_code, "FJJXSXLW301") || + StrUtil.equals(next_point_code, "FJJXSXLW302")) { + JSONObject jo = new JSONObject(); + jo.put("device_code",next_point_code); + jo.put("vehicle_code",vehicle_code); + SortingUtil.record(jo); + } + //如果是上料位置 则需要去找点位记录表上的托盘记录 + else { + String flag = "8"; + if (StrUtil.equals(next_point_code, "FJJXSSLW101") || StrUtil.equals(next_point_code, "FJJXSSLW102")) { + flag = "7"; + } + JSONArray paramArr = WQL.getWO("ACSTOMES_001.wql").addParam("flag", flag).process().getResultJSONArray(0); + for (int i = 0; i < paramArr.size(); i++) { + JSONObject jo = paramArr.getJSONObject(i); + SortingUtil.record(jo); + } + } + } JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); startPointObj.put("lock_type", "00"); startPointObj.put("point_status", "00"); @@ -233,14 +260,11 @@ public class CallMaterialTask extends AbstractAcsTask { //如果没给终点,根据起点去找工序,找一个合适的仓位 并且生成入库单,并且锁定点位 if (StrUtil.isEmpty(start_point_code)) { if (StrUtil.isEmpty(workprocedure_id)) { - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", next_point_code) .process().uniqueResult(0); workprocedure_id = workInfo.getString("workprocedure_id"); - WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); switch (workProcedureEnum) { - //烧制工序 case SZGX: startArea_type = AreaEnum.RYHCHJ.getCode(); @@ -323,17 +347,17 @@ public class CallMaterialTask extends AbstractAcsTask { iosObj.put("create_mode", create_mode); iosObj.put("task_id", task_id); iosObj.put("pcsn", pcsn); - iosObj.put("create_id","1"); + iosObj.put("create_id", "1"); iosObj.put("create_name", "管理员"); iosObj.put("create_time", DateUtil.now()); WQLObject.getWQLObject("ST_IVT_workProcedureIOS").insert(iosObj); //将组盘里面的task_id改为当前的任务 WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); JSONObject groupObj = groupTable.query("vehicle_code='" + vehicle_code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(groupObj)){ - groupObj.put("task_id",task_id); - groupTable.update(groupObj); - } + if (ObjectUtil.isNotEmpty(groupObj)) { + groupObj.put("task_id", task_id); + groupTable.update(groupObj); + } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java index 5ca685e..3e69e3f 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java @@ -2,6 +2,7 @@ package org.nl.wms.sch.manage.buss; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import org.nl.exception.BadRequestException; @@ -73,6 +74,13 @@ public class RgvTask extends AbstractAcsTask { if (StrUtil.isEmpty(start_point_code)) { throw new BadRequestException("起点不能为空!"); } + JSONObject beforTaskObj = WQLObject.getWQLObject("sch_base_task"). + query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) { + throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); + } + taskObj.put("task_id", IdUtil.getSnowflake(1, 1).nextId() + ""); String task_status = TaskStatusEnum.START_AND_POINT.getCode(); taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java index 8e7a147..b49ea7e 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java @@ -16,6 +16,7 @@ import org.nl.wms.BussConstant; import org.nl.wms.WorkProcedureEnum; import org.nl.wms.common.StructFindUtil; import org.nl.wms.ext.acs.service.WmsToJnService; +import org.nl.wms.ext.acs.service.impl.WmsToJnServiceImpl; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.AreaEnum; import org.nl.wms.sch.manage.BillTypeEnum; @@ -33,11 +34,10 @@ import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; @Service -@RequiredArgsConstructor @Slf4j public class ToConveyorTask extends AbstractAcsTask { private final String THIS_CLASS = ToConveyorTask.class.getName(); - private final WmsToJnService wmsToJnService; + @Override @@ -73,9 +73,12 @@ public class ToConveyorTask extends AbstractAcsTask { jsonTask.put("remark", "任务执行完成"); taskTab.update(jsonTask); //调用接口反馈给嘉耐 搬运任务 - JSONObject param = new JSONObject(); + + /*JSONObject param = new JSONObject(); param.put("task_id", task_id); - wmsToJnService.feedBackCarryRecord(param); + WmsToJnService wmsToJnService = new WmsToJnServiceImpl(); + wmsToJnService.feedBackCarryRecord(param) + wmsToJnService.feedBackCarryRecord(param);*/ } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoSynchronDeviceStausTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoSynchronDeviceStausTask.java new file mode 100644 index 0000000..77e58f3 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoSynchronDeviceStausTask.java @@ -0,0 +1,80 @@ + +package org.nl.wms.sch.task; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.sch.manage.buss.CallMaterialTask; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoSynchronDeviceStausTask { + private final CallMaterialTask callMaterialTask; + + @SneakyThrows + public void run() { + this.doExecute(); + } + + @Transactional(rollbackFor = Exception.class) + void doExecute() { + //1 同步压机设备状态 + this.SynchronDevice(); + //2 反馈给嘉耐 + } + + private void SynchronDevice() { + JSONArray deviceArr = WQL.getWO("ACSTOMES_001").addParam("flag", "5").process().getResultJSONArray(0); + WmsToAcsServiceImpl wmsToAcsServiceImpl = new WmsToAcsServiceImpl(); + JSONObject joo = wmsToAcsServiceImpl.queryPointStatus(deviceArr); + JSONArray pointarr = joo.getJSONArray("data"); + WQLObject recordTabele = WQLObject.getWQLObject("st_buss_deviceStatus"); + for (int i = 0; i < pointarr.size(); i++) { + JSONObject devicejo = pointarr.getJSONObject(i); + String point_code = devicejo.getString("device_code"); + //根据点位去找设备 + String device_code = WQL.getWO("ACSTOMES_001").addParam("flag", "6").addParam("point_code",point_code).process().uniqueResult(0).getString("device_code"); + JSONObject recordObj = recordTabele.query("device_code='" + device_code + "'").uniqueResult(0); + int mode = devicejo.getIntValue("mode"); + int error = devicejo.getIntValue("error"); + String device_status = ""; + //2空闲,3工作中,4等待搬运 5缺料请求 + if (mode==2){ + device_status="3"; + } + if (mode==3){ + device_status="1"; + } + if (mode==4){ + device_status="2"; + } + if (mode==5){ + device_status="5"; + } + + if (error >0){ + device_status="4"; + } + recordObj.put("device_status", device_status); + recordObj.put("update_time", DateUtil.now()); + recordTabele.update(recordObj); + } + + + } + +} + + + + diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/wql/ST_Workprocedureios_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/wql/ST_Workprocedureios_01.wql index b47a4bd..9983da9 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/wql/ST_Workprocedureios_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/wql/ST_Workprocedureios_01.wql @@ -45,17 +45,15 @@ b.workprocedure_name, c.material_name, p1.point_name AS start_point_name, - p2.point_name AS end_point_name, - unit.unit_name, - cust.cust_name + p2.point_name AS end_point_name FROM ST_IVT_workProcedureIOS a LEFT JOIN pdm_base_workprocedure b ON a.workprocedure_id = b.workprocedure_id LEFT JOIN md_me_material c ON c.material_id = a.material_id LEFT JOIN sch_base_point p1 ON a.start_point_code = p1.point_code LEFT JOIN sch_base_point p2 ON a.end_point_code = p2.point_code - LEFT JOIN md_pb_measureunit unit ON a.qty_unit_id = unit.unit_id - LEFT JOIN md_cs_customerbase cust ON a.cust_id = cust.cust_id + + WHERE a.is_delete = '0' and a.io_type = '0' OPTION 输入.search <> "" diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/out/service/wql/ST_WorkprocedureiosOut_01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/out/service/wql/ST_WorkprocedureiosOut_01.wql index 5cf8ab8..0b217f2 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/out/service/wql/ST_WorkprocedureiosOut_01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/out/service/wql/ST_WorkprocedureiosOut_01.wql @@ -70,31 +70,27 @@ IF 输入.flag = "2" PAGEQUERY - SELECT - point.*, - material.material_id, - material.material_name, - structivt.vehicle_code AS vehicle_code111, - structivt.pcsn, - structivt.canuse_qty, - structivt.frozen_qty, - structivt.ivt_qty, - structivt.warehousing_qty, - structivt.qty_unit_id, - structivt.is_full, - structivt.instorage_time, - unit.unit_name - FROM - st_ivt_structivt structivt - LEFT JOIN sch_base_point point ON point.point_id = structivt.struct_id - LEFT JOIN md_me_material material ON structivt.material_id = material.material_id - LEFT JOIN md_pb_measureunit unit ON structivt.qty_unit_id = unit.unit_id - WHERE - point.is_delete = '0' - AND point.point_type = '02' - and point.lock_type='00' - and structivt.canuse_qty > 0 - and point.is_used = '1' + SELECT + point.*, + material.material_id, + material.material_name, + structivt.vehicle_code AS vehicle_code111, + structivt.canuse_qty, + structivt.frozen_qty, + structivt.ivt_qty, + structivt.warehousing_qty, + structivt.is_full, + structivt.instorage_time + FROM + st_ivt_structivt structivt + LEFT JOIN sch_base_point point ON point.point_id = structivt.struct_id + LEFT JOIN md_me_material material ON structivt.material_id = material.material_id + WHERE + point.is_delete = '0' + AND point.point_type = '02' + AND point.lock_type = '00' + AND structivt.canuse_qty > 0 + AND point.is_used = '1' and structivt.workprocedure_id = 输入.ivt_workprocedure_id and structivt.is_full = 输入.is_full and structivt.material_id = 输入.material_id diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls b/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls index 306a9a46f2e3f89bebe3f63a8753d1bc97cdc003..9ca42788205819cba35e79884e865a47ce36c98d 100644 GIT binary patch delta 22496 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

(=x-@OalNVlBq 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