diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java index 689066e..62df8d2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; /** * @Description: 读写器 @@ -28,12 +29,36 @@ private IBusinessReadWriterService readWriterService; /** + * 大读写器 + * TCP连接 * 读取读写器获取标签信息、业务信息(新建委托书和待收入中使用,新建委托书中增加通过读写器获取样品按钮) */ @ApiOperation("获取读写器识别的样品列表") - @GetMapping("/readList") - public ReturnDTO> readList() { - return readWriterService.readList(); + @GetMapping("/sample/readList") + public ReturnDTO> sampleReadList() { + return readWriterService.sampleReadList(); + } + + /** + * 大读写器 + * TCP连接 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取大读写器识别的标签TID列表") + @GetMapping("/tId/readList") + public ReturnDTO> tIdReadList() { + return readWriterService.tIdReadList(); + } + + /** + * 小读写器 + * USB-HID连接 + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取小读写器识别的标签TID列表") + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); } } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java index 689066e..62df8d2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; /** * @Description: 读写器 @@ -28,12 +29,36 @@ private IBusinessReadWriterService readWriterService; /** + * 大读写器 + * TCP连接 * 读取读写器获取标签信息、业务信息(新建委托书和待收入中使用,新建委托书中增加通过读写器获取样品按钮) */ @ApiOperation("获取读写器识别的样品列表") - @GetMapping("/readList") - public ReturnDTO> readList() { - return readWriterService.readList(); + @GetMapping("/sample/readList") + public ReturnDTO> sampleReadList() { + return readWriterService.sampleReadList(); + } + + /** + * 大读写器 + * TCP连接 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取大读写器识别的标签TID列表") + @GetMapping("/tId/readList") + public ReturnDTO> tIdReadList() { + return readWriterService.tIdReadList(); + } + + /** + * 小读写器 + * USB-HID连接 + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取小读写器识别的标签TID列表") + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 6f8704b..5712052 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -62,7 +62,8 @@ CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), - READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"); + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"); private Integer code; private String message; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java index 689066e..62df8d2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; /** * @Description: 读写器 @@ -28,12 +29,36 @@ private IBusinessReadWriterService readWriterService; /** + * 大读写器 + * TCP连接 * 读取读写器获取标签信息、业务信息(新建委托书和待收入中使用,新建委托书中增加通过读写器获取样品按钮) */ @ApiOperation("获取读写器识别的样品列表") - @GetMapping("/readList") - public ReturnDTO> readList() { - return readWriterService.readList(); + @GetMapping("/sample/readList") + public ReturnDTO> sampleReadList() { + return readWriterService.sampleReadList(); + } + + /** + * 大读写器 + * TCP连接 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取大读写器识别的标签TID列表") + @GetMapping("/tId/readList") + public ReturnDTO> tIdReadList() { + return readWriterService.tIdReadList(); + } + + /** + * 小读写器 + * USB-HID连接 + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取小读写器识别的标签TID列表") + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 6f8704b..5712052 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -62,7 +62,8 @@ CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), - READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"); + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"); private Integer code; private String message; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java index fedffda..f93a5f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java @@ -14,9 +14,12 @@ import com.gg.reader.api.dal.HandlerTagEpcLog; import com.gg.reader.api.dal.HandlerTagEpcOver; import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.HashSet; import java.util.List; @@ -35,48 +38,19 @@ private CustomerSampleMapper sampleMapper; @Override - public ReturnDTO> readList() { + public ReturnDTO> sampleReadList() { GClient client = new GClient(); try { + // TODO: 2023/3/21 实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 //if (client.openSerial("COM11:115200", 2000)) if (!client.openTcp("192.168.1.168:8160", 0)) { throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); } - Set tids = new HashSet<>(); - //标签上报事件、结束事件订阅 - eventSubscribe(tids, client); + Set tIds = receiveTIds(client); - // 4个天线读卡, 读取EPC数据区以及TID数据区 - MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); - msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); - // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 - // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 - msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); - ParamEpcReadTid tid = new ParamEpcReadTid(); - tid.setMode(EnumG.ParamTidMode_Auto); - tid.setLen(6); - msgBaseInventoryEpc.setReadTid(tid); - client.sendSynMsg(msgBaseInventoryEpc); - if (0 == msgBaseInventoryEpc.getRtCode()) { - log.info("EPC、TID标签读取成功"); - } else { - log.info("EPC、TID标签读取失败"); - client.close(); - throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); - } - //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) - TimeUnit.SECONDS.sleep(3); - // 停止指令,空闲态 - MsgBaseStop msgBaseStop = new MsgBaseStop(); - client.sendSynMsg(msgBaseStop); - if (0 == msgBaseStop.getRtCode()) { - log.info("EPC、TID标签停止读取成功"); - } else { - log.info("EPC、TID标签停止读取失败"); - } //查询标签样品信息 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.in("label_bind", tids); + wrapper.in("label_bind", tIds); wrapper.eq("is_del", 0); List customerSampleInfos = sampleMapper.selectList(wrapper); List resultList = ConvertUtils.sourceToTarget(customerSampleInfos, ReadSampleDTO.class); @@ -89,6 +63,86 @@ } } + @Override + public ReturnDTO> tIdReadList() { + GClient client = new GClient(); + try { + //if (client.openSerial("COM11:115200", 2000)) + if (!client.openTcp("192.168.1.168:8160", 0)) { + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + return ReturnUtil.success(receiveTIds(client)); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if(CollectionUtils.isEmpty(attachedHidDevices)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if(CollectionUtils.isEmpty(tIds)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + private void eventSubscribe(Set set, GClient client) { // 订阅标签上报事件 client.onTagEpcLog = new HandlerTagEpcLog() { @@ -98,6 +152,7 @@ // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); set.add(logBaseEpcInfo.getTid()); } } @@ -107,7 +162,7 @@ @Override public void log(String readName, LogBaseEpcOver logBaseEpcOver) { if (null != logBaseEpcOver) { - System.out.println("Epc log over."); + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); } } }; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java index 689066e..62df8d2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; /** * @Description: 读写器 @@ -28,12 +29,36 @@ private IBusinessReadWriterService readWriterService; /** + * 大读写器 + * TCP连接 * 读取读写器获取标签信息、业务信息(新建委托书和待收入中使用,新建委托书中增加通过读写器获取样品按钮) */ @ApiOperation("获取读写器识别的样品列表") - @GetMapping("/readList") - public ReturnDTO> readList() { - return readWriterService.readList(); + @GetMapping("/sample/readList") + public ReturnDTO> sampleReadList() { + return readWriterService.sampleReadList(); + } + + /** + * 大读写器 + * TCP连接 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取大读写器识别的标签TID列表") + @GetMapping("/tId/readList") + public ReturnDTO> tIdReadList() { + return readWriterService.tIdReadList(); + } + + /** + * 小读写器 + * USB-HID连接 + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取小读写器识别的标签TID列表") + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 6f8704b..5712052 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -62,7 +62,8 @@ CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), - READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"); + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"); private Integer code; private String message; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java index fedffda..f93a5f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java @@ -14,9 +14,12 @@ import com.gg.reader.api.dal.HandlerTagEpcLog; import com.gg.reader.api.dal.HandlerTagEpcOver; import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.HashSet; import java.util.List; @@ -35,48 +38,19 @@ private CustomerSampleMapper sampleMapper; @Override - public ReturnDTO> readList() { + public ReturnDTO> sampleReadList() { GClient client = new GClient(); try { + // TODO: 2023/3/21 实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 //if (client.openSerial("COM11:115200", 2000)) if (!client.openTcp("192.168.1.168:8160", 0)) { throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); } - Set tids = new HashSet<>(); - //标签上报事件、结束事件订阅 - eventSubscribe(tids, client); + Set tIds = receiveTIds(client); - // 4个天线读卡, 读取EPC数据区以及TID数据区 - MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); - msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); - // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 - // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 - msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); - ParamEpcReadTid tid = new ParamEpcReadTid(); - tid.setMode(EnumG.ParamTidMode_Auto); - tid.setLen(6); - msgBaseInventoryEpc.setReadTid(tid); - client.sendSynMsg(msgBaseInventoryEpc); - if (0 == msgBaseInventoryEpc.getRtCode()) { - log.info("EPC、TID标签读取成功"); - } else { - log.info("EPC、TID标签读取失败"); - client.close(); - throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); - } - //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) - TimeUnit.SECONDS.sleep(3); - // 停止指令,空闲态 - MsgBaseStop msgBaseStop = new MsgBaseStop(); - client.sendSynMsg(msgBaseStop); - if (0 == msgBaseStop.getRtCode()) { - log.info("EPC、TID标签停止读取成功"); - } else { - log.info("EPC、TID标签停止读取失败"); - } //查询标签样品信息 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.in("label_bind", tids); + wrapper.in("label_bind", tIds); wrapper.eq("is_del", 0); List customerSampleInfos = sampleMapper.selectList(wrapper); List resultList = ConvertUtils.sourceToTarget(customerSampleInfos, ReadSampleDTO.class); @@ -89,6 +63,86 @@ } } + @Override + public ReturnDTO> tIdReadList() { + GClient client = new GClient(); + try { + //if (client.openSerial("COM11:115200", 2000)) + if (!client.openTcp("192.168.1.168:8160", 0)) { + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + return ReturnUtil.success(receiveTIds(client)); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if(CollectionUtils.isEmpty(attachedHidDevices)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if(CollectionUtils.isEmpty(tIds)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + private void eventSubscribe(Set set, GClient client) { // 订阅标签上报事件 client.onTagEpcLog = new HandlerTagEpcLog() { @@ -98,6 +152,7 @@ // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); set.add(logBaseEpcInfo.getTid()); } } @@ -107,7 +162,7 @@ @Override public void log(String readName, LogBaseEpcOver logBaseEpcOver) { if (null != logBaseEpcOver) { - System.out.println("Epc log over."); + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); } } }; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java index 9deaa4b..ee830e4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java @@ -4,6 +4,7 @@ import com.casic.missiles.dto.business.dispatch.ReadSampleDTO; import java.util.List; +import java.util.Set; /** * @Description: @@ -12,5 +13,9 @@ */ public interface IBusinessReadWriterService { - ReturnDTO> readList(); + ReturnDTO> sampleReadList(); + + ReturnDTO> tIdReadList(); + + ReturnDTO> tIdMiniReadList(); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 56621d9..a8f054a 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -136,7 +136,7 @@ @ApiOperation("实验室检测-部门检测-分配按钮(分配给具体人员)") @PostMapping("/deptExecutive/allocate") @ResponseBody - public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) throws Exception { + public ReturnDTO allocateStaff(@RequestBody @Valid SampleAllocateRequest sampleAllocateRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java index 689066e..62df8d2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessReadWriterController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; /** * @Description: 读写器 @@ -28,12 +29,36 @@ private IBusinessReadWriterService readWriterService; /** + * 大读写器 + * TCP连接 * 读取读写器获取标签信息、业务信息(新建委托书和待收入中使用,新建委托书中增加通过读写器获取样品按钮) */ @ApiOperation("获取读写器识别的样品列表") - @GetMapping("/readList") - public ReturnDTO> readList() { - return readWriterService.readList(); + @GetMapping("/sample/readList") + public ReturnDTO> sampleReadList() { + return readWriterService.sampleReadList(); + } + + /** + * 大读写器 + * TCP连接 + * 读取读写器获取标签TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取大读写器识别的标签TID列表") + @GetMapping("/tId/readList") + public ReturnDTO> tIdReadList() { + return readWriterService.tIdReadList(); + } + + /** + * 小读写器 + * USB-HID连接 + * 读取读写器获取TID列表,用于标签绑定,前端从结果中选取一个标签传入标签绑定接口 + */ + @ApiOperation("获取小读写器识别的标签TID列表") + @GetMapping("/tId/mini/readList") + public ReturnDTO> tIdMiniReadList() { + return readWriterService.tIdMiniReadList(); } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 6f8704b..5712052 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -62,7 +62,8 @@ CERTIFICATE_REPORT_SUBMIT_FAILED(3401, "证书报告提交处理失败"), FAIL_READ_EPC_TID(2416, "标签信息读取失败,请重新操作"), - READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"); + READ_WRITER_NOT_CONNECTED(2417, "标签信息读取失败,请连接读写器"), + READ_WRITER_NOT_CONNECTED_OR_NO_TID(2418, "连接读写器失败或无可识别标签"); private Integer code; private String message; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java index fedffda..f93a5f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessReadWriterServiceImpl.java @@ -14,9 +14,12 @@ import com.gg.reader.api.dal.HandlerTagEpcLog; import com.gg.reader.api.dal.HandlerTagEpcOver; import com.gg.reader.api.protocol.gx.*; +import com.gg.reader.api.utils.UsbHidUtils; import lombok.extern.slf4j.Slf4j; +import org.hid4java.HidDevice; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.HashSet; import java.util.List; @@ -35,48 +38,19 @@ private CustomerSampleMapper sampleMapper; @Override - public ReturnDTO> readList() { + public ReturnDTO> sampleReadList() { GClient client = new GClient(); try { + // TODO: 2023/3/21 实际场景若有多个读写器连接需要设计读取实现方案,将ip入库或配置文件 //if (client.openSerial("COM11:115200", 2000)) if (!client.openTcp("192.168.1.168:8160", 0)) { throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); } - Set tids = new HashSet<>(); - //标签上报事件、结束事件订阅 - eventSubscribe(tids, client); + Set tIds = receiveTIds(client); - // 4个天线读卡, 读取EPC数据区以及TID数据区 - MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); - msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); - // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 - // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 - msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); - ParamEpcReadTid tid = new ParamEpcReadTid(); - tid.setMode(EnumG.ParamTidMode_Auto); - tid.setLen(6); - msgBaseInventoryEpc.setReadTid(tid); - client.sendSynMsg(msgBaseInventoryEpc); - if (0 == msgBaseInventoryEpc.getRtCode()) { - log.info("EPC、TID标签读取成功"); - } else { - log.info("EPC、TID标签读取失败"); - client.close(); - throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); - } - //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) - TimeUnit.SECONDS.sleep(3); - // 停止指令,空闲态 - MsgBaseStop msgBaseStop = new MsgBaseStop(); - client.sendSynMsg(msgBaseStop); - if (0 == msgBaseStop.getRtCode()) { - log.info("EPC、TID标签停止读取成功"); - } else { - log.info("EPC、TID标签停止读取失败"); - } //查询标签样品信息 QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.in("label_bind", tids); + wrapper.in("label_bind", tIds); wrapper.eq("is_del", 0); List customerSampleInfos = sampleMapper.selectList(wrapper); List resultList = ConvertUtils.sourceToTarget(customerSampleInfos, ReadSampleDTO.class); @@ -89,6 +63,86 @@ } } + @Override + public ReturnDTO> tIdReadList() { + GClient client = new GClient(); + try { + //if (client.openSerial("COM11:115200", 2000)) + if (!client.openTcp("192.168.1.168:8160", 0)) { + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + return ReturnUtil.success(receiveTIds(client)); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + @Override + public ReturnDTO> tIdMiniReadList() { + GClient client = new GClient(); + Set tIds = new HashSet<>(); + try { + List attachedHidDevices = UsbHidUtils.getAttachedHidDevices(); + if(CollectionUtils.isEmpty(attachedHidDevices)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED); + } + //循环每个USB接口数据 + for (HidDevice hidDevice : attachedHidDevices) { + if (client.openUsbHid(hidDevice)) { + tIds.addAll(receiveTIds(client)); + } + } + if(CollectionUtils.isEmpty(tIds)){ + throw new BusinessException(BusinessExceptionEnum.READ_WRITER_NOT_CONNECTED_OR_NO_TID); + } + return ReturnUtil.success(tIds); + } catch (InterruptedException e) { + log.error("读写器循环读取事件时间设置,异常信息:{}", e.getMessage()); + return ReturnUtil.failed(); + } finally { + client.close(); + } + } + + private Set receiveTIds(GClient client) throws InterruptedException { + Set tIds = new HashSet<>(); + //标签上报事件、结束事件订阅 + eventSubscribe(tIds, client); + + // 4个天线读卡, 读取EPC数据区以及TID数据区 + MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc(); + msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4); + // 0: 单次读取模式,读写器尽在各个使能的天线上进行一轮读卡操作便结束读卡操作并自动进入空闲状态 + // 1: 连续读取模式,读写器一直进行读卡操作直到读写器收到停止指令后结束读卡 + msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory); + ParamEpcReadTid tid = new ParamEpcReadTid(); + tid.setMode(EnumG.ParamTidMode_Auto); + tid.setLen(6); + msgBaseInventoryEpc.setReadTid(tid); + client.sendSynMsg(msgBaseInventoryEpc); + if (0 == msgBaseInventoryEpc.getRtCode()) { + log.info("EPC、TID标签读取成功"); + } else { + log.info("EPC、TID标签读取失败"); + client.close(); + throw new BusinessException(BusinessExceptionEnum.FAIL_READ_EPC_TID); + } + //连续读取,让事件接收3秒,也可采用单次读取方式(没有连续读取识别效果好) + TimeUnit.SECONDS.sleep(3); + // 停止指令,空闲态 + MsgBaseStop msgBaseStop = new MsgBaseStop(); + client.sendSynMsg(msgBaseStop); + if (0 == msgBaseStop.getRtCode()) { + log.info("EPC、TID标签停止读取成功"); + } else { + log.info("EPC、TID标签停止读取失败"); + } + return tIds; + } + private void eventSubscribe(Set set, GClient client) { // 订阅标签上报事件 client.onTagEpcLog = new HandlerTagEpcLog() { @@ -98,6 +152,7 @@ // 标签回调数量较多,请将标签数据先缓存起来再作业务处理 if (null != logBaseEpcInfo && 0 == logBaseEpcInfo.getResult()) { System.out.println(logBaseEpcInfo); + log.info("收到标签上报事件,{}", logBaseEpcInfo.toString()); set.add(logBaseEpcInfo.getTid()); } } @@ -107,7 +162,7 @@ @Override public void log(String readName, LogBaseEpcOver logBaseEpcOver) { if (null != logBaseEpcOver) { - System.out.println("Epc log over."); + log.info("收到标签上报结束事件,{}", logBaseEpcOver.toString()); } } }; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java index 9deaa4b..ee830e4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessReadWriterService.java @@ -4,6 +4,7 @@ import com.casic.missiles.dto.business.dispatch.ReadSampleDTO; import java.util.List; +import java.util.Set; /** * @Description: @@ -12,5 +13,9 @@ */ public interface IBusinessReadWriterService { - ReturnDTO> readList(); + ReturnDTO> sampleReadList(); + + ReturnDTO> tIdReadList(); + + ReturnDTO> tIdMiniReadList(); } diff --git a/lib/reader.jar b/lib/reader.jar deleted file mode 100644 index 0fe78e6..0000000 --- a/lib/reader.jar +++ /dev/null Binary files differ