From 0d23d432e0f742284c60d2a03347af71660cfd89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Tue, 22 Aug 2023 16:44:27 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=A4=A7=E5=B1=8F=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../driver/AbstractDeviceDriver.java | 4 +- .../driver/AbstractOpcDeviceDriver.java | 68 +- .../acs/ext/wms/service/WmsToAcsService.java | 2 +- .../wms/service/impl/WmsToAcsServiceImpl.java | 650 +----------------- .../org/nl/acs/opc/DeviceExecuteAutoRun.java | 32 +- .../acs/opc/DeviceOpcSynchronizeAutoRun.java | 105 +-- .../org/nl/acs/opc/OpcServerServiceImpl.java | 281 ++++---- .../nl/modules/lucene/common/Searcher.java | 94 +-- .../impl/LuceneExecuteLogServiceImpl.java | 13 +- .../java/org/nl/config/DataBaseConfig.java | 126 ++-- .../dashboard/service/DashboardService.java | 146 ++++ .../org/nl/wms/dashboard/wql/DASHBOARD.wql | 73 ++ .../java/org/nl/wms/sch/manage/ACSSystem.java | 1 - .../org/nl/wms/sch/manage/AutoCreate.java | 1 - .../wms/sch/manage/AutoUpdateStandStatus.java | 1 - .../org/nl/wms/sch/manage/CreateMode.java | 1 - .../java/org/nl/wms/sch/manage/LockType.java | 2 - .../org/nl/wms/sch/manage/PointStatus.java | 3 +- .../java/org/nl/wms/sch/manage/Region.java | 1 - .../org/nl/wms/sch/manage/RegionInType.java | 1 - .../org/nl/wms/sch/manage/RegionOutType.java | 1 - .../java/org/nl/wms/sch/manage/TaskType.java | 1 - .../nl/wms/sch/manage/UpdateTaskStatus.java | 1 - .../sch/task/call/empty/FJCallEmptyTask.java | 1 - .../sch/task/call/empty/GTKCallEmptyTask.java | 1 - .../sch/task/call/empty/HLCallEmptyTask.java | 1 - .../sch/task/call/empty/YZCallEmptyTask.java | 1 - .../call/material/FJCallMaterialTask.java | 1 - .../call/material/SZCallMaterialTask.java | 1 - .../call/material/YZCallMaterialTask.java | 1 - .../sch/task/send/empty/FJSendEmptyTask.java | 1 - .../sch/task/send/empty/YZSendEmptyTask.java | 1 - .../send/material/FJSendMaterialTask.java | 3 - .../send/material/HLSendMaterialTask.java | 1 - .../send/material/SZSendMaterialTask.java | 1 - .../send/material/YZSendMaterialTask.java | 1 - .../sch/task/to/pack/BTHCToPackageTask.java | 1 - .../wms/sch/task/to/pack/FJToPackageTask.java | 1 - .../org/nl/wms/sch/task/util/TaskUtils.java | 1 - .../java/org/nl/wms/sch/util/PointUtils.java | 1 - .../src/main/java/org/nl/wms/util/MapOf.java | 8 +- .../src/main/java/org/nl/wms/wms.xls | Bin 281088 -> 325120 bytes 42 files changed, 543 insertions(+), 1092 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/dashboard/wql/DASHBOARD.wql diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractDeviceDriver.java index f206bcf..8ac7af2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractDeviceDriver.java @@ -16,8 +16,6 @@ public class AbstractDeviceDriver implements DeviceDriver { public AbstractDeviceDriver() { -// this.execute_log = new BusinessLoggerImpl(BusinessDomain.device_execute.name()); -// this.device_log = BusinessLoggerFactory.getNoRepeatBusinessLogger(BusinessDomain.device_execute.name()); } @@ -34,7 +32,7 @@ public class AbstractDeviceDriver implements DeviceDriver { @Override public DeviceDriver setDriverDefination(DeviceDriverDefination var1) { - this.driverDefination = driverDefination; + this.driverDefination = var1; return this; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java index 04257ca..ac617b4 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java @@ -1,7 +1,6 @@ package org.nl.acs.device_driver.driver; import cn.hutool.core.util.ObjectUtil; -import org.nl.acs.ext.wms.data.JsonUtl; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.ItemValue; import org.nl.acs.opc.OpcConfig; @@ -14,7 +13,6 @@ import org.nl.modules.lucene.service.dto.LuceneLogDto; import org.nl.modules.wql.exception.WDKException; import org.nl.modules.wql.util.SpringContextHolder; -import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; @@ -22,12 +20,6 @@ import java.util.Map; public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements OpcDeviceDriver { UnifiedDataAccessor opcUdw; - private Date sendTime; - private String last_items; - private int noLog_sendTimeOut; - private Date noLog_sendTime; - private String noLog_last_items; - public AbstractOpcDeviceDriver() { this.opcUdw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); } @@ -57,7 +49,7 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc return this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + "."; } - public boolean control(Map itemValues) { + public void control(Map itemValues) { Iterator> it = itemValues.entrySet().iterator(); @@ -73,61 +65,23 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc i++; } - return this.control(p2); + this.control(p2); } - public boolean control(ItemValue[] itemValues) { + public void control(ItemValue[] itemValues) { if (itemValues != null && itemValues.length != 0) { - String this_items = JsonUtl.parseWithoutException(itemValues); - boolean need_write = false; - StringBuilder sb = new StringBuilder(); - ItemValue[] var5 = itemValues; - int var6 = itemValues.length; - for (int var7 = 0; var7 < var6; ++var7) { - ItemValue itemValue = var5[var7]; + OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); + + opcServerService.writeInteger(this.getOpcServer(), itemValues); + UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); + + for (ItemValue itemValue : itemValues) { String code = itemValue.getItem_code(); - Object udw_value = this.getUdwValue(code); - Object write_value = itemValue.getItem_value(); - sb.append(code); - sb.append(":"); - sb.append(JsonUtl.parseWithoutException(udw_value)); - sb.append(";"); -// if (!need_write && !UnifiedDataAppService.isEquals(udw_value, write_value)) { -// need_write = true; -// } - } - need_write = true; - - if (need_write) { - Date date = new Date(); - /*if (StringUtl.isEqual(this_items, this.last_items) && date.getTime() - this.sendTime.getTime() < (long) WcsConfig.opc_write_repeat_check) { - log.trace("发送时间因为小于{}毫秒,而被无视", WcsConfig.opc_write_repeat_check); - return false; - }*/ - - this.last_items = this_items; - this.sendTime = date; - /* this.execute_log.setResource(this.getDevice().getCode(), this.getDevice().getName()); - this.execute_log.log("原始记录{}->变更为{}", new Object[]{sb, this_items}); - OpcServerService opcServerService = OpcServerFactory.getOpcServerService();*/ - - OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); - - opcServerService.writeInteger(this.getOpcServer(), itemValues); - UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); - ItemValue[] var17 = itemValues; - int var18 = itemValues.length; - - for (int var19 = 0; var19 < var18; ++var19) { - ItemValue itemValue = var17[var19]; - String code = itemValue.getItem_code(); - Object value = itemValue.getItem_value(); - opcValueAccessor.setValue(code, value); - } + Object value = itemValue.getItem_value(); + opcValueAccessor.setValue(code, value); } - return true; } else { throw new WDKException("下发 无内容"); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index 73f28a9..2602847 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -12,7 +12,7 @@ public interface WmsToAcsService { * 创建任务 * * @param jsonObject 条件 - * @return + * @return Map */ Map createFromWms(String jsonObject); 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 d76f2dd..bcae594 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 @@ -8,32 +8,24 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.config.AcsConfig; import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.DeviceDriver; -import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; -import org.nl.acs.device_driver.lnsh.lnsh_Laminating_machine.LnshLaminatingMachineDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_fold_disc_site.LnshFoldDiscSiteDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_kiln_lane.LnshKilnLaneDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_kiln_truss.LnshKilnTrussDeviceDriver; -import org.nl.acs.device_driver.lnsh.lnsh_labeling_machine.LnshLabelingMachineDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_mixing_mill.LnshMixingMillDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_out_kiln_truss.LnshOutKilnTrussDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_package_line.LnshPackageLineDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_package_pallet_manipulator.LnshPackagePalletManipulatorDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_package_site.LnshPackageSiteDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_palletizing_manipulator.LnshPalletizingManipulatorDeviceDriver; -import org.nl.acs.device_driver.lnsh.lnsh_palletizing_manipulator_site.LnshPalletizingManipulatorSiteDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_press.LnshPressDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_rgv.LnshRGVDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_split_manipulator.LnshSplitManipulatorDeviceDriver; import org.nl.acs.device_driver.lnsh.lnsh_station.LnshStationDeviceDriver; -import org.nl.acs.device_driver.standard_autodoor.StandardAutodoorDeviceDriver; import org.nl.acs.ext.wms.service.WmsToAcsService; 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.opc.DeviceAppService; -import org.nl.acs.order.service.ProduceshiftorderService; -import org.nl.acs.order.service.dto.ProduceshiftorderDto; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.task.service.TaskService; @@ -57,15 +49,13 @@ import java.util.Map; @Slf4j public class WmsToAcsServiceImpl implements WmsToAcsService { - private final InstructionService InstructionService; private final TaskService TaskService; private final DeviceService DeviceService; private final DeviceAppService DeviceAppService; private final RouteLineService RouteLineService; - private final ProduceshiftorderService produceshiftorderService; - private String log_file_type = "log_file_type"; - private String log_type = "WMS下发ACS"; + private final String log_file_type = "log_file_type"; + private final String log_type = "WMS下发ACS"; @Override public Map createFromWms(String param) { @@ -82,8 +72,8 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String task_code = task.getString("task_code"); String start_point_code = task.getString("start_device_code"); String next_point_code = task.getString("next_device_code"); - String start_device_code = ""; - String next_device_code = ""; + String start_device_code; + String next_device_code; String start_parent_code = ""; String next_parent_code = ""; if (StrUtil.isEmpty(task_code)) { @@ -98,7 +88,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { JSONObject start_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_point_code + "'").uniqueResult(0); if (!ObjectUtil.isEmpty(start_device_json)) { - start_point_code = (String) start_device_json.get("parent_storage_code") == null ? start_point_code : (String) start_device_json.get("storage_code"); + start_point_code = start_device_json.get("parent_storage_code") == null ? start_point_code : (String) start_device_json.get("storage_code"); if (start_point_code.contains(".")) { start_point_code = start_point_code.substring(0, start_point_code.indexOf(".")); } @@ -106,7 +96,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } JSONObject next_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_point_code + "'").uniqueResult(0); if (!ObjectUtil.isEmpty(next_device_json)) { - next_point_code = (String) next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); + next_point_code = next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); if (next_point_code.contains(".")) { next_point_code = next_point_code.substring(0, next_point_code.indexOf(".")); } @@ -121,14 +111,14 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String params = task.getString("params"); if (start_point_code.indexOf("-") > 0) { - String str[] = start_point_code.split("-"); + String[] str = start_point_code.split("-"); start_device_code = str[0]; } else { start_device_code = start_point_code; } if (next_point_code.indexOf("-") > 0) { - String str[] = next_point_code.split("-"); + String[] str = next_point_code.split("-"); next_device_code = str[0]; } else { next_device_code = next_point_code; @@ -146,12 +136,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { if (taskDto != null) { throw new WDKException("不能存在相同的任务号!"); } -// if (!StrUtil.isEmpty(vehicle_code) && !"0000".equals(vehicle_code)) { -// TaskDto vehicle_dto = TaskService.findByContainer(vehicle_code); -// if (vehicle_dto != null) { -// throw new WDKException("已存在该载具号的任务!"); -// } -// } + JSONObject jo = new JSONObject(); jo.put("task_code", task_code); jo.put("ext_task_uuid", ext_task_uuid); @@ -187,7 +172,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { try { TaskService.create(task_dto); } catch (Exception e) { - e.printStackTrace(); + log.error("createFromWms method error !", e); JSONObject json = new JSONObject(); json.put("task_code", task_code); json.put("ext_task_uuid", ext_task_uuid); @@ -203,14 +188,14 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { resultJson.put("errArr", errArr); resultJson.put("message", "操作成功"); resultJson.put("data", new JSONObject()); - log.info("createFromWms - 返回参数 {}", resultJson.toString()); + log.info("createFromWms - 返回参数 {}", resultJson); } catch (Exception e) { resultJson.put("status", 400); resultJson.put("errArr", e.getMessage()); resultJson.put("message", e.getMessage()); resultJson.put("data", new JSONObject()); - log.info("createFromWms - 返回参数 {}", resultJson.toString()); + log.info("createFromWms - 返回参数 {}", resultJson); } return resultJson; } finally { @@ -228,13 +213,11 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); log.debug(tasks.toString()); - log.info("cancelFromWms - 请求参数 {}", tasks.toString()); + log.info("cancelFromWms - 请求参数 {}", tasks); for (int i = 0; i < tasks.size(); i++) { JSONObject task = tasks.getJSONObject(i); String task_uuid = task.getString("task_id"); String task_code = task.getString("task_code"); - String vehicle_code = task.getString("vehicle_code"); - String params = task.getString("params"); if (StrUtil.isEmpty(task_uuid)) { throw new WDKException("任务标识不能为空"); @@ -259,7 +242,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { resultJson.put("status", HttpStatus.OK); resultJson.put("message", "操作成功"); resultJson.put("data", new JSONObject()); - log.info("cancelFromWms - 返回参数 {}", resultJson.toString()); + log.info("cancelFromWms - 返回参数 {}", resultJson); return resultJson; } finally { MDC.remove(log_file_type); @@ -272,7 +255,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { log.info("createOrder - 请求参数 {}", orders.toString()); for (int i = 0; i < orders.size(); i++) { - Boolean is_flag = false; JSONObject json = orders.getJSONObject(i); String producetask_code = json.getString("workorder_code"); @@ -315,7 +297,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { map.put("to_material_code", material_code); map.put("to_command", 1); lnshMixingMillDeviceDriver.writing(map); - is_flag = true; } if (device.getDeviceDriver() instanceof LnshPressDeviceDriver) { lnshPressDeviceDriver = (LnshPressDeviceDriver) device.getDeviceDriver(); @@ -339,7 +320,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { map.put("to_Wthickness", Wthickness); map.put("to_command", 1); lnshPressDeviceDriver.writing(map); - is_flag = true; } if (device.getDeviceDriver() instanceof LnshPackagePalletManipulatorDeviceDriver) { lnshPackagePalletManipulatorDeviceDriver = (LnshPackagePalletManipulatorDeviceDriver) device.getDeviceDriver(); @@ -364,7 +344,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { map.put("to_vehicle_type", String.valueOf(json.getIntValue("vehicle_type") - 2)); map.put("to_command", 1); lnshPackagePalletManipulatorDeviceDriver.writing(map); - is_flag = true; } if (device.getDeviceDriver() instanceof LnshSplitManipulatorDeviceDriver) { lnshSplitManipulatorDeviceDriver = (LnshSplitManipulatorDeviceDriver) device.getDeviceDriver(); @@ -388,24 +367,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { map.put("to_Wthickness", Wthickness); map.put("to_command", 1); lnshSplitManipulatorDeviceDriver.writing(map); - is_flag = true; } - //下发成功后,写入工单信息表记录 - -// ProduceshiftorderDto dto = new ProduceshiftorderDto(); -// dto.setDevice_code(device_code); -// dto.setOrder_code(producetask_code); -// dto.setOrder_status("0"); -// dto.setMaterial_code(material_code); -// dto.setMaterial_name(material_name); -// dto.setCust_code(cust_code); -// dto.setCust_name(cust_name); -// dto.setModel(model); -// dto.setMolten_pool(molten_pool); -// dto.setWeight(weight); -// dto.setQty(qty); -// dto.setProduct_code(product_code); -// produceshiftorderService.create(dto); } @@ -413,583 +375,34 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { resultJson.put("status", HttpStatus.OK.value()); resultJson.put("message", "操作成功"); resultJson.put("data", new JSONObject()); - log.info("createOrder - 返回参数 {}", resultJson.toString()); + log.info("createOrder - 返回参数 {}", resultJson); return resultJson; } @Override public Map updateDeviceGoodsFromWms(String param) { - try { - MDC.put(log_file_type, log_type); - JSONArray datas = JSONArray.parseArray(param); - log.info("updateDeviceGoodsFromWms - 请求参数 {}", datas.toString()); - for (int i = 0; i < datas.size(); i++) { - JSONObject data = datas.getJSONObject(i); - String device_code = data.getString("point_code"); - String has_goods = data.getString("has_goods"); - - JSONObject jo = new JSONObject(); - jo.put("device_code", device_code); - jo.put("hasGoodStatus", has_goods); - DeviceService.changeDeviceStatus(jo); - - } - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK); - resultJson.put("message", "操作成功"); - resultJson.put("data", new JSONObject()); - log.info("updateDeviceGoodsFromWms - 返回参数 {}", resultJson.toString()); - return resultJson; - } finally { - MDC.remove(log_file_type); - } + return null; } @Override public Map areaControl(JSONObject form) { - try { - MDC.put(log_file_type, log_type); - String device_code = form.getString("device_code"); - String type = form.getString("type"); - - Device device = DeviceAppService.findDeviceByCode(device_code); - - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK); - resultJson.put("message", "操作成功"); - resultJson.put("data", new JSONObject()); - log.info("updateDeviceGoodsFromWms - 返回参数 {}", resultJson.toString()); - return resultJson; - } finally { - MDC.remove(log_file_type); - } + return null; } @Override - public Map putAction(String jsonObject) throws Exception { - try { - MDC.put(log_file_type, log_type); - JSONArray datas = JSONArray.parseArray(jsonObject); - log.info("putAction - 请求参数 {}", datas.toString()); - for (int i = 0; i < datas.size(); i++) { - JSONObject data = datas.getJSONObject(i); - String device_code = data.getString("device_code"); - String code = data.getString("code"); - String value = data.getString("value"); - Device device = DeviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)) { - throw new Exception("未找到对应设备:" + device_code); - } - LnshLaminatingMachineDeviceDriver lnshLaminatingMachineDeviceDriver; - //晟华覆膜机 - if (device.getDeviceDriver() instanceof LnshLaminatingMachineDeviceDriver) { - lnshLaminatingMachineDeviceDriver = (LnshLaminatingMachineDeviceDriver) device.getDeviceDriver(); - org.nl.acs.device_driver.lnsh.lnsh_Laminating_machine.ItemProtocol itemProtocol = new org.nl.acs.device_driver.lnsh.lnsh_Laminating_machine.ItemProtocol(lnshLaminatingMachineDeviceDriver); - if (!lnshLaminatingMachineDeviceDriver.isExistFieldName(code, itemProtocol)) { - throw new Exception("设备:" + device_code + "未找到对应信号:" + code); - } - lnshLaminatingMachineDeviceDriver.writing(code, value); - } - } - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK); - resultJson.put("message", "操作成功"); - resultJson.put("data", new JSONObject()); - log.info("putAction - 返回参数 {}", resultJson.toString()); - return resultJson; - } finally { - MDC.remove(log_file_type); - } + public Map putAction(String jsonObject) { + return null; } @Override - public Map queryDevice(String jsonObject) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("queryDevice - 请求参数 {}", jsonObject.toString()); - JSONArray backja = new JSONArray(); - JSONArray datas = JSONArray.parseArray(jsonObject); - - //无光电普通站点 - StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - //自动门 - StandardAutodoorDeviceDriver standardAutodoorDeviceDriver; - //晟华-码垛机械手 - LnshPalletizingManipulatorDeviceDriver lnshPalletizingManipulatorDeviceDriver; - //晟华-窑车道 - LnshKilnLaneDeviceDriver lnshKilnLaneDeviceDriver; - //晟华-包装码垛机械手 - LnshPackagePalletManipulatorDeviceDriver lnshPackagePalletManipulatorDeviceDriver; - //晟华-贴标机 - LnshLabelingMachineDeviceDriver lnshLabelingMachineDeviceDriver; - //晟华-拆垛机械手 - LnshSplitManipulatorDeviceDriver lnshSplitManipulatorDeviceDriver; - //晟华-RGV - LnshRGVDeviceDriver lnshRGVDeviceDriver; - //晟华-工位(交互模板) - LnshStationDeviceDriver lnshStationDeviceDriver; - //晟华-缓存货架 - LnshLaminatingMachineDeviceDriver lnshLaminatingMachineDeviceDriver; - //晟华-机械手工位 - LnshPalletizingManipulatorSiteDeviceDriver lnshPalletizingManipulatorSiteDeviceDriver; - //晟华-包装线工位 - LnshPackageSiteDeviceDriver lnshPackageSiteDeviceDriver; - - if (datas.size() == 0) { - List list = DeviceService.findCacheDevice(); - for (int i = 0, j = list.size(); i < j; i++) { - Device device = list.get(i); - JSONObject obj = new JSONObject(); - String device_code = device.getDevice_code(); - JSONObject jo = new JSONObject(); - if (ObjectUtil.isNull(device)) { - continue; - } - if (device.getDeviceDriver() instanceof LnshStationDeviceDriver) { - lnshStationDeviceDriver = (LnshStationDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshStationDeviceDriver.getMode()); - jo.put("move", lnshStationDeviceDriver.getMove()); - jo.put("action", lnshStationDeviceDriver.getAction()); - jo.put("io_action", lnshStationDeviceDriver.getIo_action()); - jo.put("hasGoods", lnshStationDeviceDriver.getHasGoods()); - jo.put("isOnline", lnshStationDeviceDriver.getIsonline()); - jo.put("error", lnshStationDeviceDriver.getError()); - jo.put("isError", lnshStationDeviceDriver.getIserror()); - jo.put("message", lnshStationDeviceDriver.getMessage()); - jo.put("task", lnshStationDeviceDriver.getTask()); - jo.put("weight", lnshStationDeviceDriver.getWeight()); - jo.put("material", lnshStationDeviceDriver.getMaterial()); - jo.put("barcode", lnshStationDeviceDriver.getBarcode()); -// jo.put("specifications", lnshStationDeviceDriver.getSpecifications()); -// jo.put("batch", lnshStationDeviceDriver.getBatch()); -// jo.put("pallet_type", lnshStationDeviceDriver.getContainer_type()); - - } else if (device.getDeviceDriver() instanceof LnshPalletizingManipulatorSiteDeviceDriver) { - lnshPalletizingManipulatorSiteDeviceDriver = (LnshPalletizingManipulatorSiteDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPalletizingManipulatorSiteDeviceDriver.getMode()); - jo.put("move", lnshPalletizingManipulatorSiteDeviceDriver.getMove()); - jo.put("action", lnshPalletizingManipulatorSiteDeviceDriver.getAction()); - jo.put("io_action", lnshPalletizingManipulatorSiteDeviceDriver.getIo_action()); - jo.put("hasGoods", lnshPalletizingManipulatorSiteDeviceDriver.getHasGoods()); - jo.put("isOnline", lnshPalletizingManipulatorSiteDeviceDriver.getIsonline()); - jo.put("error", lnshPalletizingManipulatorSiteDeviceDriver.getError()); - jo.put("isError", lnshPalletizingManipulatorSiteDeviceDriver.getIserror()); - jo.put("message", lnshPalletizingManipulatorSiteDeviceDriver.getMessage()); - jo.put("task", lnshPalletizingManipulatorSiteDeviceDriver.getTask()); - jo.put("weight", lnshPalletizingManipulatorSiteDeviceDriver.getWeight()); - jo.put("material", lnshPalletizingManipulatorSiteDeviceDriver.getMaterial()); - jo.put("barcode", lnshPalletizingManipulatorSiteDeviceDriver.getBarcode()); - jo.put("AlongSide", lnshPalletizingManipulatorSiteDeviceDriver.getAlongSide()); - jo.put("BshortSide", lnshPalletizingManipulatorSiteDeviceDriver.getBshortSide()); - jo.put("Htrapezoidal", lnshPalletizingManipulatorSiteDeviceDriver.getHtrapezoidal()); - jo.put("Wthickness", lnshPalletizingManipulatorSiteDeviceDriver.getWthickness()); - } else if (device.getDeviceDriver() instanceof LnshPalletizingManipulatorDeviceDriver) { - lnshPalletizingManipulatorDeviceDriver = (LnshPalletizingManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPalletizingManipulatorDeviceDriver.getMode()); - jo.put("status", lnshPalletizingManipulatorDeviceDriver.getStatus()); - jo.put("action", lnshPalletizingManipulatorDeviceDriver.getAction()); - jo.put("isOnline", lnshPalletizingManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshPalletizingManipulatorDeviceDriver.getError()); -// jo.put("batch", lnshPalletizingManipulatorDeviceDriver.getBatch()); -// jo.put("specifications", lnshPalletizingManipulatorDeviceDriver.getSpecifications()); - jo.put("isError", lnshPalletizingManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshPalletizingManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshKilnLaneDeviceDriver) { - lnshKilnLaneDeviceDriver = (LnshKilnLaneDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshKilnLaneDeviceDriver.getMode()); - jo.put("status", lnshKilnLaneDeviceDriver.getStatus()); - jo.put("isOnline", lnshKilnLaneDeviceDriver.getIsonline()); - jo.put("error", lnshKilnLaneDeviceDriver.getError()); - jo.put("isError", lnshKilnLaneDeviceDriver.getIserror()); - jo.put("open_time", lnshKilnLaneDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshKilnLaneDeviceDriver.getStandby_time()); - jo.put("production_time", lnshKilnLaneDeviceDriver.getProduction_time()); - jo.put("error_time", lnshKilnLaneDeviceDriver.getError_time()); - jo.put("car_sum", lnshKilnLaneDeviceDriver.getCar_sum()); - jo.put("nullCar_qty", lnshKilnLaneDeviceDriver.getNullCar_qty()); - jo.put("burning_car_qty", lnshKilnLaneDeviceDriver.getBurning_car_qty()); - jo.put("message", lnshKilnLaneDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshPackagePalletManipulatorDeviceDriver) { - lnshPackagePalletManipulatorDeviceDriver = (LnshPackagePalletManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPackagePalletManipulatorDeviceDriver.getMode()); - jo.put("status", lnshPackagePalletManipulatorDeviceDriver.getStatus()); -// jo.put("onoff_status", lnshPackagePalletManipulatorDeviceDriver.getOnoff_status()); -// jo.put("specifications", lnshPackagePalletManipulatorDeviceDriver.getSpecifications()); -// jo.put("batch", lnshPackagePalletManipulatorDeviceDriver.getBatch()); - jo.put("isOnline", lnshPackagePalletManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshPackagePalletManipulatorDeviceDriver.getError()); - jo.put("putStation", lnshPackagePalletManipulatorDeviceDriver.getPut_station()); - jo.put("barcode", lnshPackagePalletManipulatorDeviceDriver.getBarcode()); - jo.put("material", lnshPackagePalletManipulatorDeviceDriver.getMaterial()); - jo.put("qty", lnshPackagePalletManipulatorDeviceDriver.getQty()); - jo.put("open_time", lnshPackagePalletManipulatorDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshPackagePalletManipulatorDeviceDriver.getStandby_time()); - jo.put("production_time", lnshPackagePalletManipulatorDeviceDriver.getProduction_time()); - jo.put("error_time", lnshPackagePalletManipulatorDeviceDriver.getError_time()); - jo.put("order_No", lnshPackagePalletManipulatorDeviceDriver.getOrder_No()); - jo.put("isError", lnshPackagePalletManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshPackagePalletManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshLabelingMachineDeviceDriver) { - lnshLabelingMachineDeviceDriver = (LnshLabelingMachineDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshLabelingMachineDeviceDriver.getMode()); - jo.put("status", lnshLabelingMachineDeviceDriver.getStatus()); - jo.put("isOnline", lnshLabelingMachineDeviceDriver.getIsonline()); - jo.put("open_time", lnshLabelingMachineDeviceDriver.getOpen_time()); - jo.put("close_time", lnshLabelingMachineDeviceDriver.getClose_time()); - jo.put("standby_time", lnshLabelingMachineDeviceDriver.getStandby_time()); - jo.put("production_time", lnshLabelingMachineDeviceDriver.getProduction_time()); - jo.put("error_time", lnshLabelingMachineDeviceDriver.getError_time()); - jo.put("labeling_qty", lnshLabelingMachineDeviceDriver.getLabeling_qty()); - jo.put("isError", lnshLabelingMachineDeviceDriver.getIserror()); - jo.put("message", lnshLabelingMachineDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshSplitManipulatorDeviceDriver) { - lnshSplitManipulatorDeviceDriver = (LnshSplitManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshSplitManipulatorDeviceDriver.getMode()); - jo.put("isOnline", lnshSplitManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshSplitManipulatorDeviceDriver.getError()); - jo.put("getStation", lnshSplitManipulatorDeviceDriver.getGetStation()); - jo.put("barcode", lnshSplitManipulatorDeviceDriver.getBarcode()); - jo.put("material", lnshSplitManipulatorDeviceDriver.getMaterial()); -// jo.put("batch", lnshSplitManipulatorDeviceDriver.getBatch()); -// jo.put("specifications", lnshSplitManipulatorDeviceDriver.getSpecifications()); -// jo.put("qty", lnshSplitManipulatorDeviceDriver.getQty()); - jo.put("total_split", lnshSplitManipulatorDeviceDriver.getTotal_split()); - jo.put("open_time", lnshSplitManipulatorDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshSplitManipulatorDeviceDriver.getStandby_time()); - jo.put("production_time", lnshSplitManipulatorDeviceDriver.getProduction_time()); - jo.put("error_time", lnshSplitManipulatorDeviceDriver.getError_time()); - jo.put("isError", lnshSplitManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshSplitManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshLaminatingMachineDeviceDriver) { - lnshLaminatingMachineDeviceDriver = (LnshLaminatingMachineDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshLaminatingMachineDeviceDriver.getMode()); - jo.put("move", lnshLaminatingMachineDeviceDriver.getMove()); - jo.put("container_type", lnshLaminatingMachineDeviceDriver.getContainer_type() + 3); -// jo.put("barcode", lnshLaminatingMachineDeviceDriver.getBarcode()); - jo.put("task", lnshLaminatingMachineDeviceDriver.getTask()); - jo.put("error", lnshLaminatingMachineDeviceDriver.getError()); - jo.put("isOnline", lnshLaminatingMachineDeviceDriver.getIsonline()); - jo.put("isError", lnshLaminatingMachineDeviceDriver.getIserror()); - jo.put("message", lnshLaminatingMachineDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshRGVDeviceDriver) { - lnshRGVDeviceDriver = (LnshRGVDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshRGVDeviceDriver.getMode()); - jo.put("status", lnshRGVDeviceDriver.getStatus()); - jo.put("move1", lnshRGVDeviceDriver.getMove1()); - jo.put("move2", lnshRGVDeviceDriver.getMove2()); - jo.put("action1", lnshRGVDeviceDriver.getAction1()); - jo.put("action2", lnshRGVDeviceDriver.getAction2()); - jo.put("walk_y", lnshRGVDeviceDriver.getWalk_y()); - jo.put("error", lnshRGVDeviceDriver.getError()); - jo.put("task1", lnshRGVDeviceDriver.getTask1()); - jo.put("task2", lnshRGVDeviceDriver.getTask2()); - jo.put("isOnline", lnshRGVDeviceDriver.getIsonline()); - jo.put("isError", lnshRGVDeviceDriver.getIserror()); - jo.put("message", lnshRGVDeviceDriver.getMessage()); - jo.put("open_time", lnshRGVDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshRGVDeviceDriver.getStandby_time()); - jo.put("production_time", lnshRGVDeviceDriver.getProduction_time()); - jo.put("error_time", lnshRGVDeviceDriver.getError_time()); -// jo.put("task_qty", lnshRGVDeviceDriver.getTask_qty()); -// jo.put("finishTask_qty", lnshRGVDeviceDriver.getFinishTask_qty()); -// jo.put("batch", lnshRGVDeviceDriver.getBatch()); -// jo.put("specifications", lnshRGVDeviceDriver.getSpecifications()); -// jo.put("qty", lnshRGVDeviceDriver.getQty()); - } else if (device.getDeviceDriver() instanceof LnshPackageSiteDeviceDriver) { - lnshPackageSiteDeviceDriver = (LnshPackageSiteDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPackageSiteDeviceDriver.getMode()); - jo.put("move", lnshPackageSiteDeviceDriver.getMove()); - jo.put("action", lnshPackageSiteDeviceDriver.getAction()); - jo.put("ioaction", lnshPackageSiteDeviceDriver.getIoaction()); - jo.put("error", lnshPackageSiteDeviceDriver.getError()); - jo.put("vehicle_code", lnshPackageSiteDeviceDriver.getVehicle_code()); - jo.put("vehicle_type", lnshPackageSiteDeviceDriver.getVehicle_type()); - } else { - jo.put("device_code", device.getDevice_code()); - } - backja.add(jo); - } - } else { - for (int i = 0; i < datas.size(); i++) { - JSONObject jo = new JSONObject(); - JSONObject data = datas.getJSONObject(i); - String device_code = data.getString("device_code"); - Device device = DeviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)) { - throw new Exception("未找到对应设备:" + device_code); - } - - if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { - standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", standardAutodoorDeviceDriver.getMode()); - jo.put("action", standardAutodoorDeviceDriver.getAction()); - jo.put("isOnline", true); - jo.put("error", standardAutodoorDeviceDriver.getError()); - jo.put("isError", standardAutodoorDeviceDriver.getIserror()); - } else if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("move", standardOrdinarySiteDeviceDriver.getMove()); - jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); - jo.put("hasGoods", standardOrdinarySiteDeviceDriver.getHasGoods()); - jo.put("isOnline", true); - //点击弹出 - jo.put("is_click", true); - jo.put("device_type", device.getDevice_type()); - jo.put("error", standardOrdinarySiteDeviceDriver.getError()); - jo.put("isError", standardOrdinarySiteDeviceDriver.getIserror()); - jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); - jo.put("message", standardOrdinarySiteDeviceDriver.getMessage()); - jo.put("material", standardOrdinarySiteDeviceDriver.getMaterial()); - jo.put("batch", standardOrdinarySiteDeviceDriver.getBatch()); - - } else if (device.getDeviceDriver() instanceof LnshStationDeviceDriver) { - lnshStationDeviceDriver = (LnshStationDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshStationDeviceDriver.getMode()); - jo.put("move", lnshStationDeviceDriver.getMove()); - jo.put("action", lnshStationDeviceDriver.getAction()); - jo.put("io_action", lnshStationDeviceDriver.getIo_action()); - jo.put("hasGoods", lnshStationDeviceDriver.getHasGoods()); - jo.put("isOnline", lnshStationDeviceDriver.getIsonline()); - jo.put("error", lnshStationDeviceDriver.getError()); - jo.put("isError", lnshStationDeviceDriver.getIserror()); - jo.put("message", lnshStationDeviceDriver.getMessage()); - jo.put("task", lnshStationDeviceDriver.getTask()); - jo.put("weight", lnshStationDeviceDriver.getWeight()); - jo.put("material", lnshStationDeviceDriver.getMaterial()); - jo.put("barcode", lnshStationDeviceDriver.getBarcode()); -// jo.put("specifications", lnshStationDeviceDriver.getSpecifications()); -// jo.put("batch", lnshStationDeviceDriver.getBatch()); -// jo.put("pallet_type", lnshStationDeviceDriver.getContainer_type()); - - } else if (device.getDeviceDriver() instanceof LnshPalletizingManipulatorSiteDeviceDriver) { - lnshPalletizingManipulatorSiteDeviceDriver = (LnshPalletizingManipulatorSiteDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPalletizingManipulatorSiteDeviceDriver.getMode()); - jo.put("move", lnshPalletizingManipulatorSiteDeviceDriver.getMove()); - jo.put("action", lnshPalletizingManipulatorSiteDeviceDriver.getAction()); - jo.put("io_action", lnshPalletizingManipulatorSiteDeviceDriver.getIo_action()); - jo.put("hasGoods", lnshPalletizingManipulatorSiteDeviceDriver.getHasGoods()); - jo.put("isOnline", lnshPalletizingManipulatorSiteDeviceDriver.getIsonline()); - jo.put("error", lnshPalletizingManipulatorSiteDeviceDriver.getError()); - jo.put("isError", lnshPalletizingManipulatorSiteDeviceDriver.getIserror()); - jo.put("message", lnshPalletizingManipulatorSiteDeviceDriver.getMessage()); - jo.put("task", lnshPalletizingManipulatorSiteDeviceDriver.getTask()); - jo.put("weight", lnshPalletizingManipulatorSiteDeviceDriver.getWeight()); - jo.put("material", lnshPalletizingManipulatorSiteDeviceDriver.getMaterial()); - jo.put("barcode", lnshPalletizingManipulatorSiteDeviceDriver.getBarcode()); - jo.put("AlongSide", lnshPalletizingManipulatorSiteDeviceDriver.getAlongSide()); - jo.put("BshortSide", lnshPalletizingManipulatorSiteDeviceDriver.getBshortSide()); - jo.put("Htrapezoidal", lnshPalletizingManipulatorSiteDeviceDriver.getHtrapezoidal()); - jo.put("Wthickness", lnshPalletizingManipulatorSiteDeviceDriver.getWthickness()); - } else if (device.getDeviceDriver() instanceof LnshPalletizingManipulatorDeviceDriver) { - lnshPalletizingManipulatorDeviceDriver = (LnshPalletizingManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPalletizingManipulatorDeviceDriver.getMode()); - jo.put("status", lnshPalletizingManipulatorDeviceDriver.getStatus()); - jo.put("action", lnshPalletizingManipulatorDeviceDriver.getAction()); - jo.put("isOnline", lnshPalletizingManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshPalletizingManipulatorDeviceDriver.getError()); -// jo.put("batch", lnshPalletizingManipulatorDeviceDriver.getBatch()); -// jo.put("specifications", lnshPalletizingManipulatorDeviceDriver.getSpecifications()); - jo.put("isError", lnshPalletizingManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshPalletizingManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshKilnLaneDeviceDriver) { - lnshKilnLaneDeviceDriver = (LnshKilnLaneDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshKilnLaneDeviceDriver.getMode()); - jo.put("status", lnshKilnLaneDeviceDriver.getStatus()); - jo.put("isOnline", lnshKilnLaneDeviceDriver.getIsonline()); - jo.put("error", lnshKilnLaneDeviceDriver.getError()); - jo.put("isError", lnshKilnLaneDeviceDriver.getIserror()); - jo.put("open_time", lnshKilnLaneDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshKilnLaneDeviceDriver.getStandby_time()); - jo.put("production_time", lnshKilnLaneDeviceDriver.getProduction_time()); - jo.put("error_time", lnshKilnLaneDeviceDriver.getError_time()); - jo.put("car_sum", lnshKilnLaneDeviceDriver.getCar_sum()); - jo.put("nullCar_qty", lnshKilnLaneDeviceDriver.getNullCar_qty()); - jo.put("burning_car_qty", lnshKilnLaneDeviceDriver.getBurning_car_qty()); - jo.put("message", lnshKilnLaneDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshPackagePalletManipulatorDeviceDriver) { - lnshPackagePalletManipulatorDeviceDriver = (LnshPackagePalletManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPackagePalletManipulatorDeviceDriver.getMode()); - jo.put("status", lnshPackagePalletManipulatorDeviceDriver.getStatus()); -// jo.put("onoff_status", lnshPackagePalletManipulatorDeviceDriver.getOnoff_status()); -// jo.put("specifications", lnshPackagePalletManipulatorDeviceDriver.getSpecifications()); -// jo.put("batch", lnshPackagePalletManipulatorDeviceDriver.getBatch()); - jo.put("isOnline", lnshPackagePalletManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshPackagePalletManipulatorDeviceDriver.getError()); - jo.put("putStation", lnshPackagePalletManipulatorDeviceDriver.getPut_station()); - jo.put("barcode", lnshPackagePalletManipulatorDeviceDriver.getBarcode()); - jo.put("material", lnshPackagePalletManipulatorDeviceDriver.getMaterial()); - jo.put("qty", lnshPackagePalletManipulatorDeviceDriver.getQty()); - jo.put("open_time", lnshPackagePalletManipulatorDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshPackagePalletManipulatorDeviceDriver.getStandby_time()); - jo.put("production_time", lnshPackagePalletManipulatorDeviceDriver.getProduction_time()); - jo.put("error_time", lnshPackagePalletManipulatorDeviceDriver.getError_time()); - jo.put("order_No", lnshPackagePalletManipulatorDeviceDriver.getOrder_No()); - jo.put("isError", lnshPackagePalletManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshPackagePalletManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshLabelingMachineDeviceDriver) { - lnshLabelingMachineDeviceDriver = (LnshLabelingMachineDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshLabelingMachineDeviceDriver.getMode()); - jo.put("status", lnshLabelingMachineDeviceDriver.getStatus()); - jo.put("isOnline", lnshLabelingMachineDeviceDriver.getIsonline()); - jo.put("open_time", lnshLabelingMachineDeviceDriver.getOpen_time()); - jo.put("close_time", lnshLabelingMachineDeviceDriver.getClose_time()); - jo.put("standby_time", lnshLabelingMachineDeviceDriver.getStandby_time()); - jo.put("production_time", lnshLabelingMachineDeviceDriver.getProduction_time()); - jo.put("error_time", lnshLabelingMachineDeviceDriver.getError_time()); - jo.put("labeling_qty", lnshLabelingMachineDeviceDriver.getLabeling_qty()); - jo.put("isError", lnshLabelingMachineDeviceDriver.getIserror()); - jo.put("message", lnshLabelingMachineDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshSplitManipulatorDeviceDriver) { - lnshSplitManipulatorDeviceDriver = (LnshSplitManipulatorDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshSplitManipulatorDeviceDriver.getMode()); - jo.put("isOnline", lnshSplitManipulatorDeviceDriver.getIsonline()); - jo.put("error", lnshSplitManipulatorDeviceDriver.getError()); - jo.put("getStation", lnshSplitManipulatorDeviceDriver.getGetStation()); - jo.put("barcode", lnshSplitManipulatorDeviceDriver.getBarcode()); - jo.put("material", lnshSplitManipulatorDeviceDriver.getMaterial()); -// jo.put("batch", lnshSplitManipulatorDeviceDriver.getBatch()); -// jo.put("specifications", lnshSplitManipulatorDeviceDriver.getSpecifications()); -// jo.put("qty", lnshSplitManipulatorDeviceDriver.getQty()); - jo.put("total_split", lnshSplitManipulatorDeviceDriver.getTotal_split()); - jo.put("open_time", lnshSplitManipulatorDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshSplitManipulatorDeviceDriver.getStandby_time()); - jo.put("production_time", lnshSplitManipulatorDeviceDriver.getProduction_time()); - jo.put("error_time", lnshSplitManipulatorDeviceDriver.getError_time()); - jo.put("isError", lnshSplitManipulatorDeviceDriver.getIserror()); - jo.put("message", lnshSplitManipulatorDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshLaminatingMachineDeviceDriver) { - lnshLaminatingMachineDeviceDriver = (LnshLaminatingMachineDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshLaminatingMachineDeviceDriver.getMode()); - jo.put("move", lnshLaminatingMachineDeviceDriver.getMove()); - jo.put("container_type", lnshLaminatingMachineDeviceDriver.getContainer_type() + 3); -// jo.put("barcode", lnshLaminatingMachineDeviceDriver.getBarcode()); - jo.put("task", lnshLaminatingMachineDeviceDriver.getTask()); - jo.put("error", lnshLaminatingMachineDeviceDriver.getError()); - jo.put("isOnline", lnshLaminatingMachineDeviceDriver.getIsonline()); - jo.put("isError", lnshLaminatingMachineDeviceDriver.getIserror()); - jo.put("message", lnshLaminatingMachineDeviceDriver.getMessage()); - } else if (device.getDeviceDriver() instanceof LnshRGVDeviceDriver) { - lnshRGVDeviceDriver = (LnshRGVDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshRGVDeviceDriver.getMode()); - jo.put("status", lnshRGVDeviceDriver.getStatus()); - jo.put("move_1", lnshRGVDeviceDriver.getMove1()); - jo.put("move_2", lnshRGVDeviceDriver.getMove2()); - jo.put("action_1", lnshRGVDeviceDriver.getAction1()); - jo.put("action_2", lnshRGVDeviceDriver.getAction2()); - jo.put("walk_y", lnshRGVDeviceDriver.getWalk_y()); - jo.put("error", lnshRGVDeviceDriver.getError()); - jo.put("task1", lnshRGVDeviceDriver.getTask1()); - jo.put("task2", lnshRGVDeviceDriver.getTask2()); - jo.put("isOnline", lnshRGVDeviceDriver.getIsonline()); - jo.put("isError", lnshRGVDeviceDriver.getIserror()); - jo.put("message", lnshRGVDeviceDriver.getMessage()); - jo.put("open_time", lnshRGVDeviceDriver.getOpen_time()); - jo.put("standby_time", lnshRGVDeviceDriver.getStandby_time()); - jo.put("production_time", lnshRGVDeviceDriver.getProduction_time()); - jo.put("error_time", lnshRGVDeviceDriver.getError_time()); -// jo.put("task_qty", lnshRGVDeviceDriver.getTask_qty()); -// jo.put("finishTask_qty", lnshRGVDeviceDriver.getFinishTask_qty()); -// jo.put("batch", lnshRGVDeviceDriver.getBatch()); -// jo.put("specifications", lnshRGVDeviceDriver.getSpecifications()); -// jo.put("qty", lnshRGVDeviceDriver.getQty()); - } else if (device.getDeviceDriver() instanceof LnshPackageSiteDeviceDriver) { - lnshPackageSiteDeviceDriver = (LnshPackageSiteDeviceDriver) device.getDeviceDriver(); - jo.put("device_code", device.getDevice_code()); - jo.put("mode", lnshPackageSiteDeviceDriver.getMode()); - jo.put("move", lnshPackageSiteDeviceDriver.getMove()); - jo.put("action", lnshPackageSiteDeviceDriver.getAction()); - jo.put("ioaction", lnshPackageSiteDeviceDriver.getIoaction()); - jo.put("error", lnshPackageSiteDeviceDriver.getError()); - jo.put("vehicle_code", lnshPackageSiteDeviceDriver.getVehicle_code()); - jo.put("vehicle_type", lnshPackageSiteDeviceDriver.getVehicle_type()); - } else { - jo.put("device_code", device.getDevice_code()); - } - backja.add(jo); - } - } - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK); - resultJson.put("message", "操作成功"); - resultJson.put("data", backja); - log.info("queryDevice - 返回参数 {}", resultJson.toString()); - return resultJson; - } finally { - MDC.remove(log_file_type); - } + public Map queryDevice(String jsonObject) { + return null; } @Override public Map queryTray(String whereJson) { - try { - MDC.put(log_file_type, log_type); - log.info("queryTray - 请求参数 {}", whereJson); - JSONArray datas = JSONArray.parseArray(whereJson); - - for (int i = 0; i < datas.size(); i++) { - String device_code = datas.getString(i); - Device device = DeviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)) { - throw new BadRequestException("未找到设备 [" + device_code + "]"); - } - - if (device.getDeviceDriver() instanceof LnshLaminatingMachineDeviceDriver) { - LnshLaminatingMachineDeviceDriver driver = (LnshLaminatingMachineDeviceDriver) device.getDeviceDriver(); - if (driver.getMode() != 0 - && driver.getError() == 0 - && driver.getMove() != 0) { - driver.writing(1); - driver.writing(1); - } else { - String message = ""; - if (driver.getMode() != 0) { - message += "覆膜机未联机,"; - } else { - if (driver.getError() != 0) { - message += "覆膜机故障,"; - } - if (driver.getMove() == 0) { - message += "覆膜机无木托盘,"; - } - } - message += "无法下木托盘!"; - throw new BadRequestException(message); - } - } else { - throw new BadRequestException("[" + device_code + "] 不是覆膜机!"); - } - } - - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK.value()); - resultJson.put("message", "已下木托盘!"); - log.info("queryTray - 返回参数 {}", resultJson); - return resultJson; - } finally { - MDC.remove(log_file_type); - } + return null; } @Override @@ -1157,17 +570,12 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { if (device.getDeviceDriver() instanceof LnshPackageSiteDeviceDriver) { LnshPackageSiteDeviceDriver driver = (LnshPackageSiteDeviceDriver) device.getDeviceDriver(); - driver.writing("to_vehicle_type", info.getString("vehicle_type")); - driver.writing("to_vehicle_type", info.getString("vehicle_type")); - - driver.writing("to_vehicle_code", String.valueOf(info.getIntValue("vehicle_code"))); - driver.writing("to_vehicle_code", String.valueOf(info.getIntValue("vehicle_code"))); - - driver.writing("to_is_package", info.getString("is_package")); - driver.writing("to_is_package", info.getString("is_package")); - - driver.writing(5); - driver.writing(5); + HashMap map = new HashMap<>(); + map.put("to_vehicle_type", info.getString("vehicle_type")); + map.put("to_vehicle_code", String.valueOf(info.getIntValue("vehicle_code"))); + map.put("to_is_package", info.getString("is_package")); + map.put("to_command", 5); + driver.writing(map); } } } @@ -1175,7 +583,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); - result.put("message", "写入成功成功!"); + result.put("message", "写入成功!"); log.info("writeVehicle - 返回参数 {}", result); return result; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceExecuteAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceExecuteAutoRun.java index 7b775be..f81e654 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceExecuteAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceExecuteAutoRun.java @@ -17,47 +17,31 @@ public class DeviceExecuteAutoRun extends AbstractAutoRunnable { DeviceAppService deviceAppService; int cache_thread = 3; - int corePoolSize = 50; int maximumPoolSize = 100; int queueLength = maximumPoolSize * cache_thread; - int multiple = cache_thread; - int loop_time_millions = 100; ExecutorService executorService; Map runs; public DeviceExecuteAutoRun() { - // this.executorService = Executors.newCachedThreadPool(); - /* this.executorService=new ThreadPoolExecutor( - corePoolSize, - maximumPoolSize, - 1L, - TimeUnit.SECONDS, - new ArrayBlockingQueue<>( queueLength), - new TheadFactoryName() - );*/ this.executorService = new ThreadPoolExecutor( 10, 20, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueLength), - new TheadFactoryName(), new RejectedExecutionHandler() { - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - if (!executor.isShutdown()) { - try { - executor.getQueue().put(r); - } catch (InterruptedException arg3) { - log.debug("", arg3); + new TheadFactoryName(), (r, executor) -> { + if (!executor.isShutdown()) { + try { + executor.getQueue().put(r); + } catch (InterruptedException arg3) { + log.debug("", arg3); + } } } - } - } ); - this.runs = new LinkedHashMap(); + this.runs = new LinkedHashMap<>(); this.runs = Collections.synchronizedMap(this.runs); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcSynchronizeAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcSynchronizeAutoRun.java index 4e67f75..90c92aa 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcSynchronizeAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcSynchronizeAutoRun.java @@ -35,12 +35,12 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { static ExecutorService executorService; public static Map opcServersConfig; - public static Map itemCodeOpcItemDtoMapping = new ConcurrentHashMap(); + public static Map itemCodeOpcItemDtoMapping = new ConcurrentHashMap<>(); static boolean canRefreshOpcEntity = true; private long lastRefreshOpcEntityTime; static UnifiedDataAccessor udw; - private static Map canReadOpcValues; + private static final Map canReadOpcValues; private static volatile Map opcCodeOpcEntityMapping; public DeviceOpcSynchronizeAutoRun() { @@ -60,29 +60,8 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { return opcServerService.getServer(opcCode); } - static void submitTimeLimitTask(Runnable runnable, String opcCode) { - CompletableFuture future = CompletableFuture.runAsync(runnable, executorService); - -// try { -// future.get(10L, TimeUnit.SECONDS); -// } catch (InterruptedException var9) { -// Thread.currentThread().interrupt(); -// } catch (ExecutionException var10) { -// var10.printStackTrace(); -// } catch (TimeoutException var11) { -// itemCodeOpcItemDtoMapping.keySet().forEach((key) -> { -// udw.setValue(key, (Object) null); -// }); -// canReadOpcValues = new ConcurrentHashMap<>(); -// System.out.println("opc设备同步器 任务执行超时,取消任务..."); -// future.cancel(true); -// } finally { -// canRefreshOpcEntity = true; -// if (opcCode != null) { -// canReadOpcValues.put(opcCode, true); -// } -// -// } + static void submitTimeLimitTask(Runnable runnable) { + CompletableFuture.runAsync(runnable, executorService); } private ExecutorService createThreadPool() { @@ -95,19 +74,15 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { OpcStartTag.is_run = true; opcServersConfig = this.opcServerManageService.queryAllServerMap(); executorService = this.createThreadPool(); - opcCodeOpcEntityMapping = new ConcurrentHashMap(); - itemCodeOpcItemDtoMapping.keySet().forEach((key) -> { - udw.setValue(key, (Object) null); - }); + opcCodeOpcEntityMapping = new ConcurrentHashMap<>(); + itemCodeOpcItemDtoMapping.keySet().forEach((key) -> udw.setValue(key, null)); canRefreshOpcEntity = true; canReadOpcValues.clear(); while (true) { this.refreshOpcEntity(); - Iterator var1 = opcServersConfig.keySet().iterator(); - while (var1.hasNext()) { - String opcCode = (String) var1.next(); + for (String opcCode : opcServersConfig.keySet()) { submitTimeLimitTask(() -> { boolean in = false; try { @@ -117,14 +92,14 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { this.readOpcValues(opcCode); } } catch (Exception var3) { - var3.printStackTrace(); + log.error("error !", var3); } finally { canRefreshOpcEntity = true; if (opcCode != null && in) { canReadOpcValues.put(opcCode, true); } } - }, opcCode); + }); } ThreadUtl.sleep((long) OpcConfig.synchronized_millisecond); @@ -133,16 +108,13 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { private void readOpcValues(String opcCode) throws Exception { synchronized (opcCode.intern()) { - OpcEntity opcEntity = (OpcEntity) opcCodeOpcEntityMapping.get(opcCode); + OpcEntity opcEntity = opcCodeOpcEntityMapping.get(opcCode); if (opcEntity != null) { - if (opcEntity.getItems().size() != 0) { + if (!opcEntity.getItems().isEmpty()) { long begin = System.currentTimeMillis(); if (log.isTraceEnabled()) { log.trace("opc {} 开始计时{}", opcCode, begin); } - - new HashMap(); - Map itemStatus; try { itemStatus = opcEntity.readAll(); @@ -160,22 +132,13 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { log.warn("opc {} 读取超时 : {}", opcCode, duration); } -// boolean allNull = itemStatus.entrySet().stream().map((map) -> { -// return OpcUtl.getValue((Item)map.getKey(), (ItemState)map.getValue()); -// }).allMatch(Objects::isNull); -// if (allNull) { -// opcEntity.getItems().clear(); -// } - UnifiedDataAccessor udw = opcEntity.getUdw(); Set items = itemStatus.keySet(); - Iterator var18 = items.iterator(); - while (var18.hasNext()) { - Item item = (Item) var18.next(); - ItemState itemState = (ItemState) itemStatus.get(item); + for (Item item : items) { + ItemState itemState = itemStatus.get(item); Object nowValue = OpcUtl.getValue(item, itemState); String itemId = item.getId(); Object historyValue = udw.getValue(itemId); @@ -183,10 +146,8 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { log.warn("opc 值不健康 item: {}, 状态: {}", itemId, itemState.getQuality()); } if (!UnifiedDataAppService.isEquals(nowValue, historyValue)) { - OpcItemDto itemDto = (OpcItemDto) itemCodeOpcItemDtoMapping.get(itemId); - if (true) { - this.logItemChanged(itemId, udw, nowValue, itemDto); - } + OpcItemDto itemDto = itemCodeOpcItemDtoMapping.get(itemId); + this.logItemChanged(itemId, udw, nowValue, itemDto); udw.setValue(itemId, nowValue); } @@ -206,35 +167,23 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { submitTimeLimitTask(() -> { try { Map>> protocol = this.deviceAppService.findAllFormatProtocolFromDriver(); - Iterator var2 = protocol.entrySet().iterator(); - while (var2.hasNext()) { - Entry>> stringListEntry = (Entry) var2.next(); - String opcCode = (String) stringListEntry.getKey(); - List> opcItemDtos = (List) stringListEntry.getValue(); - ((OpcEntity) opcCodeOpcEntityMapping.computeIfAbsent(opcCode, OpcEntity::new)).reload(opcItemDtos); + for (Entry>> stringListEntry : protocol.entrySet()) { + String opcCode = stringListEntry.getKey(); + List> opcItemDtos = stringListEntry.getValue(); + opcCodeOpcEntityMapping.computeIfAbsent(opcCode, OpcEntity::new).reload(opcItemDtos); } } catch (Exception var6) { - var6.printStackTrace(); + log.error("error !", var6); } finally { canRefreshOpcEntity = true; } - }, (String) null); + }); } } } - private void logMessage(String errorMessage) { - try { -// issueLogger.setResource(OpcConfig.resource_code, OpcConfig.resource_name).setError(StringUtl.getString(100), "设备同步通信异常").log(errorMessage, new Object[0]); -// businessLogger.setResource(OpcConfig.resource_code, OpcConfig.resource_name).setError(StringUtl.getString(100), "设备同步通信异常").log(errorMessage, new Object[0]); - } catch (Exception var5) { - var5.printStackTrace(); - } - - } - public void after() { OpcStartTag.is_run = false; opcCodeOpcEntityMapping.values().forEach((opcEntity) -> { @@ -242,8 +191,8 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerService.class); opcServerService.cleanGroups(opcEntity.getOpcCode()); }); - opcCodeOpcEntityMapping = new ConcurrentHashMap(); - itemCodeOpcItemDtoMapping = new ConcurrentHashMap(); + opcCodeOpcEntityMapping = new ConcurrentHashMap<>(); + itemCodeOpcItemDtoMapping = new ConcurrentHashMap<>(); executorService.shutdownNow(); } @@ -252,10 +201,8 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { List relate_items = itemDto.getRelate_items(); if (relate_items != null && !relate_items.isEmpty()) { StringBuilder sb = new StringBuilder(); - Iterator var8 = relate_items.iterator(); - while (var8.hasNext()) { - String relate = (String) var8.next(); + for (String relate : relate_items) { Object obj = udw.getValue(relate); sb.append("key:").append(relate).append("value:").append(obj).append(";"); } @@ -274,7 +221,7 @@ public class DeviceOpcSynchronizeAutoRun extends AbstractAutoRunnable { static { udw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); - canReadOpcValues = new ConcurrentHashMap(); - opcCodeOpcEntityMapping = new ConcurrentHashMap(); + canReadOpcValues = new ConcurrentHashMap<>(); + opcCodeOpcEntityMapping = new ConcurrentHashMap<>(); } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java index abe3464..6c5ed3b 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java @@ -16,176 +16,171 @@ import org.springframework.stereotype.Service; import java.net.UnknownHostException; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; /** * @author ldjun * @version 1.0 - * @date 2023年02月01日 11:27 - * @desc desc */ @Service public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoInitial { - private static final Logger log = LoggerFactory.getLogger(OpcServerServiceImpl.class); - @Autowired OpcServerManageService opcServerManageService; - Map opcServerManageDtos = new HashMap(); - Map servers = Collections.synchronizedMap(new HashMap()); - Map groups = Collections.synchronizedMap(new HashMap()); + private static final Logger log = LoggerFactory.getLogger(OpcServerServiceImpl.class); + @Autowired + OpcServerManageService opcServerManageService; + Map opcServerManageDtos = new HashMap<>(); + Map servers = Collections.synchronizedMap(new HashMap<>()); + Map groups = Collections.synchronizedMap(new HashMap<>()); - public OpcServerServiceImpl() {} + public OpcServerServiceImpl() { + } - public void autoInitial() throws Exception { - this.reload(); - if (OpcConfig.auto_start_opc) { - Thread t = - new Thread() { - public void run() { - Iterator var1 = OpcServerServiceImpl.this.opcServerManageDtos.values().iterator(); + public void autoInitial() throws Exception { + this.reload(); + if (OpcConfig.auto_start_opc) { + Thread t = + new Thread(() -> { - while (var1.hasNext()) { - OpcServerManageDto dto = (OpcServerManageDto) var1.next(); + for (OpcServerManageDto dto : OpcServerServiceImpl.this.opcServerManageDtos.values()) { + try { + OpcServerServiceImpl.this.getServer(dto.getOpc_code()); + OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code()); + } catch (Exception var4) { + OpcServerServiceImpl.log.warn("启动无法载入servers", var4); + } + } + }); + t.start(); + } + } + + public synchronized void reload() { + this.opcServerManageDtos = this.opcServerManageService.queryAllServerMap(); + this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos); + } + + public void cleanGroups(String opcCode) { + Group group = this.groups.get(opcCode); + if (group != null) { + Server server = group.getServer(); + + try { + group.remove(); + } catch (JIException var5) { + log.error("error !", var5); + } + + this.groups.remove(opcCode); + server.disconnect(); + this.servers.remove(opcCode); + } + + } + + public Group getServer(String code) throws Exception { + synchronized (this.buildLock(code)) { + Group group; + group = this.groups.get(code); + if (group != null) { + label68: + { + Group var10000; + try { + if (!group.isActive()) { + break label68; + } + + var10000 = group; + } catch (JIException var14) { + log.error(code, var14); + break label68; + } + + return var10000; + } + } + + Server server = this.servers.get(code); + boolean needcreate = false; + if (server == null) { + needcreate = true; + } else { + try { + group = server.findGroup(code); + } catch (UnknownHostException | JIException | UnknownGroupException | NotConnectedException | + IllegalArgumentException var13) { + log.error(code, var13); + needcreate = true; + } + } + + if (needcreate) { + OpcServerManageDto dto = this.opcServerManageDtos.get(code); + if (dto == null) { + throw new BadRequestException(code + "{} 不存在"); + } + + if (server == null) { + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); + } try { - OpcServerServiceImpl.this.getServer(dto.getOpc_code()); - OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code()); - } catch (Exception var4) { - OpcServerServiceImpl.log.warn("启动无法载入servers", var4); + assert server != null; + group = server.addGroup(code); + } catch (Exception var12) { + this.clearServer(code); + ThreadUtl.sleep(5000L); + log.warn("获取opc出错重新获取 {}", code, var12); + server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); + + try { + assert server != null; + group = server.addGroup(code); + } catch (Exception var11) { + log.error("error !", var11); + } } - } - } - }; - t.start(); - } - } - public synchronized void reload() { - this.opcServerManageDtos = this.opcServerManageService.queryAllServerMap(); - this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos); - } - - public void cleanGroups(String opcCode) { - Group group = (Group)this.groups.get(opcCode); - if (group != null) { - Server server = group.getServer(); - - try { - group.remove(); - } catch (JIException var5) { - var5.printStackTrace(); - } - - this.groups.remove(opcCode); - server.disconnect(); - this.servers.remove(opcCode); - } - - } - - public Group getServer(String code) throws Exception { - synchronized(this.buildLock(code)) { - Group group = null; - group = (Group)this.groups.get(code); - if (group != null) { - label68: { - Group var10000; - try { - if (!group.isActive()) { - break label68; + this.servers.put(code, server); + this.groups.put(code, group); } - var10000 = group; - } catch (JIException var14) { - log.error(code, var14); - break label68; - } - - return var10000; + return group; } - } - - Server server = (Server)this.servers.get(code); - boolean needcreate = false; - String groupName = code; - if (server == null) { - needcreate = true; - } else { - try { - group = server.findGroup(groupName); - } catch (UnknownHostException | JIException | UnknownGroupException | NotConnectedException | IllegalArgumentException var13) { - log.error(code, var13); - needcreate = true; - } - } - - if (needcreate) { - OpcServerManageDto dto = (OpcServerManageDto)this.opcServerManageDtos.get(code); - if (dto == null) { - throw new BadRequestException(code + "{} 不存在"); - } - - if (server == null) { - server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); - } - - try { - group = server.addGroup(groupName); - } catch (Exception var12) { - this.clearServer(code); - ThreadUtl.sleep(5000L); - log.warn("获取opc出错重新获取", code, var12); - server = OpcServerUtl.getServerWithOutException(dto.getOpc_host(), StrUtil.trim(dto.getCls_id()), dto.getUser(), dto.getPassword(), StrUtil.trim(dto.getDomain())); - - try { - group = server.addGroup(groupName); - } catch (Exception var11) { - var11.printStackTrace(); - } - } - - this.servers.put(code, server); - this.groups.put(code, group); - } - - return group; } - } - public void clearServer(String code) { - synchronized(this.buildLock(code)) { - try { - Server server = (Server)this.servers.get(code); - server.disconnect(); - } catch (Exception var5) { - } + public void clearServer(String code) { + synchronized (this.buildLock(code)) { + try { + Server server = this.servers.get(code); + server.disconnect(); + } catch (Exception ignored) { + } - this.servers.remove(code); - this.groups.remove(code); + this.servers.remove(code); + this.groups.remove(code); + } } - } - public void writeInteger(String code, ItemValue... values) { - try { - Group group = this.getServer(code); - OpcUtl.writeValue(group, values); - } catch (Exception var4) { - this.clearServer(code); - log.warn("写入出错opc server {} 重新加载", code, var4); - ThreadUtl.sleep(5000L); + public void writeInteger(String code, ItemValue... values) { + try { + Group group = this.getServer(code); + OpcUtl.writeValue(group, values); + } catch (Exception var4) { + this.clearServer(code); + log.warn("写入出错opc server {} 重新加载", code, var4); + ThreadUtl.sleep(5000L); // throw var4; + } } - } - private String buildLock(String key) { - if (StrUtil.isEmpty(key)) { - key = ""; + private String buildLock(String key) { + if (StrUtil.isEmpty(key)) { + key = ""; + } + String builder = "OpcServerService." + + key; + return builder.intern(); } - StringBuilder builder = new StringBuilder(); - builder.append("OpcServerService."); - builder.append(key); - String lock = builder.toString().intern(); - return lock; - } } diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java index 19ce19f..e5f181e 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java @@ -5,22 +5,17 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; -import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.*; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.BytesRef; -import org.wltea.analyzer.lucene.IKAnalyzer; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.Calendar; -import java.util.List; import java.util.Map; /** @@ -29,7 +24,7 @@ import java.util.Map; @Slf4j public class Searcher { - public static Map search(String indexDir, String ext,Map whereJson) throws Exception { + public static Map search(String indexDir, String ext, Map whereJson) throws Exception { //获取要查询的路径,也就是索引所在的位置 Directory dir = FSDirectory.open(Paths.get(indexDir)); IndexReader reader = DirectoryReader.open(dir); @@ -49,57 +44,56 @@ public class Searcher { int start = pageNum * pageSize;// 当前页的起始条数 int end = start + pageSize;// 当前页的结束条数(不能包含) // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序 - Sort sort = new Sort(new SortField("logTime", SortField.Type.DOC,true)); + Sort sort = new Sort(new SortField("logTime", SortField.Type.STRING, true)); - TopDocs docs = null; + TopDocs docs; BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); //时间范围查询 String startDate = (String) whereJson.get("begin_time"); String endDate = (String) whereJson.get("end_time"); - Calendar calendar=Calendar.getInstance(); - calendar.set(1970, 0, 1); - if (startDate == null){ - startDate = DateUtil.format(calendar.getTime(),"yyyy-MM-dd HH:mm:ss.SSS"); - }else{ + Calendar calendar = Calendar.getInstance(); + calendar.set(1970, Calendar.JANUARY, 1); + if (startDate == null) { + startDate = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss.SSS"); + } else { startDate = LuceneIndexWriter.getDate(startDate); } - if (endDate == null){ - endDate = DateUtil.format(new DateTime(),"yyyy-MM-dd HH:mm:ss.SSS"); + if (endDate == null) { + endDate = DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"); } else { endDate = LuceneIndexWriter.getDate(endDate); } TermRangeQuery termRangeQuery = new TermRangeQuery("logTime", new BytesRef(startDate), new BytesRef(endDate), true, true); - booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST); - if (whereJson.get("device_code") != null){ + booleanQueryBuilder.add(termRangeQuery, BooleanClause.Occur.MUST); + if (whereJson.get("device_code") != null) { Query termQuery = new TermQuery(new Term("device_code", (String) whereJson.get("device_code"))); - booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); } - if (whereJson.get("method") != null){ + if (whereJson.get("method") != null) { Query termQuery = new TermQuery(new Term("method", (String) whereJson.get("method"))); - booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); } - if (whereJson.get("status_code") != null){ + if (whereJson.get("status_code") != null) { Query termQuery = new TermQuery(new Term("status_code", (String) whereJson.get("status_code"))); - booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); } - if (whereJson.get("requestparam") != null){ - WildcardQuery query = new WildcardQuery(new Term("requestparam", "*"+(String) whereJson.get("requestparam")+"*")); - booleanQueryBuilder.add(query,BooleanClause.Occur.MUST); - } - if (whereJson.get("responseparam") != null){ - WildcardQuery query = new WildcardQuery(new Term("responseparam", "*"+(String) whereJson.get("responseparam")+"*")); - booleanQueryBuilder.add(query,BooleanClause.Occur.MUST); - } - if (whereJson.get("blurry") != null) { - WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*"+(String) whereJson.get("blurry")+"*")); + if (whereJson.get("requestparam") != null) { + WildcardQuery query = new WildcardQuery(new Term("requestparam", "*" + whereJson.get("requestparam") + "*")); booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); } - docs = searcher.search(booleanQueryBuilder.build(), end,sort); + if (whereJson.get("responseparam") != null) { + WildcardQuery query = new WildcardQuery(new Term("responseparam", "*" + whereJson.get("responseparam") + "*")); + booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); + } + if (whereJson.get("blurry") != null) { + WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*" + whereJson.get("blurry") + "*")); + booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); + } + docs = searcher.search(booleanQueryBuilder.build(), end, sort); //记录索引时间 long endTime = System.currentTimeMillis(); - log.info("匹配{}共耗时{}毫秒",booleanQueryBuilder.build(),(endTime-startTime)); + log.info("匹配{}共耗时{}毫秒", booleanQueryBuilder.build(), (endTime - startTime)); log.info("查询到{}条日志文件", docs.totalHits.value); - List list = new ArrayList<>(); ScoreDoc[] scoreDocs = docs.scoreDocs; if (end > docs.totalHits.value) end = (int) docs.totalHits.value; JSONArray array = new JSONArray(); @@ -108,18 +102,18 @@ public class Searcher { ScoreDoc scoreDoc = scoreDocs[i]; Document doc = reader.document(scoreDoc.doc); JSONObject object = new JSONObject(); - object.put("content",doc.get("fieldContent")); - object.put("device_code",doc.get("device_code")); - object.put("logTime",doc.get("logTime")); - object.put("method",doc.get("method")); - object.put("status_code",doc.get("status_code")); - object.put("requestparam",doc.get("requestparam")); - object.put("responseparam",doc.get("responseparam")); - if(doc.get("fieldContent") != null) { + object.put("content", doc.get("fieldContent")); + object.put("device_code", doc.get("device_code")); + object.put("logTime", doc.get("logTime")); + object.put("method", doc.get("method")); + object.put("status_code", doc.get("status_code")); + object.put("requestparam", doc.get("requestparam")); + object.put("responseparam", doc.get("responseparam")); + if (doc.get("fieldContent") != null) { array.add(object); } } - for(Object logDto:array){ + for (Object logDto : array) { log.info(logDto.toString()); } reader.close(); @@ -128,16 +122,4 @@ public class Searcher { jo.put("totalElements", docs.totalHits.value); return jo; } - - public static void main(String[] args) { - String indexDir = "D:\\lucene\\index"; - //查询这个字符串 - String q = "07.832"; - Map whereJson = null; - try { - search(indexDir, q,whereJson); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java index 2ce92ee..53afba2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java @@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.nl.modules.lucene.common.LuceneIndexWriter; import org.nl.modules.lucene.enums.LogTypeEnum; @@ -18,12 +17,8 @@ import org.nl.modules.lucene.service.dto.LuceneLogDto; import org.slf4j.MDC; import org.springframework.stereotype.Service; -import java.io.IOException; - /** * @author jlm - * @description 服务实现 - * @date 2023-04-11 */ @Service @RequiredArgsConstructor @@ -32,7 +27,7 @@ public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService { @Override public void deviceItemValue(String device_code, String key, String value) { - String now = DateUtil.now(); + } @SneakyThrows @@ -43,12 +38,12 @@ public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService { } @Override - public void interfaceExecuteLog(LuceneLogDto luceneLogDto) throws IOException { + public void interfaceExecuteLog(LuceneLogDto luceneLogDto) { luceneLogDto.setLogType(LogTypeEnum.INTERFACE_LOG.getDesc()); addIndex(luceneLogDto); } - private void addIndex(LuceneLogDto luceneLogDto) throws IOException { + private void addIndex(LuceneLogDto luceneLogDto) { IndexWriter indexWriter = LuceneIndexWriter.getIndexWriter(); //创建一个Document对象 Document document = new Document(); @@ -94,7 +89,7 @@ public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService { MDC.put(name, name); log.info("{}", message); } catch (Exception e) { - e.printStackTrace(); + log.error("error !", e); } finally { MDC.remove(name); } diff --git a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java index 0f40b46..d8b41b4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java +++ b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java @@ -18,68 +18,68 @@ import java.sql.SQLException; @Configuration @Slf4j public class DataBaseConfig { - - @Value("${erp.sqlserver.enabled}") - private boolean sqlserverIsConnect; - @Value("${erp.sqlserver.jdbcurl}") - private String sqlserverJdbcUrl; - @Value("${erp.sqlserver.username}") - private String sqlserverUserName; - @Value("${erp.sqlserver.password}") - private String sqlserverPassword; - - @Primary - @Bean(name = "dataSource") - @ConfigurationProperties(prefix = "spring.datasource.druid") - public DataSource dataSource() { - return new DruidDataSource(); - } - - @Bean("dataSource1") - @ConditionalOnExpression("${erp.sqlserver.enabled:true}") - public DataSource dataSource1() { - log.info("是否连接Sqlserver" + sqlserverIsConnect); - String jdbcUrl = sqlserverJdbcUrl; - String userName = sqlserverUserName; - String password = sqlserverPassword; - DruidDataSource druidDataSource = new DruidDataSource(); - String className; - try { - className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); - } catch (SQLException e) { - throw new RuntimeException("Get class name error: =" + jdbcUrl); - } - if (StrUtil.isEmpty(className)) { - DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); - if (null == dataTypeEnum) { - throw new RuntimeException("Not supported data type: jdbcUrl=" + jdbcUrl); - } - druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); - } else { - druidDataSource.setDriverClassName(className); - } - - - druidDataSource.setUrl(jdbcUrl); - druidDataSource.setUsername(userName); - druidDataSource.setPassword(password); - // 配置获取连接等待超时的时间 - druidDataSource.setMaxWait(3000); - // 配置初始化大小、最小、最大 - druidDataSource.setInitialSize(5); - druidDataSource.setMinIdle(5); - druidDataSource.setMaxActive(10); - - // 如果链接出现异常则直接判定为失败而不是一直重试 - druidDataSource.setBreakAfterAcquireFailure(true); - try { - druidDataSource.init(); - } catch (SQLException e) { - log.error("Exception during pool initialization", e); - throw new RuntimeException(e.getMessage()); - } - - return druidDataSource; - } +// +// @Value("${erp.sqlserver.enabled}") +// private boolean sqlserverIsConnect; +// @Value("${erp.sqlserver.jdbcurl}") +// private String sqlserverJdbcUrl; +// @Value("${erp.sqlserver.username}") +// private String sqlserverUserName; +// @Value("${erp.sqlserver.password}") +// private String sqlserverPassword; +// +// @Primary +// @Bean(name = "dataSource") +// @ConfigurationProperties(prefix = "spring.datasource.druid") +// public DataSource dataSource() { +// return new DruidDataSource(); +// } +// +// @Bean("dataSource1") +// @ConditionalOnExpression("${erp.sqlserver.enabled:true}") +// public DataSource dataSource1() { +// log.info("是否连接Sqlserver" + sqlserverIsConnect); +// String jdbcUrl = sqlserverJdbcUrl; +// String userName = sqlserverUserName; +// String password = sqlserverPassword; +// DruidDataSource druidDataSource = new DruidDataSource(); +// String className; +// try { +// className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); +// } catch (SQLException e) { +// throw new RuntimeException("Get class name error: =" + jdbcUrl); +// } +// if (StrUtil.isEmpty(className)) { +// DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); +// if (null == dataTypeEnum) { +// throw new RuntimeException("Not supported data type: jdbcUrl=" + jdbcUrl); +// } +// druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); +// } else { +// druidDataSource.setDriverClassName(className); +// } +// +// +// druidDataSource.setUrl(jdbcUrl); +// druidDataSource.setUsername(userName); +// druidDataSource.setPassword(password); +// // 配置获取连接等待超时的时间 +// druidDataSource.setMaxWait(3000); +// // 配置初始化大小、最小、最大 +// druidDataSource.setInitialSize(5); +// druidDataSource.setMinIdle(5); +// druidDataSource.setMaxActive(10); +// +// // 如果链接出现异常则直接判定为失败而不是一直重试 +// druidDataSource.setBreakAfterAcquireFailure(true); +// try { +// druidDataSource.init(); +// } catch (SQLException e) { +// log.error("Exception during pool initialization", e); +// throw new RuntimeException(e.getMessage()); +// } +// +// return druidDataSource; +// } } 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 cfacd9b..640ba11 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 @@ -4,9 +4,14 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.sch.manage.WorkOrderEnum; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.util.List; import java.util.stream.Collectors; /** @@ -16,6 +21,8 @@ import java.util.stream.Collectors; @Service public class DashboardService { + private final WmsToAcsService wmsToAcsService; + /** * 大屏首页报表 * @@ -635,4 +642,143 @@ public class DashboardService { private String randomFrom1To(int to) { return String.valueOf(1 + (int) (Math.random() * to)); } + + /** + * 首页真实数据,后期内部调用这个方法。 + * + * @return 首页真实数据 + */ + @SuppressWarnings("unused") + private JSONObject homepageData1() { + JSONObject result = new JSONObject(); + + // 当前设备情况--------------------------------------------------------------------------------------------------- + JSONObject currentEquipmentCondition = new JSONObject(); + result.put("currentEquipmentCondition", currentEquipmentCondition); + // 初始化 0 + currentEquipmentCondition.put("running", 0); + currentEquipmentCondition.put("pausing", 0); + currentEquipmentCondition.put("shutdown", 0); + currentEquipmentCondition.put("inTrouble", 0); + // 真实获取 + JSONArray pdmBiDevice = WQLObject.getWQLObject("pdm_bi_device").query().getResultJSONArray(0); + JSONObject acsResult = wmsToAcsService.getDeviceStatus(pdmBiDevice); + if (acsResult.getIntValue("status") == HttpStatus.OK.value()) { + JSONArray data = acsResult.getJSONArray("data"); + + currentEquipmentCondition.put("running", data.stream().filter(o -> ((JSONObject) o).getIntValue("device_status") == 2).count()); + currentEquipmentCondition.put("pausing", data.stream().filter(o -> ((JSONObject) o).getIntValue("device_status") == 1).count()); + currentEquipmentCondition.put("shutdown", data.stream().filter(o -> ((JSONObject) o).getIntValue("device_status") == 0).count()); + currentEquipmentCondition.put("inTrouble", data.stream().filter(o -> ((JSONObject) o).getIntValue("device_status") == 3).count()); + } + + // 每月故障统计--------------------------------------------------------------------------------------------------- + JSONObject monthlyFailureStatistics = new JSONObject(); + result.put("monthlyFailureStatistics", monthlyFailureStatistics); + + // 故障次数 + JSONObject currentMonth = new JSONObject(); + monthlyFailureStatistics.put("currentMonth", currentMonth); + // 初始化 0 + currentMonth.put("mix", 0); + currentMonth.put("press", 0); + currentMonth.put("dry", 0); + currentMonth.put("sort", 0); + // 真实获取 + JSONArray data = WQL.getWO("DASHBOARD").addParam("flag", "1").process().getResultJSONArray(0); + List mixData = data.stream().filter(o -> "HL".equals(((JSONObject) o).getString("region_code"))).collect(Collectors.toList()); + List pressData = data.stream().filter(o -> "YZ".equals(((JSONObject) o).getString("region_code"))).collect(Collectors.toList()); + List dryData = data.stream().filter(o -> "GZ".equals(((JSONObject) o).getString("region_code"))).collect(Collectors.toList()); + List sortData = data.stream().filter(o -> "FJ".equals(((JSONObject) o).getString("region_code"))).collect(Collectors.toList()); + currentMonth.put("mix", mixData.stream().filter(o -> { + JSONObject row = (JSONObject) o; + return DateUtil.thisYear() == row.getIntValue("year") && (DateUtil.thisMonth() + 1) == row.getIntValue("month"); + }).count()); + currentMonth.put("press", pressData.stream().filter(o -> { + JSONObject row = (JSONObject) o; + return DateUtil.thisYear() == row.getIntValue("year") && (DateUtil.thisMonth() + 1) == row.getIntValue("month"); + }).count()); + currentMonth.put("dry", dryData.stream().filter(o -> { + JSONObject row = (JSONObject) o; + return DateUtil.thisYear() == row.getIntValue("year") && (DateUtil.thisMonth() + 1) == row.getIntValue("month"); + }).count()); + currentMonth.put("sort", sortData.stream().filter(o -> { + JSONObject row = (JSONObject) o; + return DateUtil.thisYear() == row.getIntValue("year") && (DateUtil.thisMonth() + 1) == row.getIntValue("month"); + }).count()); + + // 平均次数 + JSONObject average = new JSONObject(); + 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()); + + // 当日工序生产统计------------------------------------------------------------------------------------------------ + JSONObject dailyProductionStatistics = new JSONObject(); + result.put("dailyProductionStatistics", dailyProductionStatistics); + + // 今日各区域生产数据 + data = WQL.getWO("DASHBOARD").addParam("flag", "2").process().getResultJSONArray(0); + + // 混料 + JSONObject mix = new JSONObject(); + dailyProductionStatistics.put("mix", mix); + // 初始化 0 + mix.put("planned", 0); + // 真实获取 + mix.put("completed", String.format("%.2f", data.stream().filter(o -> "HL".equals(((JSONObject) o).getString("region_code"))).mapToInt(o -> ((JSONObject) o).getIntValue("weight")).sum() / 1000.00)); + + // 困料 + JSONObject stand = new JSONObject(); + dailyProductionStatistics.put("stand", stand); + // 当前所有存在的料盅数据 + JSONArray cupData = WQLObject.getWQLObject("st_ivt_vehicle_detail").query("is_delete = '0' AND vehicle_type = '1'").getResultJSONArray(0); + // 处理 + stand.put("onStanding", String.format("%.2f", cupData.stream().filter(o -> "1".equals(((JSONObject) o).getString("stand_status"))).mapToInt(o -> ((JSONObject) o).getIntValue("weight")).sum() / 1000.00)); + stand.put("completed", String.format("%.2f", cupData.stream().filter(o -> "23".contains(((JSONObject) o).getString("stand_status"))).mapToInt(o -> ((JSONObject) o).getIntValue("weight")).sum() / 1000.00)); + + // 压制 + JSONObject press = new JSONObject(); + dailyProductionStatistics.put("press", press); + // 初始化 0 + press.put("planned", 0); + // 真实获取 + press.put("completed", String.format("%.2f", data.stream().filter(o -> "YZ".equals(((JSONObject) o).getString("region_code"))).mapToInt(o -> ((JSONObject) o).getIntValue("qty")).sum() / 10000.00)); + + // 干燥 + JSONObject dry = new JSONObject(); + dailyProductionStatistics.put("dry", dry); + // 出窑时间为今天的数据 + JSONArray outKilnData = WQLObject.getWQLObject("st_ivt_vehicle_detail").query("vehicle_type = '2' AND TO_DAYS ( out_kiln_time ) = TO_DAYS ( NOW() )").getResultJSONArray(0); + // 处理 + dry.put("planned", 0); + dry.put("completed", String.format("%.2f", outKilnData.stream().mapToInt(o -> ((JSONObject) o).getIntValue("qty")).sum() / 10000.00)); + + // 分拣 + JSONObject sort = new JSONObject(); + dailyProductionStatistics.put("sort", sort); + sort.put("planned", 0); + // 真实获取 + sort.put("completed", String.format("%.2f", data.stream().filter(o -> "FJ".equals(((JSONObject) o).getString("region_code"))).mapToInt(o -> ((JSONObject) o).getIntValue("qty")).sum() / 10000.00)); + + // 设备生产统计--------------------------------------------------------------------------------------------------- + JSONArray equipmentProductionStatistics = new JSONArray(); + result.put("equipmentProductionStatistics", equipmentProductionStatistics); + + return result; + } + + /** + * 大屏首页设备真实数据,后期内部调用这个方法。 + * + * @return 大屏首页设备数据 + */ + public JSONObject homepageEquipment1() { + JSONObject result = new JSONObject(); + + return result; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/wql/DASHBOARD.wql b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/wql/DASHBOARD.wql new file mode 100644 index 0000000..167ddda --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/wql/DASHBOARD.wql @@ -0,0 +1,73 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + device.region_code, + YEAR ( failure_time ) AS "year", + MONTH ( failure_time ) AS "month", + COUNT ( data_id ) AS "count" + FROM + das_device_number ddn + LEFT JOIN pdm_bi_device device ON ddn.device_code = device.device_code + GROUP BY + `year`, + `month`, + device.region_code + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + d.region_code, + wod.qty, + wod.weight, + wo.plan_qty + FROM + pdm_bd_work_order_daliy wod + LEFT JOIN pdm_bd_workorder wo ON wod.workorder_id = wo.workorder_id + LEFT JOIN pdm_bi_device d ON wo.device_id = d.device_id + WHERE + TO_DAYS ( wod.date ) = TO_DAYS ( NOW() ) + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/ACSSystem.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/ACSSystem.java index 3c06f99..5a3cd7f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/ACSSystem.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/ACSSystem.java @@ -2,7 +2,6 @@ package org.nl.wms.sch.manage; /** * @author zhangjiangwei - * @date 2023/03/03 10:42 */ public class ACSSystem { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreate.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreate.java index d85dabd..9a9db8f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreate.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreate.java @@ -2,7 +2,6 @@ package org.nl.wms.sch.manage; /** * @author zhangjiangwei - * @date 2023/04/12 21:44 */ public class AutoCreate { 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 9c9db86..eadf5b8 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 @@ -19,7 +19,6 @@ import java.util.ArrayList; /** * @author zhangjiangwei - * @date 2023/05/10 10:48 */ @Slf4j @RequiredArgsConstructor diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/CreateMode.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/CreateMode.java index 3800c29..d6c8f0b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/CreateMode.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/CreateMode.java @@ -7,7 +7,6 @@ import lombok.Getter; * 生成方式枚举类 * * @author 张江玮 - * @date 2022/11/01 15:57 */ @AllArgsConstructor public enum CreateMode { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/LockType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/LockType.java index 89915d5..6dacef4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/LockType.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/LockType.java @@ -1,6 +1,5 @@ package org.nl.wms.sch.manage; -import lombok.Getter; import lombok.RequiredArgsConstructor; import java.util.Arrays; @@ -8,7 +7,6 @@ import java.util.stream.Collectors; /** * @author zhangjiangwei - * @date 2023/03/03 9:41 */ @RequiredArgsConstructor public enum LockType { 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 d338258..41aae09 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 @@ -3,10 +3,9 @@ package org.nl.wms.sch.manage; import lombok.RequiredArgsConstructor; /** - * 任务状态 + * 点位状态 * * @author zhangjiangwei - * @date 2023/03/03 9:26 */ @RequiredArgsConstructor public enum PointStatus { 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 fc297ce..549bbe5 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 @@ -10,7 +10,6 @@ import java.util.stream.Collectors; * 区域枚举类 * * @author 张江玮 - * @date 2022/11/22 16:16 */ @RequiredArgsConstructor public enum Region { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionInType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionInType.java index 83f55a6..67db837 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionInType.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionInType.java @@ -9,7 +9,6 @@ import java.util.stream.Collectors; * 入库类型 * * @author zhangjiangwei - * @date 2023/05/19 09:53 */ @RequiredArgsConstructor public enum RegionInType { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionOutType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionOutType.java index b5a6d8e..f5e4a24 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionOutType.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionOutType.java @@ -7,7 +7,6 @@ import java.util.stream.Collectors; /** * @author zhangjiangwei - * @date 2023/05/20 14:06 */ @RequiredArgsConstructor public enum RegionOutType { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskType.java index d3ff10e..d1a940b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskType.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskType.java @@ -7,7 +7,6 @@ import java.util.Arrays; /** * @author zhangjiangwei - * @date 2023/03/03 10:21 */ @RequiredArgsConstructor public enum TaskType { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatus.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatus.java index a781445..a027da4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatus.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/UpdateTaskStatus.java @@ -7,7 +7,6 @@ import lombok.RequiredArgsConstructor; * acs反馈任务状态 * * @author zhangjiangwei - * @date 2023/03/07 11:27 */ @RequiredArgsConstructor @Getter diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/FJCallEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/FJCallEmptyTask.java index b14d582..1f8e063 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/FJCallEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/FJCallEmptyTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/28 15:27 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/GTKCallEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/GTKCallEmptyTask.java index fd10acc..ab567ac 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/GTKCallEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/GTKCallEmptyTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/21 09:15 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java index 7551a78..0fe7580 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java @@ -18,7 +18,6 @@ import org.springframework.stereotype.Component; * 辽宁晟华混料 叫空 任务类 * * @author zhangjiangwei - * @date 2023/03/03 9:08 */ @RequiredArgsConstructor @Component 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 724bbcb..0795382 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 @@ -18,7 +18,6 @@ import org.springframework.stereotype.Component; * 辽宁晟华压制 叫空 任务类 * * @author zhangjiangwei - * @date 2023/04/04 11:36 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java index 341a291..05c0f39 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/14 21:28 */ @RequiredArgsConstructor @Component 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/SZCallMaterialTask.java index 4991a44..6ae5e32 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/SZCallMaterialTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/07 15:51 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/YZCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/YZCallMaterialTask.java index 56e28cf..b6e9fdb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/YZCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/YZCallMaterialTask.java @@ -17,7 +17,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/05/10 10:04 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java index ea5190d..3afa061 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java @@ -16,7 +16,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/14 21:29 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/YZSendEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/YZSendEmptyTask.java index 669f44b..38894ce 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/YZSendEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/YZSendEmptyTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/05/10 10:25 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/FJSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/FJSendMaterialTask.java index 668913d..8de65ed 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/FJSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/FJSendMaterialTask.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/28 12:33 */ @RequiredArgsConstructor @Component @@ -294,8 +293,6 @@ public class FJSendMaterialTask extends AbstractAcsTask { } if (TaskType.SEND_MATERIAL.value().equals(task.getString("task_type"))) { - JSONObject point2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject workorder = WQL .getWO("SEND_MATERIAL_TASK") .addParam("flag", "7") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java index e1554c2..87cc58e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java @@ -17,7 +17,6 @@ import org.springframework.stereotype.Component; * 辽宁晟华混料 送料入库 任务类 * * @author zhangjiangwei - * @date 2023/03/06 14:28 */ @RequiredArgsConstructor @Component 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/SZSendMaterialTask.java index 9b326fe..4c93bfc 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/SZSendMaterialTask.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/12 22:12 */ @RequiredArgsConstructor @Component 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 650edbd..83541d6 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 @@ -15,7 +15,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/04/05 17:39 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/BTHCToPackageTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/BTHCToPackageTask.java index 1d3ff25..d5e901c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/BTHCToPackageTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/BTHCToPackageTask.java @@ -17,7 +17,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/05/04 10:05 */ @RequiredArgsConstructor @Component diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/FJToPackageTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/FJToPackageTask.java index e1494ff..32d6506 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/FJToPackageTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/to/pack/FJToPackageTask.java @@ -17,7 +17,6 @@ import org.springframework.stereotype.Component; /** * @author zhangjiangwei - * @date 2023/05/04 09:40 */ @RequiredArgsConstructor @Component 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 cafa6b3..d5518f2 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 @@ -15,7 +15,6 @@ import org.nl.wms.sch.manage.*; * 辽宁晟华任务工具类 * * @author zhangjiangwei - * @date 2023/03/06 14:32 */ public class TaskUtils { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/util/PointUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/util/PointUtils.java index 584937b..0a63a19 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/util/PointUtils.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/util/PointUtils.java @@ -2,7 +2,6 @@ package org.nl.wms.sch.util; /** * @author zhangjiangwei - * @date 2023/04/04 15:41 */ public class PointUtils { diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/util/MapOf.java b/lms/nladmin-system/src/main/java/org/nl/wms/util/MapOf.java index 9cf6223..2a64d0c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/util/MapOf.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/util/MapOf.java @@ -10,10 +10,10 @@ import java.util.HashMap; */ public class MapOf implements Serializable { - public static HashMap of(K... key){ - HashMap map = new HashMap<>(); - for (int i = 0; i < (key.length & ~1); i=i+2) { - map.put(key[i],key[i+1]); + public static HashMap of(K... key) { + HashMap map = new HashMap<>(); + for (int i = 0; i < (key.length & ~1); i = i + 2) { + map.put(key[i], key[i + 1]); } return map; } 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 a639acf0c7fc8d49c08a0a7d8fc12230b4ccc388..471100b63fec45e59c1145063f38f91bd6638121 100644 GIT binary patch delta 60101 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