添加电子标签点亮相关逻辑

This commit is contained in:
葛林强 2026-01-28 10:56:34 +08:00
parent bf7f97d90a
commit e50d0a9562
11 changed files with 341 additions and 20 deletions

View File

@ -19,4 +19,4 @@
电子标签联动输送线逻辑:输送线扫码时检查该捡选站台对应的电子标签货位是否有任务,若有则弹出;此处<span style="color:#F56789">需要正确在电子标签货位表填写站台号</span>
电子标签状态:已经激活的直接定时任务点亮,未激活的要扫码触发
电子标签状态:立即点亮的直接定时任务点亮,未激活的要扫码触发

View File

@ -364,6 +364,7 @@ public class EtagDataHandler {
log.info("电子标签普通标签 {},未检索到任务", appEtagTagInfo.getTagName());
return;
}
etagRedis.removeEtagTagTask(appEtagTagInfo.getTagName()); // 解绑这个标签绑定的任务
// 更新确认数量和确认人
String user = etagRedis.getEtagAreaUser(appEtagTagInfo.getAreaId()); // 确认人
int confirmNum = AppStringUtils.forceToInt(etagReturnInfo.getData());

View File

@ -1,31 +1,261 @@
package org.wcs.business.etag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.wcs.business.redis.EtagRedis;
import org.wcs.constant.enums.database.EtagBusinessTypeEnum;
import org.wcs.constant.enums.database.EtagTaskLightModelEnum;
import org.wcs.constant.enums.database.EtagTaskStatusEnum;
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.po.app.AppEtagTagInfo;
import org.wcs.model.po.app.AppEtagTagLocation;
import org.wcs.model.po.app.AppEtagTask;
import org.wcs.utils.AppStringUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 电子标签任务执行类
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class EtagTaskExecute {
/**
* 点亮汇总标签
*/
public void lightSummaryTag() {
}
// 电子标签操作类
private final EtagAtopOperation etagAtopOperation;
// 电子标签任务服务
private final AppEtagTaskService etagTaskService;
// 电子标签小标签数据库服务
private final AppEtagTagInfoService etagTagInfoService;
// 电子标签Redis操作类
private final EtagRedis etagRedis;
/**
* 点亮小标签
*/
public void lightSmallTag() {
lightImmediatelyTask(); // 点亮立即点亮的任务
lightNeedFireTask(); // 点亮需要触发的任务
}
/**
* 点亮通道灯
* 点亮立即点亮的任务
*/
private void lightImmediatelyTask() {
// 点亮立即点亮的任务
AppEtagTask queryImmediatelyTask = new AppEtagTask();
queryImmediatelyTask.setTaskStatus(EtagTaskStatusEnum.NOT_ACTIVATED.getCode());
queryImmediatelyTask.setLightModel(EtagTaskLightModelEnum.IMMEDIATELY.getCode());
List<AppEtagTask> immediatelyTaskList = etagTaskService.queryIgnoreNull(queryImmediatelyTask);
if(immediatelyTaskList == null) {
return;
}
if (immediatelyTaskList.isEmpty()) {
return;
}
lightEtagTasks(immediatelyTaskList);
}
/**
* 点亮需要触发的任务
*/
private void lightNeedFireTask() {
// 查找区域绑定好的载具信息
Map<String, String> areaVehicleAll = etagRedis.getEtagAreaVehicleAll();
for (Map.Entry<String, String> entry : areaVehicleAll.entrySet()) {
String areaId = entry.getKey(); // 区域编号
String vehicleNo = entry.getValue(); // 载具编号
if(AppStringUtils.isEmpty(areaId) || AppStringUtils.isEmpty(vehicleNo)) {
continue;
}
List<Integer> taskStatus = List.of(EtagTaskStatusEnum.NOT_ACTIVATED.getCode());
List<AppEtagTask> appEtagTaskList = etagTaskService.queryByTagAreaIdAndVehicleAndStatus(areaId, vehicleNo, taskStatus);
if(appEtagTaskList == null || appEtagTaskList.isEmpty()) {
continue; // 查找任务失败或者没找到任务就继续下拨循环
}
lightEtagTasks(appEtagTaskList);
}
}
/**
* 点亮任务列表
* @param appEtagTaskList 电子标签任务列表
*/
private void lightEtagTasks(List<AppEtagTask> appEtagTaskList) {
for (AppEtagTask etagTask : appEtagTaskList) {
// 查找这个任务货位对应的标签信息
AppEtagTagLocation appEtagTagLocation = etagRedis.getEtagLocation(etagTask.getLocation());
if(appEtagTagLocation == null) {
log.info("点亮标签任务:{},时未找到货位:{} 的信息", etagTask.getTaskId(), etagTask.getLocation());
AppEtagTask updateEtagTask = new AppEtagTask();
updateEtagTask.setTaskId(etagTask.getTaskId());
updateEtagTask.setTaskStatus(EtagTaskStatusEnum.ERROR.getCode());
updateEtagTask.setCompletedTime(LocalDateTime.now());
updateEtagTask.setRemark("未找到货位:" + etagTask.getLocation() + " 的信息");
Integer result = etagTaskService.updateIgnoreNull(updateEtagTask).result();
log.info("更新电子标签任务:{},结果:{},更新项:{}", updateEtagTask.getTaskId(), result, updateEtagTask);
continue;
}
// 查找这个标签绑定的任务
AppEtagTask etagTagTask = etagRedis.getEtagTagTask(appEtagTagLocation.getTagName());
if(etagTagTask != null) {
// 绑定了任务说明标签还在亮着得等按下完成
continue;
}
// 查找这个标签名称对应的数据
AppEtagTagInfo appEtagTagInfo = etagRedis.getEtagTag(appEtagTagLocation.getTagName());
if(appEtagTagInfo == null) {
log.info("点亮标签任务:{},时未找到标签:{} 的信息", etagTask.getTaskId(), appEtagTagLocation.getTagName());
AppEtagTask updateEtagTask = new AppEtagTask();
updateEtagTask.setTaskId(etagTask.getTaskId());
updateEtagTask.setTaskStatus(EtagTaskStatusEnum.ERROR.getCode());
updateEtagTask.setCompletedTime(LocalDateTime.now());
updateEtagTask.setRemark("未找到标签:" + appEtagTagLocation.getTagName() + " 的信息");
Integer result = etagTaskService.updateIgnoreNull(updateEtagTask).result();
log.info("更新电子标签任务:{},结果:{},更新项:{}", updateEtagTask.getTaskId(), result, updateEtagTask);
continue;
}
// 点亮标签
EtagLightParams lightParams = EtagLightParams.builder()
.tagName(appEtagTagInfo.getTagName())
.tagId(appEtagTagInfo.getTagId().byteValue())
.tagValue(String.valueOf(etagTask.getLightNum()))
.tagString(etagTask.getGoodsName() + "[" + etagTask.getGoodsId() + "]")
.ledBlinking(LedBlinkingEnum.BLINKING_0_25)
.ledColor(LedColorEnum.ORANGE)
.build();
String lightTagResult = etagAtopOperation.lightTag(lightParams);
log.info("点亮电子标签: {},点亮参数:{},点亮结果:{}", appEtagTagLocation.getTagName(), lightParams, lightTagResult);
if(AppStringUtils.isEmpty(lightTagResult)) {
etagRedis.setEtagTagTask(appEtagTagLocation.getTagName(), etagTask); // 点亮成功将任务绑定到标签
// 更新任务状态
AppEtagTask updateEtagTask = new AppEtagTask();
updateEtagTask.setTaskId(etagTask.getTaskId());
updateEtagTask.setTaskStatus(EtagTaskStatusEnum.LIGHTING.getCode());
updateEtagTask.setLightTime(LocalDateTime.now());
Integer result = etagTaskService.updateIgnoreNull(updateEtagTask).result();
log.info("更新电子标签任务:{},结果:{},更新项:{}", updateEtagTask.getTaskId(), result, updateEtagTask);
}
}
}
/**
* 点亮和熄灭通道灯
*/
public void lightTunnelLight() {
AppEtagTagInfo queryLightTag = new AppEtagTagInfo();
queryLightTag.setBusinessType(EtagBusinessTypeEnum.TUNNEL_LIGHT.getCode());
List<AppEtagTagInfo> etagTagInfoList = etagTagInfoService.queryIgnoreNull(queryLightTag); // 所有的通道灯数据
if(etagTagInfoList == null || etagTagInfoList.isEmpty()) {
return;
}
List<EtagLightParams> lightParamsList = new ArrayList<>(); // 各个通道灯的点亮参数
// 遍历所有通道灯获取各个通道灯的标签名称检查其是否有绑定的任务
for (AppEtagTagInfo etagTagInfo : etagTagInfoList) {
AppEtagTagInfo queryTunnelEtag = new AppEtagTagInfo();
queryTunnelEtag.setTunnelNo(etagTagInfo.getTunnelNo());
List<AppEtagTagInfo> tunnelEtagTagInfoList = etagTagInfoService.queryIgnoreNull(queryTunnelEtag);
if(tunnelEtagTagInfoList == null) {
continue;
}
boolean existTask = false; // 是否存在任务
for (AppEtagTagInfo tunnelEtagTagInfo : tunnelEtagTagInfoList) {
existTask = etagRedis.existsEtagTagTask(tunnelEtagTagInfo.getTagName());
if(existTask) {
break; // 存在一个任务即视为存在直接跳出
}
}
EtagLightParams lightParams; // 点亮参数
if(existTask) {
lightParams = EtagLightParams.builder()
.tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue())
.ledBlinking(LedBlinkingEnum.LED_ON)
.ledColor(LedColorEnum.GREEN)
.build();
} else {
lightParams = EtagLightParams.builder()
.tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue())
.ledBlinking(LedBlinkingEnum.LED_OFF)
.ledColor(LedColorEnum.GREEN)
.build();
}
lightParamsList.add(lightParams);
}
// 执行点亮或者熄灭动作
for (EtagLightParams lightParamsItem : lightParamsList) {
etagAtopOperation.lightTag(lightParamsItem);
}
}
/**
* 点亮汇总标签
*/
public void lightSummaryTag() {
AppEtagTagInfo querySummaryTag = new AppEtagTagInfo();
querySummaryTag.setBusinessType(EtagBusinessTypeEnum.AREA.getCode());
List<AppEtagTagInfo> etagTagInfoList = etagTagInfoService.queryIgnoreNull(querySummaryTag); // 所有的区域标签数据
if(etagTagInfoList == null || etagTagInfoList.isEmpty()) {
return;
}
List<EtagLightParams> lightParamsList = new ArrayList<>(); // 各个区域标签的点亮参数
for (AppEtagTagInfo etagTagInfo : etagTagInfoList) {
String etagAreaVehicle = etagRedis.getEtagAreaVehicle(etagTagInfo.getAreaId());
if(AppStringUtils.isEmpty(etagAreaVehicle)) {
// 没有绑定的载具了
lightParamsList.add(EtagLightParams.builder().tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue()).tagValue("0").tagString("无任务")
.ledBlinking(LedBlinkingEnum.LED_OFF).ledColor(LedColorEnum.GREEN).build());
continue;
}
// 还有绑定的载具
List<Integer> notCompletedTaskStatus = Arrays.asList(EtagTaskStatusEnum.NOT_ACTIVATED.getCode(), EtagTaskStatusEnum.LIGHTING.getCode());
// 检查这个载具有没有完成所有的任务
List<AppEtagTask> allEtagTaskList = etagTaskService.queryByVehicleAndStatus(etagAreaVehicle, notCompletedTaskStatus);
if(allEtagTaskList == null) {
continue; // 查询数据库失败
}
if(allEtagTaskList.isEmpty()) {
lightParamsList.add(EtagLightParams.builder().tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue()).tagValue("0").tagString("全部完成:" + etagAreaVehicle)
.ledBlinking(LedBlinkingEnum.LED_OFF).ledColor(LedColorEnum.GREEN).build());
continue;
}
// 检查这个区域还有没有这个载具的任务
List<AppEtagTask> thisAreaEtagTaskList = etagTaskService.queryByTagAreaIdAndVehicleAndStatus(etagTagInfo.getAreaId(), etagAreaVehicle, notCompletedTaskStatus);
if(thisAreaEtagTaskList == null) {
continue; // 查询数据库失败
}
if(thisAreaEtagTaskList.isEmpty()) {
lightParamsList.add(EtagLightParams.builder().tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue()).tagValue("0").tagString("任务完成:" + etagAreaVehicle)
.ledBlinking(LedBlinkingEnum.LED_ON).ledColor(LedColorEnum.BLUE).build());
continue;
}
// 正在捡选的情况
lightParamsList.add(EtagLightParams.builder().tagName(etagTagInfo.getTagName())
.tagId(etagTagInfo.getTagId().byteValue()).tagValue(String.valueOf(thisAreaEtagTaskList.size())).tagString("正在捡选:" + etagAreaVehicle)
.ledBlinking(LedBlinkingEnum.LED_ON).ledColor(LedColorEnum.ORANGE).build());
}
// 执行点亮或者熄灭动作
for (EtagLightParams lightParamsItem : lightParamsList) {
etagAtopOperation.lightTag(lightParamsItem);
}
}
}

