修改查找逻辑

玉溪
LAPTOP-S9HJSOEB\昊天 1 year ago
parent d45d6f8bfe
commit dcd7f260ef

@ -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<Integer> createCameraIo(@Valid @RequestBody CameraIoSaveReqVO createReqVO) {
return success(cameraIoService.createCameraIo(createReqVO));
List<CameraIoDO> list = cameraIoService.list(new QueryWrapper<CameraIoDO>()
.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<Integer> 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<Integer> 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<Boolean> 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<CameraIoRespVO>> list(@Valid CameraIoPageReqVO pageReqVO) {
List<CameraIoDO> pageResult = cameraIoService.list(new QueryWrapper<CameraIoDO>().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<Boolean> updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) {
cameraIoService.updateCameraIo(updateReqVO);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得相机预置点位")

@ -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<Integer> createCameraIoConfig(@Valid @RequestBody CameraIoConfigSaveReqVO createReqVO) {
return success(cameraIoConfigService.createCameraIoConfig(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新预置点位配置")
@PreAuthorize("@ss.hasPermission('logistics:camera-io-config:update')")
public CommonResult<Boolean> 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<Boolean> 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<CameraIoConfigRespVO> 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<PageResult<CameraIoConfigRespVO>> getCameraIoConfigPage(@Valid CameraIoConfigPageReqVO pageReqVO) {
PageResult<CameraIoConfigDO> 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<CameraIoConfigDO> list = cameraIoConfigService.getCameraIoConfigPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "预置点位配置.xls", "数据", CameraIoConfigRespVO.class,
BeanUtils.toBean(list, CameraIoConfigRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;

@ -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<CameraDelayTask> 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();

@ -171,6 +171,12 @@
<artifactId>yudao-module-camera-biz</artifactId>
<version>2.0.1-snapshot</version>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-logistics-api</artifactId>
<version>2.0.1-snapshot</version>
<scope>compile</scope>
</dependency>
</dependencies>

@ -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;
}
}

@ -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<Integer> createCameraIo(@Valid @RequestBody CameraIoSaveReqVO createReqVO) {
List<CameraIoDO> list = cameraIoService.list(new QueryWrapper<CameraIoDO>()
.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<Integer> 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<Boolean> 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<Integer> 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<CameraIoRespVO>> list(@Valid @RequestBody CameraIoPageReqVO pageReqVO) {
List<CameraIoDO> pageResult = cameraIoService.list(new QueryWrapper<CameraIoDO>()
.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<Boolean> deleteCameraIo(@RequestParam("id") Integer id) {
cameraIoService.deleteCameraIo(id);
return success(true);
}
@PutMapping("/update")
@Operation(summary = "更新相机预置点位")
@PreAuthorize("@ss.hasPermission('camera:camera-io:update')")
public CommonResult<Boolean> 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<CameraIoRespVO> 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<PageResult<CameraIoRespVO>> getCameraIoPage(@Valid CameraIoPageReqVO pageReqVO) {
PageResult<CameraIoDO> 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<CameraIoDO> list = cameraIoService.getCameraIoPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "相机预置点位.xls", "数据", CameraIoRespVO.class,
BeanUtils.toBean(list, CameraIoRespVO.class));
BeanUtils.toBean(list, CameraIoRespVO.class));
}
}

@ -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<List<DictDataDO>> getColumns() {
Map<String, DictDataDO> dictDataList = dictDataService.getDictDataList("scan_conf");
List<DictDataDO> 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<PageResult<CheckLogRespVO>> getCheckLogPage(@Valid CheckLogPageReqVO pageReqVO) {
public CommonResult<PageResult<CheckLogDO>> getCheckLogPage(@Valid CheckLogPageReqVO pageReqVO) {
PageResult<CheckLogDO> pageResult = checkLogService.getCheckLogPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, CheckLogRespVO.class));
return success(pageResult);
}
@GetMapping("/export-excel")

@ -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;

@ -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<List<ScanData>> getStreetStatus(@RequestBody ScanData scanData) {
List<StockDO> stockStreetList = stockService.list(new QueryWrapper<StockDO>()
.eq("street_Id", scanData.getStreetId())
.eq("direction", scanData.getDirection()));
Map<String, DictDataDO> dictValueMap = dictDataService.getDictValueMap("check_status");
List<ScanData> 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<ScanData> getStockStatus(@RequestBody ScanData scanData) {
ScanData scan = null;
Map<String, DictDataDO> dictValueMap = dictDataService.getDictValueMap("check_status");
Map<String, DictDataDO> scanConf = dictDataService.getDictDataList("scan_conf");
if (scanData.getCheckLogId() != null) {
CheckLogDO checkLogDO = checkLogService.getById(scanData.getCheckLogId());
scan = BeanUtils.toBean(checkLogDO, ScanData.class);
List<URLResourcesDo> urlResourcesDos = urlResourcesService.list(new QueryWrapper<URLResourcesDo>().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<URLResourcesDo> urlResourcesDos = urlResourcesService.list(new QueryWrapper<URLResourcesDo>().eq("uuid", stockDOS.getCheckPic()));
scan.setImages(urlResourcesDos);
}
List<ScanStatus> 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')")

@ -158,7 +158,7 @@ public class StreetController {
public CommonResult<String> closeLightSource(){
List<LightSourceDO> 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<String> closeStreetLightSource(@PathVariable Integer streetId){
List<LightSourceDO> list = streetService.getLightSourceListByStreetId(streetId);
for(LightSourceDO lightSourceDO : list){
LightFactory.LightController(lightSourceDO,1);
LightFactory.LightController(lightSourceDO,0);
}
return success("开启全部光源");

@ -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<URLResourcesDo> urlResources;
/**
*
*/
@ -122,7 +124,7 @@ public class CheckLogDO extends BaseDO {
/**
*
*/
private Short wmsCount;
private String wmsCount;
/**
*
*/

@ -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;
}

@ -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
*/

@ -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<ScanStatus> scan;
private List<URLResourcesDo> images;
// Getters and Setters (if needed)
}

@ -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;
}

@ -25,7 +25,7 @@ public interface CheckLogMapper extends BaseMapperX<CheckLogDO> {
.eqIfPresent(CheckLogDO::getDirection, reqVO.getDirection())
.eqIfPresent(CheckLogDO::getSide, reqVO.getSide())
.eqIfPresent(CheckLogDO::getStatus, reqVO.getStatus())
.eqIfPresent(CheckLogDO::getStorageCode, reqVO.getStoragCode())
.orderByDesc(CheckLogDO::getId));
}

@ -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<URLResourcesDo> {
}

@ -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;
/**
*

@ -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<CheckLogMapper, CheckLogDO>
return checkLogMapper.selectById(id);
}
@Resource
private URLResourcesService urlResourcesService;
@Override
public PageResult<CheckLogDO> getCheckLogPage(CheckLogPageReqVO pageReqVO) {
List<StreetDO> streetDOS = streetService.list();
PageResult<CheckLogDO> checkLogDOPageResult = checkLogMapper.selectPage(pageReqVO);
Map<Integer,String> 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<URLResourcesDo> urlResources = urlResourcesService.list(new QueryWrapper<URLResourcesDo>().eq("uuid", checkLogDO.getPic()));
checkLogDO.setUrlResources(urlResources);
checkLogDO.setStreetName(streetMap.get(checkLogDO.getStreetId()));
}
return checkLogDOPageResult;
}

@ -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){

@ -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<Void> future1 = CompletableFuture.runAsync(() -> {
// 任务1逻辑
method1();
}).thenRun(() -> {
// 任务1完成后的操作
System.out.println("Method 1 has completed, now performing next operation.");
});
// 启动异步任务2
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
// 任务2逻辑
method2();
}).thenRun(() -> {
// 任务2完成后的操作
System.out.println("Method 2 has completed, now performing next operation.");
});
// 启动异步任务3
CompletableFuture<Void> 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.");
}
}

@ -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<CameraIoDO>()
.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<SensorGunDO> 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<StockDO>()
.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<String, DictDataDO> dictDataList = dictDataService.getDictDataList("scan_conf");
// 默认正确
AtomicReference<String> status = new AtomicReference<>("2");
StockDO finalStock = stock;
List<CompletableFuture<ScanData>> 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<Void> 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<StockDO>()
.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<StockDO>().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<CheckLogDO>().eq("task_Id", algorithmDelayTask.getTaskId()));
if (checkLogDO != null){
checkLogDO.setStorageCode(algorithmDelayTask.getStorageCode());
if (checkLogDO != null) {
checkLogDO.setTrayCode(algorithmDelayTask.getTrayCode());
checkLogService.updateById(checkLogDO);
}
}
/*
*
*
* robotic plcIdplcId,plcIdsrmNumber
*
* @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<OrderDO>().eq("task_id",kescEntity.getData().getTaskId()));
OrderDO order = orderMapper.selectOne(new QueryWrapper<OrderDO>().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<SensorGunDO> 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<String, DictDataDO> map) {
public String cameraVideo(Integer cameraId, String path, LocalDateTime startTime, LocalDateTime endTime, Map<String, DictDataDO> 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<String,DictDataDO> map) {
public String cameraCapture(CameraDO camera, Boolean delay, String path, Map<String, DictDataDO> 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<OrderDO>().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"));
}
}

@ -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<URLResourcesDo> {
}

@ -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<URLResourcesMapper, URLResourcesDo> implements URLResourcesService {
}

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.camera.service.rfid;
import lombok.extern.slf4j.Slf4j;
/**
* sick
*/
@Slf4j
public class RFIDSocket {
}

@ -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<ScanData> 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;
}
}

@ -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<ScanData> request = new HttpEntity<>(scanData, headers);
String url = "http://"+streetDO.getPlcIp()+":"+streetDO.getPlcPort()+"/match/match3D";
return restTemplate.postForObject(url, request, ScanData.class);
}
}

@ -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;
}
}

@ -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<SensorGunDO>().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;
}
}

@ -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);
}

@ -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;
}
}
}

