From 49cd752a307c216e10612f1d1ca9cb88bd3491ae Mon Sep 17 00:00:00 2001 From: 18188916393 <2562295436@qq.com> Date: Thu, 28 Jul 2022 09:59:02 +0800 Subject: [PATCH] no message --- .../org/nl/wms/common/PointUpdateUtil.java | 33 +++ .../org/nl/wms/common/StructFindUtil.java | 32 +++ .../org/nl/wms/common/wql/QSTRUCT_RULE.wql | 55 +++- .../wms/ext/acs/rest/AcsToWmsController.java | 15 +- .../wms/ext/acs/rest/WmsToAcsController.java | 7 + .../wms/ext/acs/service/AcsToWmsService.java | 2 + .../wms/ext/acs/service/WmsToAcsService.java | 6 + .../acs/service/impl/AcsToWmsServiceImpl.java | 183 ++++++++++--- .../acs/service/impl/WmsToAcsServiceImpl.java | 7 + .../org/nl/wms/ext/acs/wql/ACSTOMES_001.wql | 42 +++ .../rest/PdaBindingMaterialController.java | 46 ++++ .../service/PdaBindingMaterialService.java | 16 ++ .../impl/PdaBindingMaterialServiceImpl.java | 61 +++++ .../binding/rest/PdaBindingController.java | 18 +- .../binding/service/PdaBindingService.java | 3 +- .../service/impl/PdaBindingServiceImpl.java | 23 +- .../service/impl/CallEmptyServiceImpl.java | 9 +- .../rest/PdaRuleSettingController.java | 47 ++++ .../service/PdaRuleSettingService.java | 17 ++ .../impl/PdaRuleSettingServiceImpl.java | 83 ++++++ .../org/nl/wms/pda/sendEmpty/wql/QPAEMPTY.wql | 30 +- .../wms/pda/sendMaterial/wql/QPADSERVICE.wql | 26 +- .../sch/manage/buss/CallEmptyVehicleTask.java | 5 +- .../nl/wms/sch/manage/buss/ConveyorTask.java | 125 +++++++++ .../org/nl/wms/sch/manage/buss/RgvTask.java | 122 +++++++++ .../sch/manage/buss/SendEmptyVehicleTask.java | 77 +----- .../wms/sch/manage/buss/SendMaterialTask.java | 36 ++- .../wms/sch/manage/buss/ToConveyorTask.java | 259 ++++++++++++++++++ .../src/main/java/org/nl/wms/wms.xls | Bin 370176 -> 397312 bytes .../src/views/wms/pdm/produceTask/index.vue | 12 - 30 files changed, 1240 insertions(+), 157 deletions(-) create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/rest/PdaBindingMaterialController.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/PdaBindingMaterialService.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/rest/PdaRuleSettingController.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/PdaRuleSettingService.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/impl/PdaRuleSettingServiceImpl.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ConveyorTask.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java new file mode 100644 index 0000000..291c8ea --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java @@ -0,0 +1,33 @@ +package org.nl.wms.common; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.exception.BadRequestException; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; + +public class PointUpdateUtil { + public static void updatePoint(JSONArray arr) { + WmsToAcsServiceImpl wmsToAcsServiceImpl = new WmsToAcsServiceImpl(); + + //JSONObject joo = wmsToAcsServiceImpl.queryPointStatus(arr); + //JSONArray pointarr = joo.getJSONArray("arr"); + + JSONArray pointarr =new JSONArray(); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + for (int i = 0; i < pointarr.size(); i++) { + JSONObject pointjo = pointarr.getJSONObject(i); + String point_status = "00"; + String vehicle_code = pointjo.getString("vehicle_code"); + if (StrUtil.isNotEmpty(vehicle_code)) { + point_status = "02"; + } + pointjo.put("point_status", point_status); + pointTable.update(pointjo); + } + } + + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java index dba858e..1ea2a52 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java @@ -2,7 +2,9 @@ package org.nl.wms.common; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alipay.api.domain.BFActivityOpenApiInfo; import org.nl.exception.BadRequestException; import org.nl.start.day01.Struct; import org.nl.wql.WQL; @@ -89,4 +91,34 @@ public class StructFindUtil { return result; } + //获取空闲的输送线的上料位 + public static JSONObject getConveyor(JSONObject jsonObject) { + String material_id = jsonObject.getString("material_id"); + //判断入输送线的规则有没有开启,假如开启需要带上物料,没有开启不需要带上物料 + String value = WQLObject.getWQLObject("sys_param").query("code='is_inrule'").uniqueResult(0).getString("value"); + if (StrUtil.equals(value, "0")) { + material_id = ""; + } + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + //获取可以用的输送线数组 + JSONArray deviceArr = WQL.getWO("QSTRUCT_RULE").addParam("flag", "6") + .addParam("material_id", material_id).process().getResultJSONArray(0); + JSONObject result = new JSONObject(); + for (int i = 0; i < deviceArr.size(); i++) { + JSONObject deviceObj = deviceArr.getJSONObject(i); + int count = deviceObj.getIntValue("count"); + //假如到该输送线上料位置的任务>= 空闲的位置个数,则需要选择下一个输送线 + int task_num = WQL.getWO("QSTRUCT_RULE").addParam("flag", "7").process().uniqueResult(0).getIntValue("count"); + if (count > task_num) { + result = pointTable.query("device_id = '" + deviceObj.getString("device_id") + "' and device_point_type='01'").uniqueResult(0); + + } else { + continue; + } + } + return result; + } + + } 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 3b377b1..51892e4 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 @@ -18,9 +18,11 @@ 输入.material_id TYPEAS s_string 输入.sect_id TYPEAS s_string 输入.area_type TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - 输入.workprocedure_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + 输入.workprocedure_id TYPEAS s_string 输入.is_full TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.next_point_code TYPEAS s_string [临时表] @@ -172,8 +174,6 @@ IF 输入.flag = "5" point.point_code AS struct_code, point.point_name AS struct_name, point.vehicle_code - - FROM sch_base_point point LEFT JOIN md_pb_vehicle vehicle ON vehicle.vehicle_code = point.vehicle_code @@ -189,4 +189,51 @@ IF 输入.flag = "5" ENDOPTION ENDSELECT ENDQUERY +ENDIF + +IF 输入.flag = "6" + QUERY + SELECT + device.device_id, + device.device_code, + device.device_name, + rule.in_seq_no, + count( * ) AS count + FROM + sch_base_point point + LEFT JOIN st_rule_cacheline rule ON point.device_id = rule.cacheline_id + LEFT JOIN pdm_base_device device ON device.device_id = rule.cacheline_id + WHERE + point.area_type = '07' + AND ( point.vehicle_code = '' OR point.vehicle_code IS NULL ) + OPTION 输入.material_id <> "" + rule.material_id = 输入.material_id + ENDOPTION + GROUP BY + device.device_id, + device.device_code, + device.device_name, + rule.in_seq_no + ORDER BY + rule.in_seq_no + ENDSELECT + ENDQUERY +ENDIF + + + +IF 输入.flag = "7" + QUERY + SELECT + count(*) + FROM + sch_base_task task + WHERE + task.task_status IN ( '04', '05', '06' ) + and task.is_delete ='1' + OPTION 输入.next_point_code <> "" + task.next_point_code = 输入.next_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 39f21ce..1c5b8ff 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 @@ -45,17 +45,16 @@ public class AcsToWmsController { return new ResponseEntity<>(HttpStatus.OK); } @PostMapping("/group") - @Log("ACS扫码器组盘") + @Log("ACS扫码器入库组盘") @ApiOperation("ACS扫码器组盘") public ResponseEntity group(@RequestBody Map whereJson) { acsToWmsService.group(whereJson); return new ResponseEntity<>(HttpStatus.OK); } - @PostMapping("/ispackage") - @Log("ACS给WMS请求是否优先包装") - @ApiOperation("ACS给WMS请求是否优先包装") + @Log("ACS给WMS请求是否自动码垛") + @ApiOperation("ACS给WMS请求是否自动码垛") public ResponseEntity ispackage(@RequestBody Map whereJson) { return new ResponseEntity<>(acsToWmsService.ispackage(whereJson), HttpStatus.OK); } @@ -89,4 +88,12 @@ public class AcsToWmsController { return new ResponseEntity<>(HttpStatus.OK); } + @PostMapping("/updateVehicleType") + @Log("更新覆膜机的点位状态") + @ApiOperation("更新覆膜机的点位状态") + public ResponseEntity updateVehicleType(@RequestBody Map whereJson) { + acsToWmsService.updateVehicleType(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index bab4ed6..98c1e05 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -64,5 +64,12 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.action(arr), HttpStatus.OK); } + @PostMapping("/queryPointStatus") + @Log("查询点位状态") + @ApiOperation("查询点位状态") + public ResponseEntity queryPointStatus(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.queryPointStatus(arr), 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 86122f8..1bb2a21 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 @@ -74,4 +74,6 @@ public interface AcsToWmsService { void sureProduceTask(Map jsonObject); + void updateVehicleType(Map jsonObject); + } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 39d3247..1070761 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -41,6 +41,12 @@ public interface WmsToAcsService { * @return */ Map action(JSONArray arr); + /** + * 下发动作信号 + * @param arr + * @return + */ + Map queryPointStatus(JSONArray arr); } 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 3740d18..6ec272b 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 @@ -5,20 +5,20 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.exception.BadRequestException; import org.nl.modules.system.util.CodeUtil; -import org.nl.start.day01.Struct; import org.nl.utils.SecurityUtils; import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.PointUpdateUtil; +import org.nl.wms.common.StructFindUtil; import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.sch.manage.buss.CallEmptyVehicleTask; -import org.nl.wms.sch.manage.buss.CallMaterialTask; -import org.nl.wms.sch.manage.buss.SendEmptyVehicleTask; -import org.nl.wms.sch.manage.buss.SendMaterialTask; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.buss.*; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; @@ -34,7 +34,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private final CallMaterialTask callMaterialTask; private final SendEmptyVehicleTask sendEmptyVehicleTask; private final CallEmptyVehicleTask callEmptyVehicleTask; - + private final RgvTask rgvTask; + private final WmsToAcsServiceImpl wmsToAcsServiceImpl; + private final ToConveyorTask toConveyorTask; @Override @Transactional(rollbackFor = Exception.class) @@ -49,20 +51,22 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (StrUtil.isEmpty(type)) { throw new BadRequestException("类型不能为空!"); } + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); switch (type) { //送料入库 case "1": jsonObject.put("start_point_code", device_code); jsonObject.put("create_mode", "01"); - String material_id = (String) jsonObject.get("material_id"); + String product_code = (String) jsonObject.get("product_code"); String pcsn = (String) jsonObject.get("pcsn"); - if (StrUtil.isEmpty(material_id)) { + if (StrUtil.isEmpty(product_code)) { throw new BadRequestException("物料不能为空!"); } if (StrUtil.isEmpty(pcsn)) { throw new BadRequestException("批次不能为空!"); } - //批次 物料,客户要从排产单里面去取 + JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_code ='" + product_code + "'").uniqueResult(0); + String material_id = materialObj.getString("material_id"); //如果是出窑输送线 要从组盘表里面去找物料 if (StrUtil.equals(device_code, "CYSSX101")) { String vehicle_code = (String) jsonObject.get("vehicle_code"); @@ -81,9 +85,29 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { 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); - String stewing_time = materiralObj.getString("stewing_time"); + Double stewing_time = materiralObj.getDouble("stewing_time"); jsonObject.put("stewing_time", stewing_time); jsonObject.put("producetask_id", produceInfoByCode.getString("producetask_id")); + //假如是压制下料的几个位置,则要考虑是入输送线 还是入立体库 + 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 = pointTable.query("area_type ='07'").getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointarr); + //2.找一个合适的输送带 + JSONObject pointObj = StructFindUtil.getConveyor(materiralObj); + + //如果未找到合适的输送带 就去货架 + if (ObjectUtil.isEmpty(pointObj)) { + sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + } else { + jsonObject.put("next_point_code", pointObj.getString("point_code")); + toConveyorTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; + } + + + } sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; case "2": @@ -106,33 +130,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { case "4": //叫空托盘 jsonObject.put("next_point_code", device_code); + produceInfoByCode = this.getProduceInfoByCode(device_code); //假如是压制机下料位置或者是码垛位的上料位,则去看看有没有当前排产单生产的物料的半满托 - if (StrUtil.equals(device_code, "YZJ01XL01") || - StrUtil.equals(device_code, "YZJ01XL02") || - StrUtil.equals(device_code, "YZJ02XL01") || - StrUtil.equals(device_code, "YZJ02XL02") || - StrUtil.equals(device_code, "YZJ03XL01") || - StrUtil.equals(device_code, "YZJ03XL02") || - StrUtil.equals(device_code, "YZJ04XL01") || - StrUtil.equals(device_code, "YZJ04XL02") || - StrUtil.equals(device_code, "YZJ05XL01") || - StrUtil.equals(device_code, "YZJ05XL02") || - StrUtil.equals(device_code, "YZJ05XL02") || - StrUtil.equals(device_code, "YZJ06XL01") || - StrUtil.equals(device_code, "YZJ06XL02") || - StrUtil.equals(device_code, "YZJ07XL01") || - StrUtil.equals(device_code, "YZJ07XL02") || - StrUtil.equals(device_code, "YZJ08XL01") || - StrUtil.equals(device_code, "YZJ08XL02") || - StrUtil.equals(device_code, "FJJXS01MD1") || - StrUtil.equals(device_code, "FJJXS01MD2") || - StrUtil.equals(device_code, "FJJXS02MD1") || - StrUtil.equals(device_code, "FJJXS02MD2") + if (StrUtil.equals(device_code, "FJJXSSLW101") || + StrUtil.equals(device_code, "FJJXSSLW102") || + StrUtil.equals(device_code, "FJJXSSLW301") || + StrUtil.equals(device_code, "FJJXSSLW302") ) { - produceInfoByCode = this.getProduceInfoByCode(device_code); + material_id = produceInfoByCode.getString("material_id"); - String cust_id = produceInfoByCode.getString("cust_id"); - String workprocedure_id = WorkProcedureEnum.YZGX.getId(); + String workprocedure_id = WorkProcedureEnum.FJGX.getId(); JSONObject jsonObject1 = WQL.getWO("ACSTOMES_001").addParam("flag", "1") .addParam("workprocedure_id", workprocedure_id) .addParam("material_id", material_id) @@ -144,16 +151,52 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("create_mode", "01"); jsonObject.put("pcsn", "pcsn"); jsonObject.put("material_id", material_id); - jsonObject.put("cust_id", cust_id); jsonObject.put("is_full", "0"); jsonObject.put("workprocedure_id", workprocedure_id); callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; } } + if (ObjectUtil.isEmpty(produceInfoByCode)) { + throw new BadRequestException("未找到点位为'" + device_code + "'对应机械手的生产工单!"); + } + jsonObject.put("vehicle_type",produceInfoByCode.getString("vehicle_type")); + callEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; + //生产rgv搬运任务 case "5": + jsonObject.put("next_point_code", device_code); + jsonObject.put("create_mode", "01"); + //1 判断有没有执行的Rgv搬运任务 + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_type='04' and is_delete='0' and acs_task_type<>'07'").uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj)) { + return; + } + //寻找起点 + //更新所有设备的点位的状态 + JSONArray pointarr = pointTable.query("area_type='07' and device_point_type ='01' ").getResultJSONArray(0); + WmsToAcsServiceImpl wmsToAcsService = new WmsToAcsServiceImpl(); + JSONArray reurnPointStatusArr = wmsToAcsService.queryPointStatus(pointarr).getJSONArray("data"); + for (int i = 0; i < reurnPointStatusArr.size(); i++) { + JSONObject reurnPointStatusObj = reurnPointStatusArr.getJSONObject(i); + reurnPointStatusObj.put("update_time", DateUtil.now()); + pointTable.update(reurnPointStatusObj); + } + //假如没有设置哪个输送线先出,没有按照先进先出 + JSONObject param = new JSONObject(); + String rule = WQLObject.getWQLObject("sys_param").query("code='is_outrule'").uniqueResult(0).getString("value"); + if (StrUtil.equals(rule, "1")) { + param = WQL.getWO("ACSTOMES_001").addParam("flag", "3").process().uniqueResult(0); + } else { + param = WQL.getWO("ACSTOMES_001").addParam("flag", "2").process().uniqueResult(0); + } + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("未找到合适的输送线可以出!"); + } + param.put("start_point_code", param.getString("point_code")); + rgvTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; } } @@ -250,15 +293,51 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { public void group(Map jsonObject) { String task_id = (String) jsonObject.get("task_id"); String vehicle_code = (String) jsonObject.get("vehicle_code"); + //永远判断生成不生成输送任务 + String device_code = (String) jsonObject.get("device_code"); if (StrUtil.isEmpty(task_id)) { throw new BadRequestException("任务标识不能为空!"); } if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("载具号不能为空!"); } + if (StrUtil.isEmpty(device_code)) { + throw new BadRequestException("设备点位不能为空!"); + } //1组盘 - WQLObject.getWQLObject("") - //2 生成任务 + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject groupObj = groupTable.query("task_id='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(groupObj)) { + throw new BadRequestException("未找到指令为'" + task_id + "'的组盘信息!"); + } + groupObj.put("vehicle_code", vehicle_code); + groupObj.put("update_optid", SecurityUtils.getCurrentUserId()); + groupObj.put("update_optname", SecurityUtils.getNickName()); + groupObj.put("update_time", DateUtil.now()); + groupTable.update(groupObj); + //更新入库单单据的托盘条码 + WQLObject iosTable = WQLObject.getWQLObject("ST_IVT_workProcedureIOS"); + JSONObject iosObj = iosTable.query("task_id ='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(iosObj)) { + iosObj.put("vehicle_code", vehicle_code); + iosTable.update(iosObj); + } + //更新任务的条码 + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + JSONObject taskObj = taskTable.query("task_id ='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + taskObj.put("vehicle_code", vehicle_code); + taskTable.update(taskObj); + } + //假如是入窑输送线对接口,生成输送任务 + if (StrUtil.equals("RYSSX101", device_code) || StrUtil.equals("RYSSX201", device_code) + || StrUtil.equals("RYSSX301", device_code) || StrUtil.equals("RYSSX401", device_code)) { + ConveyorTask conveyorTask = new ConveyorTask(); + JSONObject taskjo = new JSONObject(); + taskjo.put("vehicle_code", vehicle_code); + taskjo.put("start_point_code", device_code); + conveyorTask.createTask(taskjo); + } } @Override @@ -272,10 +351,11 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (ObjectUtil.isEmpty(vehicleObj)) { throw new BadRequestException("为找到托盘号为'" + vehicle_code + "'的组盘信息!"); } - String producetask_id = vehicleObj.getString("producetask_id"); - JSONObject taskObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("producetask_id='" + producetask_id + "'").uniqueResult(0); + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject groupObj = groupTable.query("vehicle_code ='" + vehicle_code + "'").uniqueResult(0); + groupTable.query("vehicle_code ='" + vehicle_code + "'").uniqueResult(0); JSONObject returnjo = new JSONObject(); - returnjo.put("is_package", taskObj.getString("is_package")); + returnjo.put("is_autopackage", groupObj.getString("is_autopackage")); return returnjo; } @@ -391,6 +471,29 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { taskTable.update(taskObj); } + @Override + public void updateVehicleType(Map jsonObject) { + String vehicle_type = (String) jsonObject.get("vehicle_type"); + String device_code = (String) jsonObject.get("device_code"); + String vehicle_code = (String) jsonObject.get("vehicle_code"); + if (StrUtil.isEmpty(vehicle_type)) { + throw new BadRequestException("托盘类型不能为空!"); + } + if (StrUtil.isEmpty(device_code)) { + throw new BadRequestException("设备点位不能为空"); + } + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("托盘号不能为空!"); + } + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject pointObj = pointTable.query("point_code='" + device_code + "' and area_type='05'").uniqueResult(0); + pointObj.put("vehicle_type", vehicle_type); + pointObj.put("vehicle_code", vehicle_code); + pointObj.put("point_status", "01"); + pointTable.update(pointObj); + + } + private JSONObject getProduceInfoByCode(String code) { //根据 设备点位去找生产任务信息 //1 根据点位去找设备,去找对应的设备信息 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index f957a5e..5cbf43f 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -40,6 +40,13 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return AcsUtil.notifyAcs(api, arr); } + @Override + public JSONObject queryPointStatus(JSONArray arr) { + String api = "api/wms/updateDeviceGoods"; + return AcsUtil.notifyAcs(api, arr); + + } + public static void main(String[] args) { String format = DateUtil.format(new Date(), "yyyy-MM-dd"); System.out.println(format); 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 13a4e9a..b46565d 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 @@ -61,3 +61,45 @@ ENDSELECT ENDQUERY ENDIF + + + IF 输入.flag = "2" + QUERY + SELECT + point.point_id, + point.point_code, + point.point_name, + vehiclegroup.vehicle_code + FROM + sch_base_point point + LEFT JOIN st_buss_vehiclegroup vehiclegroup ON point.vehicle_code = vehiclegroup.vehicle_code + WHERE + point.area_type = '07' + AND point.device_point_type = '01' + and (vehiclegroup.vehicle_code <>'' and vehiclegroup .vehicle_code is not null) + ORDER BY + vehiclegroup.create_time + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + point.point_id, + point.point_code, + point.point_name, + point.area_type, + point.vehicle_code + FROM + sch_base_point point + LEFT JOIN st_rule_cacheline rule on rule.cacheline_id =point.device_id + WHERE + point.area_type = '07' + AND point.device_point_type = '01' + and (point.vehicle_code <>'' and point .vehicle_code is not null) + ORDER BY + rule.out_seq_no + ENDSELECT + ENDQUERY + ENDIF diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/rest/PdaBindingMaterialController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/rest/PdaBindingMaterialController.java new file mode 100644 index 0000000..dd5b1b0 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/rest/PdaBindingMaterialController.java @@ -0,0 +1,46 @@ + +package org.nl.wms.pda.bindMaterial.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; +import org.nl.wms.pda.bindMaterial.service.PdaBindingMaterialService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author ldjun + * @date 2021-07-26 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "手持托盘组盘绑定接口管理") +@RequestMapping("/api/pda/bindingMaterial") +@Slf4j +public class PdaBindingMaterialController { + + private final PdaBindingMaterialService pdaBindingService; + + @PostMapping("/queryInfoByVehicle") + @Log("根据托盘查询信息") + @ApiOperation("根据托盘查询信息") + public ResponseEntity queryInfoByVehicle(@RequestBody Map param) { + return new ResponseEntity<>(pdaBindingService.queryInfoByVehicle(param), HttpStatus.OK); + } + @PostMapping("/confirm") + @Log("托盘物料绑定确定") + @ApiOperation("托盘物料绑定确定") + public ResponseEntity Confirm(@RequestBody Map param) { + return new ResponseEntity<>(pdaBindingService.Confirm(param), HttpStatus.OK); + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/PdaBindingMaterialService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/PdaBindingMaterialService.java new file mode 100644 index 0000000..b9adbab --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/PdaBindingMaterialService.java @@ -0,0 +1,16 @@ +package org.nl.wms.pda.bindMaterial.service; + +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +public interface PdaBindingMaterialService { + Map queryInfoByVehicle(Map jsonObject); + /** + * 盘点单确认 + * @param param 条件 + * @return Map + * + */ + Map Confirm(@RequestBody Map param); +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java new file mode 100644 index 0000000..419950b --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java @@ -0,0 +1,61 @@ +package org.nl.wms.pda.bindMaterial.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.system.service.UserService; +import org.nl.wms.database.service.MaterialService; +import org.nl.wms.pda.bindMaterial.service.PdaBindingMaterialService; +import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PdaBindingMaterialServiceImpl implements PdaBindingMaterialService { + + @Override + public Map queryInfoByVehicle(Map jsonObject) { + JSONObject returnjo = new JSONObject(); + String vehicle_code = (String) jsonObject.get("vehicle_code"); + //JSONArray materialja = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code='"+vehicle_code+"'").getResultJSONArray(0); + JSONObject materialja = WQL.getWO("QPADSERVICE").addParam("vehicle_code", vehicle_code).addParam("flag", "16").process().uniqueResult(0); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", materialja); + return returnjo; + } + + @Override + public Map Confirm(@RequestBody Map param) { + + String vehicle_code = (String) param.get("vehicle_code"); + String material_id = (String) param.get("material_id"); + String material_code = (String) param.get("material_code"); + String material_name = (String) param.get("material_name"); + String pcsn = (String) param.get("pcsn"); + String qty = (String) param.get("qty"); + WQLObject table = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject vehicleObj = table.query("vehicle_code='" + vehicle_code + "'").uniqueResult(0); + vehicleObj.put("material_id", material_id); + vehicleObj.put("material_code", material_code); + vehicleObj.put("material_name", material_name); + vehicleObj.put("pcsn", pcsn); + vehicleObj.put("qty", qty); + table.update(vehicleObj); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "操作成功!"); + return returnjo; + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/rest/PdaBindingController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/rest/PdaBindingController.java index 72da9de..bf79701 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/rest/PdaBindingController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/rest/PdaBindingController.java @@ -31,11 +31,19 @@ public class PdaBindingController { private final PdaBindingService pdaBindingService; - @PostMapping("/binding/querypoint") - @Log("查询点位") - @ApiOperation("查询点位") - public ResponseEntity queryPoint(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.queryPoint(param), HttpStatus.OK); + + @PostMapping("/binding/queryArea") + @Log("查询区域") + @ApiOperation("查询区域") + public ResponseEntity queryArea(@RequestBody Map param) { + return new ResponseEntity<>(pdaBindingService.queryArea(param), HttpStatus.OK); + } + + @PostMapping("/binding/queryPointByArea") + @Log("根据区域查询点位") + @ApiOperation("根据区域查询点位") + public ResponseEntity queryPointByArea(@RequestBody Map param) { + return new ResponseEntity<>(pdaBindingService.queryPointByArea(param), HttpStatus.OK); } @PostMapping("/binding/confirm") @Log("托盘点位绑定") diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/PdaBindingService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/PdaBindingService.java index 1916448..31c9082 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/PdaBindingService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/PdaBindingService.java @@ -5,7 +5,8 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.Map; public interface PdaBindingService { - Map queryPoint(Map jsonObject); + Map queryArea(Map jsonObject); + Map queryPointByArea(Map jsonObject); /** * 盘点单确认 * @param param 条件 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/impl/PdaBindingServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/impl/PdaBindingServiceImpl.java index 2ac3c07..ebbd4a7 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/impl/PdaBindingServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/binding/service/impl/PdaBindingServiceImpl.java @@ -15,6 +15,7 @@ import org.nl.utils.SecurityUtils; import org.nl.wms.database.service.MaterialService; import org.nl.wms.pda.binding.service.PdaBindingService; import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -33,15 +34,29 @@ public class PdaBindingServiceImpl implements PdaBindingService { private final MaterialService materialService; @Override - public Map queryPoint(Map jsonObject) { + public Map queryArea(Map param) { + JSONArray areaArr = WQL.getWO("QPAEMPTY").addParam("flag", "4").process().getResultJSONArray(0); JSONObject returnjo = new JSONObject(); - JSONArray materialja = WQLObject.getWQLObject("sch_base_point").query("1=1").getResultJSONArray(0); returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", materialja); + returnjo.put("desc", "操作成功!"); + returnjo.put("result", areaArr); return returnjo; } + + @Override + public Map queryPointByArea(Map param) { + String area_code = (String) param.get("area_code"); + if (StrUtil.isEmpty(area_code)) { + throw new PdaRequestException("区域不能为空!"); + } + JSONArray pointArr = WQL.getWO("QPAEMPTY").addParam("flag", "2").addParam("area_type", area_code).process().getResultJSONArray(0); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "操作成功!"); + returnjo.put("result", pointArr); + return returnjo; + } @Override public Map Confirm(@RequestBody Map param) { //point_code diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/service/impl/CallEmptyServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/service/impl/CallEmptyServiceImpl.java index 96ccf96..eba0b1b 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/service/impl/CallEmptyServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/service/impl/CallEmptyServiceImpl.java @@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.ext.acs.service.impl.AcsToWmsServiceImpl; import org.nl.wms.pda.callEmpty.service.CallEmptyService; import org.nl.wms.pda.exception.PdaRequestException; import org.nl.wms.sch.manage.buss.CallEmptyVehicleTask; @@ -20,10 +22,11 @@ import java.util.Map; @Slf4j public class CallEmptyServiceImpl implements CallEmptyService { private final CallEmptyVehicleTask callEmptyVehicleTask; + private final AcsToWmsServiceImpl acsToWmsServiceimpl; @Override public Map queryArea(Map param) { - JSONArray areaArr = WQL.getWO("QPAEMPTY").addParam("flag", "1").process().getResultJSONArray(0); + JSONArray areaArr = WQL.getWO("QPAEMPTY").addParam("flag", "3").process().getResultJSONArray(0); JSONObject returnjo = new JSONObject(); returnjo.put("code", "1"); returnjo.put("desc", "操作成功!"); @@ -55,7 +58,9 @@ public class CallEmptyServiceImpl implements CallEmptyService { } JSONObject jsonObject = new JSONObject(); jsonObject.put("next_point_code", next_point_code); - callEmptyVehicleTask.createTask(jsonObject); + jsonObject.put("device_code",next_point_code); + jsonObject.put("type","4"); + acsToWmsServiceimpl.receiveTaskFromAcs(jsonObject); JSONObject returnjo = new JSONObject(); returnjo.put("code", "1"); returnjo.put("desc", "操作成功!"); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/rest/PdaRuleSettingController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/rest/PdaRuleSettingController.java new file mode 100644 index 0000000..cc64d36 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/rest/PdaRuleSettingController.java @@ -0,0 +1,47 @@ + +package org.nl.wms.pda.ruleSetting.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.annotation.Log; +import org.nl.wms.pda.ruleSetting.service.PdaRuleSettingService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author ldjun + * @date 2021-07-26 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "手持托盘入窑贵州") +@RequestMapping("/api/pda/ruleSetting") +@Slf4j +public class PdaRuleSettingController { + + private final PdaRuleSettingService pdaBindingService; + + @PostMapping("/queryInfo") + @Log("查询规则信息") + @ApiOperation("查询规则信息") + public ResponseEntity queryInfo(@RequestBody Map param) { + return new ResponseEntity<>(pdaBindingService.queryInfo(param), HttpStatus.OK); + } + @PostMapping("/confirm") + @Log("规则确定") + @ApiOperation("规则确定") + public ResponseEntity Confirm(@RequestBody JSONObject param) { + return new ResponseEntity<>(pdaBindingService.Confirm(param), HttpStatus.OK); + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/PdaRuleSettingService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/PdaRuleSettingService.java new file mode 100644 index 0000000..6e6cfa0 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/PdaRuleSettingService.java @@ -0,0 +1,17 @@ +package org.nl.wms.pda.ruleSetting.service; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +public interface PdaRuleSettingService { + Map queryInfo(Map jsonObject); + /** + * 盘点单确认 + * @param param 条件 + * @return Map + * + */ + Map Confirm( JSONObject param); +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/impl/PdaRuleSettingServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/impl/PdaRuleSettingServiceImpl.java new file mode 100644 index 0000000..a5285ae --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/ruleSetting/service/impl/PdaRuleSettingServiceImpl.java @@ -0,0 +1,83 @@ +package org.nl.wms.pda.ruleSetting.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.system.service.UserService; +import org.nl.wms.database.service.MaterialService; +import org.nl.wms.pda.exception.PdaRequestException; +import org.nl.wms.pda.ruleSetting.service.PdaRuleSettingService; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PdaRuleSettingServiceImpl implements PdaRuleSettingService { + + + @Override + public Map queryInfo(Map jsonObject) { + String mode = jsonObject.get("mode"); + //1 为入 2 为出 + JSONArray arr = new JSONArray(); + JSONObject infojo = new JSONObject(); + //1 启用 0 停用 + String is_used = ""; + if (StrUtil.equals("1", mode)) { + arr = WQLObject.getWQLObject("st_rule_cacheline").query("1=1", "in_seq_no ").getResultJSONArray(0); + is_used = WQLObject.getWQLObject("sys_param").query("code='is_inrule'").uniqueResult(0).getString("value"); + } else { + arr = WQLObject.getWQLObject("st_rule_cacheline").query("1=1", "out_seq_no ").getResultJSONArray(0); + is_used = WQLObject.getWQLObject("sys_param").query("code='is_outrule'").uniqueResult(0).getString("value"); + } + infojo.put("is_used", is_used); + infojo.put("JSONArray", arr); + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "查询成功!"); + returnjo.put("result", infojo); + return returnjo; + } + + @Override + public Map Confirm( JSONObject param) { + String mode =(String) param.get("mode"); + String is_used = (String)param.get("is_used"); + JSONArray arr = param.getJSONArray("JSONArray"); + + WQLObject paramTable = WQLObject.getWQLObject("sys_param"); + WQLObject ruleTable = WQLObject.getWQLObject("st_rule_cacheline"); + if (StrUtil.equals(mode, "1")) { + JSONObject paramObj = paramTable.query("code='is_inrule'").uniqueResult(0); + paramObj.put("value", is_used); + paramTable.update(paramObj); + for (int i = 0; i < arr.size(); i++) { + JSONObject joo = arr.getJSONObject(i); + joo.put("in_seq_no",i); + ruleTable.update(joo); + } + } else { + JSONObject paramObj = paramTable.query("code='is_outrule'").uniqueResult(0); + paramObj.put("value", is_used); + paramTable.update(paramObj); + for (int i = 0; i < arr.size(); i++) { + JSONObject joo = arr.getJSONObject(i); + joo.put("out_seq_no",i); + ruleTable.update(joo); + } + } + JSONObject returnjo = new JSONObject(); + returnjo.put("code", "1"); + returnjo.put("desc", "操作成功!"); + return returnjo; + } + +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendEmpty/wql/QPAEMPTY.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendEmpty/wql/QPAEMPTY.wql index 18e623a..c5a3b12 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendEmpty/wql/QPAEMPTY.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendEmpty/wql/QPAEMPTY.wql @@ -48,6 +48,7 @@ sys_dict_detail sys WHERE sys.dict_id = '34' + and sys.value='27' ENDSELECT ENDQUERY ENDIF @@ -67,4 +68,31 @@ ENDOPTION ENDSELECT ENDQUERY - ENDIF \ No newline at end of file + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + sys.`value` as area_code, + sys.label as area_name + FROM + sys_dict_detail sys + WHERE + sys.dict_id = '34' + and (sys.value='27' or sys.value='22') + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + sys.`value` as area_code, + sys.label as area_name + FROM + sys_dict_detail sys + WHERE + sys.dict_id = '34' + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/wql/QPADSERVICE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/wql/QPADSERVICE.wql index ce130b1..a674f70 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/wql/QPADSERVICE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/wql/QPADSERVICE.wql @@ -386,4 +386,28 @@ IF 输入.flag = "13" md_me_material material ENDSELECT ENDPAGEQUERY - ENDIF \ No newline at end of file + ENDIF + +IF 输入.flag = "16" + QUERY + SELECT + vehcilegroup.group_id, + vehcilegroup.vehicle_code, + vehcilegroup.material_id, + vehcilegroup.material_code, + vehcilegroup.material_name, + vehcilegroup.pcsn, + vehcilegroup.qty + FROM + st_buss_vehiclegroup vehcilegroup + WHERE + 1 =1 + OPTION 输入.vehicle_code <> "" + vehcilegroup.vehicle_code = 输入.vehicle_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + 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 0197888..95d4d6c 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 @@ -30,7 +30,7 @@ import java.util.HashMap; */ @Service public class CallEmptyVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = SendEmptyVehicleTask.class.getName(); + private final String THIS_CLASS = CallEmptyVehicleTask.class.getName(); @Override @Transactional @@ -190,10 +190,11 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { case YZGX: vehicle_type = VehicleTypeEnum.GTP.getCode(); start_area = AreaEnum.DDKTTPQ.getCode(); + break; //分拣工序 case FJGX: //托盘类型取的物料对应的木托盘类型 - JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + device_id + "' and producetask_status='04'").uniqueResult(0); + JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + device_id + "' and producetask_status in('03')").uniqueResult(0); vehicle_type = produceObj.getString("vehicle_type"); start_area = AreaEnum.MTPQ.getCode(); is_auto_issue = "0"; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ConveyorTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ConveyorTask.java new file mode 100644 index 0000000..a62febf --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ConveyorTask.java @@ -0,0 +1,125 @@ +package org.nl.wms.sch.manage.buss; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.task.TaskTypeEnum; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 入库任务生成 + */ +@Service +public class ConveyorTask extends AbstractAcsTask { + private final String THIS_CLASS = ConveyorTask.class.getName(); + + @Transactional + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + + } + + @Transactional + @Override + public void findNextPoint() { + } + + @Override + public String createTask(JSONObject form) { + JSONObject taskObj = new JSONObject(); + //只需要传起点就好,跟载具,终点永远是入窑口 + String vehicle_code = form.getString("vehicle_code"); + String start_point_code = form.getString("start_point_code"); + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("载具不能为空!"); + } + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + 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")); + taskObj.put("task_type", TaskTypeEnum.IN_TASK.getCode()); + //输送任务 + taskObj.put("acs_task_type", "2"); + String start_area = AreaEnum.RYSSXQ.getCode(); + String next_area = AreaEnum.RYSSXQ.getCode(); + //根据起点去找终点 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + String device_id = pointTable.query("point_code ='" + start_point_code + "'").uniqueResult(0).getString("device_id"); + String next_point_code = pointTable.query("device_id ='" + device_id + "' and device_point_type ='02'").uniqueResult(0).getString("point_code"); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("start_area", start_area); + taskObj.put("next_area", next_area); + taskObj.put("next_point_code", next_point_code); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("create_name", SecurityUtils.getNickName()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_name", SecurityUtils.getNickName()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("handle_class", THIS_CLASS); + //任务基础表【sch_base_task】 + WQLObject.getWQLObject("sch_base_task").insert(taskObj); + return taskObj.getString("task_id"); + + } + + + @Override + public void forceFinish(String task_id) { + if (StrUtil.isEmpty(task_id)) { + throw new BadRequestException("任务id不能为空!"); + } + JSONObject taskjo = WQLObject.getWQLObject("sch_base_task").query("task_id='" + task_id + "'").uniqueResult(0); + taskjo.getString("taskfinish_mode"); + this.updateTaskStatus(taskjo, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } +} 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 new file mode 100644 index 0000000..c967dc5 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java @@ -0,0 +1,122 @@ +package org.nl.wms.sch.manage.buss; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.task.TaskTypeEnum; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 入库任务生成 + */ +@Service +public class RgvTask extends AbstractAcsTask { + private final String THIS_CLASS = RgvTask.class.getName(); + + @Transactional + @Override + + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + + } + + @Transactional + @Override + public void findNextPoint() { + } + + @Override + public String createTask(JSONObject form) { + JSONObject taskObj = new JSONObject(); + //只需要传起点就好,跟载具,终点永远是入窑口 + String vehicle_code = form.getString("vehicle_code"); + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("载具不能为空!"); + } + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + 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")); + taskObj.put("task_type", TaskTypeEnum.IN_TASK.getCode()); + //输送任务 + taskObj.put("acs_task_type", "2"); + String start_area = AreaEnum.RYSSXQ.getCode(); + String next_area = AreaEnum.YQY.getCode(); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("start_area", start_area); + taskObj.put("next_area", next_area); + taskObj.put("next_point_code", next_point_code); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("create_name", SecurityUtils.getNickName()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_name", SecurityUtils.getNickName()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("handle_class", THIS_CLASS); + //任务基础表【sch_base_task】 + WQLObject.getWQLObject("sch_base_task").insert(taskObj); + return taskObj.getString("task_id"); + } + + + @Override + public void forceFinish(String task_id) { + if (StrUtil.isEmpty(task_id)) { + throw new BadRequestException("任务id不能为空!"); + } + JSONObject taskjo = WQLObject.getWQLObject("sch_base_task").query("task_id='" + task_id + "'").uniqueResult(0); + taskjo.getString("taskfinish_mode"); + this.updateTaskStatus(taskjo, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendEmptyVehicleTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendEmptyVehicleTask.java index 90caefa..6a5c882 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendEmptyVehicleTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendEmptyVehicleTask.java @@ -93,55 +93,19 @@ public class SendEmptyVehicleTask extends AbstractAcsTask { } @Override - public void findNextPoint() { - String task_status = TaskStatusEnum.SURE_START.getCode(); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); - for (int i = 0; i < taskArry.size(); i++) { - JSONObject taskObj = taskArry.getJSONObject(i); - String task_id = taskObj.getString("task_id"); - //找一个合适的仓位 - WQLObject Recordtable = WQLObject.getWQLObject("st_buss_EmptyVehicleRecord"); - JSONObject IosObj = Recordtable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(IosObj)) { - throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的单据!"); - } - JSONObject param = new JSONObject(); - param.put("area_type", IosObj.getString("end_area")); - param.put("vehicle_code", IosObj.getString("vehicle_code")); - JSONObject inStructObj = StructFindUtil.getEmptyVehicleInStruct(param); - if (ObjectUtil.isEmpty(inStructObj)) { - throw new BadRequestException("未找到合适的仓位!"); - } - //修改单据状态,将终点填入 - IosObj.put("bill_status", "20"); - IosObj.put("end_point_code", inStructObj.getString("struct_code")); - Recordtable.update(IosObj); - //终点加锁 - HashMap lock_map = new HashMap(); - lock_map.put("lock_type", "01"); - WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + inStructObj.getString("struct_code") + "'"); - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); - taskObj.put("update_optname", SecurityUtils.getNickName()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - - - } + public void findNextPoint() {} @Override @Transactional public String createTask(JSONObject form) { + //送空托盘只会有钢托盘有这个需求, 所以终点永远都是 KTPHCW5 都是从码垛机械手送到空托盘缓存位5 PointService pointService = SpringContextHolder.getBean(PointService.class); //起点,托盘 不能为空,终点可以为空 String vehicle_code = form.getString("vehicle_code"); String start_point_code = form.getString("start_point_code"); - String next_point_code = form.getString("next_point_code"); - String task_status = TaskStatusEnum.SURE_START.getCode(); - String next_area = form.getString("next_area"); + String next_point_code = "KTPHCW5"; + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); + String next_area = AreaEnum.DKKTTPQ.getCode(); WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); if (StrUtil.isEmpty(start_point_code)) { throw new BadRequestException("起点不能为空!"); @@ -154,7 +118,6 @@ public class SendEmptyVehicleTask extends AbstractAcsTask { if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("载具未找到!"); } - //判断起点有没有未完成的指令 JSONObject beforTaskObj = taskTable. query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") @@ -162,36 +125,8 @@ public class SendEmptyVehicleTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(beforTaskObj)) { throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); } - - //根据起点去找工序,找一个合适的仓位 并且生成单据 - if (StrUtil.isEmpty(next_point_code)) { - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code) - .process().uniqueResult(0); - String workprocedure_code = workInfo.getString("workInfo"); - String workprocedure_id = workInfo.getString("workprocedure_id"); - WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); - switch (workProcedureEnum) { - - - //分拣工序 - case FJGX: - next_area = AreaEnum.DDKTTPQ.getCode(); - break; - default: - next_area = AreaEnum.DDKTTPQ.getCode(); - } - JSONObject param = new JSONObject(); - param.put("area_type", next_area); - param.put("vehicle_code", vehicle_code); - JSONObject inStructObj = StructFindUtil.getEmptyVehicleInStruct(param); - next_point_code = inStructObj.getString("struct_code"); - } - String bill_status = "10"; - if (StrUtil.isNotEmpty(next_point_code)) { - task_status = TaskStatusEnum.START_AND_POINT.getCode(); PointDto nextPoint = pointService.findByCode(next_point_code); - bill_status = "20"; task_status = TaskStatusEnum.START_AND_POINT.getCode(); //锁定终点 HashMap lock_map = new HashMap(); @@ -204,7 +139,7 @@ public class SendEmptyVehicleTask extends AbstractAcsTask { JSONObject EmptyVehicleObj = new JSONObject(); EmptyVehicleObj.put("record_uuid", IdUtil.getSnowflake(1, 1).nextId()); EmptyVehicleObj.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); - EmptyVehicleObj.put("bill_status", bill_status); + EmptyVehicleObj.put("bill_status", "20"); EmptyVehicleObj.put("start_point_code", start_point_code); EmptyVehicleObj.put("next_point_code", next_point_code); EmptyVehicleObj.put("start_area", startPoint.getArea_type()); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java index deb2e20..62a283f 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java @@ -135,6 +135,7 @@ public class SendMaterialTask extends AbstractAcsTask { for (int i = 0; i < taskArry.size(); i++) { JSONObject taskObj = taskArry.getJSONObject(i); String task_id = taskObj.getString("task_id"); + String start_point_code = taskObj.getString("start_point_code"); //1 将任务修改为分配 2将终点写入,完成分配,3 加锁点位 //找一个合适的仓位 WQLObject ProcedureIOStable = WQLObject.getWQLObject("ST_IVT_workProcedureIOS"); @@ -164,6 +165,9 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("update_optname", SecurityUtils.getNickName()); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); + //组盘 + + } @@ -173,7 +177,6 @@ public class SendMaterialTask extends AbstractAcsTask { @Transactional public String createTask(JSONObject form) { //请求参数 载具、起点 物料,数量,客户,批次,创建方式 是否满托不能为空! 终点可以不为空时,入库单据编号不能为空 - String vehicle_code = form.getString("vehicle_code"); String start_point_code = form.getString("start_point_code"); String next_point_code = form.getString("next_point_code"); String material_id = form.getString("material_id"); @@ -188,9 +191,6 @@ public class SendMaterialTask extends AbstractAcsTask { if (StrUtil.isEmpty(start_point_code)) { throw new BadRequestException("起点不能为空!"); } - if (StrUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("载具不能为空!"); - } //判断起点有没有未完成的指令 JSONObject beforTaskObj = taskTable. query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") @@ -214,6 +214,8 @@ public class SendMaterialTask extends AbstractAcsTask { JSONObject IosObj = iosTable.query("iostorinv_id='" + iostorinv_id + "'").uniqueResult(0); IosObj.put("bill_status", "20"); iosTable.update(IosObj); + //组盘 + } //如果没给终点,根据起点去找工序,找一个合适的仓位 并且生成入库单,并且锁定点位 if (StrUtil.isEmpty(next_point_code)) { @@ -238,7 +240,6 @@ public class SendMaterialTask extends AbstractAcsTask { WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); switch (workProcedureEnum) { - // 压制工序 case YZGX: qty_unit_id = BussConstant.HN_IN_QTY_UNIT_ID; @@ -264,7 +265,6 @@ public class SendMaterialTask extends AbstractAcsTask { JSONObject param = new JSONObject(); param.put("material_id", material_id); param.put("area_type", endArea_type); - param.put("vehicle_code", vehicle_code); JSONObject inStructObj = StructFindUtil.getInStruct(param); if (ObjectUtil.isEmpty(inStructObj)) { throw new BadRequestException("未找到合适的入库仓位!"); @@ -274,7 +274,7 @@ public class SendMaterialTask extends AbstractAcsTask { //假如静置时间为0 或者为空,则取物料表上的静置时间 if (StrUtil.isEmpty(stewing_time) || StrUtil.equals(stewing_time, "0")) { stewing_time = WQLObject.getWQLObject("md_me_material").query("material_id ='" + material_id + "'"). - uniqueResult(0).getString("stewing_time"); + uniqueResult(0).getString("stewing_time"); } JSONObject iosObj = new JSONObject(); iosObj.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId()); @@ -284,7 +284,6 @@ public class SendMaterialTask extends AbstractAcsTask { iosObj.put("workprocedure_id", workprocedure_id); iosObj.put("ivt_workprocedure_id", workprocedure_id); iosObj.put("material_id", material_id); - iosObj.put("vehicle_code", vehicle_code); iosObj.put("producetask_id", producetask_id); iosObj.put("stewing_time", stewing_time); iosObj.put("qty", qty); @@ -304,6 +303,8 @@ public class SendMaterialTask extends AbstractAcsTask { iosObj.put("create_time", DateUtil.now()); iosObj.put("is_full", is_full); WQLObject.getWQLObject("ST_IVT_workProcedureIOS").insert(iosObj); + //组盘 + } String task_status = TaskStatusEnum.START_AND_POINT.getCode(); PointDto nextPoint = pointService.findByCode(next_point_code); @@ -311,7 +312,6 @@ public class SendMaterialTask extends AbstractAcsTask { HashMap lock_map = new HashMap(); lock_map.put("lock_type", "01"); WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + next_point_code + "'"); - CodeUtil.getNewCode("TASK_CODE"); JSONObject taskObj = new JSONObject(); taskObj.put("task_id", task_id); taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); @@ -323,7 +323,6 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("request_param", form.toJSONString()); taskObj.put("next_point_code", next_point_code); taskObj.put("next_area", nextPoint.getArea_type()); - taskObj.put("vehicle_code", vehicle_code); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); taskObj.put("create_name", SecurityUtils.getCurrentUsername()); @@ -331,6 +330,23 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("create_time", DateUtil.now()); taskObj.put("is_delete", "0"); taskTable.insert(taskObj); + //组盘 + JSONObject jo = new JSONObject(); + String is_autopackage = "1"; + if (StrUtil.equals(start_point_code, "MDJXS601")) { + is_autopackage = "0"; + } + JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_id='" + material_id + "'").uniqueResult(0); + String group_id = IdUtil.getSnowflake(1, 1).nextIdStr(); + jo.put("group_id", group_id); + jo.put("material_id", material_id); + jo.put("material_code", materialObj.getString("material_code")); + jo.put("material_name", materialObj.getString("material_name")); + jo.put("is_autopackage", is_autopackage); + jo.put("pcsn", pcsn); + jo.put("qty", qty); + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + groupTable.insert(jo); return task_id; } 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 new file mode 100644 index 0000000..496d01f --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToConveyorTask.java @@ -0,0 +1,259 @@ +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.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SecurityUtils; +import org.nl.utils.SpringContextHolder; +import org.nl.wms.BussConstant; +import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.StructFindUtil; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.BillTypeEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.impl.PointServiceImpl; +import org.nl.wms.st.ivt.IvtChangeTypeEnum; +import org.nl.wms.st.ivt.StoreIvtServiceImpl; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +@Service +@RequiredArgsConstructor +@Slf4j +public class ToConveyorTask extends AbstractAcsTask { + private final String THIS_CLASS = ToConveyorTask.class.getName(); + + + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + HashMap map = new HashMap(); + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getNickName()); + map.put("update_time", DateUtil.now()); + map.put("bill_status", "40"); + WQLObject.getWQLObject("ST_IVT_workProcedureIOS").update(map, "task_id='" + jsonTask.getString("task_id") + "'"); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + ///审核单据 增加库存 改变出入库表的状态 + WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_workProcedureIOS"); + JSONObject mstObj = mstTab.query("task_id='" + task_id + "' and is_delete='0'").uniqueResult(0); + //审核 加库存可和用数量 + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + mstObj.put("bill_status", "50"); + mstObj.put("confirm_optid", SecurityUtils.getCurrentUserId()); + mstObj.put("confirm_optname", SecurityUtils.getNickName()); + mstObj.put("confirm_time", DateUtil.now()); + mstTab.update(mstObj); + + String iostorinv_id = mstObj.getString("iostorinv_id"); + String next_point_code = mstObj.getString("end_point_code"); + String start_point_code = mstObj.getString("start_point_code"); + JSONObject param = new JSONObject(); + param.put("material_id", mstObj.getString("material_id")); + param.put("bill_id", iostorinv_id); + param.put("qty_unit_id", mstObj.getString("qty_unit_id")); + param.put("pcsn", mstObj.getString("pcsn")); + param.put("change_qty", mstObj.getString("qty")); + param.put("vehicle_code", mstObj.getString("vehicle_code")); + param.put("workprocedure_id", mstObj.getString("workprocedure_id")); + param.put("is_full", mstObj.getString("is_full")); + param.put("stewing_time", mstObj.getString("stewing_time")); + param.put("producetask_id", mstObj.getString("producetask_id")); + + PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); + PointDto nextPointDto = pointService.findByCode(next_point_code); + if (ObjectUtil.isNull(nextPointDto)) { + throw new BadRequestException("未找到可用点位:" + next_point_code); + } + PointDto startPointDto = pointService.findByCode(start_point_code); + if (ObjectUtil.isNull(startPointDto)) { + throw new BadRequestException("未找到可用点位:" + start_point_code); + } + param.put("struct_id", nextPointDto.getPoint_id()); + ivtService.addIvtFlow(param, IvtChangeTypeEnum.ADD_IVT_AND_CAN_USE); + //解锁仓位,托盘信息,回写到点位上去 + String vehicle_code = jsonTask.getString("vehicle_code"); + 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"); + endpointObj.put("point_status", "02"); + endpointObj.put("vehicle_code", vehicle_code); + pointTab.update(endpointObj); + + JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + pointTab.update(startPointObj); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + String task_status = TaskStatusEnum.SURE_START.getCode(); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); + for (int i = 0; i < taskArry.size(); i++) { + JSONObject taskObj = taskArry.getJSONObject(i); + String task_id = taskObj.getString("task_id"); + //1 将任务修改为分配 2将终点写入,完成分配,3 加锁点位 + //找一个合适的仓位 + WQLObject ProcedureIOStable = WQLObject.getWQLObject("ST_IVT_workProcedureIOS"); + JSONObject IosObj = ProcedureIOStable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(IosObj)) { + throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的入库单据!"); + } + JSONObject param = new JSONObject(); + param.put("material_id", IosObj.getString("material_id")); + param.put("area_type", IosObj.getString("end_area")); + param.put("vehicle_code", IosObj.getString("vehicle_code")); + JSONObject inStructObj = StructFindUtil.getInStruct(param); + if (ObjectUtil.isEmpty(inStructObj)) { + throw new BadRequestException("未找到合适的入库仓位!"); + } + //修改单据状态,将终点填入 + IosObj.put("bill_status", "20"); + IosObj.put("end_point_code", inStructObj.getString("struct_code")); + ProcedureIOStable.update(IosObj); + //终点加锁 + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + inStructObj.getString("struct_code") + "'"); + //修改任务状态 + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getNickName()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + //请求参数 载具、起点 物料,数量,客户,批次,创建方式 是否满托不能为空! 终点可以不为空时,入库单据编号不能为空 + String vehicle_code = form.getString("vehicle_code"); + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String material_id = form.getString("material_id"); + String is_full = form.getString("is_full"); + String qty = form.getString("qty"); + String pcsn = form.getString("pcsn"); + WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + if (StrUtil.isEmpty(next_point_code)){ + throw new BadRequestException("终点不能为空!"); + } + String is_autopackage = "1"; + if (StrUtil.equals(start_point_code, "MDJXS601")) { + is_autopackage = "0"; + } + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_id='" + material_id + "'").uniqueResult(0); + //组盘 + JSONObject jo = new JSONObject(); + String group_id = IdUtil.getSnowflake(1, 1).nextIdStr(); + jo.put("group_id", group_id); + jo.put("material_id", material_id); + jo.put("material_code", materialObj.getString("material_code")); + jo.put("material_name", materialObj.getString("material_name")); + jo.put("vehicle_code", vehicle_code); + jo.put("is_autopackage", is_autopackage); + jo.put("pcsn", pcsn); + jo.put("qty", qty); + jo.put("create_id",SecurityUtils.getCurrentUserId()); + jo.put("create_name",SecurityUtils.getNickName()); + jo.put("create_time",DateUtil.now()); + jo.put("task_id",task_id); + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + groupTable.insert(jo); + + PointService pointService = SpringContextHolder.getBean(PointService.class); + PointDto startPoint = pointService.findByCode(start_point_code); + + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); + PointDto nextPoint = pointService.findByCode(next_point_code); + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", task_id); + taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + taskObj.put("task_type", "00"); + taskObj.put("acs_task_type", "1"); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("start_area", startPoint.getArea_type()); + taskObj.put("request_param", form.toJSONString()); + taskObj.put("next_point_code", next_point_code); + taskObj.put("next_area", nextPoint.getArea_type()); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("handle_class", THIS_CLASS); + taskObj.put("is_auto_issue", "1"); + taskObj.put("create_name", SecurityUtils.getCurrentUsername()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("is_delete", "0"); + taskTable.insert(taskObj); + return task_id; + } + + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_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 27958d155809d532e37b462a2ba18e6f131a7835..a63f05c5eb356a4e2e297fab43fb8a4938744351 100644 GIT binary patch delta 50847 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 delta 27289 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 A8~^|S diff --git a/wms/qd/src/views/wms/pdm/produceTask/index.vue b/wms/qd/src/views/wms/pdm/produceTask/index.vue index bc1d109..60eee88 100644 --- a/wms/qd/src/views/wms/pdm/produceTask/index.vue +++ b/wms/qd/src/views/wms/pdm/produceTask/index.vue @@ -175,14 +175,6 @@ - - - - - - - - @@ -217,10 +209,6 @@ /> - - - -