()
+ .eq("street_Id", streetDO.getId())
+ .eq("direction", stockDO.getDirection()).last("limit 1"));
+ if (rfid == null) {
+ log.error("没有rfid,streetId:{}", streetDO.getId());
+ return false;
+ }
+ // 单线程同步扫描:连接、扫描、命中判断、关闭全部在当前线程内完成
+ RFIDSocket rfidSocket = new RFIDSocket(rfid.getIp(), rfid.getPort());
+ log.info("rfid调用,ip:{};port:{}", rfid.getIp(), rfid.getPort());
+ try {
+ rfidSocket.startCheck(stockDO.getDirection());
+ return rfidSocket.scanAndWait(wmsCode, time);
+ } finally {
+ rfidSocket.close();
+ }
}
}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarRequest.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarRequest.java
new file mode 100644
index 0000000..c5b51dd
--- /dev/null
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarRequest.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.camera.service.scan;
+
+import lombok.Data;
+
+/**
+ * PAVO2 雷达 HTTP 请求体
+ *
+ * 对应 PAVO2 HTTP 运行模式 POST 到根路径 {@code /} 的 JSON body(与 TCP 协议一致,不带结尾 '>')。
+ */
+@Data
+public class RadarRequest {
+
+ /**
+ * 功能:count(盘点计数)/ check(检测)/ config(重载配置)/ ConfigureSpeed(标定速度剖面)
+ */
+ private String function;
+
+ /**
+ * 扫描动作:start / stop
+ */
+ private String scan;
+
+ /**
+ * 扫描时长(秒),到时自动停止;start 不带 scanTime 时需手动 stop 拿结果
+ */
+ private Integer scanTime;
+
+ /**
+ * 扫描范围(箱体尺寸)
+ */
+ private Box box;
+
+ /**
+ * 任务 id
+ */
+ private String task_id;
+
+ /**
+ * 箱体尺寸
+ */
+ @Data
+ public static class Box {
+ /**
+ * 长度(mm)
+ */
+ private Integer l;
+ /**
+ * 宽度(mm)
+ */
+ private Integer w;
+ /**
+ * 整堆高度(mm)
+ */
+ private Integer h;
+ /**
+ * 单层个数
+ */
+ private Integer maxPerLayer;
+ }
+}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarResponse.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarResponse.java
new file mode 100644
index 0000000..dbf1728
--- /dev/null
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarResponse.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.camera.service.scan;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * PAVO2 雷达 HTTP 响应体
+ *
+ * 响应 body 与 TCP 协议一致(不带结尾 '>')。
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RadarResponse {
+
+ /**
+ * 是否成功
+ */
+ private boolean success;
+
+ /**
+ * 状态描述,如 scan not running
+ */
+ private String status;
+
+ /**
+ * 消息/错误信息
+ */
+ private String message;
+
+ /**
+ * 结果描述,如 scan not running
+ */
+ private String result;
+
+ private String pic;
+
+ /**
+ * 计数结果(count 功能返回)
+ */
+ private Integer count;
+
+ /**
+ * 任务 id
+ */
+ private String task_id;
+}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarScanServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarScanServiceImpl.java
new file mode 100644
index 0000000..fbc0a51
--- /dev/null
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RadarScanServiceImpl.java
@@ -0,0 +1,276 @@
+package cn.iocoder.yudao.module.camera.service.scan;
+
+import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo;
+import cn.iocoder.yudao.module.camera.dal.dataobject.specificationConf.SpecificationConfDO;
+import cn.iocoder.yudao.module.camera.dal.dataobject.stock.StockDO;
+import cn.iocoder.yudao.module.camera.dal.dataobject.street.StreetDO;
+import cn.iocoder.yudao.module.camera.dal.entity.ScanData;
+import cn.iocoder.yudao.module.camera.service.radar.RadarDO;
+import cn.iocoder.yudao.module.camera.service.radar.RadarService;
+import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService;
+import cn.iocoder.yudao.module.camera.service.specificationConf.SpecificationConfService;
+import cn.iocoder.yudao.module.logistics.dal.dataobject.checkconf.CheckConfDO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * PAVO2 雷达 HTTP 接口实现
+ *
+ * PAVO2 雷达以 HTTP 运行模式对外提供接口,POST 到根路径 {@code /},
+ * 请求体为与 TCP 协议完全相同的 JSON(不带结尾 '>'),响应 body 与 TCP 相同。
+ *
+ * 数据来源:
+ *
+ * - ip/端口:通过 {@link RadarService} 按巷道 id + 方向(stockDO.direction)查询 {@link RadarDO}
+ * - box 尺寸:通过 {@link SpecificationConfService} 按品规(stockDO.wmsItemCode)查询 {@link SpecificationConfDO}
+ *
+ */
+@Slf4j
+@Service("RadarScanService")
+public class RadarScanServiceImpl implements ScanService {
+
+ @Resource
+ private RadarService radarService;
+
+ @Resource
+ private SpecificationConfService specificationConfService;
+
+ @Resource
+ private RestTemplate restTemplate;
+
+ @Resource
+ URLResourcesService urlResourcesService;
+
+ @Override
+ public ScanData scan(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO ) {
+ RadarDO radar = getRadar(streetDO, stockDO);
+ if (radar == null) {
+ log.error("[radar] 未找到雷达配置, streetId={}, direction={}", streetDO.getId(), stockDO.getDirection());
+ return new ScanData();
+ }
+ String baseUrl = "http://" + radar.getIp() + ":" + radar.getPort();
+ // 默认盘点计数;若 stockDO 指定 scanType 为 check,则走检测
+ String function = "check".equalsIgnoreCase(stockDO.getScanType()) ? "check" : "count";
+ String taskId = stockDO.getTaskId() != null ? stockDO.getTaskId() : String.valueOf(stockDO.getId());
+
+ // 构建带 box 尺寸的 start 请求
+ RadarRequest start = buildBoxRequest(function, "start", taskId, stockDO,checkConfDO);
+ RadarResponse startResp = postJson(baseUrl + "/", start);
+
+ // stop 拿结果
+ RadarRequest stop = new RadarRequest();
+ stop.setFunction(function);
+ stop.setScan("stop");
+ stop.setTask_id(taskId);
+ RadarResponse stopResp = postJson(baseUrl + "/", stop);
+
+ return toScanData(stockDO, stopResp != null ? stopResp : startResp);
+ }
+ public ScanData scanCountStart(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
+ RadarResponse stopResp = countStart( streetDO,stockDO,checkConfDO);
+
+
+ return toScanData(stockDO, stopResp );
+ }
+ public ScanData scanCountStop(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
+ RadarDO radar = getRadar(streetDO, stockDO);
+ if (radar == null) {
+ log.error("[radar] 未找到雷达配置, streetId={}, direction={}", streetDO.getId(), stockDO.getDirection());
+ return new ScanData().setCode("Not found radar");
+ }
+ String baseUrl = "http://" + radar.getIp() + ":" + radar.getPort();
+ // 默认盘点计数;若 stockDO 指定 scanType 为 check,则走检测
+ String taskId = stockDO.getTaskId() != null ? stockDO.getTaskId() : String.valueOf(stockDO.getId());
+
+ // 构建带 box 尺寸的 start 请求
+ // stop 拿结果
+ RadarRequest stop = new RadarRequest();
+ stop.setFunction("count");
+ stop.setScan("stop");
+ stop.setTask_id(taskId);
+ RadarResponse stopResp = postJson(baseUrl + "/", stop);
+
+ return toScanData(stockDO, stopResp );
+ }
+
+
+
+
+
+// /**
+// * 盘点计数:start(固定时长,到时自动停止)
+// */
+// public RadarResponse countStart(StreetDO streetDO, StockDO stockDO, int scanTime) {
+// RadarRequest request = buildBoxRequest("count", "start", taskId(stockDO), stockDO);
+// request.setScanTime(scanTime);
+// return postJson(streetDO, stockDO, request);
+// }
+
+ /**
+ * 盘点计数:start(手动,等 stop 拿结果)
+ */
+ public RadarResponse countStart(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
+ RadarRequest request = buildBoxRequest("count", "start", taskId(stockDO), stockDO,checkConfDO);
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 盘点计数:stop(拿结果)
+ */
+ public RadarResponse countStop(StreetDO streetDO, StockDO stockDO) {
+ RadarRequest request = buildRequest("count", "stop", taskId(stockDO), stockDO);
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 检测:start(手动)
+ */
+ public RadarResponse checkStart(StreetDO streetDO, StockDO stockDO) {
+ RadarRequest request = buildRequest("check", "start", taskId(stockDO), stockDO);
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 检测:stop(拿结果)
+ */
+ public RadarResponse checkStop(StreetDO streetDO, StockDO stockDO) {
+ RadarRequest request = buildRequest("check", "stop", taskId(stockDO), stockDO);
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 重载 config/config
+ */
+ public RadarResponse reloadConfig(StreetDO streetDO, StockDO stockDO) {
+ RadarRequest request = new RadarRequest();
+ request.setFunction("config");
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 标定速度剖面
+ */
+ public RadarResponse configureSpeed(StreetDO streetDO, StockDO stockDO, int scanTime) {
+ RadarRequest request = new RadarRequest();
+ request.setFunction("ConfigureSpeed");
+ request.setScanTime(scanTime);
+ return postJson(streetDO, stockDO, request);
+ }
+
+ /**
+ * 构建带 box 尺寸的请求。box 数据来自品规配置(按 stockDO.wmsItemCode 匹配 type)。
+ */
+ private RadarRequest buildBoxRequest(String function, String scan, String taskId, StockDO stockDO, CheckConfDO checkConfDO ) {
+ RadarRequest request = new RadarRequest();
+ request.setFunction(function);
+ request.setScan(scan);
+ request.setTask_id(taskId);
+
+ SpecificationConfDO conf = specificationConfService.getOne(
+ new QueryWrapper()
+ .eq("type", stockDO.getWmsExtendInfo().get("category")).last("limit 1"));
+ if (conf != null) {
+ RadarRequest.Box box = new RadarRequest.Box();
+ box.setL(conf.getLength());
+ box.setW(conf.getWidth());
+ box.setH(conf.getHeight());
+ box.setMaxPerLayer(conf.getLayersNumber());
+ request.setBox(box);
+ }
+ return request;
+ }
+ /**
+ * 构建带 box 尺寸的请求。box 数据来自品规配置(按 stockDO.wmsItemCode 匹配 type)。
+ */
+ private RadarRequest buildRequest(String function, String scan, String taskId , StockDO stockDO) {
+ RadarRequest request = new RadarRequest();
+ request.setFunction(function);
+ request.setScan(scan);
+ request.setTask_id(taskId);
+
+
+ return request;
+ }
+
+ /**
+ * 根据巷道 id + 方向查询雷达配置(ip/端口)。
+ */
+ private RadarDO getRadar(StreetDO streetDO, StockDO stockDO) {
+ return radarService.getOne(new LambdaQueryWrapper()
+ .eq(RadarDO::getStreetId, streetDO.getId())
+ .eq(RadarDO::getDirection, stockDO.getDirection()));
+ }
+
+ private String baseUrl(StreetDO streetDO, StockDO stockDO) {
+ RadarDO radar = getRadar(streetDO, stockDO);
+ if (radar == null) {
+ return null;
+ }
+ return "http://" + radar.getIp() + ":" + radar.getPort();
+ }
+
+ private String taskId(StockDO stockDO) {
+ return stockDO.getTaskId() != null ? stockDO.getTaskId() : String.valueOf(stockDO.getId());
+ }
+
+ private RadarResponse postJson(StreetDO streetDO, StockDO stockDO, RadarRequest body) {
+ String url = baseUrl(streetDO, stockDO);
+ if (url == null) {
+ log.error("[radar] 未找到雷达配置, streetId={}, direction={}", streetDO.getId(), stockDO.getDirection());
+ return null;
+ }
+ return postJson(url + "/", body);
+ }
+
+ /**
+ * 向雷达发送 POST JSON 请求。
+ */
+ private RadarResponse postJson(String url, RadarRequest body) {
+ try {
+ // 将 body 序列化为 JSON 字节,显式设置 Content-Length,避免服务端返回 411 Length Required
+ ObjectMapper objectMapper = new ObjectMapper();
+ byte[] bodyBytes = objectMapper.writeValueAsBytes(body);
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ headers.setContentLength(bodyBytes.length);
+ HttpEntity request = new HttpEntity<>(bodyBytes, headers);
+ RadarResponse resp = restTemplate.postForObject(url, request, RadarResponse.class);
+ log.info("[radar] url={} body={} resp={}", url, body, resp);
+ return resp;
+ } catch (Exception e) {
+ RadarResponse resp = new RadarResponse();
+ resp.setMessage("scan error");
+ log.error("[radar] request error, url={} body={}", url, body, e);
+ return resp;
+ }
+ }
+
+ /**
+ * 将雷达返回结果转换为 ScanData,结果放到 code 供上层与 wms 数量比对。
+ */
+ private ScanData toScanData(StockDO stockDO, RadarResponse resp) {
+ ScanData scanData = new ScanData();
+ if (resp != null) {
+ String code = resp.getCount() != null ? String.valueOf(resp.getCount())
+ : resp.getMessage();
+ scanData.setCode(code);
+ }
+ scanData.setId(stockDO.getId());
+ scanData.setDirection(stockDO.getDirection());
+ scanData.setUuid(stockDO.getCheckPic());
+ if (resp != null && resp.getPic() != null) {
+ urlResourcesService.save(URLResourcesDo.builder().url(resp.getPic()).uuid(stockDO.getCheckPic()).type("1").little("个数3d生成图").build());
+ }
+
+
+ return scanData;
+ }
+}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java
index 5844ce6..f4c28e0 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.camera.dal.entity.ScanData;
import cn.iocoder.yudao.module.camera.service.sensorgun.CognexSocket;
import cn.iocoder.yudao.module.camera.service.sensorgun.SensorGunService;
import cn.iocoder.yudao.module.camera.service.sensorgun.SickSocket;
+import cn.iocoder.yudao.module.logistics.dal.dataobject.checkconf.CheckConfDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -81,9 +82,11 @@ public class ScanGunScanServiceImpl implements ScanService{
return bd.readLine();
}
@Override
- public ScanData scan(StreetDO streetDO, StockDO stockDO) {
+ public ScanData scan(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO ) {
ScanData scanData = new ScanData();
- SensorGunDO sensorGun = sensorService.getOne(new QueryWrapper().eq("street_id", streetDO.getId()).eq("direction", stockDO.getDirection()));
+ SensorGunDO sensorGun = sensorService.getOne(new QueryWrapper()
+ .eq("street_id", streetDO.getId())
+ .eq("direction", stockDO.getDirection()));
String trayCode = "";
if (sensorGun == null) {
log.error("no sensor gun config in database ,street id:{},direction:{}", streetDO.getId(), stockDO.getDirection());
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java
index 32ea7b4..f623be4 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java
@@ -3,7 +3,8 @@ package cn.iocoder.yudao.module.camera.service.scan;
import cn.iocoder.yudao.module.camera.dal.dataobject.stock.StockDO;
import cn.iocoder.yudao.module.camera.dal.dataobject.street.StreetDO;
import cn.iocoder.yudao.module.camera.dal.entity.ScanData;
+import cn.iocoder.yudao.module.logistics.dal.dataobject.checkconf.CheckConfDO;
public interface ScanService {
- ScanData scan(StreetDO streetDO, StockDO stockDO);
+ ScanData scan(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO );
}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java
index a22493d..cb230e2 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.camera.dal.entity.ScanData;
import cn.iocoder.yudao.module.camera.service.Hik3D.HikFlaskApiService;
import cn.iocoder.yudao.module.camera.service.scan.LxService.LxServiceApi;
import cn.iocoder.yudao.module.camera.service.scan.yoloCameraApi.YoloServiceImpl;
+import cn.iocoder.yudao.module.logistics.dal.dataobject.checkconf.CheckConfDO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -27,6 +28,8 @@ public class ScanServiceFactory {
private HikFlaskApiService hikFlaskApiService;
@Resource
private QRCodeScanServiceImpl qrCodeScanService;
+ @Resource
+ private RadarScanServiceImpl radarScanService;
@Resource
LxServiceApi lxServiceApi;
@@ -35,65 +38,71 @@ public class ScanServiceFactory {
// 返回的ScanData的code会将作为扫描结果,如果和wms的一致,则记录为成功
// 图片保存将在scan方法中实现
- public ScanData scan(String type, StreetDO streetDO, StockDO stockDO) {
+ public ScanData scan(String type, StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO ) {
try {
-
switch (type) {
case "0":
return null;
// 扫码枪扫码
case "1":
log.info("扫码枪扫码");
- return scanGunScanService.scan(streetDO, stockDO);
+ return scanGunScanService.scan(streetDO, stockDO,checkConfDO);
// RFID扫码
case "2":
log.info("RFID扫码");
- return rfidScanService.scan(streetDO, stockDO);
+ return rfidScanService.scan(streetDO, stockDO,checkConfDO);
// 视觉扫码
case "3":
log.info("视觉扫码-分类");
- return yoloService.scanClassify(streetDO, stockDO);
+ return yoloService.scanClassify(streetDO,stockDO,checkConfDO);
// 3D扫码
case "4":
log.info("3D扫码");
- return pcdService.scan(streetDO, stockDO);
+ return pcdService.scan(streetDO, stockDO,checkConfDO);
// opencv扫码
case "5":
log.info("opencv扫码");
- return opencvService.scan(streetDO, stockDO);
+ return opencvService.scan(streetDO, stockDO,checkConfDO);
// hik3d识别扫码
case "6":
log.info("hik3d识别扫码");
- return hikFlaskApiService.scan(streetDO, stockDO);
+ return hikFlaskApiService.scan(streetDO, stockDO,checkConfDO);
// hik3d识别扫码存在
case "7":
log.info("hik3d识别扫码存在");
- return hikFlaskApiService.scanExist(streetDO, stockDO);
+ return hikFlaskApiService.scanExist(streetDO,stockDO,checkConfDO);
// hik3d识别扫码存在
case "8":
log.info("lx识别扫码存在");
- return yoloService.scanExist(streetDO, stockDO);
+ return yoloService.scanExist(streetDO,stockDO,checkConfDO);
// hik3d识别扫码存在
case "9":
log.info("yolo识别扫码-检测");
- return yoloService.scanDetect(streetDO, stockDO);
+ return yoloService.scanDetect(streetDO,stockDO,checkConfDO);
case "10":
log.info("lx接口品规");
- return lxServiceApi.categoryScan(streetDO, stockDO);// 二维码识别
+ return lxServiceApi.categoryScan(streetDO,stockDO,checkConfDO);// 二维码识别
case "11":
log.info("lx接口个数");
- return lxServiceApi.countScan(streetDO, stockDO);
+ return lxServiceApi.countScan(streetDO,stockDO,checkConfDO);
case "12":
log.info("lx货物码");
- return lxServiceApi.codeScan(streetDO, stockDO);
+ return lxServiceApi.codeScan(streetDO,stockDO,checkConfDO);
+ case "13":
+ log.info("雷达识别开始");
+ return radarScanService.scanCountStart(streetDO,stockDO,checkConfDO);
+
+ case "14":
+ log.info("雷达识别结束");
+ return radarScanService.scanCountStop(streetDO,stockDO,checkConfDO);
// 默认情况处理
default:
return new ScanData();
}
} catch (Exception e) {
log.error("scan error", e);
- return new ScanData();
+ return new ScanData().setCode("scan error");
}
}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/Pojo.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/Pojo.java
index 4b2bd39..28b06f7 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/Pojo.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/Pojo.java
@@ -12,6 +12,8 @@ public class Pojo {
private String determinePath;
//结果
private Boolean result;
+ private String code;
+ private String pic;
private String type;
private List detects;
private String path;
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/YoloServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/YoloServiceImpl.java
index 44ed450..5438926 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/YoloServiceImpl.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/yoloCameraApi/YoloServiceImpl.java
@@ -6,13 +6,20 @@ import cn.iocoder.yudao.module.camera.dal.dataobject.street.StreetDO;
import cn.iocoder.yudao.module.camera.dal.entity.ScanData;
import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService;
import cn.iocoder.yudao.module.camera.service.scan.ScanService;
+import cn.iocoder.yudao.module.logistics.dal.dataobject.checkconf.CheckConfDO;
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.gson.*;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
import okhttp3.*;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.time.LocalDate;
@@ -25,63 +32,66 @@ import java.util.Objects;
@Slf4j
public class YoloServiceImpl implements ScanService {
- private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
@Resource
private OkHttpClient client;
-
+
+ @Resource
+ private RestTemplate restTemplate;
private final Gson gson;
-
+
public YoloServiceImpl() {
// 配置 Gson 支持 Java 8 时间类型
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-
+
this.gson = new GsonBuilder()
- .registerTypeAdapter(LocalDate.class, (JsonSerializer) (date, type, jsonSerializationContext) ->
- new JsonPrimitive(date.format(dateFormatter)))
- .registerTypeAdapter(LocalDate.class, (JsonDeserializer) (json, type, jsonDeserializationContext) ->
- LocalDate.parse(json.getAsString(), dateFormatter))
- .registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (dateTime, type, jsonSerializationContext) ->
- new JsonPrimitive(dateTime.format(dateTimeFormatter)))
- .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, type, jsonDeserializationContext) ->
- LocalDateTime.parse(json.getAsString(), dateTimeFormatter))
+ .registerTypeAdapter(LocalDate.class, (JsonSerializer) (date, type, jsonSerializationContext) ->
+ new JsonPrimitive(date.format(dateFormatter)))
+ .registerTypeAdapter(LocalDate.class, (JsonDeserializer) (json, type, jsonDeserializationContext) ->
+ LocalDate.parse(json.getAsString(), dateFormatter))
+ .registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (dateTime, type, jsonSerializationContext) ->
+ new JsonPrimitive(dateTime.format(dateTimeFormatter)))
+ .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, type, jsonDeserializationContext) ->
+ LocalDateTime.parse(json.getAsString(), dateTimeFormatter))
.create();
}
@Resource
private DictDataService dictDataService;
+
@Override
- public ScanData scan(StreetDO streetDO, StockDO stockDO) {
+ public ScanData scan(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
return null;
}
/**
* 识别是否存在
+ *
* @param streetDO
* @param stockDO
* @return
*/
- public ScanData scanExist(StreetDO streetDO, StockDO stockDO) {
+ public ScanData scanExist(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
ScanData scanData = new ScanData();
- String urlPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
- String picPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
+ String urlPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
+ String picPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
try {
scanData.setCode("有货");
Pojo pojo = new Pojo();
pojo.setStreetId(streetDO.getPlcId());
pojo.setDirection(stockDO.getDirection());
- pojo = setHttp(pojo,urlPath+"/category/exist");
+ pojo = setHttp(pojo, urlPath + "/category/exist");
- log.info("lx3d拍照结果:"+pojo.toString());
+ log.info("lx3d拍照结果:" + pojo.toString());
- if (pojo.getResult()!= null && pojo.getResult()) {
- }else {
- scanData.setCode( "无货");
- log.info("taskId:"+stockDO.getTaskId()+" lx3d拍照结果:"+pojo.toString());
- }
+ if (pojo.getResult() != null && pojo.getResult()) {
+ } else {
+ scanData.setCode("无货");
+ log.info("taskId:" + stockDO.getTaskId() + " lx3d拍照结果:" + pojo.toString());
+ }
// if (hikPythonEntity.getColors() != null && hikPythonEntity.getColors().size() > 0) {
// for (String color:hikPythonEntity.getColors()){
// if (color.startsWith(".")) {
@@ -93,7 +103,7 @@ public class YoloServiceImpl implements ScanService {
// }
return scanData;
} catch (IOException e) {
- log.error("识别异常",e);
+ log.error("识别异常", e);
System.out.println("识别异常");
e.printStackTrace();
throw new RuntimeException(e);
@@ -106,29 +116,30 @@ public class YoloServiceImpl implements ScanService {
/**
* 识别是否存在
+ *
* @param streetDO
* @param stockDO
* @return
*/
- public ScanData scanClassify(StreetDO streetDO, StockDO stockDO) {
+ public ScanData scanClassify(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
ScanData scanData = new ScanData();
- String urlPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
- String picPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
+ String urlPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
+ String picPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
try {
// scanData.setCode("有货");
Pojo pojo = new Pojo();
pojo.setStreetId(streetDO.getPlcId());
pojo.setDirection(stockDO.getDirection());
- pojo = setHttp(pojo,urlPath+"/yolo/classify");
+ pojo = setHttp(pojo, urlPath + "/yolo/classify");
- log.info("lx3d拍照结果:"+pojo.toString());
+ log.info("lx3d拍照结果:" + pojo.toString());
scanData.setCode(pojo.getType());
- urlResourcesService.save(URLResourcesDo.builder().url(picPath+pojo.getPath()).uuid( stockDO.getCheckPic()).type("1").little("有无拍照").build());
+ urlResourcesService.save(URLResourcesDo.builder().url(picPath + pojo.getPath()).uuid(stockDO.getCheckPic()).type("1").little("有无拍照").build());
return scanData;
} catch (IOException e) {
- log.error("识别异常",e);
+ log.error("识别异常", e);
System.out.println("识别异常");
e.printStackTrace();
throw new RuntimeException(e);
@@ -138,27 +149,71 @@ public class YoloServiceImpl implements ScanService {
/**
* 识别是否存在
+ *
* @param streetDO
* @param stockDO
* @return
*/
- public ScanData scanDetect(StreetDO streetDO, StockDO stockDO) {
+ public ScanData scanDetect(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
ScanData scanData = new ScanData();
- String urlPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
- String picPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
- try {
+
+ String saveApiPath = dictDataService.parseDictData("base_conf", "data_api_path").getValue();
+
+ String savePath = dictDataService.parseDictData("camera_conf", "media_path").getValue();
+ String urlPath = "http://127.0.0.1:8097";
+ try {
// scanData.setCode("有货");
- Pojo pojo = new Pojo();
- pojo.setStreetId(streetDO.getPlcId());
- pojo.setDirection(stockDO.getDirection());
- pojo = setHttp(pojo,urlPath+"/yolo/detect");
+ Pojo pojo = new Pojo();
+
+ URLResourcesDo urlResourcesDo = urlResourcesService.getOne(
+ new QueryWrapper()
+ .eq("uuid",stockDO.getCheckPic())
+ .eq("type",1)
+ .eq("little","球机拍照").last("limit 1"));
+
+ pojo.setPic(urlResourcesDo.getUrl().replace(saveApiPath,savePath));
+
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
+ HttpEntity entity = new HttpEntity<>(pojo, headers);
+ ResponseEntity response = restTemplate.exchange(
+ urlPath + "/yolo/detect", // 替换为你的 API 地址
+ HttpMethod.POST,
+ entity,
+ Pojo.class
+ );
+
+ log.info("盘点结果:" + pojo.toString());
+ if (response.getBody() != null) {
+ scanData.setCode(response.getBody().getCode());
+// 后端加.jpg 先写死就行
+ urlResourcesService.save(URLResourcesDo.builder().url(pojo.getPic().replace(savePath ,saveApiPath)+".jpg").uuid(stockDO.getCheckPic()).type("1").little("识别拍照").build());
+ }
+ return scanData;
+ } catch (Exception e) {
+ log.error("识别异常", e);
+ System.out.println("识别异常");
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+// return null;
+ }
- log.info("lx3d拍照结果:"+pojo.toString());
- scanData.setCode(pojo.getType());
- urlResourcesService.save(URLResourcesDo.builder().url(picPath+pojo.getPath()).uuid( stockDO.getCheckPic()).type("1").little("有无拍照").build());
- return scanData;
+ public ScanData scanPicDetect(StreetDO streetDO, StockDO stockDO, CheckConfDO checkConfDO) {
+ ScanData scanData = new ScanData();
+ String urlPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
+ String picPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
+ try {
+// scanData.setCode("有货");
+ Pojo pojo = new Pojo();
+ pojo = setHttp(pojo, urlPath + "/yolo/detect");
+
+ log.info("lx3d拍照结果:" + pojo.toString());
+ scanData.setCode(pojo.getType());
+ urlResourcesService.save(URLResourcesDo.builder().url(picPath + pojo.getPath()).uuid(stockDO.getCheckPic()).type("1").little("有无拍照").build());
+ return scanData;
} catch (IOException e) {
- log.error("识别异常",e);
+ log.error("识别异常", e);
System.out.println("识别异常");
e.printStackTrace();
throw new RuntimeException(e);
@@ -166,28 +221,30 @@ public class YoloServiceImpl implements ScanService {
// return null;
}
+
/**
* 识别是否存在
+ *
* @param streetDO
* @param stockDO
* @return
*/
public ScanData scanningLxApiYolo(StreetDO streetDO, StockDO stockDO) {
ScanData scanData = new ScanData();
- String urlPath ="http://127.0.0.1:8097/judge/scan";
+ String urlPath = "http://127.0.0.1:8097/judge/scan";
try {
// scanData.setCode("有货");
Pojo pojo = new Pojo();
pojo.setStreetId(streetDO.getPlcId());
pojo.setDirection(stockDO.getDirection());
- pojo = setHttp(pojo,urlPath+"/yolo/detect");
+ pojo = setHttp(pojo, urlPath + "/yolo/detect");
- log.info("lx3d拍照结果:"+pojo.toString());
+ log.info("lx3d拍照结果:" + pojo.toString());
scanData.setCode(pojo.getType());
- urlResourcesService.save(URLResourcesDo.builder().url(pojo.getPath()).uuid( stockDO.getCheckPic()).type("1").little("有无拍照").build());
+ urlResourcesService.save(URLResourcesDo.builder().url(pojo.getPath()).uuid(stockDO.getCheckPic()).type("1").little("有无拍照").build());
return scanData;
} catch (IOException e) {
- log.error("识别异常",e);
+ log.error("识别异常", e);
System.out.println("识别异常");
e.printStackTrace();
throw new RuntimeException(e);
@@ -196,18 +253,17 @@ public class YoloServiceImpl implements ScanService {
}
-
-
/**
* 识别是否存在
+ *
* @param streetDO
* @param stockDO
* @return
*/
public ScanData scanCameraDetect(StreetDO streetDO, StockDO stockDO) {
ScanData scanData = new ScanData();
- String urlPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
- String picPath ="http://"+streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
+ String urlPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "yoloApiPort").getValue();
+ String picPath = "http://" + streetDO.getPlcIp() + ":" + dictDataService.parseDictData("Hik3DApi", "picPath").getValue();
String realPath = dictDataService.getDictDataList("camera_conf").get("media_path").getValue();
@@ -215,28 +271,30 @@ public class YoloServiceImpl implements ScanService {
try {
// scanData.setCode("有货");
List urls = urlResourcesService.list(new LambdaQueryWrapper().eq(URLResourcesDo::getUuid, stockDO.getCheckPic()));
- for (URLResourcesDo url:urls) {
+ for (URLResourcesDo url : urls) {
Pojo pojo = new Pojo();
pojo.setStreetId(streetDO.getPlcId());
- pojo.setPath(realPath+url.getUrl().replace(saveApiPath,""));
+ pojo.setPath(realPath + url.getUrl().replace(saveApiPath, ""));
pojo.setDirection(stockDO.getDirection());
pojo = setHttp(pojo, urlPath + "/yolo/detect");
log.info("lx3d拍照结果:" + pojo.toString());
- if (pojo.getType()!= null && !pojo.getType().equals("")){
+ if (pojo.getType() != null && !pojo.getType().equals("")) {
scanData.setCode(pojo.getType());
}
}
// urlResourcesService.save(URLResourcesDo.builder().url(picPath+pojo.getPath()).uuid( stockDO.getCheckPic()).type("1").little("有无拍照").build());
return scanData;
} catch (IOException e) {
- log.error("识别异常",e);
+ log.error("识别异常", e);
System.out.println("识别异常");
e.printStackTrace();
throw new RuntimeException(e);
}
// return null;
}
+
+ private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
/**
* 调用 /api/picComputeAll 接口,批量处理所有设备图片
*/
@@ -244,6 +302,7 @@ public class YoloServiceImpl implements ScanService {
String json = gson.toJson(pojo);
+
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
@@ -256,10 +315,10 @@ public class YoloServiceImpl implements ScanService {
System.out.println("Unexpected code " + response);
String responseBody = Objects.requireNonNull(response.body()).string();
- log.info("picComputeAll:{}",responseBody);
+ log.info("picComputeAll:{}", responseBody);
return gson.fromJson(responseBody, Pojo.class);
- }catch (Exception e){
- log.error("Error occurred while calling "+baseUrl, e);
+ } catch (Exception e) {
+ log.error("Error occurred while calling " + baseUrl, e);
return null;
}
}
diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/stock/StockService.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/stock/StockService.java
index 47d4271..49d8b50 100644
--- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/stock/StockService.java
+++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/stock/StockService.java
@@ -24,7 +24,7 @@ public interface StockService extends IService< StockDO> {
*
* @param taskId 任务ID=
*/
- void updateLastByTaskId(String taskId, String value,String column);
+ void updateLastByTaskId(Long taskId, String value,String column);
void updateStatusByFields(Long taskId, List value);
/**
* 创建盘点状态
@@ -68,4 +68,6 @@ public interface StockService extends IService< StockDO> {
EChartsOption laneInventoryStatistics();
List