From 1d3d755603de54c119ae0a48dfede999406f1ca8 Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Tue, 24 May 2022 15:14:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HaiLiangFeedingDefination.java | 11 +- .../HaiLiangFeedingDeviceDriver.java | 123 +++++++++++++++--- .../hailiang_feeding/ItemProtocol.java | 33 +++-- .../HaiLiangFeedingTrunkDefination.java | 21 ++- .../HaiLiangFeedingTrunkDeviceDriver.java | 68 +++++++++- .../hailiang_feeding_trunk/ItemProtocol.java | 101 +++++++++++--- .../impl/ProduceshiftorderServiceImpl.java | 4 +- .../org/nl/acs/order/service/wql/order.xls | Bin 185344 -> 185344 bytes 8 files changed, 306 insertions(+), 55 deletions(-) diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDefination.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDefination.java index 70485ff..6791ff5 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDefination.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDefination.java @@ -57,9 +57,14 @@ public class HaiLiangFeedingDefination implements OpcDeviceDriverDefination { public static List getReadableItemDtos2() { List list = new ArrayList(); list.add(new ItemDto(ItemProtocol.item_heartbeat, "心跳", "DB600.B0")); - list.add(new ItemDto(ItemProtocol.item_mode, "工作状态", "DB600.B1", true)); - list.add(new ItemDto(ItemProtocol.item_action, "动作信号", "DB600.B2")); - list.add(new ItemDto(ItemProtocol.item_error, "报警信号", "DB600.B4")); + list.add(new ItemDto(ItemProtocol.item_mode, "工作模式", "DB600.B2", Boolean.valueOf(true))); + list.add(new ItemDto(ItemProtocol.item_error, "故障信号", "DB600.B3")); + list.add(new ItemDto(ItemProtocol.item_order, "当前执行工单号", "DB600.D8")); + list.add(new ItemDto(ItemProtocol.item_order_detail, "当前工单明细号", "DB600.D12")); + list.add(new ItemDto(ItemProtocol.item_order_qty, "当前工单上料数量 ", "DB600.D16")); + list.add(new ItemDto(ItemProtocol.item_order_qualified_qty, "当前工单上料合格数量", "DB600.D20")); + list.add(new ItemDto(ItemProtocol.item_detail_qty, "当前工单实时上料数量", "DB600.D24")); + list.add(new ItemDto(ItemProtocol.item_detail_qualified_qty, "当前工单明细号合格数量", "DB600.D28")); return list; } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java index 4b76e95..754b6a2 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java @@ -1,25 +1,16 @@ package org.nl.acs.device_driver.hailiang.hailiang_feeding; -import com.alibaba.fastjson.JSONObject; +import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; -import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; -import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.opc.Device; -import org.nl.acs.route.service.RouteLineService; -import org.nl.acs.task.service.TaskService; -import org.nl.utils.SpringContextHolder; -import org.openscada.opc.lib.da.Server; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.List; /** * 海亮-上料线体 @@ -27,7 +18,8 @@ import java.util.Map; @Slf4j @Data @RequiredArgsConstructor -public class HaiLiangFeedingDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver { +public class HaiLiangFeedingDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver { + protected ItemProtocol itemProtocol = new ItemProtocol(this); @Override public Device getDevice() { @@ -35,9 +27,110 @@ public class HaiLiangFeedingDeviceDriver extends AbstractOpcDeviceDriver impleme } + String device_code; + int mode = 0; + int error = 0; + int move = 0; + int order = 0; + int order_detail = 0; + @Override public void execute() { - +// String message = null; +// try { +// device_code = this.getDeviceCode(); +// mode = this.itemProtocol.getMode(); +// error = this.itemProtocol.getError(); +// move = this.itemProtocol.getMove(); +// task = this.itemProtocol.getTask(); +// action = this.itemProtocol.getAction(); +// ioaction = this.itemProtocol.getIoAction(); +// height = this.itemProtocol.getHeight(); +// operation_type = this.itemProtocol.getOperation_type(); +// direction = this.itemProtocol.getDirection(); +// hasGoods = this.itemProtocol.getMove(); +// +// if (mode != last_mode) { +// this.setRequireSucess(false); +// } +// if (move != last_move) { +// if (move == 0) { +// thingToNothing(); +// } +// } +// if (error != last_error) { +// } +// if (mode == 2 && move != 0 && task > 0) { +// //inst_message +// inst = instructionService.findByCodeFromCache(String.valueOf(task)); +// if (inst != null) { +// inst_message = "指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); +// if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { +// inst.setInstruction_status("1"); +// instructionService.update(inst); +// } +// if (StrUtil.equals(inst.getInstruction_status(), "1") && StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { +// finish_instruction(); +// } +// } +// } +// +// if (getBarcode() != null) { +// +// } +// } catch (Exception var17) { +// return; +// } +// if (!this.itemProtocol.getIsonline()) { +// this.setIsonline(false); +// this.setIserror(true); +// message = "信号量同步异常"; +// //未联机 +// } else if (mode == 0) { +// this.setIsonline(false); +// this.setIserror(true); +// message = "未联机"; +// //有报警 +// } else if (error != 0) { +// this.setIsonline(false); +// this.setIserror(true); +// message = "有报警"; +// //无报警 +// } else { +// this.setIsonline(true); +// this.setIserror(false); +// message = ""; +// Instruction instruction = null; +// List toInstructions; +// switch (mode) { +// case 1: +// log.debug("设备运转模式:等待工作"); +// break; +// case 2: +// //申请任务 +// if (hasGoods > 0 && !StrUtil.isEmpty(barcode()) && height > 0 && !requireSucess) { +// instruction_require(barcode()); +// } +// if (hasGoods > 0 && !StrUtil.isEmpty(barcode()) && height > 0 && !applySucess) { +// instruction_apply(barcode()); +// } +// } +// switch (flag) { +// //取货完成 +// case 1: +// writing(2); +// break; +// //放货完成 +// case 2: +// writing(3); +// break; +// +// } +// } +// last_mode = mode; +// last_error = error; +// last_move = move; +// last_task = task; } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/ItemProtocol.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/ItemProtocol.java index aa87802..76faf21 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/ItemProtocol.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/ItemProtocol.java @@ -10,8 +10,20 @@ import java.util.List; public class ItemProtocol { public static String item_heartbeat = "heartbeat"; public static String item_mode = "mode"; - public static String item_action = "action"; + public static String item_move = "move"; public static String item_error = "error"; + public static String item_order = "order"; + public static String item_order_detail = "order_detail"; + //当前工单上料数量 + public static String item_order_qty = "order_qty"; + //当前工单明细号上料数量 + public static String item_order_qualified_qty = "order_qualified_qty"; + //当前工单实时上料数量 + public static String item_detail_qty = "detail_qty"; + //当前工单明细号合格数量 + public static String item_detail_qualified_qty = "detail_qualified_qty"; + + public static String item_to_command = "to_command"; @@ -29,10 +41,6 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_mode); } - public int getAction() { - return this.getOpcIntegerValue(item_action); - } - public int getError() { return this.getOpcIntegerValue(item_error); } @@ -55,16 +63,21 @@ public class ItemProtocol { public static List getReadableItemDtos() { ArrayList list = new ArrayList(); - list.add(new ItemDto(item_heartbeat, "心跳", "DB51.B0")); - list.add(new ItemDto(item_mode, "工作状态", "DB51.B1", Boolean.valueOf(true))); - list.add(new ItemDto(item_action, "动作信号", "DB51.B2")); - list.add(new ItemDto(item_error, "报警信号", "DB51.B4")); + list.add(new ItemDto(item_heartbeat, "心跳", "DB600.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB600.B2", Boolean.valueOf(true))); + list.add(new ItemDto(item_error, "故障信号", "DB600.B3")); + list.add(new ItemDto(item_order, "当前执行工单号", "DB600.D8")); + list.add(new ItemDto(item_order_detail, "当前工单明细号", "DB600.D12")); + list.add(new ItemDto(item_order_qty, "当前工单上料数量 ", "DB600.D16")); + list.add(new ItemDto(item_order_qualified_qty, "当前工单上料合格数量", "DB600.D20")); + list.add(new ItemDto(item_detail_qty, "当前工单实时上料数量", "DB600.D24")); + list.add(new ItemDto(item_detail_qualified_qty, "当前工单明细号合格数量", "DB600.D28")); return list; } public static List getWriteableItemDtos() { ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_command, "作业命令", "DB52.W2", Boolean.valueOf(true))); + list.add(new ItemDto(item_to_command, "作业命令", "DB601.D2", Boolean.valueOf(true))); return list; } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDefination.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDefination.java index 6ca685c..7f27215 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDefination.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDefination.java @@ -57,9 +57,24 @@ public class HaiLiangFeedingTrunkDefination implements OpcDeviceDriverDefination public static List getReadableItemDtos2() { List list = new ArrayList(); list.add(new ItemDto(ItemProtocol.item_heartbeat, "心跳", "DB600.B0")); - list.add(new ItemDto(ItemProtocol.item_mode, "工作状态", "DB600.B1", true)); - list.add(new ItemDto(ItemProtocol.item_action, "动作信号", "DB600.B2")); - list.add(new ItemDto(ItemProtocol.item_error, "报警信号", "DB600.B4")); + list.add(new ItemDto(ItemProtocol.item_mode, "工作模式", "DB600.B2", Boolean.valueOf(true))); + list.add(new ItemDto(ItemProtocol.item_error, "故障信号", "DB600.B3")); + list.add(new ItemDto(ItemProtocol.item_order, "当前执行工单号", "DB600.D4")); + list.add(new ItemDto(ItemProtocol.item_order_detail, "当前工单明细号", "DB600.D8")); + list.add(new ItemDto(ItemProtocol.item_last_order_detail, "上次完成工单明细号", "DB600.D12")); + list.add(new ItemDto(ItemProtocol.item_order_feeding_qty, "当前工单上料数量", "DB600.D16")); + list.add(new ItemDto(ItemProtocol.item_detail_feeding_qty, "当前工单明细号上料数量", "DB600.D20")); + list.add(new ItemDto(ItemProtocol.item_detail_lettering_qty, "当前工单明细号刻字数量", "DB600.D24")); + list.add(new ItemDto(ItemProtocol.item_detail_lettering_qualified_qty, "当前工单明细号刻字合格数量", "DB600.D28")); + list.add(new ItemDto(ItemProtocol.item_detail_risking_qualified_qty, "当前工单明细号套冒合格数", "DB600.D32")); + list.add(new ItemDto(ItemProtocol.item_detail_risking_qty, "当前工单明细号套冒数", "DB600.D36")); + list.add(new ItemDto(ItemProtocol.item_detail_strapping_qty, "当前工单明细号捆扎包数", "DB600.D40")); + list.add(new ItemDto(ItemProtocol.item_detail_strapping_oneqty, "当前工单明细号捆扎根数", "DB600.D44")); + list.add(new ItemDto(ItemProtocol.item_detail_coating_qty, "当前工单明细号裹膜数", "DB600.D48")); + list.add(new ItemDto(ItemProtocol.item_labeling_order, "当前贴标工单明细号", "DB600.D52")); + list.add(new ItemDto(ItemProtocol.item_detail_rlabeling_qualified_qty, "当前工单明细号刻字数量", "DB600.D56")); + list.add(new ItemDto(ItemProtocol.item_detail_rlabeling_qty, "当前贴标工单明细号贴标数", "DB600.D60")); + return list; } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java index d6a0b14..4864bd2 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java @@ -6,8 +6,11 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.opc.Device; +import java.util.List; + /** * 海亮-上料总线体 */ @@ -22,10 +25,73 @@ public class HaiLiangFeedingTrunkDeviceDriver extends AbstractOpcDeviceDriver im return this.device; } + boolean requireSucess = false; + String device_code; + int mode = 0; + int error = 0; + int move = 0; + int order = 0; + int order_detail = 0; + int last_mode = 0; + int last_order = order; @Override - public void execute() { + public void execute() throws Exception { + String message = null; + try { + device_code = this.getDeviceCode(); + mode = this.itemProtocol.getMode(); + error = this.itemProtocol.getError(); + order = this.itemProtocol.getOrder(); + order_detail = this.itemProtocol.getOrder_detail(); + + if (mode != last_mode) { + this.setRequireSucess(false); + } + + } catch (Exception var17) { + return; + } + + if (mode == 0) { + + message = "未联机"; + //有报警 + } else if (error != 0) { + + message = "有报警"; + //无报警 + } else { + message = ""; + + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + break; + case 2: + break; + case 3: + //申请工单 + apply_order(); + break; + case 4: + //申请工单明细 + apply_orderDetail(); + break; + } + } + last_mode = mode; + last_order = order; + } + + public boolean apply_order() throws Exception { + + return true; + } + + public boolean apply_orderDetail() throws Exception { + return true; } } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/ItemProtocol.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/ItemProtocol.java index 845ac5e..f153049 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/ItemProtocol.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/ItemProtocol.java @@ -10,7 +10,6 @@ import java.util.List; public class ItemProtocol { public static String item_heartbeat = "heartbeat"; public static String item_mode = "mode"; - public static String item_action = "action"; public static String item_error = "error"; public static String item_order = "order"; public static String item_order_detail = "order_detail"; @@ -64,6 +63,7 @@ public class ItemProtocol { this.driver = driver; } + public int getHeartbeat() { return this.getOpcIntegerValue(item_heartbeat); } @@ -72,19 +72,78 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_mode); } - public int getAction() { - return this.getOpcIntegerValue(item_action); - } - public int getError() { return this.getOpcIntegerValue(item_error); } + public int getOrder() { + return this.getOpcIntegerValue(item_order); + } + + public int getOrder_detail() { + return this.getOpcIntegerValue(item_order_detail); + } + + public int getLast_order_detail() { + return this.getOpcIntegerValue(item_last_order_detail); + } + + public int getOrder_feeding_qty() { + return this.getOpcIntegerValue(item_order_feeding_qty); + } + + public int getDetail_feeding_qty() { + return this.getOpcIntegerValue(item_detail_feeding_qty); + } + + public int getDetail_lettering_qty() { + return this.getOpcIntegerValue(item_detail_lettering_qty); + } + + public int getDetail_lettering_qualified_qty() { + return this.getOpcIntegerValue(item_detail_lettering_qualified_qty); + } + + public int getDetail_risking_qualified_qty() { + return this.getOpcIntegerValue(item_detail_risking_qualified_qty); + } + + public int getDetail_risking_qty() { + return this.getOpcIntegerValue(item_detail_risking_qty); + } + + public int getDetail_strapping_qty() { + return this.getOpcIntegerValue(item_detail_strapping_qty); + } + + public int getDetail_strapping_oneqty() { + return this.getOpcIntegerValue(item_detail_strapping_oneqty); + } + + public int getDetail_coating_qty() { + return this.getOpcIntegerValue(item_detail_coating_qty); + } + + public int getLabeling_order() { + return this.getOpcIntegerValue(item_labeling_order); + } + + public int getDetail_rlabeling_qualified_qty() { + return this.getOpcIntegerValue(item_detail_rlabeling_qualified_qty); + } + + public int getDetail_rlabeling_qty() { + return this.getOpcIntegerValue(item_detail_rlabeling_qty); + } + + public int getToCommand() { return this.getOpcIntegerValue(item_to_command); } + Boolean isonline; + public int getOpcIntegerValue(String protocol) { Integer value = this.driver.getIntegeregerValue(protocol); if (value == null) { @@ -122,22 +181,22 @@ public class ItemProtocol { public static List getWriteableItemDtos() { ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_order, "工单号", "DB600.D2")); - list.add(new ItemDto(item_to_order_detail, "工单明细号", "DB600.D6")); - list.add(new ItemDto(item_to_order_feeding_qty, "工单上料总数量", "DB600.D10")); - list.add(new ItemDto(item_to_detail_feeding_qty, "工单明细号上料数量", "DB600.D14")); - list.add(new ItemDto(item_to_outer_diameter, "外径", "DB600.REAL18")); - list.add(new ItemDto(item_to_wall_thickness, "壁厚", "DB600.REAL22")); - list.add(new ItemDto(item_to_length, "长度", "DB600.REAL26")); - list.add(new ItemDto(item_to_is_last, "是否最后工单明细号", "DB600.D30")); - list.add(new ItemDto(item_to_strapping_qty, "总捆扎包数", "DB600.D34")); - list.add(new ItemDto(item_to_one_strapping_qty, "标准每捆数量", "DB600.D38")); - list.add(new ItemDto(item_to_lastone_strapping_qty, "捆扎尾料数量", "DB600.D42")); - list.add(new ItemDto(item_to_coating_qty, "需要裹膜捆数", "DB600.D42")); - list.add(new ItemDto(item_to_labeling_qty, "需要贴标数量", "DB600.D46")); - list.add(new ItemDto(item_to_stop, "急停", "DB600.D50")); - list.add(new ItemDto(item_to_force_complete, "工单强制完成", "DB600.D54")); - list.add(new ItemDto(item_to_command, "作业命令", "DB52.D62", Boolean.valueOf(true))); + list.add(new ItemDto(item_to_order, "工单号", "DB601.D2")); + list.add(new ItemDto(item_to_order_detail, "工单明细号", "DB601.D6")); + list.add(new ItemDto(item_to_order_feeding_qty, "工单上料总数量", "DB601.D10")); + list.add(new ItemDto(item_to_detail_feeding_qty, "工单明细号上料数量", "DB601.D14")); + list.add(new ItemDto(item_to_outer_diameter, "外径", "DB601.REAL18")); + list.add(new ItemDto(item_to_wall_thickness, "壁厚", "DB601.REAL22")); + list.add(new ItemDto(item_to_length, "长度", "DB601.REAL26")); + list.add(new ItemDto(item_to_is_last, "是否最后工单明细号", "DB601.D30")); + list.add(new ItemDto(item_to_strapping_qty, "总捆扎包数", "DB601.D34")); + list.add(new ItemDto(item_to_one_strapping_qty, "标准每捆数量", "DB601.D38")); + list.add(new ItemDto(item_to_lastone_strapping_qty, "捆扎尾料数量", "DB601.D42")); + list.add(new ItemDto(item_to_coating_qty, "需要裹膜捆数", "DB601.D42")); + list.add(new ItemDto(item_to_labeling_qty, "需要贴标数量", "DB601.D46")); + list.add(new ItemDto(item_to_stop, "急停", "DB601.D50")); + list.add(new ItemDto(item_to_force_complete, "工单强制完成", "DB601.D54")); + list.add(new ItemDto(item_to_command, "作业命令", "DB601.D62", Boolean.valueOf(true))); return list; } diff --git a/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java b/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java index a2fda15..75744c7 100644 --- a/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java @@ -60,8 +60,8 @@ public class ProduceshiftorderServiceImpl implements ProduceshiftorderService, A } public synchronized void reload() { - this.order = this.queryAllOrder("order_status <2 and is_delete =0"); - this.detail = this.queryAllOrderDteail("order_detail_status <2 and is_delete =0"); + this.order = this.queryAllOrder("order_status <2 and is_deleted =0"); + this.detail = this.queryAllOrderDteail("order_detail_status <2 and is_deleted =0"); } @Override diff --git a/nladmin-system/src/main/java/org/nl/acs/order/service/wql/order.xls b/nladmin-system/src/main/java/org/nl/acs/order/service/wql/order.xls index 7518a0d903943a0d9487d3f77ff871f24f28bbfd..cde323f7a47f2af518ec947df59d7a21b2fd86ab 100644 GIT binary patch delta 8528 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 delta 8560 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