修改电子标签读取影响bug

This commit is contained in:
liuhanqing
2025-08-26 17:04:33 +08:00
parent b5aefa72a5
commit bf59094c3e
10 changed files with 208 additions and 187 deletions

View File

@@ -97,7 +97,6 @@ public class ToWcsServiceImpl implements IToWcsService {
MydoJob mydoJobParam = new MydoJob(); MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setInOrOut("1"); mydoJobParam.setInOrOut("1");
mydoJobParam.setStatus("1"); mydoJobParam.setStatus("1");
mydoJobParam.setEntranceId("fluent");
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam); List<MydoJob> mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam);
if (CollUtil.isNotEmpty(mydoJobs)){ if (CollUtil.isNotEmpty(mydoJobs)){
for (MydoJob mydoJob : mydoJobs) { for (MydoJob mydoJob : mydoJobs) {
@@ -108,6 +107,17 @@ public class ToWcsServiceImpl implements IToWcsService {
} }
} }
} }
mydoJobParam.setEntranceId("fluent");
mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam);
if (CollUtil.isNotEmpty(mydoJobs)){
for (MydoJob mydoJob : mydoJobs) {
RequestLog requestLog = requestLogService.getRequestLog(PUSH_IN_MYDO_JOB, JSONUtil.toJsonStr(mydoJob), "推送出库任务");
if ("1".equals(requestLog.getIsSuccessful())){
mydoJob.setStatus("2");
mydoJobService.updateMydoJob(mydoJob);
}
}
}
} }
@Override @Override

View File

@@ -105,7 +105,7 @@ public class ToWmsServiceImpl implements IToWmsService {
return AjaxResult.error(MessageUtils.message("warn.message")); return AjaxResult.error(MessageUtils.message("warn.message"));
} }
MydoJob inMydoJob = inMydoJobs.get(0); MydoJob inMydoJob = inMydoJobs.get(0);
mydoJobService.manualCompleted(inMydoJob); mydoJobService.manualCompleted(inMydoJob,1);
break; break;
case "2": case "2":
if (StrUtil.isEmpty(wmsJobRequest.getPickSsj())){ if (StrUtil.isEmpty(wmsJobRequest.getPickSsj())){
@@ -151,7 +151,7 @@ public class ToWmsServiceImpl implements IToWmsService {
tagTaskService.insertTagTask(tagTask); tagTaskService.insertTagTask(tagTask);
} }
//开启线程 //开启线程
new Thread(new TagOutReadThread(basTag)).start(); //new Thread(new TagOutReadThread(basTag.getIp())).start();
} }
break; break;
case "3": case "3":

View File

@@ -132,6 +132,6 @@ public class InMydoJobController extends BaseController
@PostMapping("/manualCompleted") @PostMapping("/manualCompleted")
public AjaxResult manualCompleted(@RequestBody MydoJob mydoJob) public AjaxResult manualCompleted(@RequestBody MydoJob mydoJob)
{ {
return mydoJobService.manualCompleted(mydoJob); return mydoJobService.manualCompleted(mydoJob,0);
} }
} }

View File

@@ -80,7 +80,7 @@ public interface IMydoJobService
* @param mydoJob * @param mydoJob
* @return * @return
*/ */
AjaxResult manualCompleted(MydoJob mydoJob); AjaxResult manualCompleted(MydoJob mydoJob,int type);
/** /**
* 出库手动完成 * 出库手动完成

View File

@@ -235,15 +235,17 @@ public class MydoJobServiceImpl implements IMydoJobService {
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public AjaxResult manualCompleted(MydoJob mydoJob) { public AjaxResult manualCompleted(MydoJob mydoJob,int type) {
String jobId = mydoJob.getJobId(); String jobId = mydoJob.getJobId();
MydoJob job = selectMydoJobByJobId(jobId); MydoJob job = selectMydoJobByJobId(jobId);
if (job == null) { if (job == null) {
return AjaxResult.warn(MessageUtils.message("warn.message")); return AjaxResult.warn(MessageUtils.message("warn.message"));
} }
AjaxResult ajaxResult = iToWcsService.cancelTaskByTaskNo(job.getTaskNo()); if (type == 0){
if (!ajaxResult.isSuccess()){ AjaxResult ajaxResult = iToWcsService.cancelTaskByTaskNo(job.getTaskNo());
return AjaxResult.error(MessageUtils.message("error.message17")); if (!ajaxResult.isSuccess()){
return AjaxResult.error(MessageUtils.message("error.message17"));
}
} }
BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(job.getWarehouseId()); BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(job.getWarehouseId());
if("2".equals(basWarehouse.getWarehouseType())) { if("2".equals(basWarehouse.getWarehouseType())) {

View File

@@ -2,6 +2,7 @@ package com.ruoyi.out.tagTask.controller;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
@@ -109,12 +110,14 @@ public class TagTaskController extends BaseController
* 传入电子标签信息 * 传入电子标签信息
*/ */
//@Scheduled(fixedDelay = 2000) //@Scheduled(fixedDelay = 2000)
@PostConstruct
public void tagOutManager() throws IOException { public void tagOutManager() throws IOException {
tagTaskService.tagOutManager(); tagTaskService.tagOutManager();
} }
@Scheduled(fixedDelay = 2000) //@Scheduled(fixedDelay = 2000)
@PostConstruct
public void tagInManager(){ public void tagInManager(){
tagTaskService.tagInManager(); tagTaskService.tagInManager();
} }

