From dcd7f260eff8ce8067d5d4c6cd7fb7f6ff84278c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Mon, 7 Apr 2025 15:42:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9F=A5=E6=89=BE=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/cameraio/CameraIoController.java | 55 ++- .../CameraIoConfigController.java | 93 ----- .../vo/CameraIoConfigPageReqVO.java | 19 - .../vo/CameraIoConfigRespVO.java | 24 -- .../vo/CameraIoConfigSaveReqVO.java | 19 - .../camera/lib/camera/CameraDelayTask.java | 2 + .../camera/lib/camera/TaskDelayExecutor.java | 51 ++- .../yudao-module-logistics-biz/pom.xml | 6 + .../main/java/ScanCodeType/ScanCodeType.java | 18 + .../admin/cameraio/CameraIoController.java | 80 +++- .../admin/checklog/CheckLogController.java | 21 +- .../admin/order/vo/OrderRespVO.java | 6 + .../admin/stock/StockController.java | 123 ++++++ .../admin/street/StreetController.java | 4 +- .../dal/dataobject/checklog/CheckLogDO.java | 14 +- .../dataobject/resources/URLResourcesDo.java | 47 +++ .../camera/dal/dataobject/stock/StockDO.java | 4 +- .../module/camera/dal/entity/ScanData.java | 33 ++ .../module/camera/dal/entity/ScanStatus.java | 14 + .../dal/mysql/checklog/CheckLogMapper.java | 2 +- .../mysql/resources/URLResourcesMapper.java | 10 + .../framework/netty/ksec/KsecDataInfo.java | 6 +- .../service/checklog/CheckLogServiceImpl.java | 18 +- .../service/order/OrderServiceImpl.java | 4 +- .../camera/service/plc/AsyncExample.java | 65 ++++ .../camera/service/plc/PLCServiceImpl.java | 361 +++++++++++++----- .../resources/URLResourcesService.java | 7 + .../resources/URLResourcesServiceImpl.java | 13 + .../camera/service/rfid/RFIDSocket.java | 11 + .../service/scan/OpencvServiceImpl.java | 47 +++ .../camera/service/scan/PCDServiceImpl.java | 37 ++ .../service/scan/RFIDScanServiceImpl.java | 15 + .../service/scan/ScanGunScanServiceImpl.java | 95 +++++ .../camera/service/scan/ScanService.java | 10 + .../service/scan/ScanServiceFactory.java | 56 +++ .../camera/service/scan/YoloServiceImpl.java | 15 + .../service/sensorgun/SensorGunService.java | 10 +- .../sensorgun/SensorGunServiceImpl.java | 16 +- .../yudao/module/camera/util/PathUtil.java | 52 +-- .../system/service/dict/DictDataService.java | 1 + .../service/dict/DictDataServiceImpl.java | 8 + 41 files changed, 1142 insertions(+), 350 deletions(-) delete mode 100644 yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/CameraIoConfigController.java delete mode 100644 yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigPageReqVO.java delete mode 100644 yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigRespVO.java delete mode 100644 yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigSaveReqVO.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/ScanCodeType/ScanCodeType.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/resources/URLResourcesDo.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanData.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanStatus.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/resources/URLResourcesMapper.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/AsyncExample.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesService.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesServiceImpl.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/rfid/RFIDSocket.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/OpencvServiceImpl.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/PCDServiceImpl.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RFIDScanServiceImpl.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java create mode 100644 yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/YoloServiceImpl.java diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java index 6a78f88..2299788 100644 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java +++ b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java @@ -9,8 +9,12 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoPageReqVO; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoRespVO; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoSaveReqVO; +import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO; import cn.iocoder.yudao.module.camera.dal.dataobject.cameraio.CameraIoDO; +import cn.iocoder.yudao.module.camera.lib.camera.CameraModFactory; +import cn.iocoder.yudao.module.camera.service.camera.CameraService; import cn.iocoder.yudao.module.camera.service.cameraio.CameraIoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -36,33 +40,58 @@ public class CameraIoController { @Resource private CameraIoService cameraIoService; + @Resource + private CameraModFactory cameraModFactory; + + + @Resource + private CameraService cameraService; + @PostMapping("/create") @Operation(summary = "创建相机预置点位") @PreAuthorize("@ss.hasPermission('camera:camera-io:create')") public CommonResult createCameraIo(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { - return success(cameraIoService.createCameraIo(createReqVO)); + List list = cameraIoService.list(new QueryWrapper() + .eq("camera_id", createReqVO.getCameraId())); + Integer ptzId = list.stream().map(CameraIoDO::getPtzId).max(Integer::compareTo).orElse(0)+1; + createReqVO.setPtzId(ptzId); + int i= cameraIoService.createCameraIo(createReqVO); + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId()); + + return success(i); } @PostMapping("/callPtz") @Operation(summary = "调用预置点位") @PreAuthorize("@ss.hasPermission('camera:camera-io:callPtz')") public CommonResult callPtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { + + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).toPtz(createReqVO.getPtzId(),createReqVO.getCameraId()); return success(cameraIoService.createCameraIo(createReqVO)); } - @PostMapping("/覆盖预置点位") - @Operation(summary = "创建相机预置点位") + /** + * 创建或覆盖相机预置点位 必须穿ptzId + * @param createReqVO + * @return + */ + @PostMapping("/overwritePtz") + @Operation(summary = "创建或覆盖相机预置点位") @PreAuthorize("@ss.hasPermission('camera:camera-io:overwritePtz')") public CommonResult overwritePtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId()); return success(cameraIoService.createCameraIo(createReqVO)); } - @PutMapping("/update") - @Operation(summary = "更新相机预置点位") - @PreAuthorize("@ss.hasPermission('camera:camera-io:update')") - public CommonResult updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) { - cameraIoService.updateCameraIo(updateReqVO); - return success(true); + @GetMapping("/list") + @Operation(summary = "获得相机预置点位分页") + @PreAuthorize("@ss.hasPermission('camera:camera-io:query')") + public CommonResult> list(@Valid CameraIoPageReqVO pageReqVO) { + List pageResult = cameraIoService.list(new QueryWrapper().eq("camera_id", pageReqVO.getCameraId()).orderByAsc("id")); + return success(BeanUtils.toBean(pageResult, CameraIoRespVO.class)); } @DeleteMapping("/delete") @@ -73,6 +102,14 @@ public class CameraIoController { cameraIoService.deleteCameraIo(id); return success(true); } + @PutMapping("/update") + @Operation(summary = "更新相机预置点位") + @PreAuthorize("@ss.hasPermission('camera:camera-io:update')") + public CommonResult updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) { + cameraIoService.updateCameraIo(updateReqVO); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得相机预置点位") diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/CameraIoConfigController.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/CameraIoConfigController.java deleted file mode 100644 index 3d9ee61..0000000 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/CameraIoConfigController.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig; - -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo.CameraIoConfigPageReqVO; -import cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo.CameraIoConfigRespVO; -import cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo.CameraIoConfigSaveReqVO; -import cn.iocoder.yudao.module.camera.dal.dataobject.cameraioconfig.CameraIoConfigDO; -import cn.iocoder.yudao.module.camera.service.cameraioconfig.CameraIoConfigService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 预置点位配置") -@RestController -@RequestMapping("/admin-api/camera-io-config") -@Validated -public class CameraIoConfigController { - - @Resource - private CameraIoConfigService cameraIoConfigService; - - @PostMapping("/create") - @Operation(summary = "创建预置点位配置") - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:create')") - public CommonResult createCameraIoConfig(@Valid @RequestBody CameraIoConfigSaveReqVO createReqVO) { - return success(cameraIoConfigService.createCameraIoConfig(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新预置点位配置") - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:update')") - public CommonResult updateCameraIoConfig(@Valid @RequestBody CameraIoConfigSaveReqVO updateReqVO) { - cameraIoConfigService.updateCameraIoConfig(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除预置点位配置") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:delete')") - public CommonResult deleteCameraIoConfig(@RequestParam("id") Integer id) { - cameraIoConfigService.deleteCameraIoConfig(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得预置点位配置") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:query')") - public CommonResult getCameraIoConfig(@RequestParam("id") Integer id) { - CameraIoConfigDO cameraIoConfig = cameraIoConfigService.getCameraIoConfig(id); - return success(BeanUtils.toBean(cameraIoConfig, CameraIoConfigRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得预置点位配置分页") - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:query')") - public CommonResult> getCameraIoConfigPage(@Valid CameraIoConfigPageReqVO pageReqVO) { - PageResult pageResult = cameraIoConfigService.getCameraIoConfigPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, CameraIoConfigRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出预置点位配置 Excel") - @PreAuthorize("@ss.hasPermission('logistics:camera-io-config:export')") - @ApiAccessLog(operateType = EXPORT) - public void exportCameraIoConfigExcel(@Valid CameraIoConfigPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = cameraIoConfigService.getCameraIoConfigPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "预置点位配置.xls", "数据", CameraIoConfigRespVO.class, - BeanUtils.toBean(list, CameraIoConfigRespVO.class)); - } - -} \ No newline at end of file diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigPageReqVO.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigPageReqVO.java deleted file mode 100644 index 9c14dc0..0000000 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigPageReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo; - -import lombok.*; -import io.swagger.v3.oas.annotations.media.Schema; -import cn.iocoder.yudao.framework.common.pojo.PageParam; - -@Schema(description = "管理后台 - 预置点位配置分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class CameraIoConfigPageReqVO extends PageParam { - - @Schema(description = "预置点位code") - private String code; - - @Schema(description = "预置点位名称", example = "赵六") - private String name; - -} \ No newline at end of file diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigRespVO.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigRespVO.java deleted file mode 100644 index ff4a9a4..0000000 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigRespVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import com.alibaba.excel.annotation.*; - -@Schema(description = "管理后台 - 预置点位配置 Response VO") -@Data -@ExcelIgnoreUnannotated -public class CameraIoConfigRespVO { - - @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6144") - @ExcelProperty("id") - private Integer id; - - @Schema(description = "预置点位code") - @ExcelProperty("预置点位code") - private String code; - - @Schema(description = "预置点位名称", example = "赵六") - @ExcelProperty("预置点位名称") - private String name; - -} \ No newline at end of file diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigSaveReqVO.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigSaveReqVO.java deleted file mode 100644 index bf5ec40..0000000 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraioconfig/vo/CameraIoConfigSaveReqVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.iocoder.yudao.module.camera.controller.admin.cameraioconfig.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - -@Schema(description = "管理后台 - 预置点位配置新增/修改 Request VO") -@Data -public class CameraIoConfigSaveReqVO { - - @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6144") - private Integer id; - - @Schema(description = "预置点位code") - private String code; - - @Schema(description = "预置点位名称", example = "赵六") - private String name; - -} \ No newline at end of file diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/CameraDelayTask.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/CameraDelayTask.java index 365367c..1aab6dd 100644 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/CameraDelayTask.java +++ b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/CameraDelayTask.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.camera.lib.camera; +import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,6 +11,7 @@ import java.util.concurrent.TimeUnit; @Data @AllArgsConstructor public class CameraDelayTask implements Delayed { + private CameraDO cameraDO; private Integer cameraId; diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/TaskDelayExecutor.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/TaskDelayExecutor.java index bf2b059..52029c4 100644 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/TaskDelayExecutor.java +++ b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/TaskDelayExecutor.java @@ -1,57 +1,76 @@ package cn.iocoder.yudao.module.camera.lib.camera; -import cn.iocoder.yudao.module.camera.lib.camera.hik.HikControlModuleImpl; +import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO; +import cn.iocoder.yudao.module.camera.service.camera.CameraService; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.concurrent.DelayQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +@Service public class TaskDelayExecutor { private static ExecutorService exec = Executors.newFixedThreadPool(1); private static DelayQueue queue = new DelayQueue<>(); + @Resource + private CameraModFactory cameraModFactory; public static void addMp4DelayTask(Integer cameraId, String path, LocalDateTime startTime, LocalDateTime endTime, Long delayTime) { - CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, startTime, endTime,path, 0,delayTime); + CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, startTime, endTime, path, 0, delayTime); queue.add(cameraDelayTask); } public static void addPicDelayTask(Integer cameraId, String path, Long delayTime) { - CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null,path, 1,delayTime); + CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null, path, 1, delayTime); queue.add(cameraDelayTask); } - public static void addGyrateCameraTask(Integer cameraId, Long delayTime,Integer ptzId){ - CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null,null, 2,delayTime); + public static void addGyrateCameraTask(Integer cameraId, Long delayTime, Integer ptzId) { + CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null, null, 2, delayTime); cameraDelayTask.setPtzId(ptzId); queue.add(cameraDelayTask); } - public static void runMp4DownloadExecutor(){ - exec.execute(new Consumer()); + @Resource + private CameraService cameraService; + + @PostConstruct + public void runMp4DownloadExecutor() { + + exec.execute(new Consumer(cameraModFactory, cameraService)); } private static class Consumer implements Runnable { + private CameraModFactory cameraModFactory; + private CameraService cameraService; + + Consumer(CameraModFactory cameraModFactory, CameraService cameraService) { + this.cameraModFactory = cameraModFactory; + this.cameraService = cameraService; + } @Override public void run() { while (true) { try { - CameraModule cameraControlModule = new HikControlModuleImpl(); CameraDelayTask cameraDelayTask = queue.take(); - if(cameraDelayTask != null){ - - if(cameraDelayTask.getType() == 0){ + if (cameraDelayTask != null) { + CameraDO cameraDO = cameraService.getCamera(cameraDelayTask.getCameraId()); + CameraModule cameraControlModule = cameraModFactory.get(cameraDO.getType()); + if (cameraDelayTask.getType() == 0) { cameraControlModule.downloadMp4(cameraDelayTask.getCameraId(), cameraDelayTask.getPath(), cameraDelayTask.getStartTime(), cameraDelayTask.getEndTime()); - }else if(cameraDelayTask.getType() == 1){ - cameraControlModule.pic(cameraDelayTask.getCameraId(),0, cameraDelayTask.getPath()); - }else if(cameraDelayTask.getType() == 2){ - cameraControlModule.toPtz(cameraDelayTask.getPtzId(),cameraDelayTask.getCameraId()); + } else if (cameraDelayTask.getType() == 1) { + cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath()); + } else if (cameraDelayTask.getType() == 2) { + cameraControlModule.toPtz(cameraDelayTask.getPtzId(), cameraDelayTask.getCameraId()); } - } + } } catch (InterruptedException e) { e.printStackTrace(); diff --git a/yudao-module-logistics/yudao-module-logistics-biz/pom.xml b/yudao-module-logistics/yudao-module-logistics-biz/pom.xml index 80b48c5..4fc80e3 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/pom.xml +++ b/yudao-module-logistics/yudao-module-logistics-biz/pom.xml @@ -171,6 +171,12 @@ yudao-module-camera-biz 2.0.1-snapshot + + cn.iocoder.boot + yudao-module-logistics-api + 2.0.1-snapshot + compile + diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/ScanCodeType/ScanCodeType.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/ScanCodeType/ScanCodeType.java new file mode 100644 index 0000000..48452f7 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/ScanCodeType/ScanCodeType.java @@ -0,0 +1,18 @@ +package ScanCodeType; + +public enum ScanCodeType { + SCANNING_GUN("1","scanning_gun"), + SCANNING_RFID("2","scanning_rfid"), + SCANNING_YOLO("3","scanning_yolo"), + SCANNING_PCD("4","scanning_pcd"); + private String code; + private String desc; + ScanCodeType(String code,String desc){ + this.code = code; + this.desc = desc; + } + + public String getCode() { + return code; + } +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java index 9698bfd..bfaf778 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/cameraio/CameraIoController.java @@ -9,8 +9,12 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoPageReqVO; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoRespVO; import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoSaveReqVO; +import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO; import cn.iocoder.yudao.module.camera.dal.dataobject.cameraio.CameraIoDO; +import cn.iocoder.yudao.module.camera.lib.camera.CameraModFactory; +import cn.iocoder.yudao.module.camera.service.camera.CameraService; import cn.iocoder.yudao.module.camera.service.cameraio.CameraIoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -36,34 +40,83 @@ public class CameraIoController { @Resource private CameraIoService cameraIoService; + @Resource + private CameraModFactory cameraModFactory; + + + @Resource + private CameraService cameraService; + @PostMapping("/create") @Operation(summary = "创建相机预置点位") - @PreAuthorize("@ss.hasPermission('logistics:camera-io:create')") + @PreAuthorize("@ss.hasPermission('camera:camera-io:create')") public CommonResult createCameraIo(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { + List list = cameraIoService.list(new QueryWrapper() + .eq("camera_id", createReqVO.getCameraId())); + Integer ptzId = list.stream().map(CameraIoDO::getPtzId).max(Integer::compareTo).orElse(0)+1; + createReqVO.setPtzId(ptzId); + int i= cameraIoService.createCameraIo(createReqVO); + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId()); + + return success(i); + } + + @PostMapping("/callPtz") + @Operation(summary = "调用预置点位") + @PreAuthorize("@ss.hasPermission('camera:camera-io:callPtz')") + public CommonResult callPtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { + + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).toPtz(createReqVO.getPtzId(),createReqVO.getCameraId()); return success(cameraIoService.createCameraIo(createReqVO)); } - @PutMapping("/update") - @Operation(summary = "更新相机预置点位") - @PreAuthorize("@ss.hasPermission('logistics:camera-io:update')") - public CommonResult updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) { - cameraIoService.updateCameraIo(updateReqVO); - return success(true); + /** + * 创建或覆盖相机预置点位 必须穿ptzId + * @param createReqVO + * @return + */ + @PostMapping("/overwritePtz") + @Operation(summary = "创建或覆盖相机预置点位") + @PreAuthorize("@ss.hasPermission('camera:camera-io:overwritePtz')") + public CommonResult overwritePtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) { + CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId()); + cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId()); + return success(cameraIoService.createCameraIo(createReqVO)); + } + + @PostMapping("/list") + @Operation(summary = "获得相机预置点位分页") + @PreAuthorize("@ss.hasPermission('camera:camera-io:query')") + public CommonResult> list(@Valid @RequestBody CameraIoPageReqVO pageReqVO) { + List pageResult = cameraIoService.list(new QueryWrapper() + .eq("camera_id", pageReqVO.getCameraId()) + .orderByAsc("id")); + return success(BeanUtils.toBean(pageResult, CameraIoRespVO.class)); } @DeleteMapping("/delete") @Operation(summary = "删除相机预置点位") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('logistics:camera-io:delete')") + @PreAuthorize("@ss.hasPermission('camera:camera-io:delete')") public CommonResult deleteCameraIo(@RequestParam("id") Integer id) { cameraIoService.deleteCameraIo(id); return success(true); } + @PutMapping("/update") + @Operation(summary = "更新相机预置点位") + @PreAuthorize("@ss.hasPermission('camera:camera-io:update')") + public CommonResult updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) { + cameraIoService.updateCameraIo(updateReqVO); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得相机预置点位") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('logistics:camera-io:query')") + @PreAuthorize("@ss.hasPermission('camera:camera-io:query')") public CommonResult getCameraIo(@RequestParam("id") Integer id) { CameraIoDO cameraIo = cameraIoService.getCameraIo(id); return success(BeanUtils.toBean(cameraIo, CameraIoRespVO.class)); @@ -71,7 +124,7 @@ public class CameraIoController { @GetMapping("/page") @Operation(summary = "获得相机预置点位分页") - @PreAuthorize("@ss.hasPermission('logistics:camera-io:query')") + @PreAuthorize("@ss.hasPermission('camera:camera-io:query')") public CommonResult> getCameraIoPage(@Valid CameraIoPageReqVO pageReqVO) { PageResult pageResult = cameraIoService.getCameraIoPage(pageReqVO); return success(BeanUtils.toBean(pageResult, CameraIoRespVO.class)); @@ -79,15 +132,14 @@ public class CameraIoController { @GetMapping("/export-excel") @Operation(summary = "导出相机预置点位 Excel") - @PreAuthorize("@ss.hasPermission('logistics:camera-io:export')") + @PreAuthorize("@ss.hasPermission('camera:camera-io:export')") @ApiAccessLog(operateType = EXPORT) public void exportCameraIoExcel(@Valid CameraIoPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = cameraIoService.getCameraIoPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "相机预置点位.xls", "数据", CameraIoRespVO.class, - BeanUtils.toBean(list, CameraIoRespVO.class)); + BeanUtils.toBean(list, CameraIoRespVO.class)); } - } \ No newline at end of file diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/checklog/CheckLogController.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/checklog/CheckLogController.java index 3866676..983c714 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/checklog/CheckLogController.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/checklog/CheckLogController.java @@ -11,6 +11,8 @@ import cn.iocoder.yudao.module.camera.controller.admin.checklog.vo.CheckLogRespV import cn.iocoder.yudao.module.camera.controller.admin.checklog.vo.CheckLogSaveReqVO; import cn.iocoder.yudao.module.camera.dal.dataobject.checklog.CheckLogDO; import cn.iocoder.yudao.module.camera.service.checklog.CheckLogService; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -68,13 +71,27 @@ public class CheckLogController { CheckLogDO checkLog = checkLogService.getCheckLog(id); return success(BeanUtils.toBean(checkLog, CheckLogRespVO.class)); } +@Resource + private DictDataService dictDataService; + + @PostMapping("/getColumns") + @Operation(summary = "获得盘点类型") + @PreAuthorize("@ss.hasPermission('logistics:check-log:query')") + public CommonResult> getColumns() { + + Map dictDataList = dictDataService.getDictDataList("scan_conf"); + List dictDataDOS = dictDataList.values().stream().filter(dictDataDO -> !dictDataDO.getValue().equals("0")).toList(); + + return success(dictDataDOS); + } + @GetMapping("/page") @Operation(summary = "获得盘点分页") @PreAuthorize("@ss.hasPermission('logistics:check-log:query')") - public CommonResult> getCheckLogPage(@Valid CheckLogPageReqVO pageReqVO) { + public CommonResult> getCheckLogPage(@Valid CheckLogPageReqVO pageReqVO) { PageResult pageResult = checkLogService.getCheckLogPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, CheckLogRespVO.class)); + return success(pageResult); } @GetMapping("/export-excel") diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/order/vo/OrderRespVO.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/order/vo/OrderRespVO.java index a004297..5cdb3ff 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/order/vo/OrderRespVO.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/order/vo/OrderRespVO.java @@ -69,6 +69,12 @@ public class OrderRespVO { @ExcelProperty("入列") private Integer toColumn; + @Schema(description = "视频1") + private String videoPath2 ; + + @Schema(description = "视频1") + private String videoPath1 ; + @Schema(description = "出库内外") @ExcelProperty("出库内外") private Integer toSeparation; diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/stock/StockController.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/stock/StockController.java index 861a47c..898343d 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/stock/StockController.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/stock/StockController.java @@ -10,8 +10,18 @@ import cn.iocoder.yudao.module.camera.controller.admin.stock.vo.StockPageReqVO; import cn.iocoder.yudao.module.camera.controller.admin.stock.vo.StockRespVO; import cn.iocoder.yudao.module.camera.controller.admin.stock.vo.StockSaveReqVO; import cn.iocoder.yudao.module.camera.controller.admin.stock.vo.StockStreetList; +import cn.iocoder.yudao.module.camera.dal.dataobject.checklog.CheckLogDO; +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; import cn.iocoder.yudao.module.camera.dal.dataobject.stock.StockDO; +import cn.iocoder.yudao.module.camera.dal.entity.ScanData; +import cn.iocoder.yudao.module.camera.dal.entity.ScanStatus; +import cn.iocoder.yudao.module.camera.service.checklog.CheckLogService; +import cn.iocoder.yudao.module.camera.service.plc.PLCServiceImpl; +import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService; import cn.iocoder.yudao.module.camera.service.stock.StockService; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import cn.iocoder.yudao.module.system.service.dict.DictDataService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,7 +33,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -82,6 +95,116 @@ public class StockController { return success(stock); } + + @Resource + private DictDataService dictDataService; + @PostMapping("/getStreetStatus") + @Operation(summary = "获得巷道所有盘点状态") + //@Parameter(name = "id", description = "巷道id", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('logistics:stock:getStreetList')") + public CommonResult> getStreetStatus(@RequestBody ScanData scanData) { + List stockStreetList = stockService.list(new QueryWrapper() + .eq("street_Id", scanData.getStreetId()) + .eq("direction", scanData.getDirection())); + Map dictValueMap = dictDataService.getDictValueMap("check_status"); + List scanDataList = BeanUtils.toBean(stockStreetList, ScanData.class); + for (ScanData scan:scanDataList){ + scan.setColour(dictValueMap.get(String.valueOf(scan.getStatus())).getColorType()); + scan.setStatusString(dictValueMap.get(String.valueOf(scan.getStatus())).getLabel()); + } + + return success(scanDataList); + } + @Resource + CheckLogService checkLogService; + + @Resource + URLResourcesService urlResourcesService; + @PostMapping("/getStockStatus") + @Operation(summary = "获得盘点状态") + //@Parameter(name = "id", description = "巷道id", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('logistics:stock:getStreetList')") + public CommonResult getStockStatus(@RequestBody ScanData scanData) { + ScanData scan = null; + + Map dictValueMap = dictDataService.getDictValueMap("check_status"); + Map scanConf = dictDataService.getDictDataList("scan_conf"); + + if (scanData.getCheckLogId() != null) { + CheckLogDO checkLogDO = checkLogService.getById(scanData.getCheckLogId()); + + scan = BeanUtils.toBean(checkLogDO, ScanData.class); + + List urlResourcesDos = urlResourcesService.list(new QueryWrapper().eq("uuid", checkLogDO.getPic())); + scan.setImages(urlResourcesDos); + + + }else if (scanData.getStockId() != null){ + StockDO stockDOS = stockService.getById(scanData.getStockId()); + + scan = BeanUtils.toBean(stockDOS, ScanData.class); + List urlResourcesDos = urlResourcesService.list(new QueryWrapper().eq("uuid", stockDOS.getCheckPic())); + scan.setImages(urlResourcesDos); + } + List scanStatuses = new ArrayList<>(); + // 获取字典值 + ScanData finalScan = scan; + for (DictDataDO v:scanConf.values()){ + if (!v.getValue().equals("0")){ + + ScanStatus scanStatus = BeanUtils.toBean(v, ScanStatus.class); + + try { + String wmsType = "wms" + PLCServiceImpl.capitalize(v.getLabel()); + + Field dictCode = ScanStatus.class.getDeclaredField("code"); + Field dictWmsCode = ScanStatus.class.getDeclaredField("wmsCode"); + + Field scanCode = getFieldFromHierarchy(finalScan.getClass(), v.getLabel()); + Field scanWmsCode = getFieldFromHierarchy(finalScan.getClass(), wmsType); + + if (scanCode != null && scanWmsCode != null) { + dictCode.setAccessible(true); + dictWmsCode.setAccessible(true); + scanCode.setAccessible(true); + scanWmsCode.setAccessible(true); + + dictCode.set(scanStatus, scanCode.get(finalScan)); + dictWmsCode.set(scanStatus, scanWmsCode.get(finalScan)); + } else { + System.out.println("Fields not found in the hierarchy."); + } + + // 打印 ScanStatus 的字段值 + System.out.println("ScanStatus Code: " + dictCode.get(scanStatus)); + System.out.println("ScanStatus WMS Code: " + dictWmsCode.get(scanStatus)); + + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + scanStatuses.add(scanStatus); + } + }; + if (scan != null) { + scan.setScan(scanStatuses); + scan.setColour(dictValueMap.get(String.valueOf(scan.getStatus())).getColorType()); + scan.setStatusString(dictValueMap.get(String.valueOf(scan.getStatus())).getLabel()); + } + return success(scan); + } + + public static Field getFieldFromHierarchy(Class clazz, String fieldName) { + while (clazz != null) { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + return null; + } @GetMapping("/page") @Operation(summary = "获得盘点状态分页") @PreAuthorize("@ss.hasPermission('logistics:stock:query')") diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/street/StreetController.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/street/StreetController.java index 64d14a2..05f6845 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/street/StreetController.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/controller/admin/street/StreetController.java @@ -158,7 +158,7 @@ public class StreetController { public CommonResult closeLightSource(){ List list = lightSourceService.list(); for(LightSourceDO lightSourceDO : list){ - LightFactory.LightController(lightSourceDO,1); + LightFactory.LightController(lightSourceDO,0); } return success("开启全部光源"); @@ -181,7 +181,7 @@ public class StreetController { public CommonResult closeStreetLightSource(@PathVariable Integer streetId){ List list = streetService.getLightSourceListByStreetId(streetId); for(LightSourceDO lightSourceDO : list){ - LightFactory.LightController(lightSourceDO,1); + LightFactory.LightController(lightSourceDO,0); } return success("开启全部光源"); diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/checklog/CheckLogDO.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/checklog/CheckLogDO.java index 37b8fdf..4ecae9f 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/checklog/CheckLogDO.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/checklog/CheckLogDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.camera.dal.dataobject.checklog; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -9,6 +10,7 @@ import lombok.*; import org.glassfish.jaxb.core.v2.TODO; import java.time.LocalDateTime; +import java.util.List; /** * 盘点 DO @@ -62,10 +64,6 @@ public class CheckLogDO extends BaseDO { * 托盘码 */ private String trayCode; - /* - * 货位码 - */ - private String storageCode; /** * wms托盘码 */ @@ -77,7 +75,8 @@ public class CheckLogDO extends BaseDO { /** * 数量 */ - private Short count; + private String count; + /** * 状态 * @@ -98,6 +97,9 @@ public class CheckLogDO extends BaseDO { private Integer streetId; @TableField(exist = false) private String streetName; + + @TableField(exist = false) + private List urlResources; /** * 修改时间 */ @@ -122,7 +124,7 @@ public class CheckLogDO extends BaseDO { /** * 上位数量 */ - private Short wmsCount; + private String wmsCount; /** * 视觉盘点状态 */ diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/resources/URLResourcesDo.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/resources/URLResourcesDo.java new file mode 100644 index 0000000..423d597 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/resources/URLResourcesDo.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.camera.dal.dataobject.resources; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import org.glassfish.jaxb.core.v2.TODO; + +/** + * 相机 DO + * + * @author 芋道源码 + */ +@TableName("logistics_url_resources") +@KeySequence("logistics_camera_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class URLResourcesDo extends BaseDO { + /* + * id + */ + @TableId + private Integer id; + /** + * 名称 + */ + private String url; + /** + * 类型 + * + * 枚举 {@link TODO camera_type 对应的类} + */ + private String uuid; + /** + * ip + */ + private String type; + /** + * 端口 + */ + private String little; +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/stock/StockDO.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/stock/StockDO.java index 71e5b2a..93bea52 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/stock/StockDO.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/dataobject/stock/StockDO.java @@ -58,7 +58,7 @@ public class StockDO extends BaseDO { * 扫描数量 */ @TableField(value = "`count`") - private Integer count; + private String count; /** * WMS系统中的条码 */ @@ -70,7 +70,7 @@ public class StockDO extends BaseDO { /** * WMS数量 */ - private Integer wmsCount; + private String wmsCount; /** * wms托盘码 */ diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanData.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanData.java new file mode 100644 index 0000000..96c9b7b --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanData.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.camera.dal.entity; + +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; +import cn.iocoder.yudao.module.camera.dal.dataobject.stock.StockDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ScanData extends StockDO { + private Long id; + private LocalDateTime createTime; + private Integer stockId; + private Integer checkLogId; + private String code; + private String trayCode; + + private Integer direction; + private String ip; + private Integer port; + private String statusString; + private String colour; + private DictDataDO dictDataDO; + + private String uuid; + private String statusVisionString; + private List scan; + private List images; + + // Getters and Setters (if needed) +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanStatus.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanStatus.java new file mode 100644 index 0000000..2f21777 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/entity/ScanStatus.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.camera.dal.entity; + +import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; +import lombok.Data; + +@Data +public class ScanStatus extends DictDataDO { + private String code; + + private String title; + private Integer status; + private String wmsCode; + +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/checklog/CheckLogMapper.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/checklog/CheckLogMapper.java index 941fe74..2312624 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/checklog/CheckLogMapper.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/checklog/CheckLogMapper.java @@ -25,7 +25,7 @@ public interface CheckLogMapper extends BaseMapperX { .eqIfPresent(CheckLogDO::getDirection, reqVO.getDirection()) .eqIfPresent(CheckLogDO::getSide, reqVO.getSide()) .eqIfPresent(CheckLogDO::getStatus, reqVO.getStatus()) - .eqIfPresent(CheckLogDO::getStorageCode, reqVO.getStoragCode()) + .orderByDesc(CheckLogDO::getId)); } diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/resources/URLResourcesMapper.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/resources/URLResourcesMapper.java new file mode 100644 index 0000000..02e8629 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/dal/mysql/resources/URLResourcesMapper.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.camera.dal.mysql.resources; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface URLResourcesMapper extends BaseMapperX { + +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/framework/netty/ksec/KsecDataInfo.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/framework/netty/ksec/KsecDataInfo.java index fca2e37..716e0a8 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/framework/netty/ksec/KsecDataInfo.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/framework/netty/ksec/KsecDataInfo.java @@ -39,11 +39,11 @@ public class KsecDataInfo { private String trayCode; - private String typeNum; + private String category; + + private String count; - private Integer quantity; - private Integer checkRlt; /** * 盘点批次号 diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/checklog/CheckLogServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/checklog/CheckLogServiceImpl.java index e0d4ee2..1c7051c 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/checklog/CheckLogServiceImpl.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/checklog/CheckLogServiceImpl.java @@ -5,15 +5,20 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.camera.controller.admin.checklog.vo.CheckLogPageReqVO; import cn.iocoder.yudao.module.camera.controller.admin.checklog.vo.CheckLogSaveReqVO; import cn.iocoder.yudao.module.camera.dal.dataobject.checklog.CheckLogDO; +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; import cn.iocoder.yudao.module.camera.dal.dataobject.street.StreetDO; import cn.iocoder.yudao.module.camera.dal.mysql.checklog.CheckLogMapper; +import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService; import cn.iocoder.yudao.module.camera.service.street.StreetService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.CHECK_LOG_NOT_EXISTS; @@ -68,18 +73,19 @@ public class CheckLogServiceImpl extends ServiceImpl return checkLogMapper.selectById(id); } + @Resource + private URLResourcesService urlResourcesService; @Override public PageResult getCheckLogPage(CheckLogPageReqVO pageReqVO) { List streetDOS = streetService.list(); + PageResult checkLogDOPageResult = checkLogMapper.selectPage(pageReqVO); + Map streetMap = streetDOS.stream().collect(Collectors.toMap(StreetDO::getId,StreetDO::getName)); //记录巷道名 for (CheckLogDO checkLogDO : checkLogDOPageResult.getList()){ - for (StreetDO streetDO:streetDOS){ - if (checkLogDO.getStreetId()==streetDO.getId()){ - checkLogDO.setStreetName(streetDO.getName()); - break; - } - } + List urlResources = urlResourcesService.list(new QueryWrapper().eq("uuid", checkLogDO.getPic())); + checkLogDO.setUrlResources(urlResources); + checkLogDO.setStreetName(streetMap.get(checkLogDO.getStreetId())); } return checkLogDOPageResult; } diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/order/OrderServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/order/OrderServiceImpl.java index e380632..ff2e7ec 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/order/OrderServiceImpl.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/order/OrderServiceImpl.java @@ -77,8 +77,8 @@ public class OrderServiceImpl implements OrderService { .eq("street_id",streetDo.getId()) .eq("side",orderDO.getFromSide()) .eq("direction",orderDO.getFromDirection()) - .eq("column",orderDO.getFromColumn()) - .eq("row",orderDO.getFromRow()) + .eq("`column`",orderDO.getFromColumn()) + .eq("`row`",orderDO.getFromRow()) .eq("separation",orderDO.getFromSeparation()) ); if(stockDoc==null){ diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/AsyncExample.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/AsyncExample.java new file mode 100644 index 0000000..d7e042b --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/AsyncExample.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.camera.service.plc;import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class AsyncExample { + + public static void main(String[] args) throws ExecutionException, InterruptedException { + + // 启动异步任务1 + CompletableFuture future1 = CompletableFuture.runAsync(() -> { + // 任务1逻辑 + method1(); + }).thenRun(() -> { + // 任务1完成后的操作 + System.out.println("Method 1 has completed, now performing next operation."); + }); + + // 启动异步任务2 + CompletableFuture future2 = CompletableFuture.runAsync(() -> { + // 任务2逻辑 + method2(); + }).thenRun(() -> { + // 任务2完成后的操作 + System.out.println("Method 2 has completed, now performing next operation."); + }); + + // 启动异步任务3 + CompletableFuture future3 = CompletableFuture.runAsync(() -> { + // 任务3逻辑 + method3(); + }).thenRun(() -> { + // 任务3完成后的操作 + System.out.println("Method 3 has completed, now performing next operation."); + }); + + // 等待所有任务完成 + CompletableFuture.allOf(future1, future2, future3).join(); + } + + private static void method1() { + try { + Thread.sleep(3000); // 模拟延迟 + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Executing method 1."); + } + + private static void method2() { + try { + Thread.sleep(1500); // 模拟延迟 + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Executing method 2."); + } + + private static void method3() { + try { + Thread.sleep(2000); // 模拟延迟 + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Executing method 3."); + } +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/PLCServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/PLCServiceImpl.java index f8c961d..b649711 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/PLCServiceImpl.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/plc/PLCServiceImpl.java @@ -4,11 +4,14 @@ import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO; import cn.iocoder.yudao.module.camera.dal.dataobject.cameraio.CameraIoDO; import cn.iocoder.yudao.module.camera.dal.dataobject.checklog.CheckLogDO; import cn.iocoder.yudao.module.camera.dal.dataobject.order.OrderDO; +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; import cn.iocoder.yudao.module.camera.dal.dataobject.stock.StockDO; import cn.iocoder.yudao.module.camera.dal.dataobject.stocklog.StockLogDO; import cn.iocoder.yudao.module.camera.dal.dataobject.street.StreetDO; import cn.iocoder.yudao.module.camera.dal.entity.KescEntity; +import cn.iocoder.yudao.module.camera.dal.entity.ScanData; +import cn.iocoder.yudao.module.camera.dal.mysql.checklog.CheckLogMapper; import cn.iocoder.yudao.module.camera.dal.mysql.order.OrderMapper; import cn.iocoder.yudao.module.camera.dal.mysql.sensorgun.SensorGunMapper; import cn.iocoder.yudao.module.camera.dal.mysql.stocklog.StockLogMapper; @@ -20,6 +23,8 @@ import cn.iocoder.yudao.module.camera.lib.camera.TaskDelayExecutor; import cn.iocoder.yudao.module.camera.service.camera.CameraService; import cn.iocoder.yudao.module.camera.service.cameraio.CameraIoService; import cn.iocoder.yudao.module.camera.service.checklog.CheckLogService; +import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService; +import cn.iocoder.yudao.module.camera.service.scan.ScanServiceFactory; import cn.iocoder.yudao.module.camera.service.stock.StockService; import cn.iocoder.yudao.module.camera.service.street.StreetService; import cn.iocoder.yudao.module.camera.service.threeInOneCode.ScanningGun; @@ -33,14 +38,18 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.lang.reflect.Field; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.UUID; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicReference; @Service @Slf4j -public class PLCServiceImpl implements PLCService{ +public class PLCServiceImpl implements PLCService { @Resource StreetService streetService; @Resource @@ -60,7 +69,7 @@ public class PLCServiceImpl implements PLCService{ @Resource StockService stockService; @Resource - StockLogMapper stockLogMapper ; + StockLogMapper stockLogMapper; @Resource CheckLogService checkLogService; @@ -78,7 +87,6 @@ public class PLCServiceImpl implements PLCService{ // } - public void gyrateCameraByCode(CameraDO cameraDO, String code) { Integer ptzId = cameraIoService.getOne(new QueryWrapper() .eq("camera_Id", cameraDO.getId()) @@ -88,7 +96,7 @@ public class PLCServiceImpl implements PLCService{ if (ptzId != null && ptzId >= 0) { log.info("gyrate camera by code, code:{},cameraId:{},ptId:{}", code, cameraDO.getId(), ptzId); - cameraModFactory.get(cameraDO.getType()).toPtz(ptzId,cameraDO.getId()); + cameraModFactory.get(cameraDO.getType()).toPtz(ptzId, cameraDO.getId()); } else { log.error("ptz not found ,code:{},cameraId:{}", code, cameraDO.getId()); } @@ -170,77 +178,231 @@ public class PLCServiceImpl implements PLCService{ boolean needCapture = false; String picCmd = dataInfo.getCmdName().substring(0, 2); Integer direction = dataInfo.getFromDirection(); - if ( picCmd.equals("C4") || picCmd.equals("C3")) { + if (picCmd.equals("C4") || picCmd.equals("C3")) { needCapture = true; direction = dataInfo.getToDirection(); - }else if(picCmd.equals("C1") || picCmd.equals("C2") ) { + } else if (picCmd.equals("C1") || picCmd.equals("C2")) { needCapture = true; - }else { - return; + } else { + return; } - KescEntity kescEntity = new KescEntity(); + KescEntity kescEntity = new KescEntity(); kescEntity.setData(dataInfo); // 判断巷道有几个相机 如果只有一个,则调用一个,如果是两个,先判断是否有对拍设置决定那个相机拍摄 - CameraDO camera = getCameraByLeftRight(street,direction); + CameraDO camera = getCameraByLeftRight(street, direction); // 调用预置点位 - gyrateCameraByCode(camera,picCmd); + gyrateCameraByCode(camera, picCmd); int time = Integer.parseInt(dictDataService.parseDictData("camera_conf", "delay_preset_time").getValue()); try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } - if(needCapture){ - String pathSrc = PathUtil.createFileName(dataInfo,street,picCmd,".jpg"); - pathSrc = cameraCapture(camera,false,pathSrc,dictDataService.getDictDataList("camera_conf")); + if (needCapture) { + String pathSrc = PathUtil.createFileName(dataInfo, street, picCmd, ".jpg"); + pathSrc = cameraCapture(camera, false, pathSrc, dictDataService.getDictDataList("camera_conf")); - order.setPics(Strings.hasText(order.getPics())?order.getPics()+";"+pathSrc:pathSrc); + order.setPics(Strings.hasText(order.getPics()) ? order.getPics() + ";" + pathSrc : pathSrc); orderMapper.updateById(order); } //转向原点位 - gyrateCameraByCode(camera,"C5"); + gyrateCameraByCode(camera, "C5"); } - String cameraCapture(Integer cameraId,String ptz,String path) - { - return ""; - } + @Resource + URLResourcesService urlResourcesService; + @Resource + ScanServiceFactory scanServiceFactory; + ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + // 设置线程最大执行时间,单位为毫秒 + long timeout = 5000; + @Override public void check(KsecDataInfo dataInfo) { + + long startTime = System.currentTimeMillis(); + String uuid = UUID.randomUUID().toString(); + //头部拍照 StreetDO street = streetService.getStreetByPlcId(dataInfo.getSRMNumber()); - //扫码枪 - List sensorGunDOS = sensorGunMapper.selectListByStreetId(street.getId()); - String code = ""; - for (SensorGunDO sensorGunDO :sensorGunDOS){ - if (sensorGunDO.getDirection() == dataInfo.getFromDirection()){ - - int time = Integer.parseInt(dictDataService.parseDictData("sensorFun_conf", "check_sensorFun_scan_time").getValue()); - code = ScanningGun.readOCR(sensorGunDO.getIp(),sensorGunDO.getPort(),"start",time); - } +// 获取记录 + StockDO stock = stockService.getOne( + new QueryWrapper() + .eq("direction", dataInfo.getFromDirection()) + .eq("side", dataInfo.getFromSide()) + .eq("`row`", dataInfo.getFromRow()) + .eq("`column`", dataInfo.getFromColumn()) + .eq("street_id", street.getId()) + .last("limit 1") + ); + + if (stock == null) { + stock = StockDO.builder() + .checkNum(dataInfo.getTaskId()) + .lotnum(dataInfo.getLotnum()) + .streetId(street.getId()) + .direction(dataInfo.getFromDirection()) + .side(dataInfo.getFromSide()) + .row(dataInfo.getFromRow()) + .status("0") + .column(dataInfo.getFromColumn()) + .exportTime(LocalDateTime.now()).build(); + } else { + stock.setLotnum(dataInfo.getLotnum()); + stock.setExportTime(LocalDateTime.now()); + stock.setCode(""); + stock.setWmsCode(""); + stock.setTrayCode(""); + stock.setWmsCategory(""); + stock.setCount("0"); + stock.setWmsCount("0"); + stock.setCategory(""); + stock.setWmsTrayCode(""); + stock.setStatus("0"); + stock.setCheckNum(dataInfo.getTaskId()); + } + stock.setCheckPic(uuid); + + //拍照记录 + + String pathSrc = PathUtil.createFileName(dataInfo, street, "E1", ".jpg"); + CameraDO camera = cameraService.getById(dataInfo.getFromDirection() == 1 ? street.getCamera1Id() : street.getCamera2Id()); + pathSrc = cameraCapture(camera, false, pathSrc, dictDataService.getDictDataList("camera_conf")); + urlResourcesService.save(URLResourcesDo.builder().url(pathSrc).uuid(uuid).type("1").little("球机拍照").build()); + +// 先记录正常未盘点情况 + stockService.saveOrUpdate(stock); + //根据扫码配置 获取扫码结果 + Map dictDataList = dictDataService.getDictDataList("scan_conf"); +// 默认正确 + AtomicReference status = new AtomicReference<>("2"); + StockDO finalStock = stock; + List> futures = dictDataList.values().stream() + .filter(dictDataDO -> !dictDataDO.getValue().equals("0")) + .map(dictDataDO -> CompletableFuture.supplyAsync(() -> +// 调用扫码服务,包含图片保存等不进行修改finalStock + scanServiceFactory.scan(dictDataDO.getValue(), street, dataInfo, finalStock) + ).thenApply(result -> { + // 任务完成后,基于返回的结果进行操作 +// 如果有扫码结果,并且扫码结果为假,则修改状态为错误 + // 获取字段对象 + + try { + String wmsType = "wms" + capitalize(dictDataDO.getLabel()); + Field stockField = finalStock.getClass().getDeclaredField(dictDataDO.getLabel()); + Field wmsField = KsecDataInfo.class.getDeclaredField(dictDataDO.getLabel()); + + Field stockWmsField = finalStock.getClass().getDeclaredField(wmsType); + wmsField.setAccessible(true); + stockField.setAccessible(true); + stockWmsField.setAccessible(true); + String wmsCode = (String) wmsField.get(dataInfo); + + if (!result.getCode().equals(wmsCode)) { + status.set("1"); + } + stockField.set(finalStock, result.getCode()); + stockWmsField.set(finalStock, wmsCode); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + status.set("1"); + } + + return result; + } + ).orTimeout(10, TimeUnit.SECONDS) + .exceptionally(ex -> { + if (ex instanceof TimeoutException) { + status.set("1"); + } + return null; + }) + ) + .toList(); + + // 等待所有异步任务完成 + CompletableFuture allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + try { + allOf.get(); // 阻塞直到所有任务完成 + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (ExecutionException e) { + throw new RuntimeException(e); } - //记录 - stockSave(dataInfo,street,code); + + // 打印修改后的对象 + + finalStock.setStatus(status.get()); + +// ScanStatus scanStatus = scanServiceFactory.action(isCheck,code, dataInfo.getCode(), trayCode, dataInfo.getTrayCode()); + + + stockService.saveOrUpdate(finalStock); + checkLog(finalStock); +// StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); +// threadPoolExecutor.execute(stockCheckRunnable); + //还原相机 + long end = System.currentTimeMillis(); + long s = end - startTime; + log.info("time:{}millisecond", s); // //ocr识别 // AlgorithmDelayTask algorithmDelayTask = new AlgorithmDelayTask(dataInfo.getFromDirection(),street.getPlcId() // ,dataInfo.getTaskId(),10000,code,"E1",dataInfo.getFromRow(),dataInfo.getFromColumn()); // getPhotoDelayExecutor.communicationFactory(algorithmDelayTask); } - public void stockSave(KsecDataInfo ksecDataInfo,StreetDO streetDO,String trayCode) { + public static String capitalize(String str) { + if (str == null || str.isEmpty()) { + return str; + } + StringBuilder sb = new StringBuilder(str.length()); + sb.append(Character.toUpperCase(str.charAt(0))); + sb.append(str.substring(1)); + return sb.toString(); + } + + @Resource + CheckLogMapper checkLogMapper; + + public void checkLog(StockDO stock) { + CheckLogDO checkLog = new CheckLogDO(); + checkLog.setCheckNum(stock.getCheckNum()); + checkLog.setPic(stock.getCheckPic()); + checkLog.setStreetId(stock.getStreetId()); + checkLog.setDirection(stock.getDirection()); + checkLog.setSide(stock.getSide()); + checkLog.setCode(stock.getCode()); + checkLog.setWmsCode(stock.getWmsCode()); + checkLog.setStatus(Integer.valueOf(stock.getStatus())); + checkLog.setRow(stock.getRow()); + checkLog.setColumn(stock.getColumn()); + checkLog.setTrayCode(stock.getTrayCode()); + checkLog.setWmsTrayCode(stock.getWmsTrayCode()); + checkLog.setCount(stock.getCount()); + checkLog.setWmsCount(stock.getWmsCount()); + checkLog.setWmsCategory(stock.getWmsCategory()); + checkLog.setCategory(stock.getCategory()); + checkLog.setWmsTrayCode(stock.getWmsTrayCode()); + checkLog.setLotnum(stock.getLotnum()); + checkLog.setCreateTime(LocalDateTime.now()); + checkLogMapper.insert(checkLog); + log.info("checkLogMapper insert"); + } + + public void stockSave(KsecDataInfo ksecDataInfo, StreetDO streetDO, String trayCode) { StockDO stockDO = stockService.getOne(new QueryWrapper() - .eq("street_id",streetDO.getId()) - .eq("direction",ksecDataInfo.getFromDirection()) - .eq("side",ksecDataInfo.getFromSide()) - .eq("`row`",ksecDataInfo.getFromRow()) - .eq("`column`",ksecDataInfo.getFromColumn())); + .eq("street_id", streetDO.getId()) + .eq("direction", ksecDataInfo.getFromDirection()) + .eq("side", ksecDataInfo.getFromSide()) + .eq("`row`", ksecDataInfo.getFromRow()) + .eq("`column`", ksecDataInfo.getFromColumn())); - String cameraType = ksecDataInfo.getSRMNumber()+"-"+ksecDataInfo.getCmdName()+"-"+ksecDataInfo.getToDirection()+"-"+"up"; + String cameraType = ksecDataInfo.getSRMNumber() + "-" + ksecDataInfo.getCmdName() + "-" + ksecDataInfo.getToDirection() + "-" + "up"; if (stockDO == null) { stockDO = StockDO.builder() @@ -254,14 +416,14 @@ public class PLCServiceImpl implements PLCService{ .row(ksecDataInfo.getFromRow()) .column(ksecDataInfo.getFromColumn()) .status("0") - .checkPic("http://"+streetDO.getPlcIp()+":9007/pic/"+ksecDataInfo.getTaskId()+"_"+cameraType+".JPEG;") + .checkPic("http://" + streetDO.getPlcIp() + ":9007/pic/" + ksecDataInfo.getTaskId() + "_" + cameraType + ".JPEG;") .exportTime(LocalDateTime.now()).build(); stockService.save(stockDO); - }else { + } else { stockDO.setStatus("0"); stockDO.setLotnum(ksecDataInfo.getLotnum()); stockDO.setExportTime(LocalDateTime.now()); - stockDO.setCheckPic(ksecDataInfo.getTaskId()+"_"+cameraType); + stockDO.setCheckPic(ksecDataInfo.getTaskId() + "_" + cameraType); stockDO.setCheckNum(ksecDataInfo.getTaskId()); stockDO.setCode(trayCode); stockDO.setWmsCode(trayCode); @@ -289,29 +451,30 @@ public class PLCServiceImpl implements PLCService{ checkLogService.save(checkLog); } + @Override public void stockSave(AlgorithmDelayTask algorithmDelayTask) { StockDO stockDO = stockService.getOne(new QueryWrapper().eq("task_Wms_Id", algorithmDelayTask.getTaskId())); - if (stockDO != null){ + if (stockDO != null) { stockDO.setStorageCode(algorithmDelayTask.getStorageCode()); stockDO.setTrayCode(algorithmDelayTask.getTrayCode()); stockService.updateById(stockDO); } CheckLogDO checkLogDO = checkLogService.getOne(new QueryWrapper().eq("task_Id", algorithmDelayTask.getTaskId())); - if (checkLogDO != null){ - checkLogDO.setStorageCode(algorithmDelayTask.getStorageCode()); + if (checkLogDO != null) { + checkLogDO.setTrayCode(algorithmDelayTask.getTrayCode()); checkLogService.updateById(checkLogDO); } } /* -* + * * 开始工单 robotic plcId是plcId,昆船的plcId是来自包体,即srmNumber * * @param kescEntity -*/ + */ public void orderStart(KsecDataInfo kescEntity) { StreetDO street = streetService.getStreetByPlcId(kescEntity.getSRMNumber()); @@ -361,33 +524,33 @@ public class PLCServiceImpl implements PLCService{ update.setToColumn(ksecDataInfo.getToColumn()); update.setToRow(ksecDataInfo.getToRow()); LocalDateTime endDownLoadTime = endTime.plusSeconds(10); - Duration duration = Duration.between(order.getCreateTime(),endDownLoadTime); + Duration duration = Duration.between(order.getCreateTime(), endDownLoadTime); - if(duration.toMinutes() > 50){ + if (duration.toMinutes() > 50) { endDownLoadTime = order.getCreateTime().plusMinutes(50); } if (street.getCamera1Id() != null) { - String pathSrc = PathUtil.createFileName(ksecDataInfo,street,"B2-1",".jpg"); - String path = cameraVideo(street.getCamera1Id(),pathSrc,order.getCreateTime(),endDownLoadTime,dictDataList); + String pathSrc = PathUtil.createFileName(ksecDataInfo, street, "B2-1", ".mp4"); + String path = cameraVideo(street.getCamera1Id(), pathSrc, order.getCreateTime(), endDownLoadTime, dictDataList); update.setVideoPath1(path); } if (street.getCamera2Id() != null) { - String pathSrc = PathUtil.createFileName(ksecDataInfo,street,"B2-2",".jpg"); - String path = cameraVideo(street.getCamera2Id(),pathSrc,order.getCreateTime(),endDownLoadTime,dictDataList); + String pathSrc = PathUtil.createFileName(ksecDataInfo, street, "B2-2", ".mp4"); + String path = cameraVideo(street.getCamera2Id(), pathSrc, order.getCreateTime(), endDownLoadTime, dictDataList); update.setVideoPath2(path); } orderMapper.updateById(update); } -/** + /** * 工单结束信息 * 判断有没有告警,有告警的不做处理 * 没有告警,且存在未结束工单,修改保存工单信息 * - * @param */ - + * @param + */ public void orderStop(KescEntity kescEntity) { @@ -396,7 +559,7 @@ public class PLCServiceImpl implements PLCService{ if (street == null) { return; } - OrderDO order = orderMapper.selectOne(new QueryWrapper().eq("task_id",kescEntity.getData().getTaskId())); + OrderDO order = orderMapper.selectOne(new QueryWrapper().eq("task_id", kescEntity.getData().getTaskId())); if (order == null) { log.error("订单结束信号,订单不存在,orderNum:{}", kescEntity.getData().getTaskId()); return; @@ -410,45 +573,49 @@ public class PLCServiceImpl implements PLCService{ order.setToRow(kescEntity.getData().getToRow()); //拍照相机id获取 - String cameraType = kescEntity.getData().getSRMNumber()+"-"+kescEntity.getData().getToDirection()+"-"+"up"; + String cameraType = kescEntity.getData().getSRMNumber() + "-" + kescEntity.getData().getToDirection() + "-" + "up"; List sensorGunDOS = sensorGunMapper.selectListByStreetId(street.getId()); //扫码枪校验 String sensorGunCode = ""; - for (SensorGunDO sensorGunDO : sensorGunDOS){ - if (sensorGunDO.getDirection()==kescEntity.getData().getFromDirection()) { + for (SensorGunDO sensorGunDO : sensorGunDOS) { + if (sensorGunDO.getDirection() == kescEntity.getData().getFromDirection()) { int time = Integer.parseInt(dictDataService.parseDictData("sensorFun_conf", "order_sensorFun_scan_time").getValue()); - sensorGunCode = ScanningGun.readOCR(sensorGunDO.getIp(), sensorGunDO.getPort(), "start",time); + sensorGunCode = ScanningGun.readOCR(sensorGunDO.getIp(), sensorGunDO.getPort(), "start", time); } } //拍照i //CheckIntellBlinkChanel.pictures(street.getPlcId(), kescEntity.getData().getTaskId(),cameraType,dictDataService.parseDictData("camera_position", cameraType).getValue()); - AlgorithmDelayTask algorithmDelayTask = new AlgorithmDelayTask(kescEntity.getData().getToDirection(),street.getPlcId() - ,kescEntity.getData().getTaskId(),10000,sensorGunCode,"C3",kescEntity.getData().getToRow(),kescEntity.getData().getToColumn()); + AlgorithmDelayTask algorithmDelayTask = new AlgorithmDelayTask(kescEntity.getData().getToDirection(), street.getPlcId() + , kescEntity.getData().getTaskId(), 10000, sensorGunCode, "C3", kescEntity.getData().getToRow(), kescEntity.getData().getToColumn()); - String picPath = algorithmDelayTask.getSRMNumber()+"-"+algorithmDelayTask.getCmdName()+"-"+algorithmDelayTask.getDirection()+"-"+"up"; + String picPath = algorithmDelayTask.getSRMNumber() + "-" + algorithmDelayTask.getCmdName() + "-" + algorithmDelayTask.getDirection() + "-" + "up"; KsecDataInfo ksecDataInfo = KsecDataInfo.toFrom(kescEntity.getData()); - stockSave(ksecDataInfo,street,sensorGunCode); + stockSave(ksecDataInfo, street, sensorGunCode); getPhotoDelayExecutor.communicationFactory(algorithmDelayTask); - order.setPics(order.getPics()==null?"":order.getPics()+"http://"+street.getPlcIp()+":9007/pic/"+kescEntity.getData().getTaskId()+"_"+picPath+".JPEG;"); + order.setPics(order.getPics() == null ? "" : order.getPics() + "http://" + street.getPlcIp() + ":9007/pic/" + kescEntity.getData().getTaskId() + "_" + picPath + ".JPEG;"); orderMapper.updateById(order); } + @Resource GetPhotoDelayExecutor getPhotoDelayExecutor; @Resource SensorGunMapper sensorGunMapper; + @Resource + TaskDelayExecutor taskDelayExecutor; + - public String cameraVideo(Integer cameraId,String path, LocalDateTime startTime, LocalDateTime endTime,Map map) { + public String cameraVideo(Integer cameraId, String path, LocalDateTime startTime, LocalDateTime endTime, Map map) { Thread thread = new Thread(new Runnable() { @Override public void run() { String realPath = map.get("mp4_path").getValue() + path; - TaskDelayExecutor.addMp4DelayTask(cameraId,realPath,startTime,endTime,Long.valueOf(map.get("delay_mp4_time").getValue())); + TaskDelayExecutor.addMp4DelayTask(cameraId, realPath, startTime, endTime, Long.valueOf(map.get("delay_mp4_time").getValue())); } }); thread.start(); @@ -506,37 +673,38 @@ public class PLCServiceImpl implements PLCService{ // // gyrateCameraByCode(cameraId,"C5"); // } + /** * capture picture by camera * * @Return pic address */ - public String cameraCapture(CameraDO camera, Boolean delay, String path, Map map) { + public String cameraCapture(CameraDO camera, Boolean delay, String path, Map map) { //String path = PathUtil.createFileName("jpg",cameraId); String realPath = map.get("media_path").getValue() + path; - if(delay){ - TaskDelayExecutor.addPicDelayTask(camera.getId(),realPath,Long.valueOf(map.get("delay_capture_time").getValue())); - }else { + if (delay) { + TaskDelayExecutor.addPicDelayTask(camera.getId(), realPath, Long.valueOf(map.get("delay_capture_time").getValue())); + } else { - cameraModFactory.get(camera.getType()).pic(camera.getId(),0,realPath); - log.info("cameraID: {} capture photo :{}", camera.getId(), path); + cameraModFactory.get(camera.getType()).pic(camera.getId(), 0, realPath); + log.info("cameraID: {} capture photo :{}", camera.getId(), realPath); } return path; } - String getPresetString(String code,String picCmd,KsecDataInfo ksecDataInfo){ + String getPresetString(String code, String picCmd, KsecDataInfo ksecDataInfo) { - Integer side=1; - Integer leftRight =1; - if (picCmd.equals("C2") || picCmd.equals("C1") ) { + Integer side = 1; + Integer leftRight = 1; + if (picCmd.equals("C2") || picCmd.equals("C1")) { side = ksecDataInfo.getFromSide(); leftRight = ksecDataInfo.getFromDirection(); - }else { + } else { side = ksecDataInfo.getToSide(); leftRight = ksecDataInfo.getToDirection(); } - return code + (leftRight == 1 ? "-L-" : "-R-")+ (side == 1 ? "" : "-OUT") ; + return code + (leftRight == 1 ? "-L-" : "-R-") + (side == 1 ? "" : "-OUT"); } /** @@ -545,12 +713,12 @@ public class PLCServiceImpl implements PLCService{ * @param orderInfo * @param path */ - public void captureUpdateOrderAndStock(KsecDataInfo orderInfo, String path,Integer streetId) { + public void captureUpdateOrderAndStock(KsecDataInfo orderInfo, String path, Integer streetId) { synchronized (orderInfo.getTaskId().intern()) { OrderDO order = orderMapper.selectOne(new LambdaQueryWrapper().eq(OrderDO::getTaskId, orderInfo.getTaskId())); if (order != null) { //记录送货完成 - if(orderInfo.getCode().startsWith("C4")){ + if (orderInfo.getCode().startsWith("C4")) { StockLogDO stockLog = new StockLogDO(); stockLog.setStreetId(streetId); stockLog.setDirection(orderInfo.getToDirection()); @@ -558,7 +726,7 @@ public class PLCServiceImpl implements PLCService{ stockLog.setRow(orderInfo.getToRow()); stockLog.setColumn(orderInfo.getToColumn()); stockLog.setPic(path); - String type = orderInfo.getCode().substring(1,2); + String type = orderInfo.getCode().substring(1, 2); stockLog.setType(Integer.valueOf(type)); stockLog.setOrderNum(orderInfo.getTaskId()); stockLog.setCreateTime(LocalDateTime.now()); @@ -581,37 +749,34 @@ public class PLCServiceImpl implements PLCService{ } - public CameraDO getCameraByLeftRight(StreetDO street,Integer leftRight) { + public CameraDO getCameraByLeftRight(StreetDO street, Integer leftRight) { Integer cameraId = null; // 如果只有一个相机 - if(street.getCamera1Id() == null || street.getCamera2Id() == null){ - cameraId = street.getCamera1Id() != null? street.getCamera1Id(): street.getCamera2Id(); + if (street.getCamera1Id() == null || street.getCamera2Id() == null) { + cameraId = street.getCamera1Id() != null ? street.getCamera1Id() : street.getCamera2Id(); } // 判断对拍 //获取配置信息 //码位为库 货架号 层 列 Boolean storageCode = Boolean.valueOf(dictDataService.parseDictData("camera_conf", "isOpposite").getValue()); - if (storageCode){ - if(leftRight == 1){ - cameraId = street.getCamera1Id(); - }else { + if (storageCode) { + if (leftRight == 1) { + cameraId = street.getCamera1Id(); + } else { - cameraId = street.getCamera2Id(); + cameraId = street.getCamera2Id(); } - }else { - if(leftRight == 2){ - cameraId = street.getCamera1Id(); - }else { + } else { + if (leftRight == 2) { + cameraId = street.getCamera1Id(); + } else { - cameraId = street.getCamera2Id(); + cameraId = street.getCamera2Id(); } } CameraDO camera = cameraService.getById(cameraId); return camera; } - public static void main(String[] args) { - System.out.println(Boolean.valueOf("t")); - } } diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesService.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesService.java new file mode 100644 index 0000000..7285684 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesService.java @@ -0,0 +1,7 @@ +package cn.iocoder.yudao.module.camera.service.resources; + +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface URLResourcesService extends IService { +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesServiceImpl.java new file mode 100644 index 0000000..18358b7 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/resources/URLResourcesServiceImpl.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.camera.service.resources; + +import cn.iocoder.yudao.module.camera.dal.dataobject.resources.URLResourcesDo; +import cn.iocoder.yudao.module.camera.dal.mysql.resources.URLResourcesMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +@Service +@Validated +public class URLResourcesServiceImpl extends ServiceImpl implements URLResourcesService { + +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/rfid/RFIDSocket.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/rfid/RFIDSocket.java new file mode 100644 index 0000000..74ad067 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/rfid/RFIDSocket.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.camera.service.rfid; + +import lombok.extern.slf4j.Slf4j; + +/** + * sick扫码枪 + */ +@Slf4j +public class RFIDSocket { + +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/OpencvServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/OpencvServiceImpl.java new file mode 100644 index 0000000..da46f5a --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/OpencvServiceImpl.java @@ -0,0 +1,47 @@ +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.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.framework.netty.ksec.KsecDataInfo; +import cn.iocoder.yudao.module.camera.service.resources.URLResourcesService; +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; + +@Slf4j +@Service("opencvService") +public class OpencvServiceImpl implements ScanService { + @Resource + RestTemplate restTemplate; + + @Resource + URLResourcesService urlResourcesService; + + @Override + public ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); +// + ScanData scanData = new ScanData(); + scanData.setCode(dataInfo.getCategory()); + scanData.setIp(streetDO.getPlcIp()); + scanData.setPort(streetDO.getPlcPort()); + scanData.setUuid(stockDO.getCheckPic()); + scanData.setDirection(dataInfo.getFromDirection()); + HttpEntity request = new HttpEntity<>(scanData, headers); + String url = "http://" + streetDO.getPlcIp() + ":" + streetDO.getPlcPort() + "/match/match2D"; + scanData = restTemplate.postForObject(url, request, ScanData.class); + if (scanData != null && scanData.getImages() != null) { + for (URLResourcesDo image:scanData.getImages()){ + urlResourcesService.save(image); + } + } + return scanData; + } +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/PCDServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/PCDServiceImpl.java new file mode 100644 index 0000000..0ec0209 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/PCDServiceImpl.java @@ -0,0 +1,37 @@ +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.camera.framework.netty.ksec.KsecDataInfo; +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; + +@Slf4j +@Service("pcdService") +public class PCDServiceImpl implements ScanService{ + + @Resource + RestTemplate restTemplate; + @Override + public ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); +// + ScanData scanData = new ScanData(); + scanData.setCode(dataInfo.getCategory()); + scanData.setIp(streetDO.getPlcIp()); + scanData.setPort(streetDO.getPlcPort()); + scanData.setUuid(stockDO.getCheckPic()); + scanData.setDirection(dataInfo.getFromDirection()); + HttpEntity request = new HttpEntity<>(scanData, headers); + String url = "http://"+streetDO.getPlcIp()+":"+streetDO.getPlcPort()+"/match/match3D"; + + return restTemplate.postForObject(url, request, ScanData.class); + } +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RFIDScanServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RFIDScanServiceImpl.java new file mode 100644 index 0000000..934a8c9 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/RFIDScanServiceImpl.java @@ -0,0 +1,15 @@ +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.camera.framework.netty.ksec.KsecDataInfo; +import org.springframework.stereotype.Service; + +@Service("rfidScanService") +public class RFIDScanServiceImpl implements ScanService{ + @Override + public ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + return null; + } +} 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 new file mode 100644 index 0000000..1acd0d8 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanGunScanServiceImpl.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.camera.service.scan; + +import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; +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.framework.netty.ksec.KsecDataInfo; +import cn.iocoder.yudao.module.camera.service.sensorgun.SensorGunService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.charset.StandardCharsets; + +@Slf4j +@Service("scanGunScanService") +public class ScanGunScanServiceImpl implements ScanService{ + @Resource + private SensorGunService sensorService; + + public static String readOCR(String ip,int port){ + Socket socket = new Socket(); + String code = "NoRead"; + OutputStream os = null; + InputStream is = null; + try { + socket.connect(new InetSocketAddress(ip,port),3000); + os = socket.getOutputStream(); + is = socket.getInputStream(); + int i = 0; + while ("NoRead".equals(code) && i <= 4){ + writeCmd(os); + code = read(is); + log.info("count:{},ip:{},code:{}",i,ip,code); + if(code!= null){ + code = code.replace("\\n",""); + } + i++; + } + } catch (IOException e) { + log.error("sick time out,ip:{},info:{}",ip,e); + }finally + { + if(os != null){ + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(is != null){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return code; + } + } + + private static void writeCmd(OutputStream os) throws IOException { + String startCmd = "start"; + byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8); + os.write(bytes); + } + + private static String read(InputStream inStream) throws IOException { + BufferedReader bd = new BufferedReader(new InputStreamReader(inStream)); + return bd.readLine(); + } + @Override + public ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + ScanData scanData = new ScanData(); + SensorGunDO sensorGun = sensorService.getOne(new QueryWrapper().eq("street_id", streetDO.getId()).eq("direction", dataInfo.getFromDirection())); + String trayCode = ""; + if (sensorGun == null) { + log.error("no sensor gun config in database ,street id:{},direction:{}", streetDO.getId(), dataInfo.getFromDirection()); + } else { + trayCode = readOCR(sensorGun.getIp(), sensorGun.getPort()); + } + scanData.setCode(trayCode); + return scanData; + } +} 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 new file mode 100644 index 0000000..af81195 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanService.java @@ -0,0 +1,10 @@ +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.camera.framework.netty.ksec.KsecDataInfo; + +public interface ScanService { + ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO); +} 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 new file mode 100644 index 0000000..5e44166 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/ScanServiceFactory.java @@ -0,0 +1,56 @@ +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.camera.framework.netty.ksec.KsecDataInfo; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class ScanServiceFactory { + @Resource + private PCDServiceImpl pcdService; + @Resource + private ScanGunScanServiceImpl scanGunScanService; + @Resource + private RFIDScanServiceImpl rfidScanService; + @Resource + private YoloServiceImpl yoloService; + @Resource + private OpencvServiceImpl opencvService; + + + + public ScanData scan(String type, StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + + switch (type) { + case "0": + return null; + // 扫码枪扫码 + case "1": + return scanGunScanService.scan(streetDO, dataInfo, stockDO); + // RFID扫码 + case "2": + return rfidScanService.scan(streetDO, dataInfo, stockDO); + // 视觉扫码 + case "3": + return yoloService.scan(streetDO, dataInfo, stockDO); + + // 3D扫码 + case "4": + return pcdService.scan(streetDO, dataInfo, stockDO); + + // opencv扫码 + case "5": + return opencvService.scan(streetDO, dataInfo, stockDO); + + // 默认情况处理 + default: + return null; + } + } + +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/YoloServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/YoloServiceImpl.java new file mode 100644 index 0000000..d353d15 --- /dev/null +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/scan/YoloServiceImpl.java @@ -0,0 +1,15 @@ +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.camera.framework.netty.ksec.KsecDataInfo; +import org.springframework.stereotype.Service; + +@Service("yoloService") +public class YoloServiceImpl implements ScanService{ + @Override + public ScanData scan(StreetDO streetDO, KsecDataInfo dataInfo, StockDO stockDO) { + return null; + } +} diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunService.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunService.java index bf9fe2b..c6e37e6 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunService.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunService.java @@ -1,16 +1,18 @@ package cn.iocoder.yudao.module.camera.service.sensorgun; -import jakarta.validation.*; -import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.*; -import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.SensorGunPageReqVO; +import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.SensorGunSaveReqVO; +import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; +import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.Valid; /** * 扫码枪 Service 接口 * * @author 芋道源码 */ -public interface SensorGunService { +public interface SensorGunService extends IService { /** * 创建扫码枪 diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunServiceImpl.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunServiceImpl.java index e54cf9c..ae611fb 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunServiceImpl.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/service/sensorgun/SensorGunServiceImpl.java @@ -1,15 +1,15 @@ package cn.iocoder.yudao.module.camera.service.sensorgun; -import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; - -import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.*; -import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.SensorGunPageReqVO; +import cn.iocoder.yudao.module.camera.controller.admin.sensorgun.vo.SensorGunSaveReqVO; +import cn.iocoder.yudao.module.camera.dal.dataobject.sensorgun.SensorGunDO; import cn.iocoder.yudao.module.camera.dal.mysql.sensorgun.SensorGunMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.SENSOR_GUN_NOT_EXISTS; @@ -21,7 +21,7 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.SENSOR_GUN_ */ @Service @Validated -public class SensorGunServiceImpl implements SensorGunService { +public class SensorGunServiceImpl extends ServiceImpl implements SensorGunService { @Resource private SensorGunMapper sensorGunMapper; diff --git a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/util/PathUtil.java b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/util/PathUtil.java index 21f65f2..d4cbae4 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/util/PathUtil.java +++ b/yudao-module-logistics/yudao-module-logistics-biz/src/main/java/cn/iocoder/yudao/module/camera/util/PathUtil.java @@ -13,58 +13,66 @@ import java.util.Random; @Slf4j public class PathUtil { - private static String getRandomString(int length){ - String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - Random random=new Random(); - StringBuffer sb=new StringBuffer(); - for(int i=0;i { * @return 字典数据全列表 */ Map getDictDataList(@Nullable String dictType); + Map getDictValueMap( String dictType); /** * 获得字典数据分页列表 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index f6be40b..e10d9d2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -56,6 +56,14 @@ public class DictDataServiceImpl extends ServiceImpl } + + @Override + public Map getDictValueMap( String dictType) { + List list = dictDataMapper.selectList( new QueryWrapper().eq("dict_type", dictType)); + Map map = list.stream().collect( + Collectors.toMap(DictDataDO::getValue, v->v)); + return map; + } @Override public Map getDictDataList( String dictType) { List list = dictDataMapper.selectList( new QueryWrapper().eq("dict_type", dictType));