From 512cd3acd38c81360e857417ec7a17cd1669a9e1 Mon Sep 17 00:00:00 2001 From: 18188916393 <2562295436@qq.com> Date: Thu, 18 Aug 2022 08:50:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acs/service/impl/AcsToWmsServiceImpl.java | 27 +++++++++++++----- .../sch/manage/buss/CallEmptyVehicleTask.java | 26 ++++++++++++++--- .../wms/sch/manage/buss/CallMaterialTask.java | 8 +++--- .../wms/sch/manage/buss/SendMaterialTask.java | 9 ++++-- .../nl/wms/sch/manage/buss/ToPackIngTask.java | 14 +++++++++ .../src/main/java/org/nl/wms/wms.xls | Bin 384000 -> 384000 bytes 6 files changed, 67 insertions(+), 17 deletions(-) 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 13f382c..20445e8 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 @@ -118,7 +118,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { 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); - PointUpdateUtil.updatePoint(pointarr); + PointUpdateUtil.updatePoint(pointarr); //2.找一个合适的输送带 JSONObject pointObj = StructFindUtil.getConveyor(materiralObj); //如果未找到合适的输送带 就去货架 @@ -131,9 +131,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } //假如是分拣机械手的下料位置,并且是满托,则去包装线 if (StrUtil.equals("1", is_full) && StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + String vehicle_code = pointTable.query("point_code ='" + device_code + "'").uniqueResult(0).getString("vehicle_code"); + jsonObject.put("vehicle_code", vehicle_code); toPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; } + //假如是分拣机械手的下料位置,则需要将点位上的托盘号写入 + if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + String vehicle_code = pointTable.query("point_code ='" + device_code + "'").uniqueResult(0).getString("vehicle_code"); + jsonObject.put("vehicle_code", vehicle_code); + } sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; case "2": @@ -162,7 +169,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (StrUtil.equals(device_code, "FJJXSXLW201") || StrUtil.equals(device_code, "FJJXSXLW202") || StrUtil.equals(device_code, "FJJXSXLW301") || - StrUtil.equals(device_code, "FJJXSXLW301") + StrUtil.equals(device_code, "FJJXSXLW302") ) { material_id = produceInfoByCode.getString("material_id"); @@ -185,7 +192,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } //需要更新覆膜机的托盘类型 JSONArray pointarr = WQL.getWO("ACSTOMES_001").addParam("area_type", "05").addParam("flag", "4").process().getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); + PointUpdateUtil.updatePoint(pointarr); } if (ObjectUtil.isEmpty(produceInfoByCode)) { throw new BadRequestException("未找到点位为'" + device_code + "'对应机械手的生产工单!"); @@ -193,7 +200,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("vehicle_type", produceInfoByCode.getString("vehicle_type")); //需要更新堆叠位的点位状态 JSONArray pointarr = WQL.getWO("ACSTOMES_001").addParam("point_code", "KTPDDW5").addParam("flag", "4").process().getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); + PointUpdateUtil.updatePoint(pointarr); callEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; //生产rgv搬运任务 @@ -520,15 +527,21 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override @Transactional(rollbackFor = Exception.class) public Map getVehicleInfoBycode(Map jsonObject) { - String vehicle_code = (String) jsonObject.get("vehicle_code"); + String device_code = (String) jsonObject.get("device_code"); + WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); + String vehicle_code = point_table.query("point_code='" + device_code + "'").uniqueResult(0).getString("vehicle_code"); if (StrUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("托盘编码不能为空!"); + throw new BadRequestException("未找到该点位上的托盘信息!"); } JSONObject vehicleObj = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code='" + vehicle_code + "' AND is_delete='0'").uniqueResult(0); if (ObjectUtil.isEmpty(vehicleObj)) { throw new BadRequestException("未找到托盘号为'" + vehicle_code + "'的托盘信息!"); } - return vehicleObj; + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + result.put("content", vehicleObj); + return result; } @Override 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 6115039..c3fbc97 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 @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.nl.exception.BadRequestException; @@ -12,6 +13,7 @@ import org.nl.utils.SecurityUtils; import org.nl.utils.SpringContextHolder; import org.nl.wms.WorkProcedureEnum; import org.nl.wms.common.StructFindUtil; +import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.AreaEnum; import org.nl.wms.sch.manage.TaskStatusEnum; @@ -211,7 +213,7 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { } JSONObject param = new JSONObject(); //如果托盘类型不是02,则需要加上托盘类型 - if (!StrUtil.equals(vehicle_type,"02")){ + if (!StrUtil.equals(vehicle_type, "02")) { param.put("vehicle_type", vehicle_type); } @@ -222,12 +224,28 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { } vehicle_code = outStructObj.getString("vehicle_code"); - if (StrUtil.isEmpty(vehicle_code)){ - vehicle_code="999"; + if (StrUtil.isEmpty(vehicle_code)) { + vehicle_code = "999"; } //如果是托盘区域/生成一个该类型的托盘 - if (StrUtil.equals(workInfo.getString("workprocedure_code"), AreaEnum.MTPQ.getCode())) { + if (StrUtil.equals(workInfo.getString("area_type"), AreaEnum.FJQY.getCode())) { vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_MTP"); + //将托盘插入托盘表 + WQLObject wo = WQLObject.getWQLObject("MD_PB_Vehicle"); + JSONObject jo = new JSONObject(); + VehicleDto dto = new VehicleDto(); + dto.setVehicle_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setVehicle_code(vehicle_code); + dto.setCreate_id(SecurityUtils.getCurrentUserId()); + dto.setVehicle_name(vehicle_code); + dto.setCreate_name(SecurityUtils.getNickName()); + dto.setUpdate_optid(SecurityUtils.getCurrentUserId()); + dto.setUpdate_optname(SecurityUtils.getNickName()); + dto.setUpdate_time(DateUtil.now()); + dto.setCreate_time(DateUtil.now()); + dto.setVehicle_type(vehicle_type); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); } start_point_code = outStructObj.getString("struct_code"); 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 b92c13d..6cca0a1 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 @@ -322,8 +322,8 @@ 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_name", "管理员"); + iosObj.put("create_id",SecurityUtils.getCurrentUserId()); + iosObj.put("create_name", SecurityUtils.getNickName()); iosObj.put("create_time", DateUtil.now()); WQLObject.getWQLObject("ST_IVT_workProcedureIOS").insert(iosObj); //将组盘里面的task_id改为当前的任务 @@ -370,8 +370,8 @@ public class CallMaterialTask extends AbstractAcsTask { taskObj.put("vehicle_code", vehicle_code); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); - taskObj.put("create_name", "管理员"); - taskObj.put("create_id", "1"); + taskObj.put("create_name", SecurityUtils.getNickName()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); taskObj.put("create_time", DateUtil.now()); taskObj.put("is_delete", "0"); taskTable.insert(taskObj); 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 eaac571..2505381 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 @@ -272,6 +272,10 @@ public class SendMaterialTask extends AbstractAcsTask { stewing_time = WQLObject.getWQLObject("md_me_material").query("material_id ='" + material_id + "'"). uniqueResult(0).getString("stewing_time"); } + //假如是烧制工序,静置时间都是0 + if (StrUtil.equals(workProcedureEnum.getCode(), WorkProcedureEnum.SZGX.getCode())) { + stewing_time = "0"; + } JSONObject iosObj = new JSONObject(); iosObj.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId()); iosObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); @@ -328,10 +332,11 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("is_delete", "0"); taskTable.insert(taskObj); - // 如果是压料制下需要更新组盘信息,将task_id 更新 + // 如果是压料制下,或者是分拣送料需要更新组盘信息,将task_id 更新 JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code) .process().uniqueResult(0); - if (StrUtil.equals(WorkProcedureEnum.YZGX.getCode(), workInfo.getString("workprocedure_code"))) { + if (StrUtil.equals(WorkProcedureEnum.YZGX.getCode(), workInfo.getString("workprocedure_code")) + ||StrUtil.equals(WorkProcedureEnum.FJGX.getCode(), workInfo.getString("workprocedure_code"))) { WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); JSONObject groupInfo = groupTable.query("group_id='" + group_id + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(groupInfo)) { diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java index 0225eb4..c8c339c 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java @@ -59,6 +59,20 @@ public class ToPackIngTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); jsonTask.put("remark", "任务执行完成"); taskTab.update(jsonTask); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + //将起点的载具清除 + 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); + //将组盘表删除 + WQLObject group_Table = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject groupObj = group_Table.query("vehicle_code='" + jsonTask.getString("vehicle_code") + "' and is_delete='0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(groupObj)) { + groupObj.put("is_delete", "0"); + group_Table.update(groupObj); + } } } 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 7e1fd73f6e9b5183d105a9e85ebd68e187584981..dc1a425cca7b46df9e9f525829b2f0ff37b08fc5 100644 GIT binary patch delta 6370 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 SY)tnnccl%~0qsn^#{U5{3h*uf