View File

@ -97,7 +97,6 @@ public class EtagRedis {
}
/* ******************** 电子标签货位信息 *********************** */
/**
@ -179,6 +178,22 @@ public class EtagRedis {
return stringRedisTemplate.hasKey(ETAG_TAG_TASK_KEY + ":" + tagName);
}
/**
* 获取所有电子标签绑定的任务信息
* @return 所有电子标签绑定的任务信息
*/
public Map<String, String> getEtagTagTaskAll() {
Map<String, String> tagInfoMap = new HashMap<>();
Set<String> keys = stringRedisTemplate.keys(ETAG_TAG_TASK_KEY + ":*");
for (String key : keys) {
String tagInfo = stringRedisTemplate.opsForValue().get(key);
String[] tagNameSplit = key.split(":");
tagInfoMap.put(tagNameSplit[tagNameSplit.length - 1], tagInfo);
}
return tagInfoMap;
}
/* ******************** 电子标签区域绑定的用户信息 *********************** */
/**

View File

@ -188,4 +188,64 @@ public class AppEtagTaskDao extends ServiceImpl<AppEtagTaskMapper, AppEtagTask>
return null;
}
}
/**
* 根据载具和状态查询任务
* @param vehicleNo 载具
* @param status 状态列表
* @return 列表
*/
@Override
public List<AppEtagTask> queryByVehicleAndStatus(String vehicleNo, List<Integer> status) {
if (status == null || status.isEmpty()) {
return null;
}
LambdaQueryWrapper<AppEtagTask> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppEtagTask::getVehicleNo, vehicleNo)
.in(AppEtagTask::getTaskStatus, status)
.orderByAsc(AppEtagTask::getCreateTime);
try {
return super.baseMapper.selectList(queryWrapper);
} catch (Exception e) {
return null;
}
}
/**
* 忽略Null值查询条件查询
* @param appEtagTask 查询参数
* @return 任务列表
*/
@Override
public List<AppEtagTask> queryIgnoreNull(AppEtagTask appEtagTask) {
if(appEtagTask == null) {
return null;
}
LambdaQueryWrapper<AppEtagTask> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(appEtagTask.getTaskId() != null, AppEtagTask::getTaskId, appEtagTask.getTaskId());
queryWrapper.eq(appEtagTask.getTaskGroup() != null, AppEtagTask::getTaskGroup, appEtagTask.getTaskGroup());
queryWrapper.eq(appEtagTask.getTaskType() != null, AppEtagTask::getTaskType, appEtagTask.getTaskType());
queryWrapper.eq(appEtagTask.getVehicleNo() != null, AppEtagTask::getVehicleNo, appEtagTask.getVehicleNo());
queryWrapper.eq(appEtagTask.getOrderId() != null, AppEtagTask::getOrderId, appEtagTask.getOrderId());
queryWrapper.eq(appEtagTask.getLocation() != null, AppEtagTask::getLocation, appEtagTask.getLocation());
queryWrapper.eq(appEtagTask.getGoodsId() != null, AppEtagTask::getGoodsId, appEtagTask.getGoodsId());
queryWrapper.eq(appEtagTask.getGoodsName() != null, AppEtagTask::getGoodsName, appEtagTask.getGoodsName());
queryWrapper.eq(appEtagTask.getLightNum() != null, AppEtagTask::getLightNum, appEtagTask.getLightNum());
queryWrapper.eq(appEtagTask.getConfirmNum() != null, AppEtagTask::getConfirmNum, appEtagTask.getConfirmNum());
queryWrapper.eq(appEtagTask.getTaskStatus() != null, AppEtagTask::getTaskStatus, appEtagTask.getTaskStatus());
queryWrapper.eq(appEtagTask.getLightModel() != null, AppEtagTask::getLightModel, appEtagTask.getLightModel());
queryWrapper.eq(appEtagTask.getTaskSource() != null, AppEtagTask::getTaskSource, appEtagTask.getTaskSource());
queryWrapper.eq(appEtagTask.getCreatePerson() != null, AppEtagTask::getCreatePerson, appEtagTask.getCreatePerson());
queryWrapper.eq(appEtagTask.getCreateTime() != null, AppEtagTask::getCreateTime, appEtagTask.getCreateTime());
queryWrapper.eq(appEtagTask.getLightTime() != null, AppEtagTask::getLightTime, appEtagTask.getLightTime());
queryWrapper.eq(appEtagTask.getConfirmTime() != null, AppEtagTask::getConfirmTime, appEtagTask.getConfirmTime());
queryWrapper.eq(appEtagTask.getConfirmPerson() != null, AppEtagTask::getConfirmPerson, appEtagTask.getConfirmPerson());
queryWrapper.eq(appEtagTask.getCompletedTime() != null, AppEtagTask::getCompletedTime, appEtagTask.getCompletedTime());
queryWrapper.eq(appEtagTask.getRemark() != null, AppEtagTask::getRemark, appEtagTask.getRemark());
try {
return baseMapper.selectList(queryWrapper);
} catch (Exception e) {
return null;
}
}
}

