1.增加库口搜索

2.增加去相机初始化
联合利华-拍照
LAPTOP-S9HJSOEB\昊天 4 weeks ago
parent cedfc82075
commit 583d812e85

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,2 +0,0 @@
2026-05-13 00:10:01.790 [scheduling-1] INFO [com.example.lxcameraapi.service.cron.CronTab] - corn delete file
2026-05-13 00:10:01.796 [scheduling-1] INFO [com.example.lxcameraapi.service.cron.CronTab] - free space :0

@ -1,233 +0,0 @@
2026-05-13 06:21:04.668 [task-8633] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 06:22:10.643 [task-8639] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 06:29:24.842 [task-8678] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 07:26:53.549 [task-8987] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 07:29:38.819 [task-9002] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 08:22:49.447 [task-9287] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 08:26:43.110 [task-9308] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 08:27:51.864 [task-9314] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 09:36:41.023 [task-9680] ERROR [c.e.lxcameraapi.service.AsyncProcessingService] - 异步任务执行异常
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 1
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4849)
at java.base/java.lang.String.substring(String.java:2823)
at com.example.lxcameraapi.service.AsyncProcessingService.processQrCodeAsync(AsyncProcessingService.java:168)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:317)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
2026-05-13 18:02:43.397 [main] ERROR [c.example.lxcameraapi.service.s7.S7MultiPlcService] - PLC PLC1 连接失败: 127.0.0.1, 错误码: 1
2026-05-13 18:02:43.398 [main] ERROR [c.example.lxcameraapi.service.s7.S7MultiPlcService] - PLC PLC1 连接失败: 127.0.0.1, 错误码: 1
2026-05-13 18:02:43.398 [main] ERROR [c.example.lxcameraapi.service.s7.S7MultiPlcService] - PLC PLC1 连接失败: 127.0.0.1, 错误码: 1
2026-05-13 18:02:44.191 [main] ERROR [o.s.b.diagnostics.LoggingFailureAnalysisReporter] -
***************************
APPLICATION FAILED TO START
***************************
Description:
Web server failed to start. Port 8097 was already in use.
Action:
Identify and stop the process that's listening on port 8097 or configure this application to listen on another port.

File diff suppressed because it is too large Load Diff

@ -8,6 +8,7 @@ import java.time.LocalDateTime;
public class CameraUrlQuery { public class CameraUrlQuery {
private String pallet; private String pallet;
private String batch; private String batch;
private String plc;
private LocalDateTime startTime; private LocalDateTime startTime;
private LocalDateTime endTime; private LocalDateTime endTime;
} }

@ -0,0 +1,24 @@
package com.example.lxcameraapi.conf;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatis-Plus
*/
@Configuration
public class MybatisPlusConfig {
/**
*
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

@ -26,6 +26,7 @@ public class CameraUrlController {
new Page<>(query.getPageNum(), query.getPageSize()), new Page<>(query.getPageNum(), query.getPageSize()),
params.getPallet(), params.getPallet(),
params.getBatch(), params.getBatch(),
params.getPlc(),
params.getStartTime(), params.getStartTime(),
params.getEndTime() params.getEndTime()
); );

@ -185,4 +185,39 @@ public class HikCaptureController {
return BatchCaptureResponse.failure("连拍失败: " + e.getMessage(), ip); return BatchCaptureResponse.failure("连拍失败: " + e.getMessage(), ip);
} }
} }
/**
*
*/
@GetMapping("/batchALL")
public BatchCaptureResponse captureBatchAll(
@RequestParam(defaultValue = "D:\\data") String basePath,
@RequestParam(defaultValue = "0") Integer time,
@RequestParam(defaultValue = "20") int count) {
List<String> successPaths = new ArrayList<>();
StringBuilder basePathAll = new StringBuilder(basePath + "/" + "all" + "/");
try {
for (AppConfig.Camera camera : appConfig.getHikCamera()){
String ip = camera.getIp();
basePathAll.append(camera.getId()).append("/");
Thread.sleep( time);
log.info("开始连拍IP: {}, 路径: {}, 数量: {}", ip, basePathAll, count);
successPaths.addAll(imageCaptureService.captureBatch(ip, basePathAll.toString(), count)) ;
}
} catch (Exception e) {
log.error("连拍异常", e);
return BatchCaptureResponse.failure("连拍失败: " + e.getMessage());
}
if (!successPaths.isEmpty()) {
log.info("连拍完成,, 成功: {}/{}", successPaths.size(), count);
return BatchCaptureResponse.success("all", basePath, count, successPaths.size(), successPaths);
} else {
log.warn("连拍失败, 路径: {}", basePath);
return BatchCaptureResponse.failure("连拍失败,请检查相机是否已初始化");
}
}
} }