@ -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;
}
}

@ -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<SensorGunDO> {
/**
*

@ -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<SensorGunMapper, SensorGunDO> implements SensorGunService {
@Resource
private SensorGunMapper sensorGunMapper;

@ -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<length;i++){
int number=random.nextInt(10);
private static String getRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(10);
sb.append(str.charAt(number));
}
return sb.toString();
}
public static String createFileName(String fileType,Integer cameraId) {
public static String createFileName(String fileType, Integer cameraId) {
LocalDateTime now = LocalDateTime.now();
String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/"+cameraId;
return time + "/" + now.format(DateTimeFormatter.ofPattern("HHmmss-"))+getRandomString(10) + "."+fileType;
String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/" + cameraId;
return time + "/" + now.format(DateTimeFormatter.ofPattern("HHmmss-")) + getRandomString(10) + "." + fileType;
}
public static String createFileName(KsecDataInfo dataInfo, StreetDO street, String picCmd, String fileType){
String pathSrc =street.getName()+"/"+dataInfo.getToRow()+"层/"+dataInfo.getToColumn()+"列"+"/"+ dataInfo.getTaskId()+"/";
public static String createFileName(KsecDataInfo dataInfo, StreetDO street, String picCmd, String fileType) {
String pathSrc = "";
if (dataInfo.getToColumn() == null || dataInfo.getToRow() == null) {
pathSrc =fileType+"/"+ street.getPlcId() + "/row" + dataInfo.getToRow() + "/column" + dataInfo.getToColumn() + "/" + dataInfo.getTaskId() + "/";
} else {
pathSrc =fileType+"/"+ street.getPlcId() + "/row" + dataInfo.getFromRow() + "/column" + dataInfo.getFromColumn() + "/" + dataInfo.getTaskId() + "/";
}
LocalDateTime now = LocalDateTime.now();
String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/";
return time +pathSrc+ now.format(DateTimeFormatter.ofPattern("HHmmss-"))+picCmd+"-"+getRandomString(5) + "."+fileType;
String time = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "/";
return time + pathSrc + now.format(DateTimeFormatter.ofPattern("HHmmss-")) + picCmd + "-" + getRandomString(5) + fileType;
}
public static String createFileNameByRowColumn(String fileType,Integer cameraId,Integer row,Integer column){
public static String createFileNameByRowColumn(String fileType, Integer cameraId, Integer row, Integer column) {
LocalDateTime now = LocalDateTime.now();
String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return cameraId+"/"+row+"-"+column+"/"+date + "/" +now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-"))+row+"-"+column + "."+fileType;
return cameraId + "/" + row + "-" + column + "/" + date + "/" + now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-")) + row + "-" + column + "." + fileType;
}
/**
*
*
* @param url
*/
public static void checkDirc(String url){
public static void checkDirc(String url) {
File file = new File(url);
if(!file.getParentFile().exists()){
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
}
public static File getFile(String url){
public static File getFile(String url) {
File file = new File(url);
//如果文件不存在,则新建一个
if(!file.exists()){
if(!file.getParentFile().exists()){
if (!file.exists()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
log.error("创建文件出错:{}",e);
log.error("创建文件出错:{}", e);
}
}
return file;
@ -77,7 +85,7 @@ public class PathUtil {
}
}
public static void rename(){
public static void rename() {
}

@ -56,6 +56,7 @@ public interface DictDataService extends IService<DictDataDO> {
* @return
*/
Map<String,DictDataDO> getDictDataList(@Nullable String dictType);
Map<String,DictDataDO> getDictValueMap( String dictType);
/**
*
*

@ -56,6 +56,14 @@ public class DictDataServiceImpl extends ServiceImpl<DictDataMapper,DictDataDO>
}
@Override
public Map<String,DictDataDO> getDictValueMap( String dictType) {
List<DictDataDO> list = dictDataMapper.selectList( new QueryWrapper<DictDataDO>().eq("dict_type", dictType));
Map<String,DictDataDO> map = list.stream().collect(
Collectors.toMap(DictDataDO::getValue, v->v));
return map;
}
@Override
public Map<String,DictDataDO> getDictDataList( String dictType) {
List<DictDataDO> list = dictDataMapper.selectList( new QueryWrapper<DictDataDO>().eq("dict_type", dictType));

Loading…
Cancel
Save