From 9013364d840323f1a76a2bb1ae16ffdcc9fecf24 Mon Sep 17 00:00:00 2001 From: icewint Date: Tue, 27 Jan 2026 14:19:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=B5=E5=AD=90=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=9A=84=E6=89=AB=E7=A0=81=E6=8D=A1=E9=80=89=E5=92=8C?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=A1=AE=E8=AE=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/WCS系统开发手册.md | 17 +- .../wcs/business/etag/EtagDataHandler.java | 292 +++++++++++++++++- .../org/wcs/business/redis/EtagRedis.java | 62 ++++ .../main/java/org/wcs/config/EtagConfig.java | 25 ++ .../enums/database/EtagBusinessTypeEnum.java | 22 ++ .../enums/etag/EtagSubCommandEnum.java | 15 +- .../org/wcs/mapper/AppEtagTaskMapper.java | 3 +- .../wcs/mapper/impl/AppEtagTagInfoDao.java | 24 ++ .../org/wcs/mapper/impl/AppEtagTaskDao.java | 33 ++ .../mapper/intf/AppEtagTagInfoService.java | 1 + .../wcs/mapper/intf/AppEtagTaskService.java | 1 + .../wcs/model/bo/etag/EtagLightParams.java | 91 +----- .../org/wcs/model/po/app/AppEtagTagInfo.java | 2 + .../org/wcs/utils/AppDataBaseTransUtils.java | 6 +- .../wcs/utils/function/RunnableThrowEx.java | 9 + wcs/src/main/resources/application.yml | 4 + 16 files changed, 517 insertions(+), 90 deletions(-) create mode 100644 wcs/src/main/java/org/wcs/config/EtagConfig.java create mode 100644 wcs/src/main/java/org/wcs/constant/enums/database/EtagBusinessTypeEnum.java create mode 100644 wcs/src/main/java/org/wcs/utils/function/RunnableThrowEx.java diff --git a/files/WCS系统开发手册.md b/files/WCS系统开发手册.md index 6b42ca4..e1b0d88 100644 --- a/files/WCS系统开发手册.md +++ b/files/WCS系统开发手册.md @@ -4,4 +4,19 @@ + 入库任务处理: - 若起点为空则解析成单个堆垛机任务,此时若经过托盘线扫码则更新起点到组合入库任务,同时删除解析好的任务,重新解析。 \ No newline at end of file + 若起点为空则解析成单个堆垛机任务,此时若经过托盘线扫码则更新起点到组合入库任务,同时删除解析好的任务,重新解析。 + + + + + + + +**电子标签** + ++ 扫描字符串码:``^user$`` 后 扫描的条码视为绑定这个区域的操作者; ++ 扫描字符串码:``$user^`` 解绑用户; + +电子标签联动输送线逻辑:输送线扫码时检查该捡选站台对应的电子标签货位是否有任务,若有则弹出;此处需要正确在电子标签货位表填写站台号 + +电子标签状态:已经激活的直接定时任务点亮,未激活的要扫码触发 \ No newline at end of file diff --git a/wcs/src/main/java/org/wcs/business/etag/EtagDataHandler.java b/wcs/src/main/java/org/wcs/business/etag/EtagDataHandler.java index ab9c371..175785c 100644 --- a/wcs/src/main/java/org/wcs/business/etag/EtagDataHandler.java +++ b/wcs/src/main/java/org/wcs/business/etag/EtagDataHandler.java @@ -3,13 +3,30 @@ package org.wcs.business.etag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.wcs.business.pub.ReportStandard; import org.wcs.business.redis.EtagRedis; +import org.wcs.config.EtagConfig; +import org.wcs.constant.ConstantData; import org.wcs.constant.enums.database.ETagTypeEnum; +import org.wcs.constant.enums.database.EtagBusinessTypeEnum; +import org.wcs.constant.enums.database.EtagTaskStatusEnum; +import org.wcs.constant.enums.etag.EtagSubCommandEnum; +import org.wcs.constant.enums.etag.LedBlinkingEnum; +import org.wcs.constant.enums.etag.LedColorEnum; +import org.wcs.mapper.intf.AppEtagTagInfoService; +import org.wcs.mapper.intf.AppEtagTaskService; +import org.wcs.model.bo.etag.EtagLightParams; import org.wcs.model.bo.etag.EtagReturnInfo; +import org.wcs.model.bo.tuple.Tuple2; import org.wcs.model.po.app.AppEtagTagInfo; +import org.wcs.model.po.app.AppEtagTask; import org.wcs.plugin.tcp.model.SocketDataItem; +import org.wcs.utils.AppStringUtils; import org.wcs.utils.AppThreadUtils; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; import java.util.Objects; /** @@ -20,8 +37,16 @@ import java.util.Objects; @RequiredArgsConstructor public class EtagDataHandler { + // 电子标签操作类 + private final EtagAtopOperation etagAtopOperation; // 电子标签 redis 操作类 private final EtagRedis etagRedis; + // 电子标签操作类 + private final EtagConfig etagConfig; + // 电子标签信息服务类 + private final AppEtagTagInfoService etagInfoService; + // 电子标签任务服务类 + private final AppEtagTaskService etagTaskService; /** * 接收字节数据并解析,主要是解析电子标签扫码器扫描的数据和标签按下确认的数据 @@ -91,22 +116,281 @@ public class EtagDataHandler { } Integer tagType = appEtagTagInfo.getTagType(); if(Objects.equals(tagType, ETagTypeEnum.SCAN.getCode())) { - handScanCode(etagReturnInfo); + handScanCode(appEtagTagInfo, etagReturnInfo); return; } if(ETagTypeEnum.buttonTagList().contains(ETagTypeEnum.getByCode(tagType))) { - handleTagConfirm(etagReturnInfo); + handleTagConfirm(appEtagTagInfo, etagReturnInfo); return; } } + /** + * 处理扫码标签 + * @param appEtagTagInfo 标签信息 + * @param etagReturnInfo 扫码标签返回信息 + */ + private void handScanCode(AppEtagTagInfo appEtagTagInfo, EtagReturnInfo etagReturnInfo) { + if(etagReturnInfo.getSubCommand().equals(EtagSubCommandEnum.CONFIRM_COMMAND.getCode())) { + // ---- 正确提交 + String user = etagRedis.getEtagAreaUser(appEtagTagInfo.getAreaId()); + /* 用户相关 */ + boolean isUserBind = bindOrUnbindUser(appEtagTagInfo.getAreaId(), etagReturnInfo.getData(), user); + if(isUserBind) { + return; // 如果是用户绑定相关的功能则单独处理,此处返回 + } + /* 扫描条码相关 */ + // 检查是否有任务 + List taskStatusList = List.of(EtagTaskStatusEnum.NOT_ACTIVATED.getCode()); + List appEtagTaskList = etagTaskService.queryByTagAreaIdAndVehicleAndStatus(appEtagTagInfo.getAreaId(), etagReturnInfo.getData(), taskStatusList); + if(appEtagTaskList == null) { + log.info("电子标签区域: {} 扫码: {},任务检索失败", appEtagTagInfo.getAreaId(), etagReturnInfo.getData()); + EtagLightParams lightParams = EtagLightParams.builder() + .tagName(appEtagTagInfo.getTagName()) + .tagId(appEtagTagInfo.getTagId().byteValue()) + .tagValue("") + .tagString("任务检索异常") + .ledBlinking(LedBlinkingEnum.BLINKING_0_25) + .ledColor(LedColorEnum.RED) + .build(); + lightAreaSummaryTag(appEtagTagInfo.getAreaId(), lightParams); + return; + } + if(appEtagTaskList.isEmpty()) { + log.info("电子标签区域: {} 扫码: {},无电子标签任务", appEtagTagInfo.getAreaId(), etagReturnInfo.getData()); + EtagLightParams lightParams = EtagLightParams.builder() + .tagName(appEtagTagInfo.getTagName()) + .tagId(appEtagTagInfo.getTagId().byteValue()) + .tagValue("0") + .tagString("任务完成") + .ledBlinking(LedBlinkingEnum.LED_ON) + .ledColor(LedColorEnum.GREEN) + .build(); + lightAreaSummaryTag(appEtagTagInfo.getAreaId(), lightParams); + return; + } + log.info("电子标签区域: {} 扫码: {},电子标签任务数量:{}", appEtagTagInfo.getAreaId(), etagReturnInfo.getData(), appEtagTaskList.size()); + EtagLightParams lightParams = EtagLightParams.builder() + .tagName(appEtagTagInfo.getTagName()) + .tagId(appEtagTagInfo.getTagId().byteValue()) + .tagValue(String.valueOf(appEtagTaskList.size())) + .tagString("正在捡货:" + etagReturnInfo.getData()) + .ledBlinking(LedBlinkingEnum.LED_ON) + .ledColor(LedColorEnum.ORANGE) + .build(); + lightAreaSummaryTag(appEtagTagInfo.getAreaId(), lightParams); + etagRedis.setEtagAreaVehicle(appEtagTagInfo.getAreaId(), etagReturnInfo.getData()); // 将扫码条码存储 + return; + } + EtagSubCommandEnum subCommandEnum = EtagSubCommandEnum.getByCode(etagReturnInfo.getSubCommand()); + String desc = subCommandEnum == null ? String.valueOf(etagReturnInfo.getSubCommand()) : subCommandEnum.getDesc(); + log.info("电子标签扫码器 {},返回非正常提交类型:{}", etagReturnInfo, desc); + } - private void handScanCode(EtagReturnInfo etagReturnInfo) { + /** + * 区域用户绑定或解绑 + * @param areaId 区域ID + * @param data 数据 + * @param user 用户 + * @return 是否处理成功 + */ + private boolean bindOrUnbindUser(String areaId, String data, String user) { + // 判断区域用户绑定 + if(data.equals(etagConfig.getAreaUserUnbind())) { + etagRedis.setEtagAreaUser(areaId, ""); + log.info("电子标签区域 {} 解绑用户", areaId); + EtagLightParams lightParams = EtagLightParams.builder() + .tagValue(user) + .tagString("解绑用户") + .ledBlinking(LedBlinkingEnum.BLINKING_0_25) + .ledColor(LedColorEnum.RED) + .build(); + lightAreaSummaryTag(areaId, lightParams); + AppThreadUtils.sleep(1500); // 点亮标签 1.5秒 + EtagLightParams offParams = EtagLightParams.builder() + .tagValue(user) + .tagString("解绑用户") + .ledBlinking(LedBlinkingEnum.LED_OFF) + .ledColor(LedColorEnum.RED) + .build(); + lightAreaSummaryTag(areaId, offParams); + return true; + } + if(data.equals(etagConfig.getAreaUserPrefix())) { + etagRedis.setEtagAreaUser(areaId, etagConfig.getAreaUserPrefix()); + log.info("电子标签区域 {} 准备绑定用户", areaId); + EtagLightParams lightParams = EtagLightParams.builder() + .tagValue("888") + .tagString("请扫描用户码") + .ledBlinking(LedBlinkingEnum.BLINKING_0_25) + .ledColor(LedColorEnum.GREEN) + .build(); + lightAreaSummaryTag(areaId, lightParams); + return true; + } + if(user != null && user.equals(etagConfig.getAreaUserPrefix())) { + etagRedis.setEtagAreaUser(areaId, data); + log.info("电子标签区域 {} 绑定用户:{}", areaId, data); + EtagLightParams lightParams = EtagLightParams.builder() + .tagValue(user) + .tagString("绑定成功") + .ledBlinking(LedBlinkingEnum.LED_ON) + .ledColor(LedColorEnum.PINK) + .build(); + lightAreaSummaryTag(areaId, lightParams); + AppThreadUtils.sleep(1500); // 点亮标签 1.5秒 + EtagLightParams offParams = EtagLightParams.builder() + .tagValue(user) + .tagString("绑定成功") + .ledBlinking(LedBlinkingEnum.LED_OFF) + .ledColor(LedColorEnum.PINK) + .build(); + lightAreaSummaryTag(areaId, offParams); + return true; + } + return false; } - private void handleTagConfirm(EtagReturnInfo etagReturnInfo) { + /** + * 点亮区域标签 + * @param areaId 区域 + * @param lightParams 点亮标签参数 + */ + private void lightAreaSummaryTag(String areaId, EtagLightParams lightParams) { + AppEtagTagInfo querySummaryTag = new AppEtagTagInfo(); + querySummaryTag.setAreaId(areaId); + querySummaryTag.setBusinessType(EtagBusinessTypeEnum.AREA.getCode()); + List tagInfos = etagInfoService.queryIgnoreNull(querySummaryTag); + if(tagInfos == null || tagInfos.isEmpty()) { + log.warn("电子标签区域 {} 无汇总标签", areaId); + return; + } + for (AppEtagTagInfo tagInfo : tagInfos) { + EtagLightParams tagLightParams = EtagLightParams.builder() + .tagName(tagInfo.getTagName()) + .tagId(tagInfo.getTagId().byteValue()) + .tagValue(lightParams.getTagValue()) + .tagString(lightParams.getTagString()) + .ledColor(lightParams.getLedColor()) + .ledBlinking(lightParams.getLedBlinking()) + .build(); + String lightTagResult = etagAtopOperation.lightTag(tagLightParams); + log.info("点亮电子标签: {},点亮参数:{},点亮结果:{}", tagInfo, tagLightParams, lightTagResult); + } + } + + /** + * 处理标签按下确认 + * @param appEtagTagInfo 标签信息 + * @param etagReturnInfo 标签按下确认返回信息 + */ + private void handleTagConfirm(AppEtagTagInfo appEtagTagInfo, EtagReturnInfo etagReturnInfo) { + if(Objects.equals(appEtagTagInfo.getBusinessType(), EtagBusinessTypeEnum.AREA.getCode())) { + // 区域总标签按下 + handleSummaryTagConfirm(appEtagTagInfo, etagReturnInfo); + return; + } + if(Objects.equals(appEtagTagInfo.getBusinessType(), EtagBusinessTypeEnum.NORMAL.getCode())) { + // 普通标签按下 + handleNormalTagConfirm(appEtagTagInfo, etagReturnInfo); + return; + } + log.info("未知业务标签发来确认:{};{}", appEtagTagInfo, etagReturnInfo); + } + + /** + * 处理区域总标签按下 + * @param appEtagTagInfo 标签信息 + * @param etagReturnInfo 标签按下确认返回信息 + */ + private void handleSummaryTagConfirm(AppEtagTagInfo appEtagTagInfo, EtagReturnInfo etagReturnInfo) { + if(etagReturnInfo.getSubCommand().equals(EtagSubCommandEnum.CONFIRM_COMMAND.getCode())) { + // 按下确认键 ---- 区域标签按下时检查是否还有没捡选任务,若有则再次点亮标签 + String vehicleNo = etagRedis.getEtagAreaVehicle(appEtagTagInfo.getAreaId()); + if(AppStringUtils.isEmpty(vehicleNo)) { + log.info("电子标签区域: {} 区域标签按下,载具编号未绑定", appEtagTagInfo.getAreaId()); + return; + } + // 检查是否有任务 + List taskStatusList = List.of(EtagTaskStatusEnum.NOT_ACTIVATED.getCode(), EtagTaskStatusEnum.LIGHTING.getCode()); + List appEtagTaskList = etagTaskService.queryByTagAreaIdAndVehicleAndStatus(appEtagTagInfo.getAreaId(), vehicleNo, taskStatusList); + if(appEtagTaskList == null) { + log.info("电子标签区域: {} 区域标签按下: {},任务检索失败", appEtagTagInfo.getAreaId(), vehicleNo); + EtagLightParams lightParams = EtagLightParams.builder() + .tagName(appEtagTagInfo.getTagName()) + .tagId(appEtagTagInfo.getTagId().byteValue()) + .tagValue("") + .tagString("任务检索异常") + .ledBlinking(LedBlinkingEnum.BLINKING_0_25) + .ledColor(LedColorEnum.RED) + .build(); + lightAreaSummaryTag(appEtagTagInfo.getAreaId(), lightParams); + return; + } + if(appEtagTaskList.isEmpty()) { + log.info("电子标签区域: {} 区域标签按下: {},无电子标签任务", appEtagTagInfo.getAreaId(), vehicleNo); + return; + } + log.info("电子标签区域: {} 区域标签按下: {},电子标签任务数量:{}", appEtagTagInfo.getAreaId(), vehicleNo, appEtagTaskList.size()); + EtagLightParams lightParams = EtagLightParams.builder() + .tagName(appEtagTagInfo.getTagName()) + .tagId(appEtagTagInfo.getTagId().byteValue()) + .tagValue(String.valueOf(appEtagTaskList.size())) + .tagString("还需捡货:" + vehicleNo) + .ledBlinking(LedBlinkingEnum.LED_ON) + .ledColor(LedColorEnum.ORANGE) + .build(); + lightAreaSummaryTag(appEtagTagInfo.getAreaId(), lightParams); + return; + } + EtagSubCommandEnum subCommandEnum = EtagSubCommandEnum.getByCode(etagReturnInfo.getSubCommand()); + String desc = subCommandEnum == null ? String.valueOf(etagReturnInfo.getSubCommand()) : subCommandEnum.getDesc(); + log.info("电子标签区域标签 {},返回非正常提交类型:{}", etagReturnInfo, desc); + } + + /** + * 处理普通标签按下 + * @param appEtagTagInfo 标签信息 + * @param etagReturnInfo 标签按下确认返回信息 + */ + private void handleNormalTagConfirm(AppEtagTagInfo appEtagTagInfo, EtagReturnInfo etagReturnInfo) { + log.info("电子标签普通标签 {},返回确认信息:{}", appEtagTagInfo.getTagName(), etagReturnInfo.getData()); + if(etagReturnInfo.getSubCommand().equals(EtagSubCommandEnum.CONFIRM_COMMAND.getCode())) { + // 按下确认键 + AppEtagTask etagTagTask = etagRedis.getEtagTagTask(appEtagTagInfo.getTagName()); + if(etagTagTask == null) { + log.info("电子标签普通标签 {},未检索到任务", appEtagTagInfo.getTagName()); + return; + } + // 更新确认数量和确认人 + String user = etagRedis.getEtagAreaUser(appEtagTagInfo.getAreaId()); // 确认人 + int confirmNum = AppStringUtils.forceToInt(etagReturnInfo.getData()); + AppEtagTask updateEtagTagTask = new AppEtagTask(); + updateEtagTagTask.setTaskId(etagTagTask.getTaskId()); + updateEtagTagTask.setTaskStatus(EtagTaskStatusEnum.CONFIRM.getCode()); + updateEtagTagTask.setConfirmTime(LocalDateTime.now()); + updateEtagTagTask.setCompletedTime(LocalDateTime.now()); + updateEtagTagTask.setConfirmNum(BigDecimal.valueOf(confirmNum)); + updateEtagTagTask.setConfirmPerson(user); + Integer result = etagTaskService.updateIgnoreNull(updateEtagTagTask).result(); + log.info("电子标签普通标签 {},更新任务:{},结果:{}", appEtagTagInfo.getTagName(), etagTagTask.getTaskId(), result); + // 上报电子标签任务 + if(etagTagTask.getTaskSource().equals(ConstantData.SYSTEM_NAME)) { + return; // 自己创建的不需要上报 + } + Tuple2 reportResult = ReportStandard.etagTaskReport(etagTagTask, confirmNum, user); + if(AppStringUtils.isEmpty(reportResult.item1)) { + log.info("电子标签普通标签 {},任务号:{},上报任务失败:{}", appEtagTagInfo.getTagName(), etagTagTask.getTaskId(), reportResult.item1); + } else { + log.info("电子标签普通标签 {},任务号:{},上报任务结果:{}", appEtagTagInfo.getTagName(), etagTagTask.getTaskId(), reportResult.item2); + } + return; + } + EtagSubCommandEnum subCommandEnum = EtagSubCommandEnum.getByCode(etagReturnInfo.getSubCommand()); + String desc = subCommandEnum == null ? String.valueOf(etagReturnInfo.getSubCommand()) : subCommandEnum.getDesc(); + log.info("电子标签小标签 {},返回非正常提交类型:{}", etagReturnInfo, desc); } } diff --git a/wcs/src/main/java/org/wcs/business/redis/EtagRedis.java b/wcs/src/main/java/org/wcs/business/redis/EtagRedis.java index c801fe2..90bfcdb 100644 --- a/wcs/src/main/java/org/wcs/business/redis/EtagRedis.java +++ b/wcs/src/main/java/org/wcs/business/redis/EtagRedis.java @@ -12,6 +12,8 @@ import org.wcs.model.po.app.AppEtagTagLocation; import org.wcs.model.po.app.AppEtagTask; import org.wcs.utils.AppStringUtils; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -41,6 +43,8 @@ public class EtagRedis { private static final String ETAG_TAG_COLOR_KEY = ConstantData.SYSTEM_NAME + ":Etag:TagColor"; // 电子标签小标签闪烁信息 ---- 存储上次的闪烁信息,防止重复发送闪烁命令 private static final String ETAG_TAG_BLINKING_KEY = ConstantData.SYSTEM_NAME + ":Etag:TagBlinking"; + // 电子标签绑定的当前载具编号 + private static final String ETAG_AREA_VEHICLE_KEY = ConstantData.SYSTEM_NAME + ":Etag:AreaVehicle"; /* ******************** 电子标签小标签信息 *********************** */ @@ -255,5 +259,63 @@ public class EtagRedis { return LedBlinkingEnum.getByCode(Integer.valueOf(ledBlinking)); } + /* ******************** 电子标签区域绑定的载具信息 *********************** */ + + /** + * 设置电子标签区域绑定的载具信息 + * @param areaId 区域ID + * @param vehicleNo 载具编号 + */ + public void setEtagAreaVehicle(String areaId, String vehicleNo) { + stringRedisTemplate.opsForValue().set(ETAG_AREA_VEHICLE_KEY + ":" + areaId, vehicleNo); + } + + /** + * 获取电子标签区域绑定的载具信息 + * @param areaId 区域ID + * @return 载具编号 + */ + public String getEtagAreaVehicle(String areaId) { + String vehicleNo = stringRedisTemplate.opsForValue().get(ETAG_AREA_VEHICLE_KEY + ":" + areaId); + if(AppStringUtils.isEmpty(vehicleNo)) { + return null; + } + return vehicleNo; + } + + /** + * 清空电子标签区域绑定的载具信息 + */ + public void clearEtagAreaVehicle() { + Set keys = stringRedisTemplate.keys(ETAG_AREA_VEHICLE_KEY + ":*"); + stringRedisTemplate.delete(keys); + } + + /** + * 清空电子标签区域绑定的载具信息 + * @param areaId 区域ID + */ + public void clearEtagAreaVehicle(String areaId) { + Set keys = stringRedisTemplate.keys(ETAG_AREA_VEHICLE_KEY + ":" + areaId); + stringRedisTemplate.delete(keys); + } + + /** + * 获取电子标签区域绑定的载具信息 + * @return < 区域号,载具编号 > + */ + public Map getEtagAreaVehicleAll() { + Map map = new HashMap<>(); + Set keys = stringRedisTemplate.keys(ETAG_AREA_VEHICLE_KEY + ":*"); + for (String key : keys) { + String vehicleNo = stringRedisTemplate.opsForValue().get(key); + String[] KeySplitList = key.split(":"); + map.put(KeySplitList[KeySplitList.length - 1], vehicleNo); + } + return map; + } + + + } diff --git a/wcs/src/main/java/org/wcs/config/EtagConfig.java b/wcs/src/main/java/org/wcs/config/EtagConfig.java new file mode 100644 index 0000000..2b49bf7 --- /dev/null +++ b/wcs/src/main/java/org/wcs/config/EtagConfig.java @@ -0,0 +1,25 @@ +package org.wcs.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "wcs.etag") +public class EtagConfig { + + /** + * 电子标签扫码绑定用户前扫码的字符串 + */ + private String areaUserPrefix; + + /** + * 电子标签解绑用户 + */ + private String areaUserUnbind; + + +} diff --git a/wcs/src/main/java/org/wcs/constant/enums/database/EtagBusinessTypeEnum.java b/wcs/src/main/java/org/wcs/constant/enums/database/EtagBusinessTypeEnum.java new file mode 100644 index 0000000..3469b2f --- /dev/null +++ b/wcs/src/main/java/org/wcs/constant/enums/database/EtagBusinessTypeEnum.java @@ -0,0 +1,22 @@ +package org.wcs.constant.enums.database; + +import lombok.Getter; + +/** + * 电子标签业务类型枚举 + */ +@Getter +public enum EtagBusinessTypeEnum { + + NORMAL(0, "普通"), + AREA(1, "区域标签"), + TUNNEL_LIGHT(2, "巷道灯"); + + private final Integer code; + private final String desc; + + EtagBusinessTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/wcs/src/main/java/org/wcs/constant/enums/etag/EtagSubCommandEnum.java b/wcs/src/main/java/org/wcs/constant/enums/etag/EtagSubCommandEnum.java index aa7bc6d..a7b0eaf 100644 --- a/wcs/src/main/java/org/wcs/constant/enums/etag/EtagSubCommandEnum.java +++ b/wcs/src/main/java/org/wcs/constant/enums/etag/EtagSubCommandEnum.java @@ -14,12 +14,23 @@ public enum EtagSubCommandEnum { BUTTON_STUCK(13, "按键卡死"), ERR_INSTRUCTION(12, "指令错误"); - private Integer code; - private String desc; + private final Integer code; + private final String desc; EtagSubCommandEnum(Integer code, String desc) { this.code = code; this.desc = desc; } + public static EtagSubCommandEnum getByCode(Integer code) { + for (EtagSubCommandEnum value : values()) { + if (value.code.equals(code)) { + return value; + } + } + return null; + } + + + } diff --git a/wcs/src/main/java/org/wcs/mapper/AppEtagTaskMapper.java b/wcs/src/main/java/org/wcs/mapper/AppEtagTaskMapper.java index 6c3aa05..0a5c35c 100755 --- a/wcs/src/main/java/org/wcs/mapper/AppEtagTaskMapper.java +++ b/wcs/src/main/java/org/wcs/mapper/AppEtagTaskMapper.java @@ -1,11 +1,12 @@ package org.wcs.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; import org.wcs.model.po.app.AppEtagTask; @Mapper -public interface AppEtagTaskMapper extends BaseMapper { +public interface AppEtagTaskMapper extends MPJBaseMapper { } diff --git a/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTagInfoDao.java b/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTagInfoDao.java index cba5e85..9ddd38a 100755 --- a/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTagInfoDao.java +++ b/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTagInfoDao.java @@ -80,6 +80,30 @@ public class AppEtagTagInfoDao extends ServiceImpl queryIgnoreNull(AppEtagTagInfo appEtagTagInfo) { + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(appEtagTagInfo.getTagName() != null, AppEtagTagInfo::getTagName, appEtagTagInfo.getTagName()); + queryWrapper.eq(appEtagTagInfo.getControllerId() != null, AppEtagTagInfo::getControllerId, appEtagTagInfo.getControllerId()); + queryWrapper.eq(appEtagTagInfo.getTagId() != null, AppEtagTagInfo::getTagId, appEtagTagInfo.getTagId()); + queryWrapper.eq(appEtagTagInfo.getTagType() != null, AppEtagTagInfo::getTagType, appEtagTagInfo.getTagType()); + queryWrapper.eq(appEtagTagInfo.getBusinessType() != null, AppEtagTagInfo::getBusinessType, appEtagTagInfo.getBusinessType()); + queryWrapper.eq(appEtagTagInfo.getAreaId() != null, AppEtagTagInfo::getAreaId, appEtagTagInfo.getAreaId()); + queryWrapper.eq(appEtagTagInfo.getTunnelNo() != null, AppEtagTagInfo::getTunnelNo, appEtagTagInfo.getTunnelNo()); + queryWrapper.eq(appEtagTagInfo.getRemark() != null, AppEtagTagInfo::getRemark, appEtagTagInfo.getRemark()); + return baseMapper.selectList(queryWrapper); + + } catch (Exception e) { + return null; + } + } + /** * 添加电子标签小标签信息 * @param appEtagTagInfo 添加参数 diff --git a/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTaskDao.java b/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTaskDao.java index 69fcb51..3ef0c71 100755 --- a/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTaskDao.java +++ b/wcs/src/main/java/org/wcs/mapper/impl/AppEtagTaskDao.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.query.MPJLambdaQueryWrapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.BatchResult; import org.springframework.stereotype.Service; @@ -12,6 +14,8 @@ import org.wcs.mapper.intf.AppEtagTaskService; import org.wcs.model.bo.db.DataBaseActionResult; import org.wcs.model.bo.tuple.Tuple2; import org.wcs.model.dto.serve.etagTask.EtagTaskQueryReq; +import org.wcs.model.po.app.AppEtagTagInfo; +import org.wcs.model.po.app.AppEtagTagLocation; import org.wcs.model.po.app.AppEtagTask; import org.wcs.utils.AppStringUtils; @@ -155,4 +159,33 @@ public class AppEtagTaskDao extends ServiceImpl return null; } } + + /** + * 根据标签区域ID和状态查询任务 + * @param areaId 标签区域ID + * @param vehicleNo 载具 + * @param status 状态列表 + * @return 任务列表 + */ + @Override + public List queryByTagAreaIdAndVehicleAndStatus(String areaId, String vehicleNo, List status) { + if (AppStringUtils.isEmpty(areaId) || status == null || status.isEmpty()) { + return null; + } + MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); + queryWrapper.selectAll(AppEtagTask.class); + queryWrapper.leftJoin(AppEtagTagLocation.class, + q -> q.eq(AppEtagTask::getLocation, AppEtagTagLocation::getLocation)); + queryWrapper.leftJoin(AppEtagTagInfo.class, + q -> q.eq(AppEtagTagLocation::getTagName, AppEtagTagInfo::getTagName)); + queryWrapper.eq(AppEtagTagInfo::getAreaId, areaId) + .eq(AppEtagTask::getVehicleNo, vehicleNo) + .in(AppEtagTask::getTaskStatus, status); + queryWrapper.orderByAsc(AppEtagTask::getCreateTime); + try { + return super.baseMapper.selectJoinList(AppEtagTask.class, queryWrapper); + } catch (Exception e) { + return null; + } + } } diff --git a/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTagInfoService.java b/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTagInfoService.java index 9478154..349a1d8 100755 --- a/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTagInfoService.java +++ b/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTagInfoService.java @@ -16,6 +16,7 @@ public interface AppEtagTagInfoService extends IService { Tuple2> queryEtagTagInfo(EtagTagInfoQueryReq request, Integer pageSize, Integer pageIndex); List queryEtagTagInfoByTagName(String tagName); // 通过标签名称查询 List queryAll(); // 查询所有 + List queryIgnoreNull(AppEtagTagInfo appEtagTagInfo); // 忽略空字段查询 DataBaseActionResult insert(AppEtagTagInfo appEtagTagInfo); // 添加电子标签小标签基础信息 DataBaseActionResult update(AppEtagTagInfo appEtagTagInfo); // 修改电子标签小标签基础信息 DataBaseActionResult deleteByTagName(String tagName); // 删除电子标签小标签基础信息 diff --git a/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTaskService.java b/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTaskService.java index 5460638..37f00e6 100755 --- a/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTaskService.java +++ b/wcs/src/main/java/org/wcs/mapper/intf/AppEtagTaskService.java @@ -17,4 +17,5 @@ public interface AppEtagTaskService extends IService { DataBaseActionResult insert(List appEtagTaskList); // 插入新数据 DataBaseActionResult updateIgnoreNull(AppEtagTask appEtagTask); // 更新数据,忽略Null值 List queryByTaskId(String taskId); // 通过任务ID查询 + List queryByTagAreaIdAndVehicleAndStatus(String areaId, String vehicleNo, List status); // 通过标签区域ID和载具号和状态查询 } diff --git a/wcs/src/main/java/org/wcs/model/bo/etag/EtagLightParams.java b/wcs/src/main/java/org/wcs/model/bo/etag/EtagLightParams.java index b05f2b7..c5cef48 100644 --- a/wcs/src/main/java/org/wcs/model/bo/etag/EtagLightParams.java +++ b/wcs/src/main/java/org/wcs/model/bo/etag/EtagLightParams.java @@ -1,5 +1,6 @@ package org.wcs.model.bo.etag; +import lombok.Builder; import lombok.Getter; import lombok.Setter; import org.wcs.constant.enums.etag.LedBlinkingEnum; @@ -9,6 +10,7 @@ import org.wcs.constant.enums.etag.LedColorEnum; * 点亮标签参数 */ @Getter +@Builder public class EtagLightParams { /** @@ -25,100 +27,27 @@ public class EtagLightParams { /** * 标签值 */ - private String tagValue; + @Builder.Default + private String tagValue = "888"; /** * 显示标签字符串 */ - private String tagString; + @Builder.Default + private String tagString = "未设置文本"; /** * 闪烁频率 */ - private LedBlinkingEnum ledBlinking; + @Builder.Default + private LedBlinkingEnum ledBlinking = LedBlinkingEnum.BLINKING_0_25; /** * 灯颜色 */ - private LedColorEnum ledColor; + @Builder.Default + private LedColorEnum ledColor = LedColorEnum.GREEN; - /** - * 构建开始 - * @return 新实例 - */ - public static EtagLightParams buildStart() { - return new EtagLightParams(); - } - - /** - * 设置标签名称 - * @param tagName 标签名称 - * @return 设置结果 - */ - public EtagLightParams tagName(String tagName) { - this.tagName = tagName; - return this; - } - - /** - * 设置标签值 - * @param tagValue 标签值 - * @return 设置结果 - */ - public EtagLightParams tagValue(String tagValue) { - this.tagValue = tagValue; - return this; - } - - /** - * 显示标签字符串 - * @param tagString 标签字符串 - * @return 设置结果 - */ - public EtagLightParams tagString(String tagString) { - this.tagString = tagString; - return this; - } - - /** - * 闪烁频率 - * @param ledBlinking 闪烁频率 - * @return 设置结果 - */ - public EtagLightParams ledBlinking(LedBlinkingEnum ledBlinking) { - this.ledBlinking = ledBlinking; - return this; - } - - /** - * 灯颜色 - * @param ledColor led颜色 - * @return 设置结果 - */ - public EtagLightParams ledColor(LedColorEnum ledColor) { - this.ledColor = ledColor; - return this; - } - - /** - * 构建结束 - * @return 构建结果 - */ - public EtagLightParams buildEnd() { - if(this.tagValue == null) { - this.tagValue = "888"; - } - if(this.tagString == null) { - this.tagString = "未设置文本"; - } - if(this.ledBlinking == null) { - this.ledBlinking = LedBlinkingEnum.BLINKING_0_25; - } - if(this.ledColor == null) { - this.ledColor = LedColorEnum.GREEN; - } - return this; - } @Override diff --git a/wcs/src/main/java/org/wcs/model/po/app/AppEtagTagInfo.java b/wcs/src/main/java/org/wcs/model/po/app/AppEtagTagInfo.java index 00fa0e7..239ea18 100755 --- a/wcs/src/main/java/org/wcs/model/po/app/AppEtagTagInfo.java +++ b/wcs/src/main/java/org/wcs/model/po/app/AppEtagTagInfo.java @@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import lombok.ToString; /** * 电子标签小标签基础信息 */ @Data +@ToString @TableName("t_app_etag_tag_info") public class AppEtagTagInfo { diff --git a/wcs/src/main/java/org/wcs/utils/AppDataBaseTransUtils.java b/wcs/src/main/java/org/wcs/utils/AppDataBaseTransUtils.java index 72efb72..0ba0f38 100644 --- a/wcs/src/main/java/org/wcs/utils/AppDataBaseTransUtils.java +++ b/wcs/src/main/java/org/wcs/utils/AppDataBaseTransUtils.java @@ -1,12 +1,15 @@ package org.wcs.utils; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.wcs.utils.function.RunnableThrowEx; +@Slf4j @Component @RequiredArgsConstructor public class AppDataBaseTransUtils { @@ -18,7 +21,7 @@ public class AppDataBaseTransUtils { * @param baseTran 事务类 * @return 执行结果 */ - public boolean useTran(Runnable baseTran) { + public boolean useTran(RunnableThrowEx baseTran) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); @@ -28,6 +31,7 @@ public class AppDataBaseTransUtils { return true; } catch (Exception e) { transactionManager.rollback(status); + log.error("事务执行失败", e); return false; } } diff --git a/wcs/src/main/java/org/wcs/utils/function/RunnableThrowEx.java b/wcs/src/main/java/org/wcs/utils/function/RunnableThrowEx.java new file mode 100644 index 0000000..899948e --- /dev/null +++ b/wcs/src/main/java/org/wcs/utils/function/RunnableThrowEx.java @@ -0,0 +1,9 @@ +package org.wcs.utils.function; + +/** + * 支持异常抛出的函数 + */ +@FunctionalInterface +public interface RunnableThrowEx { + void run() throws Exception; +} diff --git a/wcs/src/main/resources/application.yml b/wcs/src/main/resources/application.yml index d77d306..d3ff496 100644 --- a/wcs/src/main/resources/application.yml +++ b/wcs/src/main/resources/application.yml @@ -1,3 +1,7 @@ +wcs: + etag: + area-user-prefix: ^user$ + area-user-unbind: $user^ spring: application: name: wcs