@ -15,4 +15,5 @@ public class CameraUrl {
private LocalDateTime createTime; private LocalDateTime createTime;
private String upPath; private String upPath;
private String downPath; private String downPath;
private String plc;
} }

@ -20,12 +20,14 @@ public class CameraUrlService extends ServiceImpl<CameraUrlMapper, CameraUrl> im
Page<CameraUrl> page, Page<CameraUrl> page,
String pallet, String pallet,
String batch, String batch,
String plc,
java.time.LocalDateTime startTime, java.time.LocalDateTime startTime,
java.time.LocalDateTime endTime java.time.LocalDateTime endTime
) { ) {
return this.lambdaQuery() return this.lambdaQuery()
.like(StringUtils.isNotBlank(pallet), CameraUrl::getPallet, pallet) .like(StringUtils.isNotBlank(pallet), CameraUrl::getPallet, pallet)
.like(StringUtils.isNotBlank(batch), CameraUrl::getBatch, batch) .like(StringUtils.isNotBlank(batch), CameraUrl::getBatch, batch)
.like(StringUtils.isNotBlank(plc), CameraUrl::getPlc, plc)
.ge(startTime != null, CameraUrl::getDate, startTime) .ge(startTime != null, CameraUrl::getDate, startTime)
.le(endTime != null, CameraUrl::getDate, endTime) .le(endTime != null, CameraUrl::getDate, endTime)
.orderByDesc(CameraUrl::getCreateTime) .orderByDesc(CameraUrl::getCreateTime)

@ -8,6 +8,9 @@ import org.springframework.stereotype.Service;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy; import jakarta.annotation.PreDestroy;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -82,6 +85,7 @@ public class ImageCaptureService {
// 3. 初始化配置的相机 // 3. 初始化配置的相机
if (appConfig.getHikCamera() != null && !appConfig.getHikCamera().isEmpty()){ if (appConfig.getHikCamera() != null && !appConfig.getHikCamera().isEmpty()){
log.info("步骤3: 从配置初始化 {} 个相机...", appConfig.getHikCamera().size()); log.info("步骤3: 从配置初始化 {} 个相机...", appConfig.getHikCamera().size());
// 暂时改为需要的时候进行连接
initCamerasFromConfig(appConfig.getHikCamera()); initCamerasFromConfig(appConfig.getHikCamera());
} else { } else {
log.warn("配置中没有海康相机"); log.warn("配置中没有海康相机");
@ -242,6 +246,30 @@ public class ImageCaptureService {
} }
} }
} }
public void destroy(String ip) {
log.info("开始清理相机资源...");
// 停止抓图并销毁所有句柄
Handle hCamera = handleMap.get(ip);
try {
// 停止抓图
int nRet = MvCameraControl.MV_CC_StopGrabbing(hCamera);
if (MV_OK != nRet) {
log.warn("相机 {} 停止抓图失败errcode: [0x{}]", ip, Integer.toHexString(nRet));
}
// 销毁句柄
nRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);
if (MV_OK != nRet) {
log.warn("相机 {} 销毁句柄失败errcode: [0x{}]", ip, Integer.toHexString(nRet));
}
log.info("相机 {} 资源已清理", ip);
} catch (Exception e) {
log.error("清理相机 {} 资源时发生异常", ip, e);
}
}
/** /**
* *
@ -445,10 +473,11 @@ public class ImageCaptureService {
// 获取一帧图像 // 获取一帧图像
MV_FRAME_OUT_INFO stImageInfo = new MV_FRAME_OUT_INFO(); MV_FRAME_OUT_INFO stImageInfo = new MV_FRAME_OUT_INFO();
byte[] pData = new byte[(int) stParam.curValue]; byte[] pData = new byte[(int) stParam.curValue];
nRet = MvCameraControl.MV_CC_GetOneFrameTimeout(hCamera, pData, stImageInfo, 3000); nRet = MvCameraControl.MV_CC_GetOneFrameTimeout(hCamera, pData, stImageInfo, 5000);
if (MV_OK != nRet) { if (MV_OK != nRet) {
log.warn("获取图像失败 (第{}次)errcode: [0x{}]", attempt, Integer.toHexString(nRet)); log.warn("获取图像失败 (第{}次)errcode: [0x{}]", attempt, Integer.toHexString(nRet));
destroy(ip);
lastErrorCode = nRet; lastErrorCode = nRet;
if (attempt < maxRetries) { if (attempt < maxRetries) {
log.info("等待200ms后重试..."); log.info("等待200ms后重试...");
@ -619,6 +648,7 @@ public class ImageCaptureService {
*/ */
public List<String> captureBatch(String ip, String basePath, int count) { public List<String> captureBatch(String ip, String basePath, int count) {
List<String> successPaths = new ArrayList<>(); List<String> successPaths = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
// 确保相机已初始化 // 确保相机已初始化
if (!ensureCameraInitialized(ip)) { if (!ensureCameraInitialized(ip)) {
@ -676,6 +706,9 @@ public class ImageCaptureService {
} }
} }
LocalDateTime endNow = LocalDateTime.now();
log.info("连拍结束,相机: {}, 耗时: {}ms", ip, Duration.between(now, endNow).toMillis());
log.info("连拍完成,相机: {}, 成功: {}/{}", ip, successPaths.size(), count); log.info("连拍完成,相机: {}, 成功: {}/{}", ip, successPaths.size(), count);
return successPaths; return successPaths;
} }

