diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java index 27d6ac0..89eca02 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java @@ -5,7 +5,9 @@ import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.CameraIO; +import com.zhehekeji.web.entity.CameraIOConfig; import com.zhehekeji.web.lib.PtzControlModule; +import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq; import com.zhehekeji.web.pojo.camera.CameraIOPtz; import com.zhehekeji.web.pojo.camera.CameraSearchReq; import com.zhehekeji.web.pojo.street.StreetSearch; @@ -17,6 +19,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; +import java.util.List; @Api(value = "camera",tags = "球机管理") @RestController @@ -40,10 +43,36 @@ public class CameraController { return new Result<>(cameraService.add(camera)); } - @PostMapping("/io/import/{cameraId}") + @PostMapping("/config/import") @ApiOperation(value = "球机IO导入 ") - public Result upload(MultipartFile file,@PathVariable Integer cameraId) throws IOException { - cameraService.importExcel(file,cameraId); + public Result upload(MultipartFile file) throws IOException { + cameraService.importExcel(file); + return Result.success(); + } + + @PostMapping("/config") + @ApiOperation(value = "球机IO配置新增 ") + public Result addConfig (@RequestBody CameraIOConfig config) { + return Result.success(cameraService.addConfig(config)); + } + + @PostMapping("/config/page") + @ApiOperation(value = "球机IO配置分页列表") + public Result> configPage (@RequestBody CameraConfigSearchReq req) { + return Result.success(cameraService.configPageInfo(req)); + } + + @PutMapping("/config") + @ApiOperation(value = "球机IO配置修改 ") + public Result editConfig (@RequestBody CameraIOConfig config) { + cameraService.editConfig(config); + return Result.success(); + } + + @DeleteMapping("/config/{id}") + @ApiOperation(value = "球机IO配置删除 ") + public Result delConfig (@PathVariable Integer id) { + cameraService.delConfig(id); return Result.success(); } @@ -61,17 +90,10 @@ public class CameraController { return Result.success(); } - @PostMapping("/io") - @ApiOperation(value = "球机IO新增") - public Result addIO(@RequestBody CameraIO cameraIO) { - return Result.success(cameraService.addIO(cameraIO)); - } - - @PostMapping("/io/page") + @PostMapping("/{cameraId}/io/list") @ApiOperation(value = "球机IO列表") - public Result> IOPage(@RequestBody CameraSearchReq req) { - validatorUtil.validate(req); - return Result.success(cameraService.IOPage(req)); + public Result> IOPage(@PathVariable Integer cameraId) { + return Result.success(cameraService.ioList(cameraId)); } @PutMapping("/io") @@ -81,26 +103,19 @@ public class CameraController { return Result.success(); } - @DeleteMapping("/io/{id}") - @ApiOperation(value = "球机IO删除") - public Result delIO(@PathVariable Integer id){ - cameraService.delIO(id); - return Result.success(); - } - @PostMapping("/io/ptz") @ApiOperation(value = "球机IO配置") - public Result ptz(@RequestBody CameraIOPtz req) { + public Result ptz(@RequestBody CameraIOPtz req) { validatorUtil.validate(req); - cameraService.ptz(req.getCameraIOId(),req.getCameraId()); - return Result.success(); + return Result.success(cameraService.ptz(req.getCameraIOId(),req.getCameraId(),req.getName(),req.getType())); } @PostMapping("/io/toPtz") @ApiOperation(value = "转至球机IO配置点") public Result toPtz(@RequestBody CameraIOPtz req) { validatorUtil.validate(req); - PtzControlModule.toPtz(req.getCameraIOId(),req.getCameraId()); + Integer ptzId = cameraService.getPtzId(req.getCameraIOId()); + PtzControlModule.toPtz(ptzId,req.getCameraId()); return Result.success(); } } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Camera.java b/web/src/main/java/com/zhehekeji/web/entity/Camera.java index bbadc4a..235088b 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Camera.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Camera.java @@ -28,14 +28,6 @@ public class Camera { private String rtsp; -// private String position; -// -// private String focusing; -// -// private String aperture; -// -// private BigDecimal multiple; - @ApiModelProperty(value = "预置点 增长值",hidden = true) private Integer ptzId; diff --git a/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java b/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java index b270a3d..1487372 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java @@ -18,8 +18,6 @@ public class CameraIO { private String name; - private Integer ptzId; - private String position; private String focusing; @@ -28,5 +26,7 @@ public class CameraIO { private String multiple; + private Integer ptzId; + private LocalDateTime updateTime; } diff --git a/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java b/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java new file mode 100644 index 0000000..954dce6 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java @@ -0,0 +1,20 @@ +package com.zhehekeji.web.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("camera_io_config") +public class CameraIOConfig { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String name; + + private LocalDateTime updateTime; +} diff --git a/web/src/main/java/com/zhehekeji/web/entity/Order.java b/web/src/main/java/com/zhehekeji/web/entity/Order.java index e420d32..02cf0d0 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -31,7 +31,12 @@ public class Order { // private String positionNum; @ApiModelProperty("视频图片地址") - private String videoPath; + @TableField("`video_path_1`") + private String videoPath1; + + @ApiModelProperty("视频图片地址") + @TableField("`video_path_2`") + private String videoPath2; @ApiModelProperty("入库照片") private String putPath; diff --git a/web/src/main/java/com/zhehekeji/web/lib/CallBack.java b/web/src/main/java/com/zhehekeji/web/lib/CallBack.java index 7985688..a1666ef 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CallBack.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CallBack.java @@ -3,8 +3,6 @@ package com.zhehekeji.web.lib; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; -import javax.swing.*; - @Slf4j public class CallBack { diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOConfigMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOConfigMapper.java new file mode 100644 index 0000000..8ac7060 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOConfigMapper.java @@ -0,0 +1,11 @@ +package com.zhehekeji.web.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhehekeji.web.entity.CameraIOConfig; + +import java.util.List; + +public interface CameraIOConfigMapper extends BaseMapper { + + void batchInsert(List list); +} diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java index 3c22f89..ca91c70 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java @@ -2,10 +2,16 @@ package com.zhehekeji.web.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhehekeji.web.entity.CameraIO; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import java.util.List; public interface CameraIOMapper extends BaseMapper { - void batchInsert(List list); + @Select("select t.name as name ,io.id ,io.aperture,io.camera_id,io.focusing,io.multiple,io.position,io.ptz_id,io.update_time\n" + + "from camera_io_config t \n" + + "left join (select * from camera_io where camera_id = #{cameraId}) io on io.name = t.name ") + List cameraIOs (@Param("cameraId") Integer cameraId); + } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraConfigSearchReq.java b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraConfigSearchReq.java new file mode 100644 index 0000000..167d791 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraConfigSearchReq.java @@ -0,0 +1,16 @@ +package com.zhehekeji.web.pojo.camera; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class CameraConfigSearchReq { + + @NotNull(message = "page不能为空") + private Integer page; + + @NotNull(message = "size不能为空") + private Integer size; + +} diff --git a/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraIOPtz.java b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraIOPtz.java index 4f1a4c0..64a5444 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraIOPtz.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraIOPtz.java @@ -1,15 +1,25 @@ package com.zhehekeji.web.pojo.camera; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class CameraIOPtz { @NotNull(message = "cameraId不能为空") + @ApiModelProperty("cameraId") private Integer cameraId; - @NotNull(message = "球机IO id不能为空") + @ApiModelProperty("cameraIOId") private Integer cameraIOId; + + @NotEmpty(message = "O指令名称不能为空") + @ApiModelProperty("PLC IO指令名称") + private String name; + + @ApiModelProperty(" 0: 位置 1:对焦 2:倍数 3:光圈") + private Integer type; } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java index 3e422cc..cb327dc 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java @@ -7,12 +7,6 @@ import javax.validation.constraints.NotNull; @Data public class CameraSearchReq { - @NotNull(message = "page不能为空") - private Integer page; - - @NotNull(message = "size不能为空") - private Integer size; - @NotNull(message = "cameraId不能为空") private Integer cameraId; } diff --git a/web/src/main/java/com/zhehekeji/web/service/CameraService.java b/web/src/main/java/com/zhehekeji/web/service/CameraService.java index c8e640c..7eec019 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -4,17 +4,17 @@ import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.CameraIO; +import com.zhehekeji.web.entity.CameraIOConfig; import com.zhehekeji.web.lib.PtzControlModule; +import com.zhehekeji.web.mapper.CameraIOConfigMapper; import com.zhehekeji.web.mapper.CameraIOMapper; import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.StreetMapper; -import com.zhehekeji.web.pojo.camera.CameraSearchReq; +import com.zhehekeji.web.pojo.camera.CameraConfigSearchReq; import com.zhehekeji.web.pojo.camera.IOImport; -import com.zhehekeji.web.pojo.stock.StockExcel; import com.zhehekeji.web.pojo.street.StreetSearch; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -38,6 +38,8 @@ public class CameraService { private StreetMapper streetMapper; @Resource private CameraIOMapper ioMapper; + @Resource + private CameraIOConfigMapper configMapper; @Value("${cameraPassword}") private String cameraPassword; @@ -46,75 +48,162 @@ public class CameraService { @Value("${cameraUser}") private String cameraUser; - public Integer add(Camera camera){ + public Integer add(Camera camera) { camera.setUser(cameraUser); camera.setPassword(cameraPassword); camera.setPort(cameraPort); camera.setUpdateTime(LocalDateTime.now()); try { cameraMapper.insert(camera); - }catch (DuplicateKeyException e){ - Assert.isTrue(false,"rtsp地址已存在"); + } catch (DuplicateKeyException e) { + Assert.isTrue(false, "rtsp地址已存在"); } return camera.getId(); } - public void edit(Camera camera){ + public void edit(Camera camera) { camera.setUpdateTime(LocalDateTime.now()); camera.setPtzId(null); try { cameraMapper.updateById(camera); - }catch (DuplicateKeyException e){ - Assert.isTrue(false,"rtsp地址已存在"); + } catch (DuplicateKeyException e) { + Assert.isTrue(false, "rtsp地址已存在"); } } - public void del(Integer id){ + public void del(Integer id) { Integer count = streetMapper.checkCamera(id); - Assert.isTrue(count == null || count == 0,"球机已被绑定"); + Assert.isTrue(count == null || count == 0, "球机已被绑定"); cameraMapper.deleteById(id); } - public PageInfo cameras(StreetSearch streetSearch){ - PageHelper.startPage(streetSearch.getPageNum(),streetSearch.getPageSize()); + public PageInfo cameras(StreetSearch streetSearch) { + PageHelper.startPage(streetSearch.getPageNum(), streetSearch.getPageSize()); List cameras = cameraMapper.selectByMap(new HashMap<>(0)); return new PageInfo<>(cameras); } - public void importExcel(MultipartFile file,Integer cameraId) throws IOException { - EasyExcel.read(file.getInputStream(), IOImport.class, new IOImportListener(ioMapper,cameraId)).sheet().doRead(); + /** + * 导入IO配置 + * + * @param file + * @throws IOException + */ + public void importExcel(MultipartFile file) throws IOException { + EasyExcel.read(file.getInputStream(), IOImport.class, new IOImportListener(configMapper)).sheet().doRead(); } - public Integer addIO(CameraIO cameraIO){ - cameraIO.setUpdateTime(LocalDateTime.now()); - cameraIO.setPtzId(0); - ioMapper.insert(cameraIO); - return cameraIO.getId(); + public Integer addConfig(CameraIOConfig config) { + config.setUpdateTime(LocalDateTime.now()); + try { + configMapper.insert(config); + } catch (DuplicateKeyException e) { + Assert.isTrue(false, "配置已存在"); + } + return config.getId(); } - public PageInfo IOPage(CameraSearchReq req){ - PageHelper.startPage(req.getPage(),req.getSize()); - List list = ioMapper.selectList(new QueryWrapper().eq("camera_id",req.getCameraId())); - return new PageInfo<>(list); + /** + * 配置列表 分页 + * + * @param req + * @return + */ + public PageInfo configPageInfo(CameraConfigSearchReq req) { + PageHelper.startPage(req.getPage(), req.getSize()); + List configs = configMapper.selectByMap(new HashMap<>(0)); + return new PageInfo<>(configs); + } + + /** + * 修改config + * + * @param config + */ + public void editConfig(CameraIOConfig config) { + Assert.notNull(config.getName(), "名称不能为空"); + config.setUpdateTime(LocalDateTime.now()); + try { + configMapper.updateById(config); + } catch (DuplicateKeyException e) { + Assert.isTrue(false, "配置已存在"); + } } - public void editIO(CameraIO cameraIO){ + public void delConfig(Integer id) { + configMapper.deleteById(id); + } + + /** + * io列表 + * @param cameraId + * @return + */ + public List ioList(Integer cameraId) { + List list = ioMapper.cameraIOs(cameraId); + return list; + } + + public void editIO(CameraIO cameraIO) { cameraIO.setUpdateTime(LocalDateTime.now()); ioMapper.updateById(cameraIO); } - public void delIO(Integer id){ - ioMapper.deleteById(id); + /** + * 球机新增、或修改预置点 + * synchronized 设置为同步方法,防止出现同一个ptzId在同一个球机上 + * @param IOId 存在修改,不存在 新增 + * @param cameraId + */ + public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type) { + Camera camera = cameraMapper.selectById(cameraId); + Assert.notNull(camera, "球机不存在"); + Integer cameraPtzId = camera.getPtzId() == null ? 0 : camera.getPtzId(); + CameraIO cameraIO = null; + Integer ptzId = cameraPtzId++; + if (IOId == null || IOId == 0) { + //新增 + cameraIO = new CameraIO(); + cameraIO.setCameraId(cameraId); + cameraIO.setUpdateTime(LocalDateTime.now()); + cameraIO.setName(name); + cameraIO.setPtzId(ptzId); + conver(cameraIO,type); + ioMapper.insert(cameraIO); + } else { + //修改 + cameraIO = ioMapper.selectById(IOId); + Assert.notNull(cameraIO, "IO不存在"); + cameraIO.setPtzId(ptzId); + cameraIO.setUpdateTime(LocalDateTime.now()); + conver(cameraIO,type); + ioMapper.updateById(cameraIO); + } + camera.setPtzId(ptzId); + cameraMapper.updateById(camera); + PtzControlModule.ptz(IOId, cameraIO.getName(), cameraId); + log.info("设置 预置点 球机ID:{},预置点ID:{}", cameraId, ptzId); + return cameraIO.getId(); } - public void ptz(Integer IOId,Integer cameraId){ - CameraIO cameraIO = ioMapper.selectById(IOId); - Assert.notNull(cameraIO,"IO不存在"); - PtzControlModule.ptz(IOId,cameraIO.getName(),cameraId); - log.info("设置 预置点 球机ID:{},预置点ID:{}",cameraId, IOId); + public Integer getPtzId(Integer ioId){ + CameraIO cameraIO = ioMapper.selectById(ioId); + Assert.notNull(cameraIO,"IO配置不存在"); + return cameraIO.getPtzId(); } + private void conver(CameraIO cameraIO,Integer type){ + if(type == 0){ + cameraIO.setPosition("OK"); + }else if(type == 1){ + cameraIO.setFocusing("OK"); + }else if(type == 2){ + cameraIO.setMultiple("OK"); + }else if(type == 3){ + cameraIO.setAperture("OK"); + } + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java index 785f5a7..631704f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java +++ b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java @@ -2,14 +2,14 @@ package com.zhehekeji.web.service; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.zhehekeji.web.entity.CameraIO; -import com.zhehekeji.web.mapper.CameraIOMapper; +import com.zhehekeji.web.entity.CameraIOConfig; +import com.zhehekeji.web.mapper.CameraIOConfigMapper; import com.zhehekeji.web.pojo.camera.IOImport; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -18,29 +18,25 @@ public class IOImportListener extends AnalysisEventListener { private static Integer LENGTH = 5000; - private CameraIOMapper cameraIOMapper; - - private Integer cameraId; + private CameraIOConfigMapper configMapper; private List names = new ArrayList<>(); - public IOImportListener(CameraIOMapper cameraIOMapper,Integer cameraId){ - this.cameraIOMapper = cameraIOMapper; - this.cameraId = cameraId; - List cameraIOS = cameraIOMapper.selectList(new QueryWrapper().select("name").eq("camera_id",cameraId)); + public IOImportListener(CameraIOConfigMapper configMapper){ + this.configMapper = configMapper; + List cameraIOS = configMapper.selectByMap(new HashMap<>(0)); if(cameraIOS.size() >0){ - this.names = cameraIOS.stream().map(CameraIO::getName).collect(Collectors.toList()); + this.names = cameraIOS.stream().map(CameraIOConfig::getName).collect(Collectors.toList()); } } - private List stocks = new ArrayList<>(LENGTH); + private List stocks = new ArrayList<>(LENGTH); @Override public void invoke(IOImport ioImport, AnalysisContext analysisContext) { if(!names.contains(ioImport.getName())){ - CameraIO cameraIO = new CameraIO(); + CameraIOConfig cameraIO = new CameraIOConfig(); cameraIO.setName(ioImport.getName()); - cameraIO.setCameraId(cameraId); cameraIO.setUpdateTime(LocalDateTime.now()); stocks.add(cameraIO); if(stocks.size() > LENGTH){ @@ -54,12 +50,12 @@ public class IOImportListener extends AnalysisEventListener { @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { save(stocks); - log.info("导入球机IO"); + log.info("导入球机IO配置"); } - private void save(List stocks) { + private void save(List stocks) { if(stocks.size() > 0){ - cameraIOMapper.batchInsert(stocks); + configMapper.batchInsert(stocks); } } } diff --git a/web/src/main/resources/mapper/CameraIOConfigMapper.xml b/web/src/main/resources/mapper/CameraIOConfigMapper.xml new file mode 100644 index 0000000..7f0bf99 --- /dev/null +++ b/web/src/main/resources/mapper/CameraIOConfigMapper.xml @@ -0,0 +1,13 @@ + + + + + + insert into camera_io_config( + name,update_time + ) values + + (#{item.name},#{item.updateTime}) + + +