View File

@@ -11,6 +11,7 @@ import com.ruoyi.out.tagTask.domain.TagTask;
import com.ruoyi.out.tagTask.mapper.TagTaskMapper; import com.ruoyi.out.tagTask.mapper.TagTaskMapper;
import com.ruoyi.out.tagTask.service.ITagTaskService; import com.ruoyi.out.tagTask.service.ITagTaskService;
import com.ruoyi.out.tagTask.thread.TagInReadThread; import com.ruoyi.out.tagTask.thread.TagInReadThread;
import com.ruoyi.out.tagTask.thread.TagOutReadThread;
import com.ruoyi.out.tagTask.util.ElectronicTagClient; import com.ruoyi.out.tagTask.util.ElectronicTagClient;
import com.ruoyi.pda.domain.TrayCodeMsg; import com.ruoyi.pda.domain.TrayCodeMsg;
import com.ruoyi.pda.service.PdaService; import com.ruoyi.pda.service.PdaService;
@@ -18,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.util.HashMap; import java.util.HashMap;
@@ -114,56 +116,23 @@ public class TagTaskServiceImpl implements ITagTaskService {
@Override @Override
public void tagOutManager() throws IOException { public void tagOutManager() throws IOException {
//查询所有的电子标签任务 BasTag param = new BasTag();
TagTask tagTaskParam = new TagTask(); param.setSpare3("1");
//tagTaskParam.setStatus("0"); List<BasTag> basTags = basTagService.selectBasTagList(param);
List<TagTask> allTagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam); Map<String, List<BasTag>> collect = basTags.stream().collect(Collectors.groupingBy(BasTag::getIp));
if (CollUtil.isNotEmpty(allTagTasks)) { for (String ip : collect.keySet()) {
//按标签分组 new Thread(new TagOutReadThread(ip)).start();
Map<Long, List<TagTask>> tagGroup = allTagTasks.stream().collect(Collectors.groupingBy(TagTask::getTagId));
for (Long tagId : tagGroup.keySet()) {
BasTag basTag = basTagService.selectBasTagById(tagId);
List<TagTask> tagTaskList = tagGroup.get(tagId);
if (CollUtil.isNotEmpty(tagTaskList)) {
if (!tagTaskList.stream().allMatch(x -> "2".equals(x.getStatus()))) {
Optional<TagTask> first = tagTaskList.stream().filter(x -> "1".equals(x.getStatus())).findFirst();
if (first.isPresent()) {
TagTask tagTask = first.get();
log.info("正在处理任务:{},id:{}", tagTask.getProductId(), tagTask.getId());
} else {
TagTask tagTask = tagTaskList.get(0);
try {
boolean b = sendMsgDzbq(basTag,tagTask);
log.info("下发电子标签:ip:{},id:{}数量:{}", basTag.getIp(), basTag.getId(), tagTask.getNum());
if (b) {
basTag.setSendCompleted("1");
basTagService.updateBasTag(basTag);
tagTask.setStatus("1");
tagTaskMapper.updateTagTask(tagTask);
log.info("下发电子标签:ip:" + basTag.getIp() + ",id:" + basTag.getId() + "数量:" + basTag.getCurNum());
//开线程一直读取电子标签数据
}
} catch (Exception e) {
log.info(e.getMessage(), e.getMessage());
}
}
}
}
}
} }
} }
@Override @Override
public void tagInManager() { public void tagInManager() {
BasTag param = new BasTag(); BasTag param = new BasTag();
param.setSendCompleted("0");
param.setSpare3("2"); param.setSpare3("2");
List<BasTag> basTags = basTagService.selectBasTagList(param); List<BasTag> basTags = basTagService.selectBasTagList(param);
for (BasTag basTag : basTags) { Map<String, List<BasTag>> collect = basTags.stream().collect(Collectors.groupingBy(BasTag::getIp));
new Thread(new TagInReadThread(basTag.getId())).start(); for (String ip : collect.keySet()) {
new Thread(new TagInReadThread(ip)).start();
} }
} }
@@ -173,12 +142,12 @@ public class TagTaskServiceImpl implements ITagTaskService {
* *
* @param basTag * @param basTag
*/ */
public boolean sendDzbqOff(BasTag basTag) throws IOException { /*public boolean sendDzbqOff(BasTag basTag) throws IOException {
int address = Convert.toInt(basTag.getId()); int address = Convert.toInt(basTag.getId());
Socket socket = ElectronicTagClient.getSocket(basTag.getIp()); Socket socket = ElectronicTagClient.getSocket(basTag.getIp());
int x7 = (address + 0x10 + 0x03 + 0xe8 + 0x03 + 0xe8) % 256;//累加 校验 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"); return ElectronicTagClient.sendHexData( socket,"FA " + String.format("%02x", address) + " 10 00 03 e8 03 e8 " + String.format("%02x", x7) + " AF");
} }*/
/** /**

View File

@@ -21,6 +21,9 @@ import java.io.IOException;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.Socket; import java.net.Socket;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.ruoyi.out.tagTask.util.ElectronicTagClient.getSocket; import static com.ruoyi.out.tagTask.util.ElectronicTagClient.getSocket;
@@ -33,42 +36,61 @@ public class TagInReadThread implements Runnable {
private IBasTagService basTagService; private IBasTagService basTagService;
private PdaService pdaService; private PdaService pdaService;
private ToWcsServiceImpl toWcsService; private ToWcsServiceImpl toWcsService;
private Long tagId; private String ip;
public TagInReadThread(Long tagId) { public TagInReadThread(String ip) {
this.tagTaskMapper = SpringUtils.getBean(TagTaskMapper.class); this.tagTaskMapper = SpringUtils.getBean(TagTaskMapper.class);
this.mydoJobService = SpringUtils.getBean(IMydoJobService.class); this.mydoJobService = SpringUtils.getBean(IMydoJobService.class);
this.tagTaskService = SpringUtils.getBean(ITagTaskService.class); this.tagTaskService = SpringUtils.getBean(ITagTaskService.class);
this.basTagService = SpringUtils.getBean(IBasTagService.class); this.basTagService = SpringUtils.getBean(IBasTagService.class);
this.pdaService = SpringUtils.getBean(PdaService.class); this.pdaService = SpringUtils.getBean(PdaService.class);
this.toWcsService = SpringUtils.getBean(ToWcsServiceImpl.class); this.toWcsService = SpringUtils.getBean(ToWcsServiceImpl.class);
this.tagId = tagId; this.ip = ip;
} }
@Override @Override
public void run() { public void run() {
BasTag basTag = basTagService.selectBasTagById(tagId);
basTag.setSendCompleted("1");
basTagService.updateBasTag(basTag);
while (true) { while (true) {
try (Socket socket = getSocket(basTag.getIp())) { try (Socket socket = getSocket(ip)) {
basTag = basTagService.selectBasTagById(tagId);
if (basTag == null) {
break;
}
switch (basTag.getSpare2()) {
case "0":
String content = ElectronicTagClient.receiveHexData(socket, 0);
if (StrUtil.isNotEmpty(content)) {
//将拍灯指令整理成数组
String[] split = content.split("5A");
for (String s : split) {
if (s.length() == 10) {
String type = s.substring(4, 6);//指令类型 01是下发成功反馈 12是拍灭绿灯指令 BasTag param = new BasTag();
if ("12".equals(type)) { param.setIp(ip);
int address = new BigInteger(s.substring(2, 4), 16).intValue(); param.setSpare3("2");
List<BasTag> tagList = basTagService.selectBasTagList(param);
Map<String, List<BasTag>> collect = tagList.stream().collect(Collectors.groupingBy(BasTag::getSpare2));
if (collect.containsKey("2")) {
List<BasTag> basTags = collect.get("2");
for (BasTag basTag : basTags) {
//亮灯 下发ctu入库任务
boolean b = ElectronicTagClient.sendMsgDzbq(socket, Convert.toInt(basTag.getId()), 1, 0);
if (b) {
basTag.setSpare2("0");
basTagService.updateBasTag(basTag);
log.info("亮灯提示空料箱任务已完成,下发电子标签:ip:{},id:{}", basTag.getIp(), basTag.getId());
}
}
}
tagList = basTagService.selectBasTagList(param);
collect = tagList.stream().collect(Collectors.groupingBy(BasTag::getSpare2));
if (collect.containsKey("0")) {
List<BasTag> basTags = collect.get("0");
String content = ElectronicTagClient.receiveHexData(socket);
if (StrUtil.isNotEmpty(content)) {
//将拍灯指令整理成数组
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)) {
int address = new BigInteger(s.substring(2, 4), 16).intValue();
log.info("90收到指令:{}", address);
Optional<BasTag> first = basTags.stream().filter(x -> x.getId().intValue() == address).findFirst();
if (first.isPresent()){
BasTag basTag = first.get();
if (address == basTag.getId()) { if (address == basTag.getId()) {
//12为 绿色拍灯指令 //12为 绿色拍灯指令
MydoJob mydoJobParam = new MydoJob(); MydoJob mydoJobParam = new MydoJob();
@@ -76,7 +98,7 @@ public class TagInReadThread implements Runnable {
mydoJobParam.setExitId("fluent"); mydoJobParam.setExitId("fluent");
mydoJobParam.setStatus("1"); mydoJobParam.setStatus("1");
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam); List<MydoJob> mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam);
if (CollUtil.isEmpty(mydoJobs)){ if (CollUtil.isEmpty(mydoJobs)) {
//生成agv空料箱入库作业 //生成agv空料箱入库作业
TrayCodeMsg trayCodeMsg = new TrayCodeMsg(); TrayCodeMsg trayCodeMsg = new TrayCodeMsg();
trayCodeMsg.setTrayCode(IdUtil.fastSimpleUUID()); trayCodeMsg.setTrayCode(IdUtil.fastSimpleUUID());
@@ -84,7 +106,7 @@ public class TagInReadThread implements Runnable {
trayCodeMsg.setEntranceId(basTag.getPickAdd()); trayCodeMsg.setEntranceId(basTag.getPickAdd());
pdaService.emptyBoxIn(trayCodeMsg); pdaService.emptyBoxIn(trayCodeMsg);
toWcsService.pushInMydoJob(); toWcsService.pushInMydoJob();
}else { } else {
MydoJob mydoJob = mydoJobs.get(0); MydoJob mydoJob = mydoJobs.get(0);
mydoJob.setEntranceId(basTag.getPickAdd()); mydoJob.setEntranceId(basTag.getPickAdd());
mydoJobService.updateMydoJob(mydoJob); mydoJobService.updateMydoJob(mydoJob);
@@ -98,34 +120,21 @@ public class TagInReadThread implements Runnable {
log.info("灭灯提示空料箱任务已下发"); log.info("灭灯提示空料箱任务已下发");
} }
} }
} }
//BasTag currentBasTag = basTags.stream().filter(x -> x.getId().intValue() == address).findFirst().get();
} }
} }
} }
break; }
case "1":
//ctu 取货阶段
Thread.sleep(2000);
break;
case "2":
//亮灯 下发ctu入库任务
boolean b = ElectronicTagClient.sendMsgDzbq(socket, Convert.toInt(basTag.getId()), 1, 0);
if (b) {
basTag.setSpare2("0");
basTagService.updateBasTag(basTag);
log.info("亮灯提示空料箱任务已完成,下发电子标签:ip:{},id:{}", basTag.getIp(), basTag.getId());
}
break;
} }
} catch (IOException e) {
} catch (IOException | InterruptedException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
} }
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.out.tagTask.thread; package com.ruoyi.out.tagTask.thread;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.bas.tag.domain.BasTag; import com.ruoyi.bas.tag.domain.BasTag;
import com.ruoyi.bas.tag.service.IBasTagService; import com.ruoyi.bas.tag.service.IBasTagService;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
@@ -16,7 +17,9 @@ import java.io.IOException;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.Socket; import java.net.Socket;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import static com.ruoyi.out.tagTask.util.ElectronicTagClient.*; import static com.ruoyi.out.tagTask.util.ElectronicTagClient.*;
@@ -26,98 +29,116 @@ public class TagOutReadThread implements Runnable {
private TagTaskMapper tagTaskMapper; private TagTaskMapper tagTaskMapper;
private IBasTagService basTagService; private IBasTagService basTagService;
private PdaService pdaService; private PdaService pdaService;
private BasTag basTag; private String ip;
public TagOutReadThread(BasTag bastag) { public TagOutReadThread(String ip) {
this.tagTaskMapper = SpringUtils.getBean(TagTaskMapper.class); this.tagTaskMapper = SpringUtils.getBean(TagTaskMapper.class);
this.basTagService = SpringUtils.getBean(IBasTagService.class); this.basTagService = SpringUtils.getBean(IBasTagService.class);
this.pdaService = SpringUtils.getBean(PdaService.class); this.pdaService = SpringUtils.getBean(PdaService.class);
this.basTag = bastag; this.ip = ip;
} }
@Override @Override
public void run() { public void run() {
//查询所有下发的任务
TagTask tagTaskParam = new TagTask();
tagTaskParam.setTagId(basTag.getId());
List<TagTask> allTagTasks = null;
try (Socket socket = getSocket(basTag.getIp())) {
while (true) { while (true) {
//查询所有下发的任务
TagTask tagTaskParam = new TagTask();
List<TagTask> tagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam);
if (CollUtil.isEmpty(tagTasks)){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
continue;
}
Map<Long, List<TagTask>> collect = tagTasks.stream().collect(Collectors.groupingBy(TagTask::getTagId));
try (Socket socket = getSocket(ip)) {
allTagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam); //下发标签
if (allTagTasks.stream().allMatch(x -> "2".equals(x.getStatus()))) { for (Long tagId : collect.keySet()) {
//全部拣选完成 灭灯逻辑 List<TagTask> allTagTasks = collect.get(tagId);
//灭灯 Optional<TagTask> first = allTagTasks.stream().filter(x -> "0".equals(x.getStatus())).findFirst();
boolean b = sendDzbqOff(socket, Convert.toInt(basTag.getId())); if (first.isPresent()) {
if (b) { TagTask tagTask = first.get();
//出库确认 BasTag basTag = basTagService.selectBasTagById(tagId);
TrayCodeMakeSure trayCodeMakeSure = new TrayCodeMakeSure(); boolean b = sendMsgDzbq(socket, Convert.toInt(basTag.getId()), Convert.toInt(tagTask.getNum()), Convert.toInt(tagTask.getNum()));
trayCodeMakeSure.setTrayCode(basTag.getTrayCode()); if (b) {
AjaxResult ajaxResult = pdaService.outMakeSure(trayCodeMakeSure); basTag.setSendCompleted("1");
if (ajaxResult.isSuccess()) { basTag.setCurNum(tagTask.getNum());
//删除标签绑定信息
basTag.setSendCompleted("0");
basTag.setTrayCode("");
basTagService.updateBasTag(basTag); basTagService.updateBasTag(basTag);
//删除tagList tagTask.setStatus("1");
tagTaskMapper.deleteTagTaskByIds(allTagTasks.stream().map(TagTask::getId).toArray(Long[]::new)); tagTaskMapper.updateTagTask(tagTask);
log.info("下发电子标签灭灯:ip:{},id:{}", basTag.getIp(), basTag.getId()); log.info("下发电子标签:ip:{},id:{}数量:{}", basTag.getIp(), basTag.getId(), tagTask.getNum());
break;
} }
} }
} else {
if (allTagTasks.stream().anyMatch(x -> "1".equals(x.getStatus()))) {
Optional<TagTask> first = allTagTasks.stream().filter(x -> "1".equals(x.getStatus())).findFirst();
if (first.isPresent()) {
TagTask tagTask = first.get();
/* 接收电子标签指令 */
String content = ElectronicTagClient.receiveHexData(socket, 0);//读取值
if (!content.isEmpty()) {
log.info("读取电子标签值:{}", content);
}
//将拍灯指令整理成数组
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("更新任务状态:{},id:{}", tagTask.getProductId(), tagTask.getId());
}
}
}
}
}
} else {
Optional<TagTask> first = allTagTasks.stream().filter(x -> "0".equals(x.getStatus())).findFirst();
if (first.isPresent()) {
TagTask tagTask = first.get();
boolean b = sendMsgDzbq(socket, Convert.toInt(basTag.getId()), Convert.toInt(tagTask.getNum()), Convert.toInt(tagTask.getNum()));
if (b) {
basTag.setSendCompleted("1");
basTag.setCurNum(tagTask.getNum());
basTagService.updateBasTag(basTag);
tagTask.setStatus("1");
tagTaskMapper.updateTagTask(tagTask);
log.info("下发电子标签:ip:{},id:{}数量:{}", basTag.getIp(), basTag.getId(), tagTask.getNum());
}
}
}
} }
tagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam);
collect = tagTasks.stream().collect(Collectors.groupingBy(TagTask::getTagId));
for (Long tagId : collect.keySet()) {
List<TagTask> allTagTasks = collect.get(tagId);
if (allTagTasks.stream().allMatch(x -> "2".equals(x.getStatus()))) {
//全部拣选完成 灭灯逻辑
//灭灯
BasTag basTag = basTagService.selectBasTagById(tagId);
boolean b = sendDzbqOff(socket, Convert.toInt(basTag.getId()));
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(allTagTasks.stream().map(TagTask::getId).toArray(Long[]::new));
log.info("下发电子标签灭灯:ip:{},id:{}", basTag.getIp(), basTag.getId());
}
}
}
}
tagTaskParam.setStatus("1");
tagTasks = tagTaskMapper.selectTagTaskList(tagTaskParam);
if (CollUtil.isNotEmpty(tagTasks)) {
/* 接收电子标签指令 */
String content = ElectronicTagClient.receiveHexData(socket);//读取值
//将拍灯指令整理成数组
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();
log.info("119收到指令:{}", address);
Optional<TagTask> first = tagTasks.stream().filter(x -> address == x.getTagId()).findFirst();
if(first.isPresent()){
TagTask tagTask = first.get();
BasTag basTag = basTagService.selectBasTagById(tagTask.getTagId());
if (address == basTag.getId()) {
//更新当前子任务状态
tagTask.setStatus("2");
tagTaskMapper.updateTagTask(tagTask);
log.info("更新任务状态:{},id:{}", tagTask.getProductId(), tagTask.getId());
}
}
}
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
} catch (IOException e) {
throw new RuntimeException(e);
}
} }

