From b8a7699aed5e56635256e2350d1af8636c4df77a Mon Sep 17 00:00:00 2001 From: liuhanqing Date: Fri, 1 Aug 2025 17:53:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B5=E5=AD=90=E6=A0=87=E7=AD=BE=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/service/impl/ToWmsServiceImpl.java | 16 ++- .../service/impl/TagTaskServiceImpl.java | 69 +--------- .../out/tagTask/thread/TagReadThread.java | 126 ++++++++++++++++++ .../out/tagTask/util/ElectronicTagClient.java | 2 +- ruoyi-ui/src/views/index.vue | 2 +- 5 files changed, 141 insertions(+), 74 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/thread/TagReadThread.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java index 7050165..9e92a53 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/ToWmsServiceImpl.java @@ -102,14 +102,16 @@ public class ToWmsServiceImpl implements IToWmsService { if(mydoJobs.isEmpty()){ return AjaxResult.warn(MessageUtils.message("warn.message")); } - MydoJob mydoJob = mydoJobs.get(0); - if ("1".equals(mydoJob.getExecutionPhase())){ - mydoJob.setExecutionPhase("2"); - mydoJob.setTrayCode(param.getTrayCode()); - mydoJob.setStatus("2"); - mydoJobService.updateMydoJob(mydoJob); + + for (MydoJob mydoJob : mydoJobs) { + if ("1".equals(mydoJob.getExecutionPhase())){ + mydoJob.setExecutionPhase("2"); + mydoJob.setTrayCode(param.getTrayCode()); + mydoJob.setStatus("2"); + mydoJobService.updateMydoJob(mydoJob); + } } - return AjaxResult.success(mydoJob); + return AjaxResult.success(mydoJobs); } @Override diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/service/impl/TagTaskServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/service/impl/TagTaskServiceImpl.java index 47fbfd2..bf196c7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/service/impl/TagTaskServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/service/impl/TagTaskServiceImpl.java @@ -17,6 +17,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; import com.ruoyi.job.mydojob.domain.MydoJob; import com.ruoyi.job.mydojob.service.IMydoJobService; +import com.ruoyi.out.tagTask.thread.TagReadThread; import com.ruoyi.out.tagTask.util.ElectronicTagClient; import com.ruoyi.pda.domain.TrayCodeMakeSure; import com.ruoyi.pda.domain.TrayCodeMsg; @@ -130,26 +131,7 @@ public class TagTaskServiceImpl implements ITagTaskService { List tagTaskList = tagGroup.get(tagId); if (CollUtil.isNotEmpty(tagTaskList)) { - if (tagTaskList.stream().allMatch(x -> "2".equals(x.getStatus()))) { - //全部拣选完成 灭灯逻辑 - //灭灯 - boolean b = sendDzbqOff(basTag); - log.info("灭灯:{}", b); - if (b) { - //出库确认 - TrayCodeMakeSure trayCodeMakeSure = new TrayCodeMakeSure(); - trayCodeMakeSure.setTrayCode(basTag.getTrayCode()); - AjaxResult ajaxResult = pdaService.outMakeSure(trayCodeMakeSure); - if (ajaxResult.isSuccess()){ - //删除标签绑定信息 - basTag.setSendCompleted("0"); - basTag.setTrayCode(""); - basTagService.updateBasTag(basTag); - //删除tagList - tagTaskMapper.deleteTagTaskByIds(tagTaskList.stream().map(TagTask::getId).toArray(Long[]::new)); - } - } - } else { + if (!tagTaskList.stream().allMatch(x -> "2".equals(x.getStatus()))) { Optional first = tagTaskList.stream().filter(x -> "1".equals(x.getStatus())).findFirst(); if (first.isPresent()) { TagTask tagTask = first.get(); @@ -165,8 +147,8 @@ public class TagTaskServiceImpl implements ITagTaskService { tagTask.setStatus("1"); tagTaskMapper.updateTagTask(tagTask); log.info("下发电子标签:ip:" + basTag.getIp() + ",id:" + basTag.getId() + "数量:" + basTag.getCurNum()); - } else { - sendMsgDzbq(basTag,tagTask); + //开线程一直读取电子标签数据 + new Thread(new TagReadThread(tagTaskMapper,basTagService,pdaService)).start(); } } catch (Exception e) { log.info(e.getMessage(), e.getMessage()); @@ -177,49 +159,6 @@ public class TagTaskServiceImpl implements ITagTaskService { } } - - //查询所有下发的任务 - tagTaskParam = new TagTask(); - tagTaskParam.setStatus("1"); - allTagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam); - if (CollUtil.isNotEmpty(allTagTasks)) { - Map> tagGroup = allTagTasks.stream().collect(Collectors.groupingBy(TagTask::getTagId)); - for (Long tagId : tagGroup.keySet()) { - BasTag basTag = basTagService.selectBasTagById(tagId); - Socket socket = getSocket(basTag); - try { - /** 接收电子标签指令 */ - String content = ElectronicTagClient.receiveHexData(socket,3000);//读取值 - if (!content.isEmpty()) { - log.info("读取电子标签值:" + content); - } - for (TagTask tagTask : tagGroup.get(tagId)) { - //将拍灯指令整理成数组 - String[] split = content.split("5A"); - for (String s : split) { - if (s.length() == 10) { - String type = s.substring(4, 6);//指令类型 01是下发成功反馈 12是拍灭绿灯指令 - if ("12".equals(type)) { - //12为 绿色拍灯指令 - int address = new BigInteger(s.substring(2, 4), 16).intValue(); - if (address == basTag.getId()) { - //更新当前子任务状态 - tagTask.setStatus("2"); - tagTaskMapper.updateTagTask(tagTask); - log.info("更新任务状态:" + tagTask.getProductId() + ",id:" + tagTask.getId()); - } - } - } - } - } - } catch (Exception e) { - log.error(e.getMessage(), e); - } - - } - } - - } @Override diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/thread/TagReadThread.java b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/thread/TagReadThread.java new file mode 100644 index 0000000..aa81127 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/thread/TagReadThread.java @@ -0,0 +1,126 @@ +package com.ruoyi.out.tagTask.thread; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.bas.tag.domain.BasTag; +import com.ruoyi.bas.tag.service.IBasTagService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.out.tagTask.domain.TagTask; +import com.ruoyi.out.tagTask.mapper.TagTaskMapper; +import com.ruoyi.out.tagTask.util.ElectronicTagClient; +import com.ruoyi.pda.domain.TrayCodeMakeSure; +import com.ruoyi.pda.service.PdaService; + +import java.io.IOException; +import java.math.BigInteger; +import java.net.Socket; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class TagReadThread implements Runnable{ + + private TagTaskMapper tagTaskMapper; + private IBasTagService basTagService; + private PdaService pdaService; + + public TagReadThread(TagTaskMapper tagTaskMapper, IBasTagService basTagService,PdaService pdaService) { + this.tagTaskMapper = tagTaskMapper; + this.basTagService = basTagService; + this.pdaService = pdaService; + } + + @Override + public void run() { + //查询所有下发的任务 + TagTask tagTaskParam = new TagTask(); + tagTaskParam.setStatus("1"); + List allTagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam); + if (CollUtil.isNotEmpty(allTagTasks)) { + Map> tagGroup = allTagTasks.stream().collect(Collectors.groupingBy(TagTask::getTagId)); + for (Long tagId : tagGroup.keySet()) { + BasTag basTag = basTagService.selectBasTagById(tagId); + try (Socket socket = getSocket(basTag)){ + /** 接收电子标签指令 */ + String content = ElectronicTagClient.receiveHexData(socket,0);//读取值 + if (!content.isEmpty()) { + System.out.println("读取电子标签值:" + content); + } + for (TagTask tagTask : tagGroup.get(tagId)) { + //将拍灯指令整理成数组 + String[] split = content.split("5A"); + for (String s : split) { + if (s.length() == 10) { + String type = s.substring(4, 6);//指令类型 01是下发成功反馈 12是拍灭绿灯指令 + if ("12".equals(type)) { + //12为 绿色拍灯指令 + int address = new BigInteger(s.substring(2, 4), 16).intValue(); + if (address == basTag.getId()) { + //更新当前子任务状态 + tagTask.setStatus("2"); + tagTaskMapper.updateTagTask(tagTask); + System.out.println("更新任务状态:" + tagTask.getProductId() + ",id:" + tagTask.getId()); + TagTask param = new TagTask(); + param.setTagId(tagId); + List tagTasks = tagTaskMapper.selectTagTaskList(param); + if (CollUtil.isNotEmpty(tagTasks)){ + if (tagTasks.stream().allMatch(x-> "2".equals(x.getStatus()))){ + //全部拣选完成 灭灯逻辑 + //灭灯 + boolean b = sendDzbqOff(basTag); + if (b) { + //出库确认 + TrayCodeMakeSure trayCodeMakeSure = new TrayCodeMakeSure(); + trayCodeMakeSure.setTrayCode(basTag.getTrayCode()); + AjaxResult ajaxResult = pdaService.outMakeSure(trayCodeMakeSure); + if (ajaxResult.isSuccess()){ + //删除标签绑定信息 + basTag.setSendCompleted("0"); + basTag.setTrayCode(""); + basTagService.updateBasTag(basTag); + //删除tagList + tagTaskMapper.deleteTagTaskByIds(tagTasks.stream().map(TagTask::getId).toArray(Long[]::new)); + } + } + } + + } + } + } + } + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + + /** + * 获取socket + * + * @param basTag + * @return + */ + private Socket getSocket(BasTag basTag) { + try { + return new Socket(basTag.getIp(), 20108); + }catch (Exception e){ + System.out.println(e.getMessage()); + } + return null; + } + + /** + * 灭灯 + * + * @param basTag + */ + public boolean sendDzbqOff(BasTag basTag) throws IOException { + int address = Convert.toInt(basTag.getId()); + Socket socket = getSocket(basTag); + int x7 = (address + 0x10 + 0x03 + 0xe8 + 0x03 + 0xe8) % 256;//累加 校验 + return ElectronicTagClient.sendHexData( socket,"FA " + String.format("%02x", address) + " 10 00 03 e8 03 e8 " + String.format("%02x", x7) + " AF"); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/util/ElectronicTagClient.java b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/util/ElectronicTagClient.java index 7d1e82d..8324bc9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/util/ElectronicTagClient.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/tagTask/util/ElectronicTagClient.java @@ -62,7 +62,7 @@ public class ElectronicTagClient { * @throws IOException 如果发生I/O错误或超时 */ public static String receiveHexData(Socket socket, int timeoutMillis) throws IOException { - socket.setSoTimeout(timeoutMillis); + //socket.setSoTimeout(timeoutMillis); InputStream input = socket.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index fad5c0c..7f5a289 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -163,7 +163,7 @@ export default { this.getListData() this.timer = setInterval(() => { this.getListData() - }, 5000) + }, 30000) }, beforeDestroy() { if (this.timer) {