From 1679e98a7c801c2047b0fbacba9593b4a89f9171 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Fri, 24 Mar 2023 10:39:00 +0800 Subject: [PATCH 1/5] =?UTF-8?q?add:=E4=BF=AE=E6=94=B9=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=BA=BF=E5=8C=BA=E5=9F=9F=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/common/enums/AcsTaskEnum.java | 33 +-- .../wms/ext/acs/rest/AcsToWmsController.java | 6 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 12 +- .../ext/acs/service/impl/AgvInstService.java | 25 +-- .../nl/wms/sch/tasks/PointToPointTask.java | 165 -------------- .../nl/wms/sch/tasks/SpeMachineryTask.java | 201 ++++++++++++++++++ .../src/main/java/org/nl/wms/sch/wql/sch.xls | Bin 184320 -> 183808 bytes 7 files changed, 236 insertions(+), 206 deletions(-) delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SpeMachineryTask.java diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java index cdf036d6..2a75a76b 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java @@ -2,6 +2,13 @@ package org.nl.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import org.springframework.util.CollectionUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.stream.Collectors; /* * @author ZZQ @@ -13,28 +20,28 @@ import lombok.Getter; public enum AcsTaskEnum { UNDEFINED("0","未定义类型"), //任务类型:3个点,任务编号,无需载具 - PRODUCT_MAC("1","专机-专机任务"), + TASK_PRODUCT_MAC("1","专机-专机任务"), //3个点,任务编号,缓存线空载具列表 - PRODUCT_CACHE("2","专机-缓存线任务"), + TASK_PRODUCT_CACHE("2","专机-缓存线任务"), //3个点,任务编号,缓存线满料载具列表 - CACHELINE_OUT("3","缓存线出库任务"), + TASK_CACHELINE_OUT("3","缓存线出库任务"), //回调状态 - ACS_RUNDING("1","运行中"), - ACS_FINISH("2","完成"), - ACS_CANNEL("3","完成"), + STATUS_START("1","开始取货"), + STATUS_RUNDING("2","放货中"), + STATUS_FINISH("3","完成"), + STATUS_CANNEL("4","取消"), - ACS_CALLTYPE_FULL("1","满料请求"), - ACS_CALLTYPE_EMP("2","缺料请求"), + REQUEST_CALLTYPE_FULL("1","满料请求"), + REQUEST_CALLTYPE_EMP("2","缺料请求"), ; private String code; private String desc; - public static AcsTaskEnum getType(String type){ - for (AcsTaskEnum value : AcsTaskEnum.values()) { - if (value.getCode().equals(type)){ - return value; - } + public static AcsTaskEnum getType(String type,String enumType){ + Optional first = Arrays.stream(AcsTaskEnum.values()).filter(a -> a.name().contains(enumType.toUpperCase(Locale.ROOT)) && a.getCode().equals(type)).findFirst(); + if (first.isPresent()){ + return first.get(); } return AcsTaskEnum.UNDEFINED; } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 5c37a4f5..59fc7276 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -44,9 +44,9 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); } -// @PostMapping("/orderFinish") -// @Log("ACS给WMS下发工单完成状态") -// @ApiOperation("ACS给WMS下发工单完成状态") + @PostMapping("/orderFinish") + @Log("ACS给WMS下发工单完成状态") + @ApiOperation("ACS给WMS下发工单完成状态") public ResponseEntity orderFinish(@RequestBody String string) { return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 536a18b7..b2c60897 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -38,14 +38,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public Map apply(JSONObject jsonObject) { Map result = MapOf.of("status", HttpStatus.OK.value(), "message", "ACS向WMS申请任务成功!"); - //1.满料请求 - //2.缺料请求 + //1.专机设备满料请求 + //2.专机设备缺料请求:专机,深坑 String type = jsonObject.getString("type"); try { - if (type.equals(AcsTaskEnum.ACS_CALLTYPE_FULL.getCode())){ + if (type.equals(AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode())){ agvInstService.fullMaster(jsonObject); } - if (type.equals(AcsTaskEnum.ACS_CALLTYPE_EMP.getCode())){ + if (type.equals(AcsTaskEnum.REQUEST_CALLTYPE_EMP.getCode())){ agvInstService.callMatter(jsonObject); } }catch (Exception ex){ @@ -78,10 +78,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String message = ""; String status = ""; if ("1".equals(acs_task_status)) { - status = AcsTaskEnum.ACS_RUNDING.getCode(); + status = AcsTaskEnum.STATUS_RUNDING.getCode(); } if ("2".equals(acs_task_status)) { - status = AcsTaskEnum.ACS_FINISH.getCode(); + status = AcsTaskEnum.STATUS_FINISH.getCode(); } // 任务处理类 try { diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java index 93cff234..de6dc5e6 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java @@ -1,34 +1,21 @@ package org.nl.wms.ext.acs.service.impl; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.nl.common.ConstantParam; import org.nl.common.enums.AcsTaskEnum; -import org.nl.common.enums.InterfaceLogType; import org.nl.common.enums.StatusEnum; -import org.nl.common.utils.IdUtil; import org.nl.common.utils.MapOf; import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.service.RedisService; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.exception.WDKException; import org.nl.utils.PointLockUtils; -import org.nl.wms.sch.tasks.PointToPointTask; +import org.nl.wms.sch.tasks.SpeMachineryTask; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; /* @@ -68,7 +55,7 @@ public class AgvInstService { String needMove = order.getString("is_needmove"); String materialprocessSeries = order.getString("materialprocess_series"); - String taskType = AcsTaskEnum.PRODUCT_MAC.getCode(); + String taskType = AcsTaskEnum.TASK_PRODUCT_MAC.getCode(); if (StatusEnum.STATUS_TRUE.equals(needMove)){ JSONObject devicePoint = basePoint.query("point_code = '" + point_code + "' and is_delete = 0 and is_used = 1").uniqueResult(0); JSONObject empPoint = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "2", "point_code", point_code, "point_type", StatusEnum.POINT_LOCATION_EMP.getCode())).process().uniqueResult(0); @@ -100,11 +87,11 @@ public class AgvInstService { if (StringUtils.isEmpty(cacheVehile)) { throw new BadRequestException("缓存线:"+nextPoint+"没有可用空载具"); } - taskType = AcsTaskEnum.CACHELINE_OUT.getCode(); + taskType = AcsTaskEnum.TASK_CACHELINE_OUT.getCode(); } //生成任务nextPoint - PointToPointTask pointTask = new PointToPointTask(); + SpeMachineryTask pointTask = new SpeMachineryTask(); JSONObject taskForm = new JSONObject(MapOf.of("start_device_code",point_code, "next_device_code",nextPoint,"return_device_code", empPoint.getString("point_code"),"vehicle_code", cacheVehile,"quantity", quantity,"product_area",devicePoint.getString("product_area"),"type",taskType)); @@ -143,10 +130,10 @@ public class AgvInstService { if (StringUtils.isEmpty(cacheVehile)) { throw new BadRequestException("缓存线:"+startPoint+"没有可用空载具"); } - PointToPointTask pointTask = new PointToPointTask(); + SpeMachineryTask pointTask = new SpeMachineryTask(); JSONObject taskForm = new JSONObject(MapOf.of("start_device_code",startPoint, "next_device_code",point_code,"return_device_code", startPoint,"vehicle_code", - cacheVehile,"product_area",devicePoint.getString("product_area"),"type",AcsTaskEnum.CACHELINE_OUT.getCode())); + cacheVehile,"product_area",devicePoint.getString("product_area"),"type",AcsTaskEnum.TASK_CACHELINE_OUT.getCode())); String taskId = pointTask.createTask(taskForm); log.info(OPT_NAME+"callMatter taskID:{}",taskId); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java deleted file mode 100644 index 340508e0..00000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.nl.wms.sch.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.enums.AcsTaskEnum; -import org.nl.common.enums.InterfaceLogType; -import org.nl.common.enums.StatusEnum; -import org.nl.common.utils.MapOf; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; - import org.nl.common.utils.SecurityUtils; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.springframework.http.HttpStatus; - - -import java.util.HashMap; - -/** - * 普通点对点任务 - */ -@Slf4j -public class PointToPointTask extends AbstractAcsTask { - - private static String OPT_NAME = "ACS回调# "; - - @Override - public void updateTaskStatus(JSONObject param,String status) { - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); - WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); - log.info(InterfaceLogType.ACS_TO_LMS.getDesc()); - - //参数: - String taskId = param.getString("taskId"); - String workprocedureCode = param.getString("workorder_code"); - //入箱条码,出箱条码 - String inboxtxm = param.getString("inboxtxm"); - String outboxtxm = param.getString("outboxtxm"); - - // 指令执行中 - JSONObject task = taskTable.query("task_id = '" + taskId + "'").uniqueResult(0); - String taskStatus = task.getString("task_status"); - AcsTaskEnum taskTypeEnum = AcsTaskEnum.getType(task.getString("task_type")); - try { - if (AcsTaskEnum.ACS_RUNDING.getCode().equals(status)) { - if (!taskStatus.equals(StatusEnum.TASK_PUBLISH.getCode())){ - log.error(OPT_NAME+"任务:{} 状态异常不是处于下发状态:{}",taskId,taskStatus); - } - // 更新指令为执行中 - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+taskId+"'"); - //如果是缓存线任务:释放缓存线对应载具 - // 如果终点是缓存线,出箱的时候代表已经入了满料箱子 - //根据任务类型确认更新 - switch (taskTypeEnum){ - case PRODUCT_MAC: - break; - case PRODUCT_CACHE: - //到缓存线说明需要出一个空箱号 - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); - break; - case CACHELINE_OUT: - //到缓存线说明需要出满箱号 - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); - break; - default: - log.error(OPT_NAME+"未定义任务类型:{}",task.getString("task_type")); - throw new BadRequestException(OPT_NAME+"未定义任务类型:"+task.getString("task_type")); - } - } - // 指令完成 - if (AcsTaskEnum.ACS_FINISH.getCode().equals(status)) { - if (!taskStatus.equals(StatusEnum.TASK_RUNNING.getCode())) { - log.error(OPT_NAME + "任务:{} 状态异常不是处于运行中状态:{}", taskId, taskStatus); - } - switch (taskTypeEnum) { - case PRODUCT_MAC:case CACHELINE_OUT: - //到专机:更新设备上料位物料数量 - String point_code2 = task.getString("point_code2"); - JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); - task.getDouble("material_qty"); - double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); - deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); - break; - case PRODUCT_CACHE: - cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"), - "material_id", task.getString("material_id"), - "vehicle_code", inboxtxm, - "vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(), - //工单,工序? - "workorder_code", workprocedureCode, - "create_time", DateUtil.now(), - "update_time", DateUtil.now() - //物料规格,物料名称 从物料信息表关联查询 - )); - break; - default: - log.error(OPT_NAME + "未定义任务类型:{}", task.getString("task_type")); - throw new BadRequestException(OPT_NAME + "未定义任务类型:" + task.getString("task_type")); - } - } - }catch (Exception ex){ - log.error(OPT_NAME+"updateStatus error:{}",ex); - throw ex; - } - } - - - @Override - public String createTask(JSONObject form) { - String start_point_code = form.getString("start_point_code"); - String next_point_code = form.getString("next_point_code"); - String vehicle_code = form.getString("vehicle_code"); - String type = form.getString("type"); - if (StrUtil.isEmpty(start_point_code)) { - throw new BadRequestException("起点不能为空!"); - } - if (StrUtil.isEmpty(next_point_code)) { - throw new BadRequestException("终点不能为空!"); - } - if (StrUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("载具不能为空!"); - } - String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - JSONObject task = new JSONObject(); - task.put("taskdtl_id", taskdtl_id); - task.put("task_id", taskdtl_id); - task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); - task.put("task_type", type); - task.put("task_status", "01"); - task.put("start_point_code", start_point_code); - task.put("next_point_code", next_point_code); - task.put("vehicle_code", vehicle_code); - task.put("handle_class", this.getClass().getName()); - task.put("finished_type", "01"); - task.put("is_delete", "0"); - String currentUserId = SecurityUtils.getCurrentUserId(); - task.put("create_id", currentUserId); - task.put("create_name", SecurityUtils.getCurrentNickName()); - task.put("update_optid", currentUserId); - task.put("update_optname", SecurityUtils.getCurrentNickName()); - task.put("create_time", DateUtil.now()); - task.put("update_time", DateUtil.now()); - task.put("priority", "1"); - WQLObject.getWQLObject("SCH_BASE_Task").insert(task); - return taskdtl_id; - } - - - @Override - public void cancel(String taskId) { - log.info(OPT_NAME+"cancel taskID:{}",taskId); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - //专机-专机 - //专机-缓存线 - //缓存线出库 - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'"); - - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SpeMachineryTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SpeMachineryTask.java new file mode 100644 index 00000000..aa1a95a7 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SpeMachineryTask.java @@ -0,0 +1,201 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.enums.AcsTaskEnum; +import org.nl.common.enums.InterfaceLogType; +import org.nl.common.enums.StatusEnum; +import org.nl.common.utils.MapOf; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; + import org.nl.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.springframework.http.HttpStatus; + + +import java.util.HashMap; +import java.util.Map; + +/** + * 专机任务 + */ +@Slf4j +public class SpeMachineryTask extends AbstractAcsTask { + private final Map SpeHandles= new HashMap<>(); + private static String OPT_NAME = "ACS回调# "; + + public SpeMachineryTask() { + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe()); + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache()); + SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe()); + } + + @Override + public void updateTaskStatus(JSONObject param,String status) { + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + log.info(InterfaceLogType.ACS_TO_LMS.getDesc()); + // 指令执行中 + JSONObject task = taskTable.query("task_id = '" + param.getString("taskId") + "'").uniqueResult(0); + AcsTaskEnum taskType = AcsTaskEnum.getType(task.getString("task_type"),"TASK_"); + try { + SpeHandles.get(taskType.name()).handle(param,status,task); + }catch (Exception ex){ + log.error(OPT_NAME+"updateStatus error:{}",ex); + throw ex; + } + } + + + @Override + public String createTask(JSONObject form) { + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String vehicle_code = form.getString("vehicle_code"); + String type = form.getString("type"); + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + if (StrUtil.isEmpty(next_point_code)) { + throw new BadRequestException("终点不能为空!"); + } + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("载具不能为空!"); + } + String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject task = new JSONObject(); + task.put("taskdtl_id", taskdtl_id); + task.put("task_id", taskdtl_id); + task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + task.put("task_type", type); + task.put("task_status", "01"); + task.put("start_point_code", start_point_code); + task.put("next_point_code", next_point_code); + task.put("vehicle_code", vehicle_code); + task.put("handle_class", this.getClass().getName()); + task.put("finished_type", "01"); + task.put("is_delete", "0"); + String currentUserId = SecurityUtils.getCurrentUserId(); + task.put("create_id", currentUserId); + task.put("create_name", SecurityUtils.getCurrentNickName()); + task.put("update_optid", currentUserId); + task.put("update_optname", SecurityUtils.getCurrentNickName()); + task.put("create_time", DateUtil.now()); + task.put("update_time", DateUtil.now()); + task.put("priority", "1"); + WQLObject.getWQLObject("SCH_BASE_Task").insert(task); + return taskdtl_id; + } + + + @Override + public void cancel(String taskId) { + log.info(OPT_NAME+"cancel taskID:{}",taskId); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + //专机-专机 + //专机-缓存线 + //缓存线出库 + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'"); + + } + interface SpeStatusHandler{ + void handle(JSONObject param,String status,JSONObject task); + } + class Spe2Spe implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,JSONObject task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); + + switch (status){ + case STATUS_START: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + break; + case STATUS_RUNDING: + break; + case STATUS_FINISH: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + //到专机:更新设备上料位物料数量 + String point_code2 = task.getString("point_code2"); + JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); + task.getDouble("material_qty"); + double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); + deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); + break; + default: + log.error(OPT_NAME+"未定义任务状态:{}",sta); + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } + class Spe2Cache implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,JSONObject task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); + String workprocedureCode = param.getString("workorder_code"); + String inboxtxm = param.getString("inboxtxm"); + String outboxtxm = param.getString("outboxtxm"); + switch (status){ + case STATUS_START: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + break; + case STATUS_RUNDING: + cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); + break; + case STATUS_FINISH: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"), + "material_id", task.getString("material_id"), + "vehicle_code", inboxtxm, + "vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(), + //工单,工序? + "workorder_code", workprocedureCode, + "create_time", DateUtil.now(), + "update_time", DateUtil.now() + //物料规格,物料名称 从物料信息表关联查询 + )); + break; + default: + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } + class Cache2Spe implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,JSONObject task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); + WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); + String outboxtxm = param.getString("outboxtxm"); + + switch (status){ + case STATUS_START: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); + break; + case STATUS_FINISH: + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + + String point_code2 = task.getString("point_code2"); + JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); + task.getDouble("material_qty"); + double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); + deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); + break; + default: + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls index 87f050bb1b2cba66721079c5bfb4aba31d64078a..ac076407e447595366cd1cdace2b7113df45f6e7 100644 GIT binary patch delta 1911 zcmZuyYitx%6h3EWcV^p#c3+`jEYRR^s)iSc{Zp7C6U+nCBO&|Nf33yg|&u3p`r*`EoP*$=I0nWNbsVI@E* zg#+;{DQFW%vz<<-ZrAN#NjI~+OB0ySU4~Oc*BEbqhdcc-*3C_35TlHF9WJ$0C`@Jn zkH(y7qX#yP)r{BJHc$E^%@fC<<&An6Yx^{zps{NnzDK_D98bEDn^vP)zIgrV<;Jf3 zd(&Soh5*a}CON?g3Se>d*KGmdV37b_iC|EG?uX#4v2sr$Sj2`a=e%h0y$@4C;?EQ! zzC_UUpe2H)2Y(_MG}c$Wtu0LZ;a=v^cKnuzesrvnF+~{6FE0Z%gG#laXa)hf(IPp)`Gi-^zmV+L|1<{?k zxIeGR5&j2~VLl+V!eQ!(8A%k;?g1r*ax%OX$1Q{h_2o;j0DscoU4m1JJfglt)Ze02 zd3_1JR9oRTMZCUbtiA+zeX;%v)k}9kcSkTg!zTnvg}_H~1EoS>KkAVP=3|=P8o`q0 z3_%PLaR(fT6GKGY2_MIuhG?ZW;UGjSbwN(tK?tm{FODlT<8P%VDH%ebQbea7;;utr zqu1O%()x-{Fa$}II|hB?8h{i9EDa(Q)_D!0)H2w!30Yf;=+Sok`wpIeHd z*=AFymgG;w<-`A#Cv^q7Nsit~k_-Bj0)Cn)WmH9NgfhBpHr@6T4!=`@eHGG&0n3-_ ztfpvJqtr2X!ope448ahFiQ7_lsm)P1XwIQ?Xnu9{SwqT8!nx5+C+TA*)kmV6Pf7Q! zcqqE*v=o!EFS_YlslaOEU%|tqpdUFaO%+j;qUhDLl1&ofJTkBUeoku4;?zot`12Kd XR?}EPqlU&x8msiS^U@m~8!Z0U0g7=gp!Xyei!tzB^sCUSiMYFhWS*?8Bc}uv(d9N=3TA^w zic@_l(4RC@X;kB+F^!eBYn{}h9Zm1x)uYqWxmqjrX;W#Xb}|j?7?w$Y)h5#=xYp_1 zv;ggx)=odh{B~8UBm5JBXV`5*@@v%gqj#8!Ly?q$ruYcxJ%rAmeDK*@yZ4$aTVQVC~6x z>a~niZB(k?vamk2rsq698F{9UOUY~<%+yWhh?|-`L3~p zgw55}9i9#ksAnkUIGlORVDvgv0OWgU*yQ$P@C46bsM%r>jiM3M$#UTyn}c|%(>8~U zmUqoS*^St3OCDjfiBH!1Pz7sX z8Lr-gT3oGyN<`M;S%xOZnC}IwU0YBTxwU9sNC)IWadRoxvU%>CHQ^YzVE}H_1H_{Y z<0k+)_*$;QUD{*^h(pYv#}}QR@3YXd8(J$9>qBGe`_BMeZ=(Yj{*~&bJiXA}iR=HQ z)~|E)n%h4E)Ew@=U?+b`1HVL6+SmUC$i2lAR(7wBOXzzD(4Ih`+e@Hb`nzv`uAl|+ zpCU3*l*Wt@ZI(R& zy&m)kGUkE`wkWt7@s~tfA@Lb|G5if!F>DYE3W!ZCFC_XbGpEbrbjK9BJp4{?gyRZb z-Vj|LZfhfCik~5!@COmE6q0eNc21Db3GU(mOiw;1xCdfg4C0vXPDr2F+3BiE=H)YZ+QOS_Rr-v`TU7Rbj*bguf7v From 2be3a97a1d5974780ce7c47afdf5d32eae5e1efb Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Fri, 24 Mar 2023 10:41:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?add:=E4=BF=AE=E6=94=B9=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=BA=BF=E5=8C=BA=E5=9F=9F=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nl/wms/pda/service/impl/CacheLineHandServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java index 85abcc80..9a131fd9 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java @@ -18,7 +18,7 @@ import org.nl.wms.pda.dto.CachelineVehileMaterialDto; import org.nl.wms.pda.dto.MaterialDto; import org.nl.wms.pda.service.CacheLineHandService; import org.nl.wms.sch.service.impl.TaskServiceImpl; -import org.nl.wms.sch.tasks.PointToPointTask; +import org.nl.wms.sch.tasks.SpeMachineryTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -123,7 +123,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{ @Override public void instOperation(JSONObject param) { String optType = param.getString("opt_type"); - PointToPointTask pointToPointTask = new PointToPointTask(); + SpeMachineryTask SpeMachineryTask = new SpeMachineryTask(); WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONObject taskObject = taskTab.query("task_id =" + param.getString("instruct_uuid")).uniqueResult(0); //01-取消、02-完成、03-重发,根据操作类型执行相关操作 @@ -131,7 +131,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{ updateTaskStatus(taskObject, optType); } if("03".equals(optType)) { - pointToPointTask.createTask(taskObject); + SpeMachineryTask.createTask(taskObject); } } From 2810b1ce2ec4173a868007e5ebd9aaf01fbc82af Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Fri, 24 Mar 2023 10:52:53 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=E5=B7=A5=E5=8D=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 236032 -> 236032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index 454eaeb263a373a97bd2142c1379fd8daa60022f..b558de70986872fe7472664b1027556519f75a79 100644 GIT binary patch delta 3030 zcmZXV3sh9s6^8e|12e-z?hG?91BwEQ8Wnkn2^tNkX|S3AiHZ0Ej3Y$T#$uxgqB17c zC=@|X>o$syEF0@)n98Fz?weH;e{r}$Q zxzF*oMtEBznk^=ad)d)3nPB!sn37GxVR4I3EKZSUP8AQC-C_WLSDSl@ZI)DV(L7Yl zw?vBqORQ)y$BJ6kHnL|N`;VC2zRQ-)rqJi08PWiYAzpkP;u3qptYUEZqu3(K!lwjR z!d@6DPK3uchFV#g>^mB+n=nC~(^GJu$nW72eQc>XROH)In0k$8v+=xOD`t{yPr+nS z#?J(?)t(cR007s&w*j>Bi~I|UiN63&NN9{K#{ObvqzeZaY3n21I7q}hT;liqmL$$a zreHr|b)?`Bk;%`#Vh%qO4e#$9;~oE>I7~e6jEhO+HjD;OLp;Cg0PTSWMYhvrlSrxg z{2DE?qTv+XWpTrTY080Eq^;f_iZc4xG&IBJzU=&KWlcltV$R}7h& z$=NeNXm+rJ88EZx;OcmgaF_uj?}zCIbo>Axych1g9}W}8rj6(o@VkDH(%C=UNa7X^ z)0{~$_e+6BWABIQzJlrVV@4c*j|U1G;*43e0(d2k%kLn3rNlGmo7#v{$%dT{u(FbQ zo~k9a1(Ib7T{8(~lO!9t zHo)3yEmL2sGB1#9vhXY%`__A7tgxf}e%Zv-460CqSv#;ua-JFzD1rW|@UabQtiUgRyiPu&G zh-n6Ba{`p}9NZKwAEcOLjsV;~Ch|IV`5F$cuxjRy<-2G&I9_C*4f6Fk`LNX-^#uT3 zzRP{tXL~rb$WC8gN43ek@H#-rjk}r=^I_Ng(4N_02>as@K2JfIH5S48G{VeMgrB~E zBERF7FRy!0dGO;eBdqZ+E5o0ewS!1?uVNzE7vVMi5Kq-@2n7phPy>g_R)G`o2+gR# zH2tX3tcG@snksO<{-J^)20Tu^DjEJk!B7L9pr%T^rJqzVoM9_`M88?gssBjV7UKy0 zl+t<_0UuLl73Sb6@>a3-iP9nr?KB;&!sYrI1$6`diKZ-JcveB10ngEwOR!S^vx0U5 zo~N><4F95Fqyayrn@hR9zf$%x9_D9CbFfwne5D8J#z7(Sfz39|0D`T`_{F3^4akPH%9<;(X_$QTl zxhowCx{T&JsoBe2xk5Lk_Lb7yMwTwhT+Z56@-AoXn$luetB0?teK}9{zbO1A*8Z)u zSVQ|}-2rs@Jujgf@w$J>%eYbgx>sPQDeMM2+aMA80g`Ps_M`_^V^`d_D!xC*x53SO zUnZ!9TmFn1JcQUy-L-f?|Bn&}v$Y1kqr<;6W;vn`v+y?M*74UJT33f@w(pfQ*>HkJ zXX|hRA|CDnlhA>>OXboyXco9BaXrq}V-z$QFxJ0eJyxRLQ&BV1RnUtP zH(-tyr_rfJ7*DkuunT+B;*C6#KFTOddKSdf+Z%bI5=d)eEm3KK%I-^Jn|KEL(Hf~G zDNPQb2Kv*_OCJuN&X@ROAMCUhgz+eRfF|)hd@D}?mqpuaf%2HP4L?B4^!I+9mmqG0a`!f-YvjEz6TAqwD0e%~ zwST9!cONhy0)6@m?CbB`j;UySSVhDe@uM_)_7!we)(%X^(e(2jJWr1(M*=&FA&d6z z;QnM&xBMC7AG;Gxh-3Ya?UKE@n{9x~7ATzofrhDkH%`~bsdNJk%cFE*H(n5pXOigB z9$aY}|E|0zcHX^+{GKJ*hTqK`Ywy zr<6n9RwXcr%3Ha-o>ov^QyzGR?zHk2m`oG);chJO-`FS1W{UF2oi`n(lH1Q?n5LlI zd4({Y8vOVo&Y+gs<>o1YSv2!4h8_jwo#KJn zbXvj^1?6Spfl?a(HpAx>l(&cn=Fqzm&Q(y}7#?`upZX3S2wK^WZ?H&;_P>e1skFFJ5k1>HaSgKLWM@ delta 3066 zcmZXV3v^9q7RUF#H@P>Do1FWKdy|SJh$tcw(#lju(3w;Xf-y=&BzNM`SsqzrD&mn) zDk6e!W^Jn|#xTWL!i}DGlrqD3^r4=^Xp26kGcqZv)T5f&-*-POYgjq=oZtVy_x>LH ze5bl8wz?^{(QdW(nR~QfZ?Fert?5>=#^x0hZ9T*hTU)Wo?iVxo@3h@3411Qyu_cIw zHow@*&!g-KqMyBuc+K8ce8K(^9M@{M1zYT^t=39t6hj=dqb9;G$OJ5gWN{aHEM}7D%D~QI zI$smT23LN3A^_ZKbpkZ;jrzw+~ZQ+6K2D+lyq6PrT>$i)pSX zamC#UyNL)-2BwJKd`%XU_?o8NJ3TK9{QuO^Dm6eOmrMq@qYConfZ}OED#nKxWES3d)%Q~36i0wg6=0_F9khM!fXY-kKr>ir#Lnyr)?;S z?@1|?#4lEi@utQ>arqpEuayNReODJd zL9*mCAvV2iYM^RP-6+XY1y*>5ZfTZ^6(=oeKR2#ea?kf6Z&JmdhTI#KH%qc%Q;}g9 zO7>OJ$PtpItqigKb@tI4t86nR8z2G|{e1Oy-k9r)>@tt-dZU$p&LC6-_f~AT2B%h@ zwc^Xc=jYmb1xN0B+9CGtiw^Gt4jTrS?{nGG`c?rrIAUczz&JO+M>Dr?%QDVq1*_|&69k8JDB{@a}nW|F9BZN zH2$2|(t4HYwxFZ=ti@J(3t;$d<@)rS@~DLLXoSs)2q!WShW1CeH3DJq1ccF3sCox( z6OQJBVClUszYWh>h)`v&oQ~6M#%Emq0YpJKSfCUx{T?xnI=+I}jYGUdQn0hI6b@5| zSvUy)PSa*#rg21T5lTBsJ7;0JaZJNV1&>okCByeMj8gCe+F6NrjSn?+Fl>U4$ehio zPmr|=bBvF*7NY`A(x58L$B#)!?UdGHm3EpgR$-07+oQ&5D0r5BGl$_h4V?=9gYM74 zO5?nSE(I^p!nq9psi9lJixfQ%^CLfDxF6i$CamN2m_84^#;4loVPi3TMuLrai7w9L zfnC;`S0%YZ9p+;$eoiIxv9Ixk*5X*(17Fh4`CQ;DT_7%0z+24){-up=l<{kNwib?LLJ;O^Oxdb#Jd!;4EGuLwAhucOW{6USjKDn38mCyU;Kee z>iOvbZLP;l=a1T%uAHq%SL^Xb*>P&W(rH&c&wluFo((dS{o7qREmX0bXJe&<%Xv0o zTFX#cIAH^8HX7W(nq6x>lomntQj4SutU05!mZ>zZp0I+eM>Cb(k{PPLU29chUd~wd*l|BLK1zrhMOyyp~1XUWi7=#c0^mFro{q{Hhm z-N@2f=&a~TxPj;1iw17sxNNP3j*Mr_TB&jSpWGOF4W?|uzac(rW^R_RL2vDDr&cKE z(UTQsz#S^tf|FhMbyFvSf(Uf&RqSB?xCMKl@e>`9tm2=e+&6iJ`!JL%oE%!=KfK8+ zoU4r~Y%GSK(qT4YUy9kvKY8ZJt!PE;XO7+`2lX&%S}3WGObgYg+U;0q^w+SnvJ9Y` z+wn3TS%s-|=g+tpv(5QCaGDjLH@USuX#7muWnUG-&&jo$`zl{U*;hsI0@d!uGGm~I zVGN7mMS39NAPwbbs0e;Rbt)gPjrvMU2HlpX|m*9wTcGKF4l zLZ>lI8{~(p42Dx}6Te9#G?ZVg0Q{0%dpK$&745<8_$xE=Ejfiz+9SKF5MH9LCQo6s zhO(=QU<_?CaRwHW?` Date: Fri, 24 Mar 2023 11:14:31 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HailiangAutoCacheLineDeviceDriver.java | 13 ++ .../HailiangCleaningFeedingLineDriver.java | 18 ++- .../HailiangCleaningMachineDeviceDriver.java | 18 ++- ...ningMachineStorageStationDeviceDriver.java | 13 ++ .../HailiangElevatorWiringDeviceDriver.java | 14 ++ .../HailiangEngravingCacheDeviceDriver.java | 4 + .../HailiangEngravingMachineDeviceDriver.java | 14 ++ .../HailiangFoldingDiscSmartDeviceDriver.java | 13 ++ .../HailiangPackerStationDeviceDriver.java | 13 ++ .../HailiangPaintLineDeviceDriver.java | 13 ++ .../HailiangSpecialDeviceDriver.java | 14 ++ ...iliangSpecialEmptyStationDeviceDriver.java | 13 ++ ...ailiangSpecialFullStationDeviceDriver.java | 13 ++ ...ailiangSpecialPickStationDeviceDriver.java | 13 ++ ...ailiangSpecialPourStationDeviceDriver.java | 13 ++ .../HailiangStackingStationDriver.java | 13 ++ ...HailiangThreestationSmartDeviceDriver.java | 14 ++ ...HailiangHailiangxjplcTestDeviceDriver.java | 143 +++++++++-------- .../HailiangSmartplcTestDeviceDriver.java | 13 ++ .../LampThreecolorDeviceDriver.java | 4 + ...otoelectricInspectionSiteDeviceDriver.java | 5 + .../StandardAutodoorDeviceDriver.java | 5 + .../StandardCoveyorControlDeviceDriver.java | 5 + ...eyorControlWithPlcScannerDeviceDriver.java | 15 +- ...CoveyorControlWithScannerDeviceDriver.java | 5 + .../StandardInspectSiteDeviceDriver.java | 4 + .../StandardOrdinarySiteDeviceDriver.java | 4 + .../StandardScannerDeviceDriver.java | 6 + .../java/org/nl/acs/history/ErrorUtil.java | 63 ++++++++ .../rest/DeviceErrorLogController.java | 77 ++++++++++ .../service/DeviceErrorLogService.java | 74 +++++++++ .../service/dto/DeviceErrorLogDto.java | 29 ++++ .../impl/DeviceErrorLogServiceImpl.java | 137 +++++++++++++++++ .../modules/system/service/DictService.java | 2 + .../service/impl/DictDetailServiceImpl.java | 7 + .../system/service/impl/DictServiceImpl.java | 6 + .../java/org/nl/modules/system/wql/sys.xls | Bin 228864 -> 270848 bytes .../src/api/acs/history/acsDeviceErrorLog.js | 27 ++++ .../src/views/acs/device/config.vue | 34 ++-- .../acs/history/deviceErrorInfo/index.vue | 145 ++++++++++++++++++ 40 files changed, 943 insertions(+), 93 deletions(-) create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java create mode 100644 wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js create mode 100644 wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java index 42bb224f..20337f25 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java @@ -12,6 +12,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; @@ -53,6 +57,8 @@ public class HailiangAutoCacheLineDeviceDriver extends AbstractOpcDeviceDriver i ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); int mode = 0; int error = 0; @@ -255,6 +261,13 @@ public class HailiangAutoCacheLineDeviceDriver extends AbstractOpcDeviceDriver i logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java index 0cc162d6..e75e6589 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java @@ -11,11 +11,16 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.order.service.ProduceshiftorderService; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.modules.system.service.ParamService; @@ -52,8 +57,10 @@ public class HailiangCleaningFeedingLineDriver extends AbstractOpcDeviceDriver i ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); -// @Autowired -// ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -185,6 +192,13 @@ public class HailiangCleaningFeedingLineDriver extends AbstractOpcDeviceDriver i logServer.deviceExecuteLog(this.device_code,"","","信号in_pcsn:" + last_in_pcsn + "->" + in_pcsn); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java index 921720d4..7dac2b70 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java @@ -11,11 +11,16 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.order.service.ProduceshiftorderService; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.modules.system.service.ParamService; @@ -52,8 +57,10 @@ public class HailiangCleaningMachineDeviceDriver extends AbstractOpcDeviceDriver ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); -// @Autowired -// ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(.class); + @Autowired + ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -204,6 +211,13 @@ public class HailiangCleaningMachineDeviceDriver extends AbstractOpcDeviceDriver logServer.deviceExecuteLog(this.device_code,"","","信号pause:" + last_pause + "->" + pause); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java index 3be56959..22567272 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java @@ -20,6 +20,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -71,6 +75,8 @@ public class HailiangCleaningMachineStorageStationDeviceDriver extends AbstractO ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -173,6 +179,13 @@ public class HailiangCleaningMachineStorageStationDeviceDriver extends AbstractO full_number = this.itemProtocol.getItem_full_number(); silo_material_no = this.itemProtocol.getItem_silo_material_no(); if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java index 85f5e01d..32a9aec4 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -42,6 +46,9 @@ public class HailiangElevatorWiringDeviceDriver extends AbstractOpcDeviceDriver TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; @@ -136,6 +143,13 @@ public class HailiangElevatorWiringDeviceDriver extends AbstractOpcDeviceDriver logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java index 5d936a40..547e84ba 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java @@ -22,6 +22,8 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -76,6 +78,8 @@ public class HailiangEngravingCacheDeviceDriver extends AbstractOpcDeviceDriver ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java index 76788b41..669bf721 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java @@ -20,6 +20,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -76,6 +80,9 @@ public class HailiangEngravingMachineDeviceDriver extends AbstractOpcDeviceDrive ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvServiceImpl agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; int status = 0;//线体状态 @@ -273,6 +280,13 @@ public class HailiangEngravingMachineDeviceDriver extends AbstractOpcDeviceDrive logServer.deviceExecuteLog(this.device_code,"","","信号line_ready:" + last_line_ready + "->" + line_ready); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java index 825178de..7fffa7bb 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -42,6 +46,8 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); //放货准备锁 String putReadyLock = null; @@ -136,6 +142,13 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java index 817219ff..00a400ef 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java @@ -21,6 +21,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -77,6 +81,8 @@ public class HailiangPackerStationDeviceDriver extends AbstractOpcDeviceDriver i ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -232,6 +238,13 @@ public class HailiangPackerStationDeviceDriver extends AbstractOpcDeviceDriver i } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java index e178f203..743cb54f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -42,6 +46,8 @@ public class HailiangPaintLineDeviceDriver extends AbstractOpcDeviceDriver imple TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); //放货准备锁 String putReadyLock = null; @@ -136,6 +142,13 @@ public class HailiangPaintLineDeviceDriver extends AbstractOpcDeviceDriver imple logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java index dc031788..5047ac0b 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java @@ -15,6 +15,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -68,6 +72,9 @@ public class HailiangSpecialDeviceDriver extends AbstractOpcDeviceDriver impleme DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; @@ -274,6 +281,13 @@ public class HailiangSpecialDeviceDriver extends AbstractOpcDeviceDriver impleme logServer.deviceExecuteLog(this.device_code,"","","信号device_online:" + last_device_online + "->" + device_online); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java index 265676fb..a59141ff 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java @@ -20,6 +20,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -71,6 +75,8 @@ public class HailiangSpecialEmptyStationDeviceDriver extends AbstractOpcDeviceDr DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -213,6 +219,13 @@ public class HailiangSpecialEmptyStationDeviceDriver extends AbstractOpcDeviceDr } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java index 22c14992..13fe7cce 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java @@ -24,6 +24,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -76,6 +80,8 @@ public class HailiangSpecialFullStationDeviceDriver extends AbstractOpcDeviceDri ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -223,6 +229,13 @@ public class HailiangSpecialFullStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code, "", "", "信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java index 455ab532..7d39a3a6 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java @@ -15,6 +15,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -64,6 +68,8 @@ public class HailiangSpecialPickStationDeviceDriver extends AbstractOpcDeviceDri ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -191,6 +197,13 @@ public class HailiangSpecialPickStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code,"","","信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java index 23ca505d..5eddfdff 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java @@ -21,6 +21,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -72,6 +76,8 @@ public class HailiangSpecialPourStationDeviceDriver extends AbstractOpcDeviceDri DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -197,6 +203,13 @@ public class HailiangSpecialPourStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code,"","","信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java index bb416fb9..b14a1f7e 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java @@ -13,6 +13,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -58,6 +62,8 @@ public class HailiangStackingStationDriver extends AbstractOpcDeviceDriver imple DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -235,6 +241,13 @@ public class HailiangStackingStationDriver extends AbstractOpcDeviceDriver imple logServer.deviceExecuteLog(this.device_code,"","","信号all_ready:" + last_all_ready + "->" + all_ready); } if (line_error != last_line_error) { + if (line_error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(line_error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(line_error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"line_error" ,String.valueOf(line_error)); logServer.deviceExecuteLog(this.device_code,"","","信号line_error:" + last_line_error + "->" + line_error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java index dfcd4154..9ec11a6b 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -42,6 +46,9 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container_type_desc; String last_container_type_desc; //放货准备锁 @@ -140,6 +147,13 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java index 1b8347d3..ca0a7498 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java @@ -12,6 +12,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -53,8 +57,10 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); - @Autowired + @Autowired AgvService agvService = SpringContextHolder.getBean(AgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -66,64 +72,64 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv protected boolean has_goods_tag = false; int heartbeat = 0; - int mode =0; - int error =0; - int error_num =0; - int open_time =0; - int close_time =0; - int ready_time =0; - int running_time =0; - int error_time =0; - int voltage =0; - int temperature =0; - int current =0; - int material =0; - int lack_material =0; - int full_material =0; - int storage_qty =0; - int feeding_qty =0; - int blanking_qty =0; - int qualified_qty =0; - int unqualified_qty =0; - int finish =0; - int task =0; - int noload_electricity_consumption =0; - int prod_electricity_consumption =0; - int gas_consumption =0; - int water_consumption =0; - int oil_level =0; - int monthly_electricity_consumption =0; - int pause =0; + int mode = 0; + int error = 0; + int error_num = 0; + int open_time = 0; + int close_time = 0; + int ready_time = 0; + int running_time = 0; + int error_time = 0; + int voltage = 0; + int temperature = 0; + int current = 0; + int material = 0; + int lack_material = 0; + int full_material = 0; + int storage_qty = 0; + int feeding_qty = 0; + int blanking_qty = 0; + int qualified_qty = 0; + int unqualified_qty = 0; + int finish = 0; + int task = 0; + int noload_electricity_consumption = 0; + int prod_electricity_consumption = 0; + int gas_consumption = 0; + int water_consumption = 0; + int oil_level = 0; + int monthly_electricity_consumption = 0; + int pause = 0; - int last_mode =0; - int last_error =0; - int last_error_num =0; - int last_open_time =0; - int last_close_time =0; - int last_ready_time =0; - int last_running_time =0; - int last_error_time =0; - int last_voltage =0; - int last_temperature =0; - int last_current =0; - int last_material =0; - int last_lack_material =0; - int last_full_material =0; - int last_storage_qty =0; - int last_feeding_qty =0; - int last_blanking_qty =0; - int last_qualified_qty =0; - int last_unqualified_qty =0; - int last_finish =0; - int last_task =0; - int last_noload_electricity_consumption =0; - int last_prod_electricity_consumption =0; - int last_gas_consumption =0; - int last_water_consumption =0; - int last_oil_level =0; - int last_monthly_electricity_consumption =0; - int last_pause =0; + int last_mode = 0; + int last_error = 0; + int last_error_num = 0; + int last_open_time = 0; + int last_close_time = 0; + int last_ready_time = 0; + int last_running_time = 0; + int last_error_time = 0; + int last_voltage = 0; + int last_temperature = 0; + int last_current = 0; + int last_material = 0; + int last_lack_material = 0; + int last_full_material = 0; + int last_storage_qty = 0; + int last_feeding_qty = 0; + int last_blanking_qty = 0; + int last_qualified_qty = 0; + int last_unqualified_qty = 0; + int last_finish = 0; + int last_task = 0; + int last_noload_electricity_consumption = 0; + int last_prod_electricity_consumption = 0; + int last_gas_consumption = 0; + int last_water_consumption = 0; + int last_oil_level = 0; + int last_monthly_electricity_consumption = 0; + int last_pause = 0; Boolean isonline = true; @@ -167,8 +173,8 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv int flag = 0; - int agvphase=0; - int index =0; + int agvphase = 0; + int index = 0; String device_code; @@ -179,7 +185,7 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv @Override - public void execute(){ + public void execute() { device_code = this.getDeviceCode(); heartbeat = this.itemProtocol.getItem_heartbeat(); mode = this.itemProtocol.getItem_mode(); @@ -213,12 +219,19 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv if (mode != last_mode) { this.setRequireSucess(false); - logServer.deviceItemValue(this.device_code,"mode" ,String.valueOf(mode)); - logServer.deviceExecuteLog(this.device_code,"","","信号mode:" + last_mode + "->" + mode); + logServer.deviceItemValue(this.device_code, "mode", String.valueOf(mode)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); } if (error != last_error) { - logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); - logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } + logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } } @@ -233,7 +246,7 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv protected void thingToNothing() { log.debug("从有货到无货 清理数据"); - logServer.deviceExecuteLog(this.device_code,"","","光电信号切换,刷新请求标记:"+this.requireSucess); + logServer.deviceExecuteLog(this.device_code, "", "", "光电信号切换,刷新请求标记:" + this.requireSucess); this.setRequireSucess(false); this.setApplySucess(false); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java index 5aab9b89..fbfad906 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java @@ -13,6 +13,10 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; @@ -55,6 +59,8 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); @Autowired AgvService agvService = SpringContextHolder.getBean(AgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); private Date instruction_require_time = new Date(); private Date instruction_finished_time = new Date(); @@ -115,6 +121,13 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im } } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java index 269e127b..6c3b391c 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java @@ -8,6 +8,8 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; @@ -30,6 +32,8 @@ public class LampThreecolorDeviceDriver extends AbstractOpcDeviceDriver implemen @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java index 62ca5b91..32e6aa44 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java @@ -12,6 +12,8 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -53,6 +55,9 @@ public class PhotoelectricInspectionSiteDeviceDriver extends AbstractOpcDeviceDr TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java index d314b68e..857b8c32 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java @@ -7,10 +7,13 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.opc.Device; import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; import java.util.HashMap; import java.util.Map; @@ -25,6 +28,8 @@ import java.util.Map; public class StandardAutodoorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, DeviceStageMonitor { protected ItemProtocol itemProtocol = new ItemProtocol(this); DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); int open = 0; int close = 0; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java index 49934623..7e535e4f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java @@ -15,6 +15,8 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.monitor.DeviceStageMonitor; @@ -61,6 +63,9 @@ public class StandardCoveyorControlDeviceDriver extends AbstractOpcDeviceDriver AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); @Autowired ParamService paramService = SpringContextHolder.getBean(ParamService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java index e459f504..b3013a63 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java @@ -18,6 +18,10 @@ import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.monitor.DeviceStageMonitor; @@ -61,7 +65,9 @@ public class StandardCoveyorControlWithPlcScannerDeviceDriver extends AbstractOp ParamService paramService = SpringContextHolder.getBean(ParamService.class); @Autowired AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsService.class); - ; + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String barcode = null; String formatcode = null; @@ -171,6 +177,13 @@ public class StandardCoveyorControlWithPlcScannerDeviceDriver extends AbstractOp } } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } } if (mode == 2 && move != 0 && task > 0) { //inst_message diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java index 6076a7e0..362e4f76 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java @@ -19,6 +19,8 @@ import org.nl.acs.device_driver.ScannerDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -67,6 +69,9 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; protected String barcode = null; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java index 77356545..09397d79 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java @@ -13,6 +13,8 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -46,6 +48,8 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp protected ItemProtocol itemProtocol = new ItemProtocol(this); DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index e2ec8b0d..83086ad9 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -15,6 +15,8 @@ import org.nl.acs.device_driver.driver.AbstractDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -53,6 +55,8 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); Integer hasGoods = 0; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java index a3e5708b..4ca38215 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java @@ -7,16 +7,22 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.ScannerDeviceDriver; import org.nl.acs.device_driver.driver.AbstractDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.socket.SocketConfig; import org.nl.acs.udw.UnifiedDataAccessor; import org.nl.acs.udw.UnifiedDataAccessorFactory; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; /** 标准版扫码器 */ @Slf4j @Data public class StandardScannerDeviceDriver extends AbstractDeviceDriver implements ScannerDeviceDriver, DeviceDriver, DeviceStageMonitor { + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); UnifiedDataAccessor accessor_value; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java new file mode 100644 index 00000000..5b12aec7 --- /dev/null +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java @@ -0,0 +1,63 @@ +package org.nl.acs.history; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import org.nl.modules.system.domain.Dict; +import org.nl.modules.system.service.DictDetailService; +import org.nl.modules.system.service.DictService; +import org.nl.modules.system.service.dto.DictDetailDto; +import org.nl.modules.system.service.impl.DictDetailServiceImpl; +import org.nl.modules.system.service.impl.DictServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; + +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * @author: geng by + * @createDate: 2023/3/15 + */ +public class ErrorUtil { + + public static ConcurrentHashMap> dictMap = new ConcurrentHashMap<>(); + + + public static String getDictDetail(String type, String error_code) { + getDict(); + List dictDetailDtos = dictMap.get(type); + String detail = null; + if (ObjectUtil.isNotEmpty(dictDetailDtos)) { + for (int i = 0; i < dictDetailDtos.size(); i++) { + DictDetailDto dictDetailDto = dictDetailDtos.get(i); + String value = dictDetailDto.getValue(); + String label = dictDetailDto.getLabel(); + if (StrUtil.equals(value, error_code)) { + detail = label; + break; + } + } + } + return detail == null ? "字典表未配置对应的报警信息" : detail; + } + + + public static void getDict() { + if (ObjectUtil.isEmpty(dictMap)) { + DictDetailService dictDetailService = SpringContextHolder.getBean(DictDetailServiceImpl.class); + DictService dictService = SpringContextHolder.getBean(DictServiceImpl.class); + List dictDtos = dictService.queryAll(); + for (int i = 0; i < dictDtos.size(); i++) { + Dict dictDto = dictDtos.get(i); + dictMap.put(dictDto.getName(), getDict(dictDto.getName(), t -> { + return dictDetailService.getDictByName(t); + })); + } + } + } + + public static List getDict(String name, Function> f) { + return f.apply(name); + } + +} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java new file mode 100644 index 00000000..694440fe --- /dev/null +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java @@ -0,0 +1,77 @@ + +package org.nl.acs.history.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.modules.logging.annotation.Log; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** +* @author gengby +* @date 2023-03-15 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "设备报警记录管理") +@RequestMapping("/api/deviceErrorLog") +@Slf4j +public class DeviceErrorLogController { + + private final DeviceErrorLogService acsDeviceErrorLogService; + + @GetMapping + @Log("查询设备报警记录") + @ApiOperation("查询设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(acsDeviceErrorLogService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增设备报警记录") + @ApiOperation("新增设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:add')") + public ResponseEntity create(@Validated @RequestBody DeviceErrorLogDto dto){ + acsDeviceErrorLogService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改设备报警记录") + @ApiOperation("修改设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:edit')") + public ResponseEntity update(@Validated @RequestBody DeviceErrorLogDto dto){ + acsDeviceErrorLogService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除设备报警记录") + @ApiOperation("删除设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + acsDeviceErrorLogService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("导出设备报警记录") + @ApiOperation("导出设备报警记录") + @GetMapping(value = "/download") + //@PreAuthorize("@el.check('acsDeviceErrorLog:list')") + public void download(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + acsDeviceErrorLogService.download(acsDeviceErrorLogService.queryAll(whereJson), response); + } +} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java new file mode 100644 index 00000000..e4bcc6c8 --- /dev/null +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java @@ -0,0 +1,74 @@ + +package org.nl.acs.history.service; + +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.springframework.data.domain.Pageable; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author gengby +* @date 2023-03-15 +**/ +public interface DeviceErrorLogService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param error_log_uuid ID + * @return AcsDeviceErrorLog + */ + DeviceErrorLogDto findById(String error_log_uuid); + + /** + * 根据编码查询 + * @param code code + * @return AcsDeviceErrorLog + */ + DeviceErrorLogDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(DeviceErrorLogDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(DeviceErrorLogDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 导出数据 + * @param dtos 待导出的数据 + * @param response / + * @throws IOException / + */ + void download(List dtos, HttpServletResponse response) throws IOException; +} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java new file mode 100644 index 00000000..eb08cae4 --- /dev/null +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java @@ -0,0 +1,29 @@ +package org.nl.acs.history.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author gengby +* @date 2023-03-15 +**/ +@Data +public class DeviceErrorLogDto implements Serializable { + + /** 报警日志标识 */ + private String error_log_uuid; + + /** 设备编码 */ + private String device_code; + + /** 报警编码 */ + private String error_code; + + /** 报警信息 */ + private String error_info; + + /** 报警时间 */ + private String error_time; +} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java new file mode 100644 index 00000000..19120c08 --- /dev/null +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java @@ -0,0 +1,137 @@ + +package org.nl.acs.history.service.impl; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author gengby + * @description 服务实现 + * @date 2023-03-15 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class DeviceErrorLogServiceImpl implements DeviceErrorLogService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String device_code = MapUtil.getStr(whereJson, "device_code"); + String error_code = MapUtil.getStr(whereJson, "error_code"); + String error_info = MapUtil.getStr(whereJson, "error_info"); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + String where = "1 = 1 "; + if (StrUtil.isNotEmpty(device_code)) { + where += "and device_code like '%" + device_code + "%'"; + } + if (StrUtil.isNotEmpty(error_code)) { + where += "and error_code like '%" + error_code + "%'"; + } + if (StrUtil.isNotEmpty(error_info)) { + where += "and error_info like '%" + error_info + "%'"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "error_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(DeviceErrorLogDto.class); + return list; + } + + @Override + public DeviceErrorLogDto findById(String error_log_uuid) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = wo.query("error_log_uuid ='" + error_log_uuid + "'").uniqueResult(0); + final DeviceErrorLogDto obj = (DeviceErrorLogDto) JSONObject.toJavaObject(json, DeviceErrorLogDto.class); + return obj; + } + + @Override + public DeviceErrorLogDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + final DeviceErrorLogDto obj = (DeviceErrorLogDto) JSONObject.toJavaObject(json, DeviceErrorLogDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(DeviceErrorLogDto dto) { + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + + dto.setError_log_uuid(IdUtil.simpleUUID()); + dto.setDevice_code(dto.getDevice_code()); + dto.setError_code(dto.getError_code()); + dto.setError_info(dto.getError_info()); + dto.setError_time(now); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DeviceErrorLogDto dto) { + DeviceErrorLogDto entity = this.findById(dto.getError_log_uuid()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + for (String error_log_uuid : ids) { + wo.delete("error_log_uuid = '" + error_log_uuid + "'"); + } + } + + @Override + public void download(List all, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (DeviceErrorLogDto acsDeviceErrorLog : all) { + Map map = new LinkedHashMap<>(); + map.put("设备编码", acsDeviceErrorLog.getDevice_code()); + map.put("报警编码", acsDeviceErrorLog.getError_code()); + map.put("报警信息", acsDeviceErrorLog.getError_info()); + map.put("报警时间", acsDeviceErrorLog.getError_time()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } +} diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index 76a0011b..0b9aaffd 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java @@ -47,6 +47,8 @@ public interface DictService { */ List queryAll(DictQueryCriteria dict); + List queryAll(); + /** * 创建 * @param resources / diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java index e60fa8e1..008158df 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java @@ -16,6 +16,7 @@ package org.nl.modules.system.service.impl; import lombok.RequiredArgsConstructor; +import org.nl.acs.history.ErrorUtil; import org.nl.modules.common.utils.PageUtil; import org.nl.modules.common.utils.QueryHelp; import org.nl.modules.common.utils.RedisUtils; @@ -64,6 +65,8 @@ public class DictDetailServiceImpl implements DictDetailService { dictDetailRepository.save(resources); // 清理缓存 delCaches(resources); + Dict dict = dictRepository.findById(resources.getDict().getId()).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } @Override @@ -75,6 +78,8 @@ public class DictDetailServiceImpl implements DictDetailService { dictDetailRepository.save(resources); // 清理缓存 delCaches(resources); + Dict dict = dictRepository.findById(resources.getDict().getId()).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } @Override @@ -90,6 +95,8 @@ public class DictDetailServiceImpl implements DictDetailService { // 清理缓存 delCaches(dictDetail); dictDetailRepository.deleteById(id); + Dict dict = dictRepository.findById(id).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } public void delCaches(DictDetail dictDetail){ diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java index 4b938b44..aabd3600 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java @@ -60,6 +60,12 @@ public class DictServiceImpl implements DictService { return dictMapper.toDto(list); } + @Override + public List queryAll() { + List list = dictRepository.findAll(); + return list; + } + @Override @Transactional(rollbackFor = Exception.class) public void create(Dict resources) { diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls b/wcs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls index 82566ab6461a4d0e92adeacbb1883cf1ca00f877..9d388cbb30a6b4b25ea70a3fd6a5076fad164e87 100644 GIT binary patch delta 54500 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 LyV@8vQ-}W#?@$!- diff --git a/wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js b/wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js new file mode 100644 index 00000000..12f1337d --- /dev/null +++ b/wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deviceErrorLog', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deviceErrorLog/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deviceErrorLog', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/wcs/nladmin-ui/src/views/acs/device/config.vue b/wcs/nladmin-ui/src/views/acs/device/config.vue index 70077a81..6e92eb1c 100644 --- a/wcs/nladmin-ui/src/views/acs/device/config.vue +++ b/wcs/nladmin-ui/src/views/acs/device/config.vue @@ -75,25 +75,13 @@ import { get, selectDriverCodeList } from '@/api/acs/device/driverConfig' import { getDicts } from '@/api/system/dict' import standard_inspect_site from './driver/standard_inspect_site' import standard_ordinary_site from './driver/standard_ordinary_site' -import weighing_site from './driver/weighing_site' -import machines_site from './driver/machines_site' import lamp_three_color from './driver/lamp_three_color' import standard_autodoor from './driver/standard_autodoor' -import standard_emptypallet_site from './driver/standard_emptypallet_site' -import standard_manipulator_inspect_site from './driver/standard_manipulator_inspect_site' -import standard_special_inspect_site from './driver/standard_special_inspect_site' -import special_ordinary_site from './driver/special_ordinary_site' import standard_storage from '@/views/acs/device/driver/standard_storage' import standard_scanner from '@/views/acs/device/driver/standard_scanner' import standard_conveyor_control_with_scanner from '@/views/acs/device/driver/standard_conveyor_control_with_scanner' -import standard_conveyor_control_with_plcscanner from '@/views/acs/device/driver/standard_conveyor_control_with_plcscanner' import standard_conveyor_control from '@/views/acs/device/driver/standard_conveyor_control' import standard_conveyor_monitor from '@/views/acs/device/driver/standard_conveyor_monitor' -import non_line_manipulator_inspect_site from '@/views/acs/device/driver/non_line_manipulator_inspect_site' -import non_line_inspect_site from '@/views/acs/device/driver/non_line_inspect_site' -import manipulator_inspect_site_NDC from '@/views/acs/device/driver/manipulator_inspect_site_NDC' -import standard_manipulator_stacking_site from '@/views/acs/device/driver/standard_manipulator_stacking_site' -import standard_photoelectric_inspect_site from '@/views/acs/device/driver/standard_photoelectric_inspect_site' import hailiang_special_pick_station from '@/views/acs/device/driver/hailiang_one/hailiang_special_pick_station' import hailiang_special_empty_station from '@/views/acs/device/driver/hailiang_one/hailiang_special_empty_station' @@ -122,18 +110,20 @@ export default { components: { standard_ordinary_site, standard_inspect_site, - standard_autodoor, + standard_storage, + standard_scanner, + standard_conveyor_control_with_scanner, + standard_conveyor_control, + standard_conveyor_monitor, + hailiang_smart_plc_test, + agv_ndc_two, + agv_ndc_one, + lamp_three_color, standard_emptypallet_site, standard_manipulator_inspect_site, standard_special_inspect_site, - lamp_three_color, - standard_storage, special_ordinary_site, - standard_scanner, - standard_conveyor_control_with_scanner, standard_conveyor_control_with_plcscanner, - standard_conveyor_control, - standard_conveyor_monitor, weighing_site, machines_site, non_line_manipulator_inspect_site, @@ -141,8 +131,6 @@ export default { manipulator_inspect_site_NDC, standard_manipulator_stacking_site, standard_photoelectric_inspect_site, - agv_ndc_two, - agv_ndc_one, hailiang_packer_station, hailiang_engraving_cache, hailiang_special_pick_station, @@ -156,12 +144,12 @@ export default { hailiang_cleaning_machine, hailiang_cleaning_machine_storage_station, hailiang_xj_plc_test, - hailiang_smart_plc_test, hailiang_threestation_smart, hailiang_foldingDisc_smart, hailiang_elevator_wiring, hailiang_paint_line, - hailiang_stacking_station + hailiang_stacking_station, + standard_autodoor }, dicts: ['device_type'], mixins: [crud], diff --git a/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue b/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue new file mode 100644 index 00000000..7a3611a3 --- /dev/null +++ b/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue @@ -0,0 +1,145 @@ + + + + + From ebbdf1540826481138810858b8f0a73719515101 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Fri, 24 Mar 2023 11:22:57 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=BA=BF=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/dto/CachelinePositionDto.java | 2 +- .../CachelineRegionRelationController.java | 66 +++++++++ .../CachelineRegionRelationService.java | 64 +++++++++ .../dto/CachelineRegionRelationDto.java | 49 +++++++ .../CachelineRegionRelationServiceImpl.java | 123 ++++++++++++++++ .../impl/ProduceWorkorderServiceImpl.java | 5 +- .../src/main/java/org/nl/wms/sch/wql/sch.xls | Bin 183808 -> 219648 bytes .../region/cachelineRegionRelation.js | 27 ++++ .../master/storagevehicleinfo/index.vue | 2 +- .../views/wms/cacheline/position/index.vue | 11 +- .../src/views/wms/cacheline/region/index.vue | 136 ++++++++++++++++++ 11 files changed, 476 insertions(+), 9 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/rest/CachelineRegionRelationController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/CachelineRegionRelationService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/dto/CachelineRegionRelationDto.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/impl/CachelineRegionRelationServiceImpl.java create mode 100644 mes/qd/src/api/wms/cacheline/region/cachelineRegionRelation.js create mode 100644 mes/qd/src/views/wms/cacheline/region/index.vue diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/position/service/dto/CachelinePositionDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/position/service/dto/CachelinePositionDto.java index 2b65068f..78234925 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/position/service/dto/CachelinePositionDto.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/position/service/dto/CachelinePositionDto.java @@ -24,7 +24,7 @@ public class CachelinePositionDto implements Serializable { private BigDecimal positionOrder_no; /** 缓存线编码 */ - private String cacheLine_code; + private String cacheline_code; /** 缓存线层数 */ private BigDecimal layer_num; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/rest/CachelineRegionRelationController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/rest/CachelineRegionRelationController.java new file mode 100644 index 00000000..51573e20 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/rest/CachelineRegionRelationController.java @@ -0,0 +1,66 @@ +package org.nl.wms.cacheline.region.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.anno.Log; +import org.nl.wms.cacheline.region.service.CachelineRegionRelationService; +import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** +* @author lyd +* @date 2023-03-24 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "个缓存线区域关系管理") +@RequestMapping("/api/cachelineRegionRelation") +@Slf4j +public class CachelineRegionRelationController { + + private final CachelineRegionRelationService cachelineRegionRelationService; + + @GetMapping + @Log("查询个缓存线区域关系") + @ApiOperation("查询个缓存线区域关系") + //@PreAuthorize("@el.check('cachelineRegionRelation:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(cachelineRegionRelationService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增个缓存线区域关系") + @ApiOperation("新增个缓存线区域关系") + //@PreAuthorize("@el.check('cachelineRegionRelation:add')") + public ResponseEntity create(@Validated @RequestBody CachelineRegionRelationDto dto){ + cachelineRegionRelationService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改个缓存线区域关系") + @ApiOperation("修改个缓存线区域关系") + //@PreAuthorize("@el.check('cachelineRegionRelation:edit')") + public ResponseEntity update(@Validated @RequestBody CachelineRegionRelationDto dto){ + cachelineRegionRelationService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除个缓存线区域关系") + @ApiOperation("删除个缓存线区域关系") + //@PreAuthorize("@el.check('cachelineRegionRelation:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + cachelineRegionRelationService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/CachelineRegionRelationService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/CachelineRegionRelationService.java new file mode 100644 index 00000000..34c19773 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/CachelineRegionRelationService.java @@ -0,0 +1,64 @@ +package org.nl.wms.cacheline.region.service; + +import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto; +import org.springframework.data.domain.Pageable; + +import java.util.Map; +import java.util.List; + +/** +* @description 服务接口 +* @author lyd +* @date 2023-03-24 +**/ +public interface CachelineRegionRelationService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param relation_id ID + * @return CachelineRegionRelation + */ + CachelineRegionRelationDto findById(String relation_id); + + /** + * 根据编码查询 + * @param code code + * @return CachelineRegionRelation + */ + CachelineRegionRelationDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(CachelineRegionRelationDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(CachelineRegionRelationDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/dto/CachelineRegionRelationDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/dto/CachelineRegionRelationDto.java new file mode 100644 index 00000000..d64e226c --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/dto/CachelineRegionRelationDto.java @@ -0,0 +1,49 @@ +package org.nl.wms.cacheline.region.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author lyd + * @description / + * @date 2023-03-24 + **/ +@Data +public class CachelineRegionRelationDto implements Serializable { + + /** + * 主键标识 + */ + private String relation_id; + + /** + * 区域编码 + */ + private String region_code; + + /** + * 缓存线编码 + */ + private String cacheline_code; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 更新时间 + */ + private String update_time; + + /** + * 是否可用 + */ + private String is_active; + + /** + * 是否删除 + */ + private String is_delete; +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/impl/CachelineRegionRelationServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/impl/CachelineRegionRelationServiceImpl.java new file mode 100644 index 00000000..f87c4aa8 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/region/service/impl/CachelineRegionRelationServiceImpl.java @@ -0,0 +1,123 @@ +package org.nl.wms.cacheline.region.service.impl; + +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.cacheline.region.service.CachelineRegionRelationService; +import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.utils.SecurityUtils; + +import lombok.extern.slf4j.Slf4j; +import cn.hutool.core.util.ObjectUtil; + +/** +* @description 服务实现 +* @author lyd +* @date 2023-03-24 +**/ +@Service +@RequiredArgsConstructor +@Slf4j +public class CachelineRegionRelationServiceImpl implements CachelineRegionRelationService { + + @Override + public Map queryAll(Map whereJson, Pageable page){ + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + String where = "1 = 1"; + if (ObjectUtil.isNotEmpty(whereJson.get("search"))){ + String search = whereJson.get("search").toString(); + where = "region_code like '%" + search + "%' " + + "OR cacheline_code like '%" + search + "%'"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "region_code, cacheline_code"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson){ + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(CachelineRegionRelationDto.class); + return null; + } + + @Override + public CachelineRegionRelationDto findById(String relation_id) { + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + JSONObject json = wo.query("relation_id = '" + relation_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( CachelineRegionRelationDto.class); + } + return null; + } + + @Override + public CachelineRegionRelationDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( CachelineRegionRelationDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(CachelineRegionRelationDto dto) { + dto.setRelation_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + dto.setUpdate_time(DateUtil.now()); + dto.setCreate_time(DateUtil.now()); + + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(CachelineRegionRelationDto dto) { + CachelineRegionRelationDto entity = this.findById(dto.getRelation_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + dto.setUpdate_time(DateUtil.now()); + + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + + WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation"); + for (String relation_id: ids) { + JSONObject param = new JSONObject(); + param.put("relation_id", String.valueOf(relation_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", DateUtil.now()); + wo.update(param); + } + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java index 93b83107..199662f4 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceWorkorderServiceImpl.java @@ -13,6 +13,7 @@ import cn.hutool.poi.excel.ExcelUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -71,8 +72,10 @@ public class ProduceWorkorderServiceImpl implements ProduceWorkorderService { String product_area = MapUtil.getStr(whereJson, "product_area"); String product_series = ""; // 员工只能看到自己创建的工单 + String currentUsername = SecurityUtils.getCurrentUsername(); + SysUser one = userService.getOne(new LambdaQueryWrapper().eq(SysUser::getUsername, currentUsername)); String currentUserId = ""; - if (!SecurityUtils.getCurrentUsername().equals("admin")) currentUserId = SecurityUtils.getCurrentUserId(); + if (!one.getIsAdmin()) currentUserId = SecurityUtils.getCurrentUserId(); JSONObject map = new JSONObject(); map.put("flag", "1"); //map.put("order_status", order_status); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls index ac076407e447595366cd1cdace2b7113df45f6e7..7df0c7d0ec6098b209cb9543147650d1be554d29 100644 GIT binary patch literal 219648 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

BHyOVTojbCIUqt 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 diff --git a/mes/qd/src/views/wms/cacheline/position/index.vue b/mes/qd/src/views/wms/cacheline/position/index.vue index 2a34d66f..5032cc9e 100644 --- a/mes/qd/src/views/wms/cacheline/position/index.vue +++ b/mes/qd/src/views/wms/cacheline/position/index.vue @@ -69,8 +69,8 @@ - - + + @@ -152,7 +152,7 @@ - + @@ -161,7 +161,6 @@ - + + + +