View File

@@ -71,24 +71,30 @@ public class ElectronicTagClient {
* @return 接收到的16进制字符串 * @return 接收到的16进制字符串
* @throws IOException 如果发生I/O错误或超时 * @throws IOException 如果发生I/O错误或超时
*/ */
public static String receiveHexData(Socket socket, int timeoutMillis) throws IOException { public static String receiveHexData(Socket socket){
InputStream input = socket.getInputStream(); try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); InputStream input = socket.getInputStream();
byte[] temp = new byte[1024]; ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int bytesRead; byte[] temp = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(temp)) != -1) { while ((bytesRead = input.read(temp)) != -1) {
buffer.write(temp, 0, bytesRead); buffer.write(temp, 0, bytesRead);
if (input.available() == 0) { if (input.available() == 0) {
break; // 没有更多数据可读 break; // 没有更多数据可读
}
} }
}
byte[] responseBytes = buffer.toByteArray(); byte[] responseBytes = buffer.toByteArray();
if (responseBytes.length == 0) { if (responseBytes.length == 0) {
return "无响应数据"; return "无响应数据";
}
return byteArrayToHexString(responseBytes);
}catch (IOException e){
log.error("e: {}", e.getMessage());
} }
return byteArrayToHexString(responseBytes); return "";
} }
// 16进制字符串转字节数组 // 16进制字符串转字节数组
@@ -147,6 +153,7 @@ public class ElectronicTagClient {
try { try {
String[] split = ip.split(":"); String[] split = ip.split(":");
Socket socket = new Socket(split[0], Convert.toInt(split[1])); Socket socket = new Socket(split[0], Convert.toInt(split[1]));
socket.setSoTimeout(3000);
log.info("成功连接到电子标签服务器: " + split[0] + ":" + split[1]); log.info("成功连接到电子标签服务器: " + split[0] + ":" + split[1]);
return socket; return socket;
} catch (Exception e) { } catch (Exception e) {