View File

@ -18,4 +18,6 @@ public interface AppEtagTaskService extends IService<AppEtagTask> {
DataBaseActionResult<Integer> updateIgnoreNull(AppEtagTask appEtagTask); // 更新数据,忽略Null值
List<AppEtagTask> queryByTaskId(String taskId); // 通过任务ID查询
List<AppEtagTask> queryByTagAreaIdAndVehicleAndStatus(String areaId, String vehicleNo, List<Integer> status); // 通过标签区域ID和载具号和状态查询
List<AppEtagTask> queryByVehicleAndStatus(String vehicleNo, List<Integer> status); // 通过标签]载具号和状态查询
List<AppEtagTask> queryIgnoreNull(AppEtagTask appEtagTask); // 查询数据,忽略Null值的查询条件
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.ToString;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -12,6 +13,7 @@ import java.time.LocalDateTime;
* 电子标签任务类
*/
@Data
@ToString
@TableName("t_app_etag_task")
public class AppEtagTask {

View File

@ -8,6 +8,7 @@ import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.wcs.business.etag.EtagCommon;
import org.wcs.business.etag.EtagDataHandler;
import org.wcs.business.etag.EtagTaskExecute;
import org.wcs.business.redis.EtagRedis;
import org.wcs.constant.enums.common.OnOrOffEnum;
import org.wcs.constant.enums.common.TrueOrFalseEnum;
@ -37,6 +38,8 @@ public class EtagJob implements Job {
private final AppEtagTagInfoService etagTagInfoService; // 电子标签小标信息数据表操作类
private final AppEtagTagLocationService etagTagLocationService; // 电子标签位置信息数据表操作类
private final EtagTaskExecute etagTaskExecute; // 电子标签任务执行类
// 是否正在加载基础数据
private static boolean isLoadingBaseData = false;
@ -49,14 +52,9 @@ public class EtagJob implements Job {
if(EtagCommon.socketClient == null || !isLoadingBaseData) {
return;
}
}
/**
* 点亮小标签
*/
private void lightSmallTag() {
etagTaskExecute.lightSmallTag(); // 点亮小标签
etagTaskExecute.lightTunnelLight(); // 点亮通道灯
etagTaskExecute.lightSummaryTag(); // 点亮汇总标签
}

View File

@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.wcs.constant.ConstantData;
import org.wcs.constant.enums.database.EtagTaskLightModelEnum;
import org.wcs.constant.enums.database.EtagTaskStatusEnum;
import org.wcs.factory.AppServeResponseFactory;
@ -84,9 +85,9 @@ public class EtagTaskService implements IEtagTaskService {
appEtagTask.setGoodsId(request.getGoodsId());
appEtagTask.setGoodsName(request.getGoodsName());
appEtagTask.setLightNum(request.getLightNum());
appEtagTask.setTaskStatus(request.getLightModel().equals(EtagTaskLightModelEnum.IMMEDIATELY.getCode()) ? EtagTaskStatusEnum.ACTIVATED.getCode() : EtagTaskStatusEnum.NOT_ACTIVATED.getCode());
appEtagTask.setTaskStatus(EtagTaskStatusEnum.NOT_ACTIVATED.getCode());
appEtagTask.setLightModel(request.getLightModel());
appEtagTask.setTaskSource("");
appEtagTask.setTaskSource(ConstantData.SYSTEM_NAME);
appEtagTask.setCreatePerson(operationUserId);
appEtagTask.setCreateTime(LocalDateTime.now());
appEtagTask.setRemark(request.getRemark());

View File

@ -1,7 +1,7 @@
wcs:
etag:
area-user-prefix: ^user$
area-user-unbind: $user^
area-user-prefix: ^user$ # 电子标签扫描此字符串码后下一个视为用户码
area-user-unbind: $user^ # 电子标签扫描此字符串码后注销用户
spring:
application:
name: wcs

View File

@ -1,6 +1,7 @@
package org.wcs;
import HslCommunication.Core.Types.ActionOperateExTwo;
import HslCommunication.Core.Types.List;
import HslCommunication.ModBus.ModbusTcpServer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@ -31,4 +32,15 @@ class WcsApplicationTests {
}
}
@Test
void testList() {
List<Integer> list = new List<>();
list.Add(244546456);
list.Add(234234234);
List< Integer> newList = new List<>();
for (Integer i : list) {
newList.Add(i);
}
}
}