From 6a5c49067686fadad2e6b1edacc4837098868e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Tue, 5 Sep 2023 15:00:24 +0800 Subject: [PATCH] rev --- .../LnshKilnTrussDeviceDriver.java | 1 + .../lnsh_out_kiln_truss/ItemProtocol.java | 25 +- .../LnshOutKilnTrussDefination.java | 13 +- .../LnshOutKilnTrussDeviceDriver.java | 38 +- .../lnsh/lnsh_press/ItemProtocol.java | 58 +-- .../lnsh/lnsh_press/LnshPressDefination.java | 17 +- .../lnsh_press/LnshPressDeviceDriver.java | 71 +++- .../lnsh_station/LnshStationDeviceDriver.java | 19 +- .../acs/ext/wms/service/AcsToWmsService.java | 2 + .../wms/service/impl/AcsToWmsServiceImpl.java | 29 +- .../wms/service/impl/WmsToAcsServiceImpl.java | 7 +- .../task/service/impl/TaskServiceImpl.java | 9 - .../modules/quartz/task/AutoCreateInst.java | 3 +- .../auto/run/NDCSocketConnectionAutoRun.java | 7 +- .../main/resources/config/application-dev.yml | 2 +- .../resources/config/application-prod.yml | 4 +- .../acs/device/driver/lnsh/lnsh_station.vue | 22 +- .../modules/common/utils/PointUpdateUtil.java | 4 +- .../service/dto/MaterialDetailDto.java | 2 +- .../basedata/service/dto/MaterialbaseDto.java | 6 +- .../service/impl/MaterialbaseServiceImpl.java | 17 +- .../nl/wms/basedata/wql/QMD_ME_MATERIAL.wql | 19 +- .../wql/QMD_PB_STORAGEVEHICLEINFO.wql | 2 +- .../dashboard/service/DashboardService.java | 7 +- .../wms/ext/acs/rest/AcsToWmsController.java | 14 +- .../wms/ext/acs/service/AcsToWmsService.java | 4 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 387 +++++++++++++----- .../org/nl/wms/ext/acs/wql/ACS_TO_WMS.wql | 2 +- .../org/nl/wms/pda/service/PdaService.java | 6 +- .../nl/wms/pdm/service/WorkordeService.java | 2 + .../org/nl/wms/pdm/service/dto/DeviceDto.java | 2 +- .../nl/wms/pdm/service/dto/WorkorderDto.java | 10 +- .../service/impl/WorkorderServiceImpl.java | 170 +++++--- .../org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql | 13 +- .../nl/wms/sch/manage/AbstractAcsTask.java | 1 + .../org/nl/wms/sch/manage/AutoCreateTask.java | 21 +- .../wms/sch/manage/AutoUpdateStandStatus.java | 6 +- .../org/nl/wms/sch/manage/PointStatus.java | 2 +- .../java/org/nl/wms/sch/manage/Region.java | 6 +- .../nl/wms/sch/manage/wql/MANAGE_QUERY.wql | 4 +- .../org/nl/wms/sch/service/dto/PointDto.java | 2 +- .../nl/wms/sch/service/dto/TaskQueryDto.java | 2 +- .../sch/service/impl/PointServiceImpl.java | 2 +- .../sch/service/impl/RegionServiceImpl.java | 2 +- .../sch/task/call/empty/YZCallEmptyTask.java | 69 ++-- .../task/call/empty/wql/CALL_EMPTY_TASK.wql | 119 +----- ...erialTask.java => GZCallMaterialTask.java} | 12 +- .../call/material/wql/CALL_MATERIAL_TASK.wql | 28 +- ...erialTask.java => GZSendMaterialTask.java} | 6 +- .../send/material/YZSendMaterialTask.java | 26 +- .../send/material/wql/SEND_MATERIAL_TASK.wql | 6 +- .../org/nl/wms/sch/task/util/TaskUtils.java | 6 + .../nl/wms/sch/task/util/wql/TASK_UTILS.wql | 4 +- .../org/nl/wms/sch/wql/QSCH_BASE_POINT.wql | 4 +- .../java/org/nl/wms/sch/wql/QSCH_TASK_01.wql | 2 +- .../src/main/java/org/nl/wms/wms.xls | Bin 325120 -> 285184 bytes .../resources/config/application-prod.yml | 2 +- .../src/main/resources/config/application.yml | 2 +- .../src/test/java/org/nl/test/PointTest.java | 14 +- lms/nladmin-ui/src/views/generator/index.vue | 2 +- .../src/views/system/dept/index.vue | 6 +- .../src/views/system/grid/index.vue | 8 +- .../views/system/logicflow/image/index.vue | 2 +- .../src/views/system/logicflow/index.vue | 6 +- .../system/monitor/device/XJDeviceMonitor.vue | 2 +- .../src/views/system/monitor/device/index.vue | 3 +- .../src/views/system/param/index.vue | 7 +- .../src/views/tools/codeGen/codeDetail.vue | 12 +- .../src/views/tools/codeGen/index.vue | 14 +- .../src/views/wms/basedata/bom/index.vue | 287 ------------- .../src/views/wms/basedata/class/index.vue | 6 +- .../src/views/wms/basedata/customer/index.vue | 10 +- .../wms/basedata/material/detail/index.vue | 207 ---------- .../src/views/wms/basedata/material/index.vue | 129 ++---- .../src/views/wms/basedata/measure/index.vue | 6 +- .../src/views/wms/basedata/supp/index.vue | 8 +- .../wms/basedata/vehicle/group/index.vue | 34 +- .../src/views/wms/basedata/vehicle/index.vue | 20 +- .../src/views/wms/pdm/device/index.vue | 14 +- .../wms/pdm/workerorder/OutMaterDialog.vue | 4 +- .../views/wms/pdm/workerorder/ViewDialog.vue | 12 +- .../views/wms/pdm/workerorder/fj/index.vue | 64 +-- .../views/wms/pdm/workerorder/hl/index.vue | 29 +- .../src/views/wms/pdm/workerorder/index.vue | 76 ++-- .../src/views/wms/pub/BOMDialog.vue | 8 +- .../src/views/wms/pub/DeviceDialog.vue | 8 +- .../src/views/wms/pub/MaterDialog.vue | 27 +- .../src/views/wms/pub/PointDialog.vue | 4 +- .../views/wms/sch/point/MaterialDialog.vue | 4 +- .../src/views/wms/sch/point/ViewDialog.vue | 100 ++--- .../views/wms/sch/point/WorkOrderDialog.vue | 4 +- .../src/views/wms/sch/point/index.vue | 20 +- .../src/views/wms/sch/region/index.vue | 10 +- .../src/views/wms/sch/task/index.vue | 16 +- .../src/views/wms/st/cppoint/cppInRegion.vue | 9 +- .../src/views/wms/st/cppoint/cppInventory.vue | 53 ++- .../src/views/wms/st/cppoint/cppOutRegion.vue | 11 +- .../src/views/wms/st/ysa/inventory.vue | 56 +-- .../src/views/wms/st/ysa/ysqInRegion.vue | 9 +- .../src/views/wms/st/ysa/ysqOutRegion.vue | 37 +- 100 files changed, 1161 insertions(+), 1525 deletions(-) rename lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/{SZCallMaterialTask.java => GZCallMaterialTask.java} (94%) rename lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/{SZSendMaterialTask.java => GZSendMaterialTask.java} (98%) delete mode 100644 lms/nladmin-ui/src/views/wms/basedata/bom/index.vue delete mode 100644 lms/nladmin-ui/src/views/wms/basedata/material/detail/index.vue diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_kiln_truss/LnshKilnTrussDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_kiln_truss/LnshKilnTrussDeviceDriver.java index 2dd594d..f66f168 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_kiln_truss/LnshKilnTrussDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_kiln_truss/LnshKilnTrussDeviceDriver.java @@ -216,6 +216,7 @@ public class LnshKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implement JSONObject param = new JSONObject(); param.put("kiln_number", kiln_number); param.put("vehicle_code", barcode); + param.put("type", "1"); HttpResponse response = acsToWmsService.inKiln(param); if (ObjectUtil.isNotEmpty(response)) { if (response.getStatus() == HttpStatus.OK.value()) { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/ItemProtocol.java index 0d7eef3..2189bbe 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/ItemProtocol.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/ItemProtocol.java @@ -22,6 +22,8 @@ public class ItemProtocol { public static String item_standby_time = "standby_time"; public static String item_production_time = "production_time"; public static String item_error_time = "error_time"; + public static String item_cool_number = "cool_number"; + public static String item_to_command = "to_command"; public static String item_to_target = "to_target"; public static String item_to_task = "to_task"; @@ -84,6 +86,10 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_to_task); } + public int getCool_number() { + return this.getOpcIntegerValue(item_cool_number); + } + //是否有货 public int hasGoods(int move) { return move; @@ -113,23 +119,24 @@ public class ItemProtocol { } public static List getReadableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_heartbeat, "心跳", "DB1.B0")); - list.add(new ItemDto(item_mode, "工作模式", "DB1.B1", Boolean.valueOf(true))); + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB100.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB1.B1", Boolean.TRUE)); list.add(new ItemDto(item_status, "设备状态", "DB1.B2")); list.add(new ItemDto(item_outKiln_move, "出窑光电", "DB1.B3")); list.add(new ItemDto(item_outKiln_barcode, "出窑条码", "DB1.W4")); list.add(new ItemDto(item_outKiln_device, "出窑设备", "DB1.D6")); - list.add(new ItemDto(item_open_time, "开机时间", "DB1.STRING10.50")); - list.add(new ItemDto(item_standby_time, "待机时间", "DB1.D62")); - list.add(new ItemDto(item_production_time, "生产时间", "DB1.D66")); - list.add(new ItemDto(item_error_time, "故障时间", "DB1.D70")); + list.add(new ItemDto(item_cool_number, "冷却道号", "DB1.D10")); + list.add(new ItemDto(item_open_time, "开机时间", "DB1.STRING14.50")); + list.add(new ItemDto(item_standby_time, "待机时间", "DB1.D66")); + list.add(new ItemDto(item_production_time, "生产时间", "DB1.D70")); + list.add(new ItemDto(item_error_time, "故障时间", "DB1.D74")); return list; } public static List getWriteableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_command, "下发指令", "DB1.W0", Boolean.valueOf(true))); + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_to_command, "下发指令", "DB1.W0", Boolean.TRUE)); list.add(new ItemDto(item_to_target, "下发目标站", "DB1.W2")); list.add(new ItemDto(item_to_task, "下发任务号", "DB1.D4")); return list; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDefination.java index 668d493..7828ecb 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDefination.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDefination.java @@ -54,18 +54,7 @@ public class LnshOutKilnTrussDefination implements OpcDeviceDriverDefination { } public static List getReadableItemDtos2() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(ItemProtocol.item_heartbeat, "心跳", "DB1.B0")); - list.add(new ItemDto(ItemProtocol.item_mode, "工作模式", "DB1.B1", Boolean.valueOf(true))); - list.add(new ItemDto(ItemProtocol.item_status, "设备状态", "DB1.B2")); - list.add(new ItemDto(ItemProtocol.item_outKiln_move, "出窑光电", "DB1.B3")); - list.add(new ItemDto(ItemProtocol.item_outKiln_barcode, "出窑条码", "DB1.W4")); - list.add(new ItemDto(ItemProtocol.item_outKiln_device, "出窑设备", "DB1.D6")); - list.add(new ItemDto(ItemProtocol.item_open_time, "开机时间", "DB1.STRING10.50")); - list.add(new ItemDto(ItemProtocol.item_standby_time, "待机时间", "DB1.D62")); - list.add(new ItemDto(ItemProtocol.item_production_time, "生产时间", "DB1.D66")); - list.add(new ItemDto(ItemProtocol.item_error_time, "故障时间", "DB1.D70")); - return list; + return ItemProtocol.getReadableItemDtos(); } @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDeviceDriver.java index 7d7ed8b..add1ba7 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_out_kiln_truss/LnshOutKilnTrussDeviceDriver.java @@ -23,7 +23,6 @@ import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.modules.wql.util.SpringContextHolder; import org.openscada.opc.lib.da.Server; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import java.util.Date; @@ -102,6 +101,9 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem //出窑设备 int outKiln_device = 0; int last_outKiln_device = 0; + // 冷却道号 + int cool_number = 0; + int last_cool_number = 0; @Override public Device getDevice() { @@ -123,6 +125,7 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem outKiln_move = this.itemProtocol.getOutKiln_move(); outKiln_barcode = this.itemProtocol.getOutKiln_barcode(); outKiln_device = this.itemProtocol.getOutKiln_device(); + cool_number = this.itemProtocol.getCool_number(); if (mode != last_mode) { this.setRequireSucess(false); @@ -202,10 +205,16 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem break; case 5: - if (!requireSucess && outKiln_move != 0) { + if (!requireSucess && outKiln_move != 0 && outKiln_barcode != 0) { outKiln(); } break; + + case 17: + if (!requireSucess && outKiln_move != 0 && outKiln_barcode != 0 && cool_number != 0) { + outKilnConfirm(); + } + break; } } @@ -218,6 +227,7 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem last_outKiln_move = outKiln_move; last_outKiln_barcode = outKiln_barcode; last_outKiln_device = outKiln_device; + last_cool_number = cool_number; } @@ -254,7 +264,6 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem if (result.getStatus() == HttpStatus.OK.value()) { JSONObject jsonObject = JSONObject.parseObject(result.body()); if (ObjectUtil.isNotEmpty(jsonObject) && "200".equals(jsonObject.getString("status"))) { - this.writing(jsonObject.getBooleanValue("data") ? 22 : 23); this.writing(jsonObject.getBooleanValue("data") ? 22 : 23); this.setRequireSucess(true); } @@ -293,6 +302,29 @@ public class LnshOutKilnTrussDeviceDriver extends AbstractOpcDeviceDriver implem logServer.deviceExecuteLog(this.device_code, "", "", param + " 写入 " + value); } + public synchronized void outKilnConfirm() { + Date date = new Date(); + if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + } else { + this.instruction_require_time = date; + JSONObject param = new JSONObject(); + param.put("cool_number", cool_number); + param.put("vehicle_code", outKiln_barcode); + param.put("type", "2"); + HttpResponse response = acsToWmsService.inKiln(param); + if (ObjectUtil.isNotEmpty(response)) { + if (response.getStatus() == HttpStatus.OK.value()) { + JSONObject jsonObject = JSONObject.parseObject(response.body()); + if (ObjectUtil.isNotEmpty(jsonObject) && "200".equals(jsonObject.getString("status"))) { + this.writing(this.mode); + this.requireSucess = true; + } + } + } + } + } + @Override public JSONObject getDeviceStatusName() throws Exception { String mode; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/ItemProtocol.java index bb88a7d..20fac26 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/ItemProtocol.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/ItemProtocol.java @@ -27,6 +27,7 @@ public class ItemProtocol { public static String item_qualified = "qualified"; public static String item_unqualified = "unqualified"; public static String item_order_No = "order_No"; + public static String item_avg_piece_weight = "avg_piece_weight"; public static String item_to_command = "to_command"; public static String item_to_error = "to_error"; public static String item_to_order_No = "to_order_No"; @@ -141,6 +142,10 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_to_Wthickness); } + public int getAvg_piece_weight() { + return this.getOpcIntegerValue(item_avg_piece_weight); + } + //是否有货 public int hasGoods(int move) { return move; @@ -171,36 +176,37 @@ public class ItemProtocol { } public static List getReadableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_heartbeat, "心跳", "DB8.B0")); - list.add(new ItemDto(item_mode, "工作模式", "DB8.B1", Boolean.valueOf(true))); - list.add(new ItemDto(item_status, "设备状态", "DB8.B2")); - list.add(new ItemDto(item_error, "故障", "DB8.B3")); - list.add(new ItemDto(item_open_time, "开机时间", "DB8.STRING4.50")); - list.add(new ItemDto(item_standby_time, "待机时间", "DB8.D56")); - list.add(new ItemDto(item_production_time, "生产时间", "DB8.D60")); - list.add(new ItemDto(item_error_time, "故障时间", "DB8.D64")); - list.add(new ItemDto(item_material, "当前生产物料", "DB8.STRING68.50")); - list.add(new ItemDto(item_qty, "当前已生产数量", "DB8.D120")); - list.add(new ItemDto(item_weight, "当前已生产重量", "DB8.D124")); - list.add(new ItemDto(item_qualified, "当前已生产合格数", "DB8.D128")); - list.add(new ItemDto(item_unqualified, "当前已生产不合格数", "DB8.D132")); - list.add(new ItemDto(item_order_No, "工单号", "DB8.STRING136.50")); + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB.B1", Boolean.TRUE)); + list.add(new ItemDto(item_status, "设备状态", "DB.B2")); + list.add(new ItemDto(item_error, "故障", "DB.B3")); + list.add(new ItemDto(item_open_time, "开机时间", "DB.STRING4.50")); + list.add(new ItemDto(item_standby_time, "待机时间", "DB.D56")); + list.add(new ItemDto(item_production_time, "生产时间", "DB.D60")); + list.add(new ItemDto(item_error_time, "故障时间", "DB.D64")); + list.add(new ItemDto(item_material, "当前生产物料", "DB.STRING68.50")); + list.add(new ItemDto(item_qty, "当前已生产数量", "DB.D120")); + list.add(new ItemDto(item_weight, "当前已生产重量", "DB.D124")); + list.add(new ItemDto(item_qualified, "当前已生产合格数", "DB.D128")); + list.add(new ItemDto(item_unqualified, "当前已生产不合格数", "DB.D132")); + list.add(new ItemDto(item_order_No, "工单号", "DB.STRING136.50")); + list.add(new ItemDto(item_avg_piece_weight, "当前工单平均单重", "DB.D188")); return list; } public static List getWriteableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_command, "反馈", "DB9.W0", Boolean.valueOf(true))); - list.add(new ItemDto(item_to_error, "error", "DB9.W2")); - list.add(new ItemDto(item_to_order_No, "工单号", "DB9.STRING4.50")); - list.add(new ItemDto(item_to_qty, "生产重量", "DB9.D56")); - list.add(new ItemDto(item_to_material_code, "下发物料编号", "DB9.STRING60.50")); - list.add(new ItemDto(item_to_product_code, "产品编号", "DB4.W112")); - list.add(new ItemDto(item_to_AlongSide, "A长边", "DB4.W114")); - list.add(new ItemDto(item_to_BshortSide, "B短边", "DB4.W116")); - list.add(new ItemDto(item_to_Htrapezoidal, "H梯形高", "DB4.W118")); - list.add(new ItemDto(item_to_Wthickness, "W厚度", "DB4.W120")); + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_to_command, "反馈", "DB.W0", Boolean.TRUE)); + list.add(new ItemDto(item_to_error, "error", "DB.W2")); + list.add(new ItemDto(item_to_order_No, "工单号", "DB.STRING4.50")); + list.add(new ItemDto(item_to_qty, "生产重量", "DB.D56")); + list.add(new ItemDto(item_to_material_code, "下发物料编号", "DB.STRING60.50")); + list.add(new ItemDto(item_to_product_code, "产品编号", "DB.W112")); + list.add(new ItemDto(item_to_AlongSide, "A长边", "DB.W114")); + list.add(new ItemDto(item_to_BshortSide, "B短边", "DB.W116")); + list.add(new ItemDto(item_to_Htrapezoidal, "H梯形高", "DB.W118")); + list.add(new ItemDto(item_to_Wthickness, "W厚度", "DB.W120")); return list; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDefination.java index 58f77f5..9c23d60 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDefination.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDefination.java @@ -56,22 +56,7 @@ public class LnshPressDefination implements OpcDeviceDriverDefination { } public static List getReadableItemDtos2() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(ItemProtocol.item_heartbeat, "心跳", "DB8.B0")); - list.add(new ItemDto(ItemProtocol.item_mode, "工作模式", "DB8.B1", Boolean.valueOf(true))); - list.add(new ItemDto(ItemProtocol.item_status, "设备状态", "DB8.B2")); - list.add(new ItemDto(ItemProtocol.item_error, "故障", "DB8.B3")); - list.add(new ItemDto(ItemProtocol.item_open_time, "开机时间", "DB8.STRING4.50")); - list.add(new ItemDto(ItemProtocol.item_standby_time, "待机时间", "DB8.D56")); - list.add(new ItemDto(ItemProtocol.item_production_time, "生产时间", "DB8.D60")); - list.add(new ItemDto(ItemProtocol.item_error_time, "故障时间", "DB8.D64")); - list.add(new ItemDto(ItemProtocol.item_material, "当前生产物料", "DB8.STRING68.50")); - list.add(new ItemDto(ItemProtocol.item_qty, "当前已生产数量", "DB8.D120")); - list.add(new ItemDto(ItemProtocol.item_weight, "当前已生产重量", "DB8.D124")); - list.add(new ItemDto(ItemProtocol.item_qualified, "当前已生产合格数", "DB8.D128")); - list.add(new ItemDto(ItemProtocol.item_unqualified, "当前已生产不合格数", "DB8.D132")); - list.add(new ItemDto(ItemProtocol.item_order_No, "工单号", "DB8.STRING136.50")); - return list; + return ItemProtocol.getReadableItemDtos(); } @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDeviceDriver.java index 7cdebe7..08cf8ca 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_press/LnshPressDeviceDriver.java @@ -110,6 +110,8 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De int last_unqualified = 0; String order_No = "0"; String last_order_No = "0"; + int avg_piece_weight = 0; + int last_avg_piece_weight = 0; @Override public Device getDevice() { @@ -135,6 +137,7 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De unqualified = this.itemProtocol.getUnqualified(); qty = this.itemProtocol.getQty(); material = this.itemProtocol.getMaterial(); + avg_piece_weight = this.itemProtocol.getAvg_piece_weight(); if (mode != last_mode) { this.setRequireSucess(false); @@ -189,6 +192,10 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De logServer.deviceItemValue(this.device_code, "order_No", order_No); logServer.deviceExecuteLog(this.device_code, "", "", "信号order_No:" + last_order_No + " -> " + order_No); } + if (avg_piece_weight != last_avg_piece_weight) { + logServer.deviceItemValue(this.device_code, "avg_piece_weight", String.valueOf(avg_piece_weight)); + logServer.deviceExecuteLog(this.device_code, "", "", "avg_piece_weight:" + last_avg_piece_weight + " -> " + avg_piece_weight); + } } catch (Exception var17) { return; @@ -218,7 +225,7 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De case 2: break; case 3: - //排产单确认 + // 工单确认确认 if (!requireSucess && !"0".equals(order_No) && StrUtil.isNotBlank(order_No)) { JSONObject json = new JSONObject(); json.put("workorder_code", order_No); @@ -227,19 +234,46 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De } break; case 4: - //工单完成反馈 + // 工单完成 if (!requireSucess && !"0".equals(order_No) && StrUtil.isNotBlank(order_No)) { JSONObject json = new JSONObject(); json.put("workorder_code", order_No); json.put("qty", qty); + json.put("qualified_qty", qualified); json.put("unqualified_qty", unqualified); + json.put("weight", weight); + json.put("avg_piece_weight", avg_piece_weight); json.put("type", "2"); enterProduction(json); } break; + case 5: + // 报工 + if (!requireSucess && !"0".equals(order_No) && StrUtil.isNotBlank(order_No)) { + JSONObject json = new JSONObject(); + json.put("workorder_code", order_No); + json.put("qty", qty); + json.put("qualified_qty", qualified); + json.put("unqualified_qty", unqualified); + json.put("weight", weight); + json.put("avg_piece_weight", avg_piece_weight); + this.reportForWork(json); + } + case 6: + // 工单暂停 + if (!requireSucess && !"0".equals(order_No) && StrUtil.isNotBlank(order_No)) { + JSONObject json = new JSONObject(); + json.put("workorder_code", order_No); + json.put("qty", qty); + json.put("qualified_qty", qualified); + json.put("unqualified_qty", unqualified); + json.put("weight", weight); + json.put("avg_piece_weight", avg_piece_weight); + json.put("type", "3"); + enterProduction(json); + } } - } last_mode = mode; @@ -255,6 +289,7 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De last_qualified = qualified; last_unqualified = unqualified; last_order_No = order_No; + last_avg_piece_weight = avg_piece_weight; } @@ -284,13 +319,6 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De if (result.getStatus() == HttpStatus.OK.value()) { JSONObject jsonObject = JSONObject.parseObject(result.body()); if (ObjectUtil.isNotEmpty(jsonObject) && "200".equals(jsonObject.getString("status"))) { -// ProduceshiftorderDto dto = produceshiftorderService.findByCode(order_No); -// if (this.mode == 3) { -// dto.setOrder_status("1"); -// } else if (this.mode == 4) { -// dto.setOrder_status("2"); -// } -// produceshiftorderService.update(dto); this.writing(this.mode); this.setRequireSucess(true); } @@ -300,6 +328,29 @@ public class LnshPressDeviceDriver extends AbstractOpcDeviceDriver implements De } } + public synchronized boolean reportForWork(JSONObject json) { + Date date = new Date(); + if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + return false; + } else { + this.instruction_require_time = date; + HttpResponse result = acsToWmsService.reportForWork(json); + if (ObjectUtil.isNotEmpty(result) && HttpStatus.OK.value() == result.getStatus()) { + JSONObject responseBody = JSONObject.parseObject(result.body()); + if (ObjectUtil.isNotEmpty(responseBody)) { + if (HttpStatus.OK.value() == responseBody.getIntValue("status")) { + this.writing(this.mode); + this.setRequireSucess(true); + } else { + this.writing(7); + } + } + } + return true; + } + } + public boolean exe_business() { return true; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_station/LnshStationDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_station/LnshStationDeviceDriver.java index 5877509..ce83a62 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_station/LnshStationDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/lnsh/lnsh_station/LnshStationDeviceDriver.java @@ -281,7 +281,7 @@ public class LnshStationDeviceDriver extends AbstractOpcDeviceDriver implements } case 17: // 反向组盘 - if (!requireSucess && this.move != 0 && this.task != 0) { + if (!requireSucess && this.move != 0 && this.task != 0 && this.barcode != 0) { reverseGroup(); } } @@ -541,15 +541,14 @@ public class LnshStationDeviceDriver extends AbstractOpcDeviceDriver implements log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); } else { this.instruction_require_time = date; - Instruction inst = SpringContextHolder.getBean(InstructionService.class).findByCode(String.valueOf(task)); - if (!StrUtil.startWith(inst.getTask_code(), "-")) { - JSONObject json = new JSONObject(); - json.put("task_code", inst.getTask_code()); - json.put("vehicle_code", barcode); - HttpResponse result = acsToWmsService.reverseGroup(json); - if (ObjectUtil.isNotEmpty(result)) { - JSONObject jsonObject = JSONObject.parseObject(result.body()); - if (result.getStatus() == 200 || StrUtil.equals(jsonObject.getString("status"), "200")) { + JSONObject json = new JSONObject(); + json.put("device_code", this.device_code); + json.put("vehicle_code", this.barcode); + HttpResponse response = acsToWmsService.reverseGroup(json); + if (ObjectUtil.isNotEmpty(response)) { + if (response.getStatus() == HttpStatus.OK.value()) { + JSONObject jsonObject = JSONObject.parseObject(response.body()); + if (ObjectUtil.isNotEmpty(jsonObject) && "200".equals(jsonObject.getString("status"))) { this.writing(this.mode); this.setRequireSucess(true); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java index d677a0c..09496a1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java @@ -174,4 +174,6 @@ public interface AcsToWmsService { HttpResponse feedbackVehicleType(JSONObject param); HttpResponse mark(JSONObject param); + + HttpResponse reportForWork(JSONObject param); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index 3d02ede..8fa318e 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -997,9 +997,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { .execute(); log.info("reverseGroup - 响应参数 {}", result.body()); } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - System.out.println(msg); + log.error("reverseGroup - 请求错误!", e); } return result; } finally { @@ -1059,4 +1057,29 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { MDC.remove(log_file_type); } } + + @Override + public HttpResponse reportForWork(JSONObject param) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = acsConfigService.findByCode(AcsConfig.WMSURL).getValue(); + + HttpResponse result = null; + log.info("reportForWork - 请求参数 {}", param); + AddressDto addressDto = addressService.findByCode("reportForWork"); + String methods_url = addressDto.getMethods_url(); + try { + result = HttpRequest + .post(wmsurl + methods_url) + .body(param.toJSONString()) + .execute(); + log.info("reportForWork - 响应参数 {}", result.body()); + } catch (Exception e) { + log.error("reportForWork - 请求错误!", e); + } + return result; + } finally { + MDC.remove(log_file_type); + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index ffcb134..c7a6f90 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -259,8 +259,9 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { JSONObject json = orders.getJSONObject(i); String producetask_code = json.getString("workorder_code"); String device_code = json.getString("device_code"); - String material_code = json.getString("material_code"); + String material_code = json.getString("material_number"); String qty = json.getString("plan_qty"); + String weight = json.getString("plan_weight"); String product_code = json.getString("product_code"); String AlongSide = json.getString("a"); String BshortSide = json.getString("b"); @@ -285,7 +286,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { if (lnshMixingMillDeviceDriver.getMode() == 0) { throw new BadRequestException("设备未联机,下发失败!"); } - if (StrUtil.isEmpty(qty)) { + if (StrUtil.isEmpty(weight)) { throw new BadRequestException("重量不能为空!"); } if (StrUtil.isEmpty(material_code)) { @@ -293,7 +294,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } HashMap map = new HashMap<>(); map.put("to_order_No", producetask_code); - map.put("to_weight", qty); + map.put("to_weight", weight); map.put("to_material_code", material_code); map.put("to_command", 1); lnshMixingMillDeviceDriver.writing(map); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 8ba0454..61ab956 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -309,8 +309,6 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { task_code = CodeUtil.getNewCode("TASK_NO"); task_code = "-" + task_code; } - String start_point_code = dto.getStart_point_code(); - String next_point_code = dto.getNext_point_code(); String start_device_code = dto.getStart_device_code(); String next_device_code = dto.getNext_device_code(); String route_plan_code = dto.getRoute_plan_code(); @@ -327,19 +325,12 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { } String plan_code = dto.getRoute_plan_code(); //判断起点终点设备类型 - String startDeviceType = deviceAppService.findDeviceTypeByCode(dto.getStart_device_code()); - String nextDeviceType = deviceAppService.findDeviceTypeByCode(dto.getNext_device_code()); if (routelineserver.getShortPathLines(dto.getStart_device_code(), dto.getNext_device_code(), plan_code).size() == 0) { throw new Exception(dto.getStart_point_code() + "->" + dto.getNext_point_code() + "路由不通!"); } - String createTaskCheck = acsConfigService.findByCode(AcsConfig.CREATETASKCHECK).getValue(); - DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - Device nextdevice = appService.findDeviceByCode(next_device_code); Device startdevice = appService.findDeviceByCode(start_device_code); dto.setMaterial(startdevice.getMaterial_type()); - StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - StandardInspectSiteDeviceDriver standardInspectSiteDeviceDriver; WQLObject wo = WQLObject.getWQLObject("acs_task"); JSONObject json = (JSONObject) JSONObject.toJSON(dto); diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java index 8677789..c6cd796 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java @@ -56,9 +56,8 @@ public class AutoCreateInst { String route_plan_code = acsTask.getRoute_plan_code(); String vehicleType = acsTask.getVehicle_type(); //是否复合任务 =0非复合任务 - String compound_task = acsTask.getCompound_task(); String compound_task_data = null; - String next_point_code = acsTask.getNext_point_code(); + String next_point_code; String next_device_code = acsTask.getNext_device_code(); if (StrUtil.isEmpty(start_device_code)) { log.info("任务 [" + taskcode + "] 起点设备为空,无法生成指令。"); diff --git a/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java index ef1f424..51d2d53 100644 --- a/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java @@ -36,6 +36,7 @@ import org.springframework.stereotype.Component; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.Socket; import java.util.Date; import java.util.Map; @@ -90,7 +91,9 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { ip = acsConfigService.findByCode(AcsConfig.AGVURL).getValue(); port = Integer.parseInt(acsConfigService.findByCode(AcsConfig.AGVPORT).getValue()); byte[] b = new byte[1028]; - s = new Socket(ip, port); + s = new Socket(); + s.connect(new InetSocketAddress(ip, port), 2 * 1000); + s.setKeepAlive(true); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); @@ -154,8 +157,6 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { StandardAutodoorDeviceDriver standardAutodoorDeviceDriver; LnshStationDeviceDriver lnshStationDeviceDriver; LnshPalletizingManipulatorSiteDeviceDriver lnshPalletizingManipulatorSiteDeviceDriver; - int type = Integer.parseInt(acsConfigService.findByCode(AcsConfig.BUSINESSTYPE).getValue()); - try { if (phase == 0x01) { data = AgvService.sendAgvOneModeInst(phase, index); diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index 7eb57bd..1436d67 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lnsh_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:yksh_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 diff --git a/acs/nladmin-system/src/main/resources/config/application-prod.yml b/acs/nladmin-system/src/main/resources/config/application-prod.yml index fdcbec5..e0e3fcd 100644 --- a/acs/nladmin-system/src/main/resources/config/application-prod.yml +++ b/acs/nladmin-system/src/main/resources/config/application-prod.yml @@ -6,7 +6,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.210}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.210}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 @@ -52,7 +52,7 @@ spring: multi-statement-allow: true redis: #数据库索引 - database: ${REDIS_DB:2} + database: ${REDIS_DB:1} host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PWD:} diff --git a/acs/nladmin-ui/src/views/acs/device/driver/lnsh/lnsh_station.vue b/acs/nladmin-ui/src/views/acs/device/driver/lnsh/lnsh_station.vue index 5633cc5..145664f 100644 --- a/acs/nladmin-ui/src/views/acs/device/driver/lnsh/lnsh_station.vue +++ b/acs/nladmin-ui/src/views/acs/device/driver/lnsh/lnsh_station.vue @@ -337,31 +337,31 @@ export default { } for (const val in this.data1) { if (this.data1[val].code.indexOf('heartbeat') !== -1) { - this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) - 1) + this.data1[val].db = beforeStr + '.' + 'B0' } if (this.data1[val].code.indexOf('move') !== -1) { - this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 1) + this.data1[val].db = beforeStr + '.' + 'B2' } if (this.data1[val].code.indexOf('action') !== -1) { - this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 2) + this.data1[val].db = beforeStr + '.' + 'B3' } if (this.data1[val].code.indexOf('ioaction') !== -1) { - this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 3) + this.data1[val].db = beforeStr + '.' + 'B4' } if (this.data1[val].code.indexOf('error') !== -1) { - this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 4) + this.data1[val].db = beforeStr + '.' + 'B5' } if (this.data1[val].code.indexOf('task') !== -1) { - this.data1[val].db = beforeStr + '.' + 'D' + (parseInt(endNumber) + 5) + this.data1[val].db = beforeStr + '.' + 'D6' } if (this.data1[val].code.indexOf('weight') !== -1) { - this.data1[val].db = beforeStr + '.' + 'D' + (parseInt(endNumber) + 9) + this.data1[val].db = beforeStr + '.' + 'D10' } if (this.data1[val].code.indexOf('material') !== -1) { - this.data1[val].db = beforeStr + '.' + 'STRING' + (parseInt(endNumber) + 13) + '.50' + this.data1[val].db = beforeStr + '.' + 'STRING14.50' } if (this.data1[val].code.indexOf('barcode') !== -1) { - this.data1[val].db = beforeStr + '.' + 'W' + (parseInt(endNumber) + 63) + this.data1[val].db = beforeStr + '.' + 'W66' } } } @@ -382,10 +382,10 @@ export default { } for (const val in this.data2) { if (this.data2[val].code.indexOf('to_target') !== -1) { - this.data2[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 2) + this.data2[val].db = beforeStr + '.' + 'W2' } if (this.data2[val].code.indexOf('to_task') !== -1) { - this.data2[val].db = beforeStr + '.' + 'D' + (parseInt(endNumber) + 4) + this.data2[val].db = beforeStr + '.' + 'D4' } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java index a3bf136..ae106da 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/PointUpdateUtil.java @@ -35,7 +35,7 @@ public class PointUpdateUtil { pointObj.put("weight_unit_id", ""); pointObj.put("instorage_time", ""); pointObj.put("is_full", "0"); - pointObj.put("standing_time", "0"); + pointObj.put("stand_time", "0"); pointObj.put("warn_time", "0"); pointObj.put("group_id", ""); pointTab.update(pointObj); @@ -56,7 +56,7 @@ public class PointUpdateUtil { pointObj.put("ivt_qty", "0"); pointObj.put("pcsn", null); pointObj.put("material_id", null); - pointObj.put("standing_time", "0"); + pointObj.put("stand_time", "0"); pointTab.update(pointObj); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialDetailDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialDetailDto.java index ba6021e..c79d143 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialDetailDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialDetailDto.java @@ -24,7 +24,7 @@ public class MaterialDetailDto implements Serializable { /** * 物料编码 */ - private String material_code; + private String material_number; /** * 物料名称 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java index 09fd61a..4ebee8d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.io.Serializable; -import java.math.BigDecimal; /** * @author zhouz @@ -21,9 +20,10 @@ public class MaterialbaseDto implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long material_id; - private String material_code; + private String material_number; + private String material_name; - private Integer standing_time; + private Integer stand_time; private Integer threshold_time; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java index bd4e5cf..f63d50f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java @@ -29,8 +29,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; /** * @author zhouz @@ -50,11 +48,8 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { HashMap map = new HashMap<>(); map.put("flag", "1"); - map.put("search", name); - map.put("material_type", MapUtil.getStr(whereJson, "material_type")); - map.put("order_code", MapUtil.getStr(whereJson, "order_code")); - map.put("product_grade", MapUtil.getStr(whereJson, "product_grade")); - map.put("brick_type", MapUtil.getStr(whereJson, "brick_type")); + map.put("material_number", MapUtil.getStr(whereJson, "material_number")); + map.put("material_name", MapUtil.getStr(whereJson, "material_name")); return WQL.getWO("QMD_ME_MATERIAL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "create_time DESC"); } @@ -81,7 +76,7 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { if (StrUtil.isNotEmpty(code) && code.contains("\\")) { code = code.replace("\\", "\\\\"); } - JSONObject json = wo.query("material_code ='" + code + "'").uniqueResult(0); + JSONObject json = wo.query("material_number ='" + code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(json)) return null; String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); json.put("base_unit_name", unit_name); @@ -93,10 +88,10 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { @Transactional(rollbackFor = Exception.class) public void create(MaterialbaseDto dto) { WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); - String material_code = dto.getMaterial_code(); - JSONObject material = wo.query("material_code = '" + material_code + "'").uniqueResult(0); + String material_number = dto.getMaterial_number(); + JSONObject material = wo.query("material_number = '" + material_number + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(material)) { - throw new BadRequestException("物料编码 [" + material_code + "] 已存在!"); + throw new BadRequestException("物料号 [" + material_number + "] 已存在!"); } Long currentUserId = SecurityUtils.getCurrentUserId(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql index ac1de57..91ce79d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql @@ -22,6 +22,8 @@ 输入.order_code TYPEAS s_string 输入.product_grade TYPEAS s_string 输入.brick_type TYPEAS s_string + 输入.material_number TYPEAS s_string + 输入.material_name TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -53,20 +55,11 @@ md_me_materialbase mb WHERE is_delete = '0' - OPTION 输入.search <> "" - mb.material_code like '%' 输入.search '%' + OPTION 输入.material_number <> "" + mb.material_number like '%' 输入.material_number '%' ENDOPTION - OPTION 输入.material_type <> "" - mb.material_type = 输入.material_type - ENDOPTION - OPTION 输入.order_code <> "" - mb.order_code LIKE '%' 输入.order_code '%' - ENDOPTION - OPTION 输入.product_grade <> "" - mb.product_grade LIKE '%' 输入.product_grade '%' - ENDOPTION - OPTION 输入.brick_type <> "" - mb.brick_type LIKE '%' 输入.brick_type '%' + OPTION 输入.material_name <> "" + mb.material_name = like '%' 输入.material_name '%' ENDOPTION ENDSELECT ENDPAGEQUERY diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_STORAGEVEHICLEINFO.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_STORAGEVEHICLEINFO.wql index 36ac5f7..0d33527 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_STORAGEVEHICLEINFO.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_STORAGEVEHICLEINFO.wql @@ -46,7 +46,7 @@ SELECT s.*, d.label AS storagevehicle_type_name, - mater.material_code, + mater.material_number, mater.material_name, point.point_code, point.point_name diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java index 640ba11..bb506aa 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java @@ -712,9 +712,9 @@ public class DashboardService { monthlyFailureStatistics.put("average", average); // 真实获取 average.put("mix", mixData.isEmpty() ? 0 : mixData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); - average.put("press", mixData.isEmpty() ? 0 : pressData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); - average.put("dry", mixData.isEmpty() ? 0 : dryData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); - average.put("sort", mixData.isEmpty() ? 0 : sortData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); + average.put("press", pressData.isEmpty() ? 0 : pressData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); + average.put("dry", dryData.isEmpty() ? 0 : dryData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); + average.put("sort", sortData.isEmpty() ? 0 : sortData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("count")).sum() / mixData.size()); // 当日工序生产统计------------------------------------------------------------------------------------------------ JSONObject dailyProductionStatistics = new JSONObject(); @@ -776,6 +776,7 @@ public class DashboardService { * * @return 大屏首页设备数据 */ + @SuppressWarnings("all") public JSONObject homepageEquipment1() { JSONObject result = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 5d7d155..09cc9a3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -68,7 +68,7 @@ public class AcsToWmsController { RLock lock = SpringContextHolder.getBean(RedissonClient.class).getFairLock(type); boolean try_lock = false; try { - try_lock = lock.tryLock(5, TimeUnit.SECONDS); + try_lock = lock.tryLock(10, TimeUnit.SECONDS); if (try_lock) { return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); } @@ -150,8 +150,8 @@ public class AcsToWmsController { } @PostMapping("/getVehicleInfoBycode") - @Log("根据设备编码编码获取托盘信息") - @ApiOperation("根据设备编码编码获取托盘信息") + @Log("根据设备号编码获取托盘信息") + @ApiOperation("根据设备号编码获取托盘信息") @SaIgnore public ResponseEntity getVehicleInfoByDevice_code(@RequestBody Map whereJson) { return new ResponseEntity<>(acsToWmsService.getVehicleInfoByDeviceCode(whereJson), HttpStatus.OK); @@ -189,4 +189,12 @@ public class AcsToWmsController { public ResponseEntity inKiln(@RequestBody JSONObject param) { return ResponseEntity.ok(acsToWmsService.inKiln(param)); } + + @PostMapping("/reportForWork") + @Log("报工") + @ApiOperation("报工") + @SaIgnore + public ResponseEntity reportForWork(@RequestBody JSONObject param) { + return ResponseEntity.ok(acsToWmsService.reportForWork(param)); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 0d4c7de..7ea841c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -96,7 +96,7 @@ public interface AcsToWmsService { JSONObject reverseGroup(JSONObject whereJson); /** - * 根据设备编码获取托盘信息 + * 根据设备号获取托盘信息 * * @param jsonObject 条件 * @return Map @@ -108,4 +108,6 @@ public interface AcsToWmsService { JSONObject outKiln(JSONObject whereJson); JSONObject inKiln(JSONObject param); + + JSONObject reportForWork(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 45934fc..5f6c8ee 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -14,37 +14,21 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.basedata.eum.StandStatus; import org.nl.wms.basedata.eum.TrueOrFalse; import org.nl.wms.basedata.eum.VehicleType; import org.nl.wms.basedata.service.dto.VehicleDto; -import org.nl.wms.common.PickType; import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.pdm.service.WorkordeService; import org.nl.wms.sch.manage.*; -import org.nl.wms.sch.task.call.empty.FJCallEmptyTask; -import org.nl.wms.sch.task.call.empty.GTKCallEmptyTask; -import org.nl.wms.sch.task.call.empty.HLCallEmptyTask; import org.nl.wms.sch.task.call.empty.YZCallEmptyTask; -import org.nl.wms.sch.task.call.material.FJCallMaterialTask; -import org.nl.wms.sch.task.call.material.SZCallMaterialTask; -import org.nl.wms.sch.task.call.material.YZCallMaterialTask; -import org.nl.wms.sch.task.send.empty.FJSendEmptyTask; -import org.nl.wms.sch.task.send.empty.YZSendEmptyTask; -import org.nl.wms.sch.task.send.material.FJSendMaterialTask; -import org.nl.wms.sch.task.send.material.HLSendMaterialTask; -import org.nl.wms.sch.task.send.material.SZSendMaterialTask; +import org.nl.wms.sch.task.call.material.GZCallMaterialTask; import org.nl.wms.sch.task.send.material.YZSendMaterialTask; -import org.nl.wms.sch.task.to.pack.BTHCToPackageTask; -import org.nl.wms.sch.task.to.pack.FJToPackageTask; import org.nl.wms.sch.task.util.TaskUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Method; -import java.math.BigDecimal; -import java.util.Date; import java.util.Map; @Service @@ -52,37 +36,13 @@ import java.util.Map; @Slf4j public class AcsToWmsServiceImpl implements AcsToWmsService { - private final HLCallEmptyTask hlCallEmptyTask; - - private final HLSendMaterialTask hlSendMaterialTask; + private final WorkordeService workordeService; private final YZCallEmptyTask yzCallEmptyTask; private final YZSendMaterialTask yzSendMaterialTask; - private final SZSendMaterialTask szSendMaterialTask; - - private final FJCallMaterialTask fjCallMaterialTask; - - private final FJSendEmptyTask fjSendEmptyTask; - - private final GTKCallEmptyTask gtkCallEmptyTask; - - private final FJSendMaterialTask fjSendMaterialTask; - - private final FJCallEmptyTask fjCallEmptyTask; - - private final FJToPackageTask fjToPackageTask; - - private final BTHCToPackageTask bthcToPackageTask; - - private final YZCallMaterialTask yzCallMaterialTask; - - private final YZSendEmptyTask yzSendEmptyTask; - - private final SZCallMaterialTask szCallMaterialTask; - - private final WmsToAcsService wmsToAcsService; + private final GZCallMaterialTask gzCallMaterialTask; /** * task_id:任务标识 @@ -207,7 +167,91 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override @Transactional(rollbackFor = Exception.class) public JSONObject apply(JSONObject param) { - return null; + String type = param.getString("type"); + if (StrUtil.isBlank(type)) { + throw new BadRequestException("任务类型不能为空!"); + } + String pointCode = param.getString("device_code"); + if (StrUtil.isBlank(pointCode)) { + throw new BadRequestException("点位不能为空!"); + } + + JSONObject point = param.getJSONObject("point"); + if (ObjectUtil.isEmpty(point)) { + point = WQLObject + .getWQLObject("sch_base_point") + .query("is_used = '1' AND point_code = '" + pointCode + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("[" + pointCode + "] 已删除或未启用!"); + } + } + + TaskUtils.isLocked(point); + + JSONObject methodParam = new JSONObject(); + methodParam.put("point", point); + methodParam.put("create_mode", CreateMode.ACSSQ.value()); + String request_param = param.getString("request_param"); + if (StrUtil.isBlank(request_param)) { + request_param = param.toJSONString(); + } + methodParam.put("request_param", request_param); + methodParam.put("create_id", ACSSystem.id); + methodParam.put("create_name", ACSSystem.nick_name); + + Region region = Region.get(point.getString("region_code")); + String taskCode = null; + switch (type) { + case "1": + // 送料 + switch (region) { + case YZ: + methodParam.put("workorder", param.getJSONObject("workorder")); + methodParam.put("vd", param.getJSONObject("vd")); + taskCode = yzSendMaterialTask.createTask(methodParam); + break; + default: + throw new BadRequestException("[" + region.label() + "] 不能发起送料任务!"); + } + break; + case "2": + // 叫料 + switch (region) { + case GZ: + taskCode = gzCallMaterialTask.createTask(methodParam); + break; + default: + throw new BadRequestException("[" + region.label() + "] 不能发起叫料任务!"); + } + break; + case "3": + // 送空 + break; + case "4": + // 叫空 + JSONObject workOrder = WQLObject + .getWQLObject("pdm_bd_workorder") + .query("is_delete = '0' AND device_code = '" + point.getString("device_code") + "' AND order_status = '3'") + .uniqueResult(0); + methodParam.put("workorder", workOrder); + + switch (region) { + case YZ: + taskCode = yzCallEmptyTask.createTask(methodParam); + break; + default: + throw new BadRequestException("[" + region.label() + "] 不能发起叫空任务!"); + } + break; + default: + throw new BadRequestException("未知任务类型!"); + } + + JSONObject result = new JSONObject(); + result.put("message", "申请任务成功,任务编码 [" + taskCode + "]"); + result.put("status", HttpStatus.OK.value()); + return result; } /** @@ -263,7 +307,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { vd.put("vehicle_code", vehicle_code); vd.put("material_id", workorder.getString("material_id")); vd.put("qty", qty); - vd.put("weight", weight); + vd.put("weight", Long.parseLong(weight) / 1000.00); vd.put("is_full", is_full); vd.put("workorder_id", workorder.getString("workorder_id")); vd.put("point_code", point_code); @@ -395,52 +439,83 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (StrUtil.isEmpty(type)) { throw new BadRequestException("类型不能为空!"); } - String workorder_code = jsonObject.getString("workorder_code"); - if (StrUtil.isEmpty(type)) { - throw new BadRequestException("工单编码不能为空!"); + String WorkOrderCode = jsonObject.getString("workorder_code"); + if (StrUtil.isEmpty(WorkOrderCode)) { + throw new BadRequestException("工单号不能为空!"); } - WQLObject workorder_table = WQLObject.getWQLObject("pdm_bd_workorder"); - JSONObject workorder = workorder_table - .query("workorder_code = '" + workorder_code + "'") + WQLObject workOrderTable = WQLObject.getWQLObject("pdm_bd_workorder"); + JSONObject workOrder = workOrderTable + .query("workorder_code = '" + WorkOrderCode + "'") .uniqueResult(0); + if (ObjectUtil.isEmpty(workOrder)) { + throw new BadRequestException("工单不存在!"); + } + long workOrderId = workOrder.getLongValue("workorder_id"); - if ("1".equals(type)) { - // 排产确认 - if (workorder.getIntValue("order_status") < 3) { - workorder.put("order_status", WorkOrderEnum.ORDER_STATUS_PRODUCING.value()); - workorder.put("realproducestart_date", DateUtil.now()); - TaskUtils.addACSUpdateColum(workorder); - workorder_table.update(workorder); - } - } else if ("2".equals(type)) { - // 工单完成 - String qty = jsonObject.getString("qty"); - if (StrUtil.isBlank(qty)) { - throw new BadRequestException("数量不能为空!"); - } + switch (type) { + case "1": + // 工单确认 + workOrder.put("order_status", WorkOrderEnum.ORDER_STATUS_PRODUCING.value()); + workOrder.put("realproducestart_date", DateUtil.now()); + TaskUtils.addACSUpdateColum(workOrder); + workOrderTable.update(workOrder); + break; + case "2": + // 工单完成 + { + int qty = jsonObject.getIntValue("qty"); + int qualifiedQty = jsonObject.getIntValue("qualified_qty"); + int unqualifiedQty = jsonObject.getIntValue("unqualified_qty"); + int weightG = jsonObject.getIntValue("weight"); + double weightKG = weightG / 1000.00; + int avgPieceWeightG = jsonObject.getIntValue("avg_piece_weight"); + double avgPieceWeightKG = avgPieceWeightG / 1000.00; - if (workorder.getIntValue("order_status") < 5) { - workorder.put("order_status", WorkOrderEnum.ORDER_STATUS_FINISH.value()); - if (!"0".equals(qty)) { - workorder.put("real_qty", qty); - } else { - workorder.put("real_qty", workorder.getIntValue("unqualified_qty") + workorder.getIntValue("qualified_qty")); - } - String unqualified_qty = jsonObject.getString("unqualified_qty"); - if (StrUtil.isNotBlank(unqualified_qty) && !"0".equals(unqualified_qty)) { - workorder.put("unqualified_qty", unqualified_qty); - } - String qualified_qty = jsonObject.getString("qualified_qty"); - if (StrUtil.isNotBlank(qualified_qty) && !"0".equals(qualified_qty)) { - workorder.put("qualified_qty", qualified_qty); - } else { - workorder.put("qualified_qty", workorder.getIntValue("real_qty") - workorder.getIntValue("unqualified_qty")); - } + // 报工 + workordeService.reportWorkOrderDaily(workOrderId, qty, qualifiedQty, unqualifiedQty, weightKG, avgPieceWeightKG); - workorder.put("realproduceend_date", DateUtil.now()); - TaskUtils.addACSUpdateColum(workorder); - workorder_table.update(workorder); + // 汇总 + JSONArray workOrderDailyList = WQLObject.getWQLObject("pdm_bd_work_order_daily").query("workorder_id = " + workOrderId).getResultJSONArray(0); + workOrder.put("real_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("qty")).sum()); + workOrder.put("real_weight", workOrderDailyList.stream().mapToDouble(o -> ((JSONObject) o).getDoubleValue("weight")).sum()); + workOrder.put("qualified_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("qualified_qty")).sum()); + workOrder.put("unqualified_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("unqualified_qty")).sum()); + workOrder.put("avg_piece_weight", workOrderDailyList.stream().mapToDouble(o -> ((JSONObject) o).getDoubleValue("avg_piece_weight")).sum() / workOrderDailyList.size()); + workOrder.put("order_status", WorkOrderEnum.ORDER_STATUS_FINISH.value()); + workOrder.put("realproduceend_date", DateUtil.now()); + TaskUtils.addACSUpdateColum(workOrder); + workOrderTable.update(workOrder); } + break; + case "3": + // 工单暂停 + { + int qty = jsonObject.getIntValue("qty"); + int qualifiedQty = jsonObject.getIntValue("qualified_qty"); + int unqualifiedQty = jsonObject.getIntValue("unqualified_qty"); + int weightG = jsonObject.getIntValue("weight"); + double weightKG = weightG / 1000.00; + int avgPieceWeightG = jsonObject.getIntValue("avg_piece_weight"); + double avgPieceWeightKG = avgPieceWeightG / 1000.00; + + // 报工 + workordeService.reportWorkOrderDaily(workOrderId, qty, qualifiedQty, unqualifiedQty, weightKG, avgPieceWeightKG); + + // 汇总 + JSONArray workOrderDailyList = WQLObject.getWQLObject("pdm_bd_work_order_daily").query("workorder_id = " + workOrderId).getResultJSONArray(0); + workOrder.put("real_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("qty")).sum()); + workOrder.put("real_weight", workOrderDailyList.stream().mapToDouble(o -> ((JSONObject) o).getDoubleValue("weight")).sum()); + workOrder.put("qualified_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("qualified_qty")).sum()); + workOrder.put("unqualified_qty", workOrderDailyList.stream().mapToInt(o -> ((JSONObject) o).getIntValue("unqualified_qty")).sum()); + workOrder.put("avg_piece_weight", workOrderDailyList.stream().mapToDouble(o -> ((JSONObject) o).getDoubleValue("avg_piece_weight")).sum() / workOrderDailyList.size()); + workOrder.put("order_status", WorkOrderEnum.ORDER_STATUS_STOP.value()); + workOrder.put("realproduceend_date", DateUtil.now()); + TaskUtils.addACSUpdateColum(workOrder); + workOrderTable.update(workOrder); + } + break; + default: + throw new BadRequestException("未知操作类型!"); } JSONObject result = new JSONObject(); @@ -475,27 +550,42 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { /** * 入窑口反向组盘 * - * @param whereJson + * @param param */ @Override @Transactional(rollbackFor = Exception.class) - public JSONObject reverseGroup(JSONObject whereJson) { - String vehicle_code = whereJson.getString("vehicle_code"); - if (StrUtil.isBlank(vehicle_code)) { + public JSONObject reverseGroup(JSONObject param) { + String vehicle_code = TaskUtils.formatVehicleCode(param.getString("vehicle_code")); + if ("0000".equals(vehicle_code)) { throw new BadRequestException("条码不能为空!"); } - String task_code = whereJson.getString("task_code"); - if (StrUtil.isBlank(task_code)) { - throw new BadRequestException("任务编码不能为空!"); + String device_code = param.getString("device_code"); + if (StrUtil.isBlank(device_code)) { + throw new BadRequestException("设备号不能为空!"); } - JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_code = '" + task_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(task)) { - throw new BadRequestException("未查询到任务 [" + task_code + "] !"); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject point = pointTable.query("point_code = '" + device_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("[" + device_code + "] 点位不存在!"); + } + // 等待任务完成 + TaskUtils.isLocked(point); + + String vdId = point.getString("vd_id"); + if (StrUtil.isNotBlank(vdId)) { + JSONObject vdUpdate = new JSONObject(); + vdUpdate.put("vehicle_code", vehicle_code); + WQLObject.getWQLObject("st_ivt_vehicle_detail").update(vdUpdate, "vd_id = " + vdId); + + // 解绑点位防止人工放料出错 + point.put("vehicle_type", ""); + point.put("vehicle_code", ""); + point.put("vd_id", null); + point.put("point_status", PointStatus.EMPTY.value()); + TaskUtils.addACSUpdateColum(point); + pointTable.update(point); } - JSONObject vd_update = new JSONObject(); - vd_update.put("vehicle_code", vehicle_code); - WQLObject.getWQLObject("st_ivt_vehicle_detail").update(vd_update, "vd_id = " + task.getString("group_id")); JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); @@ -504,7 +594,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } /** - * 根据设备编码获取托盘信息 + * 根据设备号获取托盘信息 * * @param jsonObject 条件 * @return Map @@ -622,12 +712,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { .query("is_delete = '0' AND vehicle_type = '2' AND vehicle_code = '" + vehicle_code + "'") .uniqueResult(0); if (ObjectUtil.isNotEmpty(vd)) { - vd.put("is_fire", "1"); - vd.put("is_in_kiln", "0"); - vd_table.update(vd); - JSONObject workorder = WQLObject.getWQLObject("pdm_bd_workorder").query("workorder_id = " + vd.getString("workorder_id")).uniqueResult(0); to_package = TrueOrFalse.trueOrFalse(workorder.getString("is_pri")); + + vd.put("out_kiln_time", DateUtil.now()); + TaskUtils.addACSUpdateColum(vd); + vd_table.update(vd); } JSONObject result = new JSONObject(); @@ -645,13 +735,25 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public JSONObject inKiln(JSONObject param) { String vehicle_code = TaskUtils.formatVehicleCode(param.getString("vehicle_code")); - if (StrUtil.isNotBlank(vehicle_code)) { - String kiln_number = param.getString("kiln_number"); - if (StrUtil.isNotBlank(kiln_number)) { - JSONObject vd_update = new JSONObject(); - vd_update.put("kiln_number", "Y0" + kiln_number); - vd_update.put("in_kiln_time", DateUtil.now()); - WQLObject.getWQLObject("st_ivt_vehicle_detail").update(vd_update, "is_delete = '0' AND vehicle_code = '" + vehicle_code + "'"); + if (!"0000".equals(vehicle_code)) { + String type = param.getString("type"); + if ("1".equals(type)) { + String kilnNumber = param.getString("kiln_number"); + if (StrUtil.isNotBlank(kilnNumber) && !"0".equals(kilnNumber)) { + JSONObject vd_update = new JSONObject(); + vd_update.put("kiln_number", "Y0" + kilnNumber); + vd_update.put("in_kiln_time", DateUtil.now()); + TaskUtils.addACSUpdateColum(vd_update); + WQLObject.getWQLObject("st_ivt_vehicle_detail").update(vd_update, "is_delete = '0' AND vehicle_code = '" + vehicle_code + "'"); + } + } else if ("2".equals(type)) { + String coolNumber = param.getString("cool_number"); + if (StrUtil.isNotBlank(coolNumber) && !"0".equals(coolNumber)) { + JSONObject vd_update = new JSONObject(); + vd_update.put("cool_number", "LQD0" + coolNumber); + TaskUtils.addACSUpdateColum(vd_update); + WQLObject.getWQLObject("st_ivt_vehicle_detail").update(vd_update, "is_delete = '0' AND vehicle_code = '" + vehicle_code + "'"); + } } } @@ -660,4 +762,67 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { result.put("message", "反馈成功!"); return result; } + + @Override + public JSONObject reportForWork(JSONObject param) { + String WorkOrderCode = param.getString("workorder_code"); + if (StrUtil.isEmpty(WorkOrderCode)) { + throw new BadRequestException("工单号不能为空!"); + } + WQLObject workOrderTable = WQLObject.getWQLObject("pdm_bd_workorder"); + JSONObject workOrder = workOrderTable + .query("workorder_code = '" + WorkOrderCode + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(workOrder)) { + throw new BadRequestException("工单不存在!"); + } + long workOrderId = workOrder.getLongValue("workorder_id"); + int qty = param.getIntValue("qty"); + int qualifiedQty = param.getIntValue("qualified_qty"); + int unqualifiedQty = param.getIntValue("unqualified_qty"); + int weightG = param.getIntValue("weight"); + double weightKG = weightG / 1000.00; + int avgPieceWeightG = param.getIntValue("avg_piece_weight"); + double avgPieceWeightKG = avgPieceWeightG / 1000.00; + + String today = DateUtil.today(); + WQLObject wodTable = WQLObject.getWQLObject("pdm_bd_work_order_daily"); + JSONObject workOrderDaily = wodTable.query("workorder_id = " + workOrderId + " AND date = '" + today + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(workOrderDaily)) { + workOrderDaily = new JSONObject(); + workOrderDaily.put("id", IdUtil.getSnowflake().nextId()); + workOrderDaily.put("date", today); + workOrderDaily.put("workorder_id", workOrderId); + workOrderDaily.put("qty", qty); + workOrderDaily.put("qualified_qty", qualifiedQty); + workOrderDaily.put("unqualified_qty", unqualifiedQty); + workOrderDaily.put("weight", weightKG); + workOrderDaily.put("avg_piece_weight", avgPieceWeightKG); + workOrderDaily.put("is_report", TrueOrFalse.TRUE.value()); + TaskUtils.addACSCreateColum(workOrderDaily); + wodTable.insert(workOrderDaily); + } else { + if ("1".equals(workOrderDaily.getString("is_report"))) { + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.CREATED.value()); + result.put("message", "当日已报工!"); + return result; + } + + workOrderDaily.put("qty", qty); + workOrderDaily.put("qualified_qty", qualifiedQty); + workOrderDaily.put("unqualified_qty", unqualifiedQty); + workOrderDaily.put("weight", weightKG); + workOrderDaily.put("avg_piece_weight", avgPieceWeightKG); + workOrderDaily.put("is_report", TrueOrFalse.TRUE.value()); + TaskUtils.addACSUpdateColum(workOrderDaily); + wodTable.update(workOrderDaily); + } + + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "反馈成功!"); + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACS_TO_WMS.wql b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACS_TO_WMS.wql index 796d970..0b2b2f9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACS_TO_WMS.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACS_TO_WMS.wql @@ -78,7 +78,7 @@ QUERY SELECT vd.is_package, - material.material_code, + material.material_number, material.furnace, material.material_brick_type, material.product_grade, diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java index 8e4bc53..79ec05a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java @@ -32,7 +32,7 @@ public interface PdaService { * 查询设备 * * @param func 手持功能 - * @return 设备编码 设备名称 + * @return 设备号 设备名称 */ JSONArray device(String func); @@ -47,7 +47,7 @@ public interface PdaService { /** * 不合格品上报 * - * @param device_code 设备编码 + * @param device_code 设备号 * @param unqualified_qty 不合格数量 */ void report(String device_code, String unqualified_qty); @@ -120,7 +120,7 @@ public interface PdaService { /** * 呼叫次品料 * - * @param device_code 设备编码 + * @param device_code 设备号 */ void callDefective(String device_code, String request_param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java index 1bd390d..118d0de 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java @@ -126,4 +126,6 @@ public interface WorkordeService { JSONArray getMaterial(); void downloadExcel(Map params, HttpServletResponse response); + + void reportWorkOrderDaily(long workOrderId, int qty, int qualifiedQty, int unqualifiedQty, double weight, double avgPieceWeight); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java index 736ed46..5874ee4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java @@ -23,7 +23,7 @@ public class DeviceDto implements Serializable { private Long device_id; /** - * 设备编码 + * 设备号 */ private String device_code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java index 54b1207..6a5b57d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkorderDto.java @@ -65,7 +65,7 @@ public class WorkorderDto implements Serializable { /** 回传MES状态 */ private String passback_status; - /** 设备编码 */ + /** 设备号 */ private String device_code; /** 外部标识 */ @@ -96,7 +96,7 @@ public class WorkorderDto implements Serializable { private String update_time; /** 静置时间 */ - private String standing_time; + private String stand_time; /** 阈值时间 */ private String warn_time; @@ -112,4 +112,10 @@ public class WorkorderDto implements Serializable { private String region_code; private String plan_date; + + private BigDecimal plan_weight; + + private BigDecimal real_weight; + + private BigDecimal avg_piece_weight; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java index 7ee8172..e73c8b1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java @@ -19,12 +19,10 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; import org.nl.wms.basedata.eum.TrueOrFalse; -import org.nl.wms.basedata.eum.VehicleType; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pdm.service.WorkordeService; import org.nl.wms.pdm.service.dto.WorkorderDto; import org.nl.wms.sch.manage.Region; -import org.nl.wms.sch.manage.RegionInType; import org.nl.wms.sch.manage.WorkOrderEnum; import org.nl.wms.sch.task.util.TaskUtils; import org.springframework.data.domain.Pageable; @@ -34,7 +32,6 @@ import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -127,15 +124,7 @@ public class WorkorderServiceImpl implements WorkordeService { work_order.put("planproducestart_date", dto.getPlanproducestart_date()); work_order.put("planproduceend_date", dto.getPlanproduceend_date()); work_order.put("material_id", dto.getMaterial_id()); - String region_code = dto.getRegion_code(); String vehicle_type = dto.getVehicle_type(); - if (!Region.FJ.value().equals(region_code)) { - if (Region.YZ.value().equals(region_code)) { - vehicle_type = VehicleType.STEEL_TRAY.value(); - } else if (Region.HL.value().equals(region_code)) { - vehicle_type = VehicleType.CUP.value(); - } - } work_order.put("vehicle_type", vehicle_type); work_order.put("device_id", dto.getDevice_id()); work_order.put("device_code", dto.getDevice_code()); @@ -145,6 +134,7 @@ public class WorkorderServiceImpl implements WorkordeService { work_order.put("ext_code", dto.getExt_code()); work_order.put("is_delete", TrueOrFalse.FALSE.value()); work_order.put("plan_date", dto.getPlan_date()); + work_order.put("plan_weight", dto.getPlan_weight()); Long user_id = SecurityUtils.getCurrentUserId(); String nick_name = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); @@ -209,8 +199,20 @@ public class WorkorderServiceImpl implements WorkordeService { .addParam("workorder_id", workorder_id) .process() .uniqueResult(0); - if (submit_obj.getIntValue("order_status") > 2) { - throw new BadRequestException("工单已开工!"); + int orderStatus = submit_obj.getIntValue("order_status"); + if (orderStatus == 3) { + throw new BadRequestException("工单已在生产中!"); + } + if (orderStatus == 5) { + throw new BadRequestException("工单已完成!"); + } + int product_code = submit_obj.getIntValue("product_code"); + int a = submit_obj.getIntValue("a"); + int b = submit_obj.getIntValue("b"); + int h = submit_obj.getIntValue("h"); + int w = submit_obj.getIntValue("w"); + if (product_code == 0 || a == 0 || b == 0 || h == 0 || w == 0) { + throw new BadRequestException("工单所生产物料的砖型参数未正确配置!"); } JSONObject workorder = WQLObject @@ -222,29 +224,34 @@ public class WorkorderServiceImpl implements WorkordeService { } if (Region.HL.value().equals(submit_obj.getString("region_code"))) { - String material_code = submit_obj.getString("material_code"); - submit_obj.put("material_code", material_code.substring(5, 11)); - } + JSONObject order_update = new JSONObject(); + order_update.put("order_status", WorkOrderEnum.ORDER_STATUS_PRODUCING.value()); + TaskUtils.addCurrentUpdateColum(order_update); + WQLObject + .getWQLObject("pdm_bd_workorder") + .update(order_update, "workorder_id = " + workorder_id); + } else { - JSONArray request = new JSONArray(); - request.add(submit_obj); - Map result; - try { - result = wmsToAcsService.order(request); - } catch (Exception e) { - log.error("工单开工报错!", e); - throw new RuntimeException(e); - } - if (HttpStatus.OK.value() != MapUtil.getInt(result, "status")) { - throw new BadRequestException(String.valueOf(result.get("message"))); - } + JSONArray request = new JSONArray(); + request.add(submit_obj); + Map result; + try { + result = wmsToAcsService.order(request); + } catch (Exception e) { + log.error("工单开工报错!", e); + throw new BadRequestException(e.getMessage()); + } + if (HttpStatus.OK.value() != MapUtil.getInt(result, "status")) { + throw new BadRequestException(String.valueOf(result.get("message"))); + } - JSONObject order_update = new JSONObject(); - order_update.put("order_status", WorkOrderEnum.ORDER_STATUS_DELIVERED.value()); - TaskUtils.addCurrentUpdateColum(order_update); - WQLObject - .getWQLObject("pdm_bd_workorder") - .update(order_update, "workorder_id = " + workorder_id); + JSONObject order_update = new JSONObject(); + order_update.put("order_status", WorkOrderEnum.ORDER_STATUS_DELIVERED.value()); + TaskUtils.addCurrentUpdateColum(order_update); + WQLObject + .getWQLObject("pdm_bd_workorder") + .update(order_update, "workorder_id = " + workorder_id); + } } @Override @@ -307,7 +314,7 @@ public class WorkorderServiceImpl implements WorkordeService { String workprocedure_id = row.getString("workprocedure_id"); String produceorder_code = row.getString("produceorder_code"); String material_id = row.getString("material_id"); - String material_code = row.getString("material_code"); + String material_number = row.getString("material_number"); String material_name = row.getString("material_name"); String material_spec = row.getString("material_spec"); String is_needmove = row.getString("is_needmove"); @@ -323,7 +330,7 @@ public class WorkorderServiceImpl implements WorkordeService { produceorderMap.put("update_optid", currentUserId); produceorderMap.put("update_optname", nickName); produceorderMap.put("update_time", now); - if (order_status.equals("01")){ + if (order_status.equals("01")) { produceorderMap.put("realproducestart_date", now); } wo.update(produceorderMap); @@ -346,15 +353,15 @@ public class WorkorderServiceImpl implements WorkordeService { // TODO JSONArray array = new JSONArray(); JSONObject acsObj = new JSONObject(); - acsObj.put("ext_order_id",workorder_id); - acsObj.put("is_needmove",is_needmove); - acsObj.put("order_code",produceorder_code); - acsObj.put("qty",plan_qty); - acsObj.put("material_uuid",material_id); - acsObj.put("material_code",material_code); - acsObj.put("material_name",material_name); - acsObj.put("material_spec",material_spec); - acsObj.put("device_code",device_code); + acsObj.put("ext_order_id", workorder_id); + acsObj.put("is_needmove", is_needmove); + acsObj.put("order_code", produceorder_code); + acsObj.put("qty", plan_qty); + acsObj.put("material_uuid", material_id); + acsObj.put("material_number", material_number); + acsObj.put("material_name", material_name); + acsObj.put("material_spec", material_spec); + acsObj.put("device_code", device_code); array.add(acsObj); wmsToAcsService.order(array); } else { @@ -372,8 +379,8 @@ public class WorkorderServiceImpl implements WorkordeService { // TODO JSONArray array = new JSONArray(); JSONObject map = new JSONObject(); - map.put("ext_order_id",workorder_id); - map.put("type","2"); + map.put("ext_order_id", workorder_id); + map.put("type", "2"); array.add(map); wmsToAcsService.orderStatusUpdate(array); } @@ -395,12 +402,12 @@ public class WorkorderServiceImpl implements WorkordeService { WQLObject wo = WQLObject.getWQLObject("PDM_BD_WORKORDER"); JSONObject jsonObject = wo.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); JSONObject produceorderMap = new JSONObject(); - produceorderMap.put("workorder_id",workorder_id); - if (row.getString("report_qty").equals("0") || StrUtil.isEmpty(row.getString("report_qty"))){ - produceorderMap.put("report_qty",report_qty); - }else { + produceorderMap.put("workorder_id", workorder_id); + if (row.getString("report_qty").equals("0") || StrUtil.isEmpty(row.getString("report_qty"))) { + produceorderMap.put("report_qty", report_qty); + } else { Integer sum = Integer.parseInt(row.getString("report_qty")) + Integer.parseInt(report_qty); - produceorderMap.put("report_qty",sum); + produceorderMap.put("report_qty", sum); } produceorderMap.put("order_status", "03"); produceorderMap.put("update_optid", currentUserId); @@ -410,20 +417,20 @@ public class WorkorderServiceImpl implements WorkordeService { //同时修改这条工单对应的记录表中最新的一条数据的报工数量 WQLObject wo_record = WQLObject.getWQLObject("MPS_BD_MacOperateRecord"); //获取最新的工单的对应记录信息 - JSONObject newRecord = wo_record.query("workorder_id = '"+workorder_id+"' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); - newRecord.put("report_qty",report_qty); - newRecord.put("finish_qty",jsonObject.getString("real_qty")); + JSONObject newRecord = wo_record.query("workorder_id = '" + workorder_id + "' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); + newRecord.put("report_qty", report_qty); + newRecord.put("finish_qty", jsonObject.getString("real_qty")); Integer finishproduct_qty = Integer.parseInt(jsonObject.getString("real_qty")) - Integer.parseInt(newRecord.getString("init_qty")); - newRecord.put("finishproduct_qty",finishproduct_qty); - newRecord.put("operatetime_end",now); + newRecord.put("finishproduct_qty", finishproduct_qty); + newRecord.put("operatetime_end", now); wo_record.update(newRecord); //wms向acs发送请求 工单暂停 // 报工的时候同时向acs发送工单暂停状态 // TODO JSONArray array = new JSONArray(); JSONObject map = new JSONObject(); - map.put("ext_order_id",workorder_id); - map.put("type","1"); + map.put("ext_order_id", workorder_id); + map.put("type", "1"); array.add(map); wmsToAcsService.orderStatusUpdate(array); } @@ -468,11 +475,11 @@ public class WorkorderServiceImpl implements WorkordeService { JSONObject jsonProduceShiftOrder = wo.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); WQLObject wo_record = WQLObject.getWQLObject("MPS_BD_MacOperateRecord"); //获取最新的工单的对应记录信息 - JSONObject jsonObject = wo_record.query("workorder_id = '"+workorder_id+"' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); + JSONObject jsonObject = wo_record.query("workorder_id = '" + workorder_id + "' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); String finish_qty = jsonProduceShiftOrder.getString("real_qty"); - jsonObject.put("finish_qty",finish_qty); + jsonObject.put("finish_qty", finish_qty); Integer finishproduct_qty = Integer.parseInt(finish_qty) - Integer.parseInt(jsonObject.getString("init_qty")); - jsonObject.put("finishproduct_qty",finishproduct_qty); + jsonObject.put("finishproduct_qty", finishproduct_qty); return jsonObject; } @@ -486,8 +493,8 @@ public class WorkorderServiceImpl implements WorkordeService { public JSONArray getDtl(JSONObject param) { final String workorder_id = param.getString("workorder_id"); JSONObject map = new JSONObject(); - map.put("flag","5"); - map.put("workorder_id",workorder_id); + map.put("flag", "5"); + map.put("workorder_id", workorder_id); JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map).process().getResultJSONArray(0); return resultJSONArray; } @@ -532,10 +539,10 @@ public class WorkorderServiceImpl implements WorkordeService { List> list = workorders.stream().map(o -> { JSONObject workorder = (JSONObject) o; Map workorder_map = new LinkedHashMap<>(); - workorder_map.put("工单编码", workorder.getString("workorder_code")); + workorder_map.put("工单号", workorder.getString("workorder_code")); workorder_map.put("工单状态", workorder.getString("order_status")); workorder_map.put("设备", workorder.getString("device_name")); - workorder_map.put("物料编码", workorder.getString("material_code")); + workorder_map.put("物料编码", workorder.getString("material_number")); workorder_map.put("载具类型", workorder.getString("vehicle_type")); workorder_map.put("计划数量", workorder.getString("plan_qty")); workorder_map.put("计划生产日期", workorder.getString("plan_date")); @@ -553,4 +560,35 @@ public class WorkorderServiceImpl implements WorkordeService { throw new RuntimeException(e); } } + + @Override + public void reportWorkOrderDaily(long workOrderId, int qty, int qualifiedQty, int unqualifiedQty, double weight, double avgPieceWeight) { + String today = DateUtil.today(); + WQLObject wodTable = WQLObject.getWQLObject("pdm_bd_work_order_daily"); + JSONObject workOrderDaily = wodTable.query("workorder_id = " + workOrderId + " AND date = '" + today + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderDaily)) { + workOrderDaily = new JSONObject(); + workOrderDaily.put("id", IdUtil.getSnowflake().nextId()); + workOrderDaily.put("date", today); + workOrderDaily.put("workorder_id", workOrderId); + workOrderDaily.put("qty", qty); + workOrderDaily.put("qualified_qty", qualifiedQty); + workOrderDaily.put("unqualified_qty", unqualifiedQty); + workOrderDaily.put("weight", weight); + workOrderDaily.put("avg_piece_weight", avgPieceWeight); + workOrderDaily.put("is_report", "1"); + TaskUtils.addACSCreateColum(workOrderDaily); + wodTable.insert(workOrderDaily); + } else { + workOrderDaily.put("qty", qty); + workOrderDaily.put("qualified_qty", qualifiedQty); + workOrderDaily.put("unqualified_qty", unqualifiedQty); + workOrderDaily.put("weight", weight); + workOrderDaily.put("avg_piece_weight", avgPieceWeight); + workOrderDaily.put("is_report", "1"); + TaskUtils.addACSUpdateColum(workOrderDaily); + wodTable.update(workOrderDaily); + } + + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql index 1deca4c..ccf1f58 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql @@ -55,7 +55,8 @@ PAGEQUERY SELECT ShiftOrder.*, - material.material_code, + material.material_number, + material.material_name, device.device_name FROM PDM_BD_WORKORDER ShiftOrder @@ -84,7 +85,7 @@ ENDOPTION OPTION 输入.material <> "" ( - material.material_code like 输入.material + material.material_number like 输入.material ) ENDOPTION OPTION 输入.region_code <> "" @@ -115,7 +116,7 @@ SELECT shiftOrder.*, workprocedure.workprocedure_name, - material.material_code, + material.material_number, material.material_spec FROM PDM_BD_WORKORDER shiftOrder @@ -172,7 +173,7 @@ workorder.order_status, workorder.device_id, device.device_code, - material.material_code, + material.material_number, material.product_code, material.a, material.b, @@ -197,7 +198,7 @@ ShiftOrder.workorder_code, d1.label AS order_status, device.device_name, - material.material_code, + material.material_number, d2.label AS vehicle_type, ShiftOrder.plan_qty, ShiftOrder.plan_date, @@ -235,7 +236,7 @@ ENDOPTION OPTION 输入.material <> "" ( - material.material_code like 输入.material + material.material_number like 输入.material ) ENDOPTION OPTION 输入.region_code <> "" diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 3863e34..102f3e0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -257,6 +257,7 @@ public abstract class AbstractAcsTask { point1.put("task_code", ""); point1.put("vehicle_type", ""); point1.put("vehicle_code", ""); + point1.put("vd_id", null); point1.put("point_status", PointStatus.EMPTY.value()); TaskUtils.addACSUpdateColum(point1); point_table.update(point1); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java index 4276dfc..45c7b88 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java @@ -11,18 +11,20 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.sch.AcsUtil; import org.nl.wms.sch.task.AcsTaskDTO; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.reflections.Reflections; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; @Slf4j @Component("autoCreateTask") public class AutoCreateTask { // 下发acs的任务集合 - private List taskList = null; private Set> subTypes = null; WQLObject taskTab = null; @@ -34,13 +36,26 @@ public class AutoCreateTask { subTypes = reflections.getSubTypesOf(AbstractAcsTask.class); } if (ObjectUtil.isNull(taskTab)) taskTab = WQLObject.getWQLObject("sch_base_task"); - taskList = new ArrayList<>(); - this.doExecute(); + RLock lock = SpringContextHolder.getBean(RedissonClient.class).getFairLock("autoCreateTask"); + boolean try_lock = false; + try { + try_lock = lock.tryLock(0, TimeUnit.SECONDS); + if (try_lock) { + this.doExecute(); + } + } catch (Exception e) { + log.error("auto create task error !", e); + } finally { + if (try_lock) { + lock.unlock(); + } + } } private void doExecute() { + ArrayList taskList = new ArrayList<>(); subTypes.forEach(clz -> { // 调用AbstractAcsTask类的每个子类的schedule()方法 try { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoUpdateStandStatus.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoUpdateStandStatus.java index eadf5b8..32dffb7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoUpdateStandStatus.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoUpdateStandStatus.java @@ -36,7 +36,7 @@ public class AutoUpdateStandStatus { for (int i = 0; i < vds.size(); i++) { JSONObject vd = vds.getJSONObject(i); DateTime create_time = DateUtil.parse(vd.getString("create_time")); - DateTime time = DateUtil.offsetMinute(create_time, vd.getIntValue("standing_time")); + DateTime time = DateUtil.offsetMinute(create_time, vd.getIntValue("stand_time")); int compare = DateUtil.compare(DateUtil.date(), time); if (compare >= 0) { ids.add(vd.getLong("vd_id")); @@ -58,8 +58,8 @@ public class AutoUpdateStandStatus { JSONObject vd = vds.getJSONObject(i); DateTime create_time = DateUtil.parse(vd.getString("create_time")); int threshold_time = vd.getIntValue("threshold_time"); - int standing_time = vd.getIntValue("standing_time"); - if (threshold_time != 0 && threshold_time < standing_time) { + int stand_time = vd.getIntValue("stand_time"); + if (threshold_time != 0 && threshold_time < stand_time) { DateTime time = DateUtil.offsetMinute(create_time, threshold_time); int compare = DateUtil.compare(DateUtil.date(), time); if (compare >= 0) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/PointStatus.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/PointStatus.java index 41aae09..e22df5a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/PointStatus.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/PointStatus.java @@ -12,7 +12,7 @@ public enum PointStatus { EMPTY("空位", "1"), EMPTY_VEHICLE("空载具", "2"), - HAS_GOODS("有货", "3"); + HAS_GOODS("有箱有料", "3"); private final String label; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/Region.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/Region.java index 549bbe5..c8dd013 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/Region.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/Region.java @@ -17,10 +17,10 @@ public enum Region { HL("混料区", "HL"), KLHJ("困料货架", "KLHJ"), YZ("压制区", "YZ"), - BCPHJ("半成品货架", "BCPHJ"), - SZ("烧制区", "SZ"), + YQHJ("窑前货架", "YQHJ"), + GZ("干燥区", "GZ"), + YHHJ("窑后货架", "YHHJ"), FJ("分拣区", "FJ"), - BTHC("半托缓存区", "BTHC"), GTK("钢托库", "GTK"); private final String label; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/wql/MANAGE_QUERY.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/wql/MANAGE_QUERY.wql index 2e574ff..fbbea6e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/wql/MANAGE_QUERY.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/wql/MANAGE_QUERY.wql @@ -41,7 +41,7 @@ QUERY SELECT vd.*, - mb.standing_time + mb.stand_time FROM st_ivt_vehicle_detail vd LEFT JOIN md_me_materialbase mb ON vd.material_id = mb.material_id @@ -57,7 +57,7 @@ QUERY SELECT vd.*, - mb.standing_time, + mb.stand_time, mb.threshold_time FROM st_ivt_vehicle_detail vd diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java index 68062d7..a0f22c9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java @@ -43,7 +43,7 @@ public class PointDto implements Serializable { /** 锁定类型 */ private String lock_type; - /** 设备编码 */ + /** 设备号 */ private String device_code; /** 载具类型 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java index 24911c7..9eae8e3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java @@ -72,7 +72,7 @@ public class TaskQueryDto implements Serializable { /** * 物料编码 */ - private String material_code; + private String material_number; /** * 车号 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index 45ad63f..a4b2541 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -112,7 +112,7 @@ public class PointServiceImpl implements PointService { String point_code = dto.getPoint_code(); PointDto byCode = this.findByCode(point_code); if (ObjectUtil.isNotEmpty(byCode)) { - throw new BadRequestException("存在相同的点位编码"); + throw new BadRequestException("存在相同的点位号"); } Long currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java index 4faf50e..af5ed84 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java @@ -45,7 +45,7 @@ public class RegionServiceImpl implements RegionService { map.put("flag", "1"); if (ObjectUtil.isNotEmpty(region_code)) map.put("region_code",region_code+"%"); - JSONObject json = WQL.getWO("QSCH_REGION_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "region.region_code ASC"); + JSONObject json = WQL.getWO("QSCH_REGION_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "region.create_time DESC"); return json; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/YZCallEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/YZCallEmptyTask.java index 0795382..25af5b2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/YZCallEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/YZCallEmptyTask.java @@ -39,12 +39,12 @@ public class YZCallEmptyTask extends AbstractAcsTask { @Override public String createTask(JSONObject form) { JSONObject point = form.getJSONObject("point"); - JSONObject work_order = form.getJSONObject("workorder"); + JSONObject workOrder = form.getJSONObject("workorder"); int priority = 1; - String material_id = null; - if (ObjectUtil.isNotEmpty(work_order)) { - priority = TrueOrFalse.trueOrFalse(work_order.getString("is_urgent")) ? 50 : 1; - material_id = work_order.getString("material_id"); + String materialId = null; + if (ObjectUtil.isNotEmpty(workOrder)) { + priority = TrueOrFalse.trueOrFalse(workOrder.getString("is_urgent")) ? 2 : 1; + materialId = workOrder.getString("material_id"); } JSONObject task = TaskUtils.buildTask( @@ -54,7 +54,7 @@ public class YZCallEmptyTask extends AbstractAcsTask { null, point.getString("point_code"), null, - material_id, + materialId, VehicleType.STEEL_TRAY.value(), null, priority, @@ -90,34 +90,52 @@ public class YZCallEmptyTask extends AbstractAcsTask { JSONObject point = null; String material_id = task.getString("material_id"); if (StrUtil.isNotBlank(material_id)) { - point = WQL + point = WQL .getWO("CALL_EMPTY_TASK") - .addParam("flag", "1") + .addParam("flag", "2") .addParam("point_code", task.getString("point_code2")) .addParam("material_id", material_id) .process() .uniqueResult(0); + + if (ObjectUtil.isNotEmpty(point)) { + task.put("task_status", TaskStatus.START_AND_END.value()); + task.put("point_code1", point.getString("point_code")); + task.put("vehicle_type", VehicleType.STEEL_TRAY.value()); + task.put("vehicle_code", TaskUtils.formatVehicleCode(point.getString("vehicle_code"))); + task.put("group_id", point.getLongValue("vd_id")); + task.put("remark", ""); + TaskUtils.addAutoUpdateColum(task); + task_table.update(task); + + point.put("lock_type", LockType.TASK_LOCKED.value()); + point.put("task_code", task.getString("task_code")); + TaskUtils.addAutoUpdateColum(point); + point_table.update(point); + } } if (ObjectUtil.isEmpty(point)) { - task.put("material_id", null); point = WQL .getWO("CALL_EMPTY_TASK") - .addParam("flag", "2") + .addParam("flag", "1") .process() .uniqueResult(0); - } - if (ObjectUtil.isNotEmpty(point)) { - task.put("task_status", TaskStatus.START_AND_END.value()); - task.put("point_code1", point.getString("point_code")); - task.put("vehicle_code", TaskUtils.formatVehicleCode(point.getString("vehicle_code"))); - task.put("remark", ""); - TaskUtils.addAutoUpdateColum(task); - task_table.update(task); - point.put("lock_type", LockType.TASK_LOCKED.value()); - point.put("task_code", task.getString("task_code")); - TaskUtils.addAutoUpdateColum(point); - point_table.update(point); + if (ObjectUtil.isNotEmpty(point)) { + task.put("task_status", TaskStatus.START_AND_END.value()); + task.put("point_code1", point.getString("point_code")); + task.put("vehicle_type", VehicleType.STEEL_TRAY.value()); + task.put("vehicle_code", TaskUtils.formatVehicleCode(point.getString("vehicle_code"))); + task.put("material_id", null); + task.put("remark", ""); + TaskUtils.addAutoUpdateColum(task); + task_table.update(task); + + point.put("lock_type", LockType.TASK_LOCKED.value()); + point.put("task_code", task.getString("task_code")); + TaskUtils.addAutoUpdateColum(point); + point_table.update(point); + } } } } @@ -186,14 +204,14 @@ public class YZCallEmptyTask extends AbstractAcsTask { } } - public void finishTask(JSONObject task, OperationType operation_type) { + public void finishTask(JSONObject task, OperationType operation_type) { int current_task_status = task.getIntValue("task_status"); if (current_task_status < Integer.parseInt(TaskStatus.FINISHED.value())) { if (operation_type == OperationType.MANUAL - && current_task_status < Integer.parseInt(TaskStatus.START_AND_END.value())) { + && current_task_status < Integer.parseInt(TaskStatus.START_AND_END.value())) { throw new BadRequestException("只能手动完成 [确认起点和终点] 之后的任务!"); } - + task.put("task_status", TaskStatus.FINISHED.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(task); @@ -232,6 +250,7 @@ public class YZCallEmptyTask extends AbstractAcsTask { point2.put("task_code", ""); point2.put("vehicle_type", task.getString("vehicle_type")); point2.put("vehicle_code", task.getString("vehicle_code")); + point2.put("vd_id", task.getString("group_id")); point2.put("point_status", PointStatus.EMPTY_VEHICLE.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point2); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql index 64eef90..a2bbeeb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql @@ -15,7 +15,6 @@ ################################################# 输入.flag TYPEAS s_string 输入.point_code TYPEAS s_string - 输入.vehicle_type TYPEAS s_string 输入.material_id TYPEAS f_string [临时表] @@ -42,29 +41,6 @@ IF 输入.flag = "1" QUERY - SELECT - * - FROM - sch_base_point point - LEFT JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type - AND point.vehicle_code = vd.vehicle_code - WHERE - point.is_used = '1' - AND point.lock_type = '1' - AND point.region_code = 'BCPHJ' - AND point.point_status = '1' - AND point.vehicle_type = '2' - AND vd.is_delete = '0' - AND vd.point_code = 输入.point_code - AND vd.material_id = 输入.material_id - AND vd.is_full = '0' - AND vd.is_in_kiln = '0' - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY SELECT * FROM @@ -73,90 +49,25 @@ is_used = '1' AND lock_type = '1' AND region_code = 'GTK' - AND point_type = '3' + AND point_type = '1' ENDSELECT - ENDQUERY - ENDIF + ENDQUERY + ENDIF - IF 输入.flag = "3" - QUERY - SELECT - point.* + IF 输入.flag = "2" + QUERY + SELECT + p.* FROM - sch_base_point point - LEFT JOIN sch_base_task task ON point.point_code = task.point_code1 - AND task.task_status <> '7' - AND task_status <> '8' + sch_base_point p + LEFT JOIN st_ivt_vehicle_detail vd ON p.vd_id = vd.vd_id WHERE - point.is_used = '1' - AND point.lock_type = '1' - AND point.region_code = 'GTK' - AND point.point_type = '1' - AND task.task_id IS NULL - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "4" - QUERY - SELECT - tpw.* - FROM - sch_base_point tpw - LEFT JOIN sch_base_point djw ON tpw.device_code = djw.point_code - WHERE - tpw.is_used = '1' - AND djw.is_used = '1' - AND tpw.region_code = 'FJ' - AND djw.region_code = 'FJ' - AND tpw.point_type = '4' - AND djw.point_type = '3' - AND djw.lock_type = '1' - AND tpw.vehicle_type = 输入.vehicle_type - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "5" - QUERY - SELECT - point.* - FROM - sch_base_point point - LEFT JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type - AND point.vehicle_code = vd.vehicle_code - AND vd.is_delete = '0' - WHERE - is_used = '1' - AND lock_type = '1' - AND region_code = 'KLHJ' - AND point_type = '1' - AND point_status = '1' - AND point.vehicle_type = '1' - AND vd.vd_id IS NULL - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "6" - QUERY - SELECT - point.*, - vd.vd_id - FROM - sch_base_point point - LEFT JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type - AND point.vehicle_code = vd.vehicle_code + p.is_used = '1' + AND p.lock_type = '1' AND vd.is_delete = '0' - WHERE - point.is_used = '1' - AND point.lock_type = '1' - AND point.region_code = 'BTHC' - AND point.point_type = '1' - AND point.point_status = '1' - AND point.vehicle_type = 输入.vehicle_type - AND vd.material_id = 输入.material_id + AND vd.is_full = '0' AND vd.point_code = 输入.point_code + AND vd.material_id = 输入.material_id ENDSELECT - ENDQUERY - ENDIF + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/GZCallMaterialTask.java similarity index 94% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/GZCallMaterialTask.java index 6ae5e32..f4444b2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/GZCallMaterialTask.java @@ -2,7 +2,6 @@ package org.nl.wms.sch.task.call.material; 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 org.nl.modules.common.exception.BadRequestException; @@ -18,7 +17,7 @@ import org.springframework.stereotype.Component; */ @RequiredArgsConstructor @Component -public class SZCallMaterialTask extends AbstractAcsTask { +public class GZCallMaterialTask extends AbstractAcsTask { @Override @@ -40,7 +39,7 @@ public class SZCallMaterialTask extends AbstractAcsTask { JSONObject point = form.getJSONObject("point"); JSONObject task = TaskUtils.buildTask( - "烧制区叫料", + "干燥区叫料", TaskType.CALL_MATERIAL.value(), TaskStatus.SURE_END.value(), null, @@ -50,7 +49,7 @@ public class SZCallMaterialTask extends AbstractAcsTask { VehicleType.STEEL_TRAY.value(), null, 1, - SZCallMaterialTask.class.getName(), + GZCallMaterialTask.class.getName(), form.getString("create_mode"), form.getString("request_param"), form.getString("create_id"), @@ -181,6 +180,7 @@ public class SZCallMaterialTask extends AbstractAcsTask { point1.put("task_code", ""); point1.put("vehicle_type", ""); point1.put("vehicle_code", ""); + point1.put("vd_id", null); point1.put("point_status", PointStatus.EMPTY.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point1); @@ -191,8 +191,12 @@ public class SZCallMaterialTask extends AbstractAcsTask { } JSONObject point2 = new JSONObject(); + point2.put("point_status", PointStatus.HAS_GOODS.value()); point2.put("lock_type", LockType.UNLOCKED.value()); point2.put("task_code", ""); + point2.put("vehicle_type", task.getString("vehicle_type")); + point2.put("vehicle_code", task.getString("vehicle_code")); + point2.put("vd_id", task.getString("group_id")); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point2); } else if (operation_type == OperationType.MANUAL) { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql index 806c5c5..b509ae0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql @@ -42,26 +42,22 @@ IF 输入.flag = "1" QUERY SELECT - point.*, - vd.vd_id, + p.*, vd.material_id, - workorder.is_urgent + wo.is_urgent FROM - sch_base_point point - JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type - AND point.vehicle_code = vd.vehicle_code - AND vd.is_delete = '0' - LEFT JOIN pdm_bd_workorder workorder ON vd.workorder_id = workorder.workorder_id + sch_base_point p + LEFT JOIN st_ivt_vehicle_detail vd ON p.vd_id = vd.vd_id + LEFT JOIN pdm_bd_workorder wo ON vd.workorder_id = wo.workorder_id WHERE - point.is_used = '1' - AND point.lock_type = '1' - AND point.region_code = 'BCPHJ' - AND point.point_status = '1' - AND point.vehicle_type = '2' - AND vd.is_fire = '0' - AND vd.is_in_kiln = '1' + p.is_used = '1' + AND p.lock_type = '1' + AND p.region_code = 'YQHJ' + AND p.point_type = '1' + AND p.point_status = '3' ORDER BY - workorder.is_urgent DESC, vd.create_time ASC + wo.is_urgent DESC, + vd.create_time ASC ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/GZSendMaterialTask.java similarity index 98% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/GZSendMaterialTask.java index 4c93bfc..3c22800 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/GZSendMaterialTask.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component; */ @RequiredArgsConstructor @Component -public class SZSendMaterialTask extends AbstractAcsTask { +public class GZSendMaterialTask extends AbstractAcsTask { @Override @@ -50,7 +50,7 @@ public class SZSendMaterialTask extends AbstractAcsTask { vd.getString("vehicle_type"), vd.getString("vehicle_code"), 1, - SZSendMaterialTask.class.getName(), + GZSendMaterialTask.class.getName(), form.getString("create_mode"), form.getString("request_param"), form.getString("create_id"), @@ -71,7 +71,7 @@ public class SZSendMaterialTask extends AbstractAcsTask { public void findNextPoint() { WQLObject task_table = WQLObject.getWQLObject("sch_base_task"); JSONArray tasks = task_table - .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + SZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC") + .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + GZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC") .getResultJSONArray(0); if (ObjectUtil.isNotEmpty(tasks)) { WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java index 83541d6..4ecb3dc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java @@ -39,7 +39,7 @@ public class YZSendMaterialTask extends AbstractAcsTask { public String createTask(JSONObject form) { JSONObject point = form.getJSONObject("point"); JSONObject work_order = form.getJSONObject("workorder"); - int priority = TrueOrFalse.trueOrFalse(work_order.getString("is_urgent")) ? 50 : 1; + int priority = TrueOrFalse.trueOrFalse(work_order.getString("is_urgent")) ? 2 : 1; JSONObject vd = form.getJSONObject("vd"); JSONObject task = TaskUtils.buildTask( @@ -48,7 +48,7 @@ public class YZSendMaterialTask extends AbstractAcsTask { TaskStatus.SURE_START.value(), point.getString("point_code"), null, - vd.getLong("vd_id"), + vd.getLongValue("vd_id"), vd.getString("material_id"), vd.getString("vehicle_type"), vd.getString("vehicle_code"), @@ -63,6 +63,7 @@ public class YZSendMaterialTask extends AbstractAcsTask { point.put("lock_type", LockType.TASK_LOCKED.value()); point.put("task_code", task.getString("task_code")); + point.put("vd_id", vd.getLongValue("vd_id")); TaskUtils.addFormUpdateColum(point, form); WQLObject.getWQLObject("sch_base_point").update(point); @@ -145,6 +146,7 @@ public class YZSendMaterialTask extends AbstractAcsTask { && task.getString("task_code").equals(point1.getString("task_code"))) { point1.put("lock_type", LockType.UNLOCKED.value()); point1.put("task_code", ""); + point1.put("vd_id", null); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point1); } else if (operation_type == OperationType.MANUAL) { @@ -172,14 +174,14 @@ public class YZSendMaterialTask extends AbstractAcsTask { } - public void finishTask(JSONObject task, OperationType operation_type) { + public void finishTask(JSONObject task, OperationType operation_type) { int current_task_status = task.getIntValue("task_status"); if (current_task_status < Integer.parseInt(TaskStatus.FINISHED.value())) { if (operation_type == OperationType.MANUAL - && current_task_status < Integer.parseInt(TaskStatus.START_AND_END.value())) { + && current_task_status < Integer.parseInt(TaskStatus.START_AND_END.value())) { throw new BadRequestException("只能手动完成 [确认起点和终点] 之后的任务!"); } - + task.put("task_status", TaskStatus.FINISHED.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(task); @@ -217,6 +219,7 @@ public class YZSendMaterialTask extends AbstractAcsTask { point2.put("task_code", ""); point2.put("vehicle_type", task.getString("vehicle_type")); point2.put("vehicle_code", task.getString("vehicle_code")); + point2.put("vd_id", task.getLongValue("group_id")); point2.put("point_status", PointStatus.HAS_GOODS.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point2); @@ -225,19 +228,6 @@ public class YZSendMaterialTask extends AbstractAcsTask { } point_table.update(point2, "point_code = '" + point_code2 + "'"); } - - JSONObject workorder = WQL - .getWO("SEND_MATERIAL_TASK") - .addParam("flag", "7") - .addParam("vd_id", task.getString("group_id")) - .process() - .uniqueResult(0); - - JSONObject workorder_update = new JSONObject(); - workorder_update.put("real_qty", workorder.getIntValue("real_qty") + workorder.getIntValue("qty")); - workorder_update.put("qualified_qty", workorder.getIntValue("qualified_qty") + workorder.getIntValue("qty")); - TaskUtils.addACSUpdateColum(workorder_update); - WQLObject.getWQLObject("pdm_bd_workorder").update(workorder_update, "workorder_id = " + workorder.getString("workorder_id")); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql index 4d94fa2..f50924a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql @@ -50,11 +50,9 @@ WHERE is_used = '1' AND lock_type = '1' - AND region_code = 'BCPHJ' + AND point_status = '1' + AND region_code = 'YQHJ' AND point_type = '1' - AND point_status = '0' - ORDER BY - point_code ASC ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java index d5518f2..53ab5e0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java @@ -132,6 +132,12 @@ public class TaskUtils { return vehicle_code; } + public static void addACSCreateColum(JSONObject row) { + row.put("create_id", ACSSystem.id); + row.put("create_name", ACSSystem.nick_name); + row.put("create_time", DateUtil.now()); + } + public static void addACSUpdateColum(JSONObject row) { row.put("update_optid", ACSSystem.id); row.put("update_optname", ACSSystem.nick_name); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/wql/TASK_UTILS.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/wql/TASK_UTILS.wql index 1e4d311..fe314b7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/wql/TASK_UTILS.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/wql/TASK_UTILS.wql @@ -45,7 +45,7 @@ vd.qty, vd.weight AS vd_weight, material.weight AS material_weight, - material.material_code, + material.material_number, material.order_code FROM st_ivt_vehicle_detail vd @@ -60,7 +60,7 @@ QUERY SELECT workorder.unqualified_qty AS qty, - material.material_code AS material_code, + material.material_number AS material_number, material.weight AS material_weight, material.order_code, device.region_code diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql index 816cf5c..bada08e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_BASE_POINT.wql @@ -50,10 +50,10 @@ PAGEQUERY SELECT point.*, - material.material_code + material.material_number FROM sch_base_point point - LEFT JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type AND point.vehicle_code = vd.vehicle_code AND vd.is_delete = '0' + LEFT JOIN st_ivt_vehicle_detail vd ON point.vd_id = vd.vd_id LEFT JOIN md_me_materialbase material ON vd.material_id = material.material_id WHERE 1 = 1 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql index aa46e8b..7df36fc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql @@ -56,7 +56,7 @@ point1.region_name AS point1_region_name, point2.point_name AS point2_name, point2.region_name AS point2_region_name, - material.material_code, + material.material_number, dd.label AS task_status_name FROM sch_base_task task diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 471100b63fec45e59c1145063f38f91bd6638121..27e8d3fe2cf1f380a26262eddff19e36d80a1edb 100644 GIT binary patch delta 38462 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�byd%{SQ?!|q1MI)7XecG7%�baJ!@?IXH*)b-5Qv0 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 H%;5hI#nX>W delta 74895 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 BBw+vm diff --git a/lms/nladmin-system/src/main/resources/config/application-prod.yml b/lms/nladmin-system/src/main/resources/config/application-prod.yml index 14d60b1..527a6ba 100644 --- a/lms/nladmin-system/src/main/resources/config/application-prod.yml +++ b/lms/nladmin-system/src/main/resources/config/application-prod.yml @@ -6,7 +6,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.220}:${DB_PORT:3306}/${DB_NAME:lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.220}:${DB_PORT:3306}/${DB_NAME:lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 diff --git a/lms/nladmin-system/src/main/resources/config/application.yml b/lms/nladmin-system/src/main/resources/config/application.yml index 6f01423..942ceff 100644 --- a/lms/nladmin-system/src/main/resources/config/application.yml +++ b/lms/nladmin-system/src/main/resources/config/application.yml @@ -2,7 +2,7 @@ spring: freemarker: check-template-location: false profiles: - active: dev + active: prod jackson: time-zone: GMT+8 data: diff --git a/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java b/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java index 3d46780..bc597c3 100644 --- a/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java +++ b/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java @@ -22,14 +22,14 @@ public class PointTest { JSONObject point = new JSONObject(); WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); String now = DateUtil.now(); - for (int i = 1; i < 10; i++) { + for (int i = 1; i <= 24; i++) { point.put("point_id", IdUtil.getSnowflake(1L, 1L).nextId()); - point.put("point_code", "YJ" + String.format("%02d", i + 1) + "SL01"); - point.put("point_name", "压机" + (i + 1) + "上料位"); - point.put("region_id", "1643438714497667072"); - point.put("region_code", "YZ"); - point.put("region_name", "压制区"); - point.put("point_type", "2"); + point.put("point_code", "YHHW" + String.format("%02d", i)); + point.put("point_name", "窑后货位" + i); + point.put("region_id", 1695713466955993088L); + point.put("region_code", "YHHJ"); + point.put("region_name", "窑后货架"); + point.put("point_type", "1"); point.put("lock_type", "1"); point.put("create_id", 1); point.put("create_name", "管理员"); diff --git a/lms/nladmin-ui/src/views/generator/index.vue b/lms/nladmin-ui/src/views/generator/index.vue index 8bdf5a8..b67f670 100644 --- a/lms/nladmin-ui/src/views/generator/index.vue +++ b/lms/nladmin-ui/src/views/generator/index.vue @@ -25,7 +25,7 @@ - + - + @@ -198,11 +198,6 @@ {{ dict.label.true_or_false[scope.row.is_urgent] }} - - - @@ -274,7 +269,7 @@ const defaultForm = { plan_qty: null, real_qty: null, material_id: null, - material_code: null, + material_number: null, material_weight: null, vehicle_type: '1', planproducestart_date: null, @@ -303,7 +298,7 @@ const defaultForm = { is_new: '1', is_package: '1', warn_time: '0', - standing_time: '0', + stand_time: '0', is_urgent: '0', is_pri: '0', ext_code: null, @@ -350,8 +345,8 @@ export default { plan_qty: [ { required: true, message: '计划数量不能为空', trigger: 'blur' } ], - material_code: [ - { required: true, message: '物料编码不能为空', trigger: 'change' } + material_number: [ + { required: true, message: '物料号不能为空', trigger: 'change' } ], vehicle_type: [ { required: true, message: '木托盘类型不能为空', trigger: 'blur' } @@ -430,7 +425,7 @@ export default { }, setMaterValue(row) { this.form.material_id = row.material_id - this.form.material_code = row.material_code + this.form.material_number = row.material_number }, // 下发 submits(row) { diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue index 8e6610a..3ce0d5a 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -20,11 +20,11 @@ @keyup.enter.native="crud.toQuery" /> - + @@ -88,16 +88,6 @@ > 强制完成 - - 导出Excel - - + @@ -139,13 +129,23 @@ - + + + + 千克 + + + @@ -194,8 +194,8 @@ @@ -210,22 +210,14 @@ {{ dict.label.pdm_workorder_status[scope.row.order_status] }} - + - - - + - - + + diff --git a/lms/nladmin-ui/src/views/wms/pub/DeviceDialog.vue b/lms/nladmin-ui/src/views/wms/pub/DeviceDialog.vue index d9a4445..0dda6df 100644 --- a/lms/nladmin-ui/src/views/wms/pub/DeviceDialog.vue +++ b/lms/nladmin-ui/src/views/wms/pub/DeviceDialog.vue @@ -15,11 +15,11 @@ label-width="90px" label-suffix=":" > - + @@ -45,7 +45,7 @@ - + - + diff --git a/lms/nladmin-ui/src/views/wms/pub/MaterDialog.vue b/lms/nladmin-ui/src/views/wms/pub/MaterDialog.vue index 1409ddd..0e5a226 100644 --- a/lms/nladmin-ui/src/views/wms/pub/MaterDialog.vue +++ b/lms/nladmin-ui/src/views/wms/pub/MaterDialog.vue @@ -15,30 +15,21 @@ label-width="90px" label-suffix=":" > - + - + - - - @@ -64,10 +55,8 @@ - - - - + + diff --git a/lms/nladmin-ui/src/views/wms/pub/PointDialog.vue b/lms/nladmin-ui/src/views/wms/pub/PointDialog.vue index 0916e1e..9ca97bc 100644 --- a/lms/nladmin-ui/src/views/wms/pub/PointDialog.vue +++ b/lms/nladmin-ui/src/views/wms/pub/PointDialog.vue @@ -12,7 +12,7 @@ - + @@ -39,7 +39,7 @@ - + diff --git a/lms/nladmin-ui/src/views/wms/sch/point/MaterialDialog.vue b/lms/nladmin-ui/src/views/wms/sch/point/MaterialDialog.vue index b5f8400..64b2c43 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/MaterialDialog.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/MaterialDialog.vue @@ -47,13 +47,13 @@ - + - + diff --git a/lms/nladmin-ui/src/views/wms/sch/point/ViewDialog.vue b/lms/nladmin-ui/src/views/wms/sch/point/ViewDialog.vue index d8321dc..3a6ab90 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/ViewDialog.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/ViewDialog.vue @@ -14,36 +14,36 @@ - - + + - + - - + + - + - + - + - + - + - - + + - + @@ -56,30 +56,30 @@ - - + + - + - + - + - + - + - + - + @@ -91,30 +91,30 @@ - - + + - + - + - + - + - + - + - + @@ -126,30 +126,30 @@ - - + + - + - + - + - + - + - + - + @@ -169,15 +169,15 @@ :highlight-current-row="true" :header-cell-style="{background:'#f5f7fa',color:'#606266'}" > - - - - - - - - - + + + + + + + + + - + + @click="changeShowTab" + > 编辑 + @click="doEdit(crud.data)" + > 保存 - - + + @@ -204,6 +210,7 @@ > @@ -218,23 +225,23 @@ - - + + - + - - + + @@ -259,7 +267,7 @@ - +