@ -391,6 +391,7 @@ public class S7MultiPlcService {
cameraUrl.setCreateTime(LocalDateTime.now()); cameraUrl.setCreateTime(LocalDateTime.now());
cameraUrl.setUpPath(photos.get("upPath")); cameraUrl.setUpPath(photos.get("upPath"));
cameraUrl.setDownPath(photos.get("downPath")); cameraUrl.setDownPath(photos.get("downPath"));
cameraUrl.setPlc(plcNumber);
cameraUrlService.saveOrUpdate(cameraUrl); cameraUrlService.saveOrUpdate(cameraUrl);
// 标记拍照完成 // 标记拍照完成

@ -185,6 +185,10 @@
<h1 class="card-title">相机拍照记录查询</h1> <h1 class="card-title">相机拍照记录查询</h1>
<div class="form-row"> <div class="form-row">
<div class="form-group query-input">
<label>库口</label>
<input type="text" id="plc" placeholder="plc">
</div>
<div class="form-group query-input"> <div class="form-group query-input">
<label>托盘号</label> <label>托盘号</label>
<input type="text" id="pallet" placeholder="托盘号"> <input type="text" id="pallet" placeholder="托盘号">
@ -216,6 +220,7 @@
<table> <table>
<thead> <thead>
<tr> <tr>
<th>库口</th>
<th>托盘号</th> <th>托盘号</th>
<th>批次号</th> <th>批次号</th>
<th>生产日期</th> <th>生产日期</th>
@ -254,12 +259,14 @@
function getQueryParams() { function getQueryParams() {
const pallet = document.getElementById('pallet').value.trim(); const pallet = document.getElementById('pallet').value.trim();
const plc = document.getElementById('plc').value.trim();
const batch = document.getElementById('batch').value.trim(); const batch = document.getElementById('batch').value.trim();
const startTime = document.getElementById('startTime').value; const startTime = document.getElementById('startTime').value;
const endTime = document.getElementById('endTime').value; const endTime = document.getElementById('endTime').value;
const params = {}; const params = {};
if (pallet) params.pallet = pallet; if (pallet) params.pallet = pallet;
if (plc) params.plc = plc;
if (batch) params.batch = batch; if (batch) params.batch = batch;
if (startTime) params.startTime = startTime.replace('T', ' ') + ':00'; if (startTime) params.startTime = startTime.replace('T', ' ') + ':00';
if (endTime) params.endTime = endTime.replace('T', ' ') + ':00'; if (endTime) params.endTime = endTime.replace('T', ' ') + ':00';
@ -338,6 +345,8 @@
const tbody = document.getElementById('tableBody'); const tbody = document.getElementById('tableBody');
tbody.innerHTML = data.list.map(item => ` tbody.innerHTML = data.list.map(item => `
<tr> <tr>
<td>${item.plc || '-'}</td>
<td>${item.pallet || '-'}</td> <td>${item.pallet || '-'}</td>
<td>${item.batch || '-'}</td> <td>${item.batch || '-'}</td>
<td>${formatDateTime(item.date)}</td> <td>${formatDateTime(item.date)}</td>
@ -370,6 +379,8 @@
function reset() { function reset() {
document.getElementById('pallet').value = ''; document.getElementById('pallet').value = '';
document.getElementById('plc').value = '';
document.getElementById('batch').value = ''; document.getElementById('batch').value = '';
document.getElementById('startTime').value = ''; document.getElementById('startTime').value = '';
document.getElementById('endTime').value = ''; document.getElementById('endTime').value = '';

Loading…
Cancel
Save