From 4e0ef0482a59a0b7238dea0e547aabdba0cfd1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E9=B8=A3?= Date: Wed, 30 Dec 2020 16:50:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=90=83=E6=9C=BAIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CameraControlController.java | 20 +++-- .../web/controller/CameraController.java | 39 ++++++++++ .../web/controller/OrderController.java | 23 +++++- .../com/zhehekeji/web/entity/CameraIO.java | 24 ++++++ .../java/com/zhehekeji/web/entity/Order.java | 4 +- .../zhehekeji/web/entity/OrderLastMedia.java | 12 ++- .../java/com/zhehekeji/web/lib/CallBack.java | 45 +++++++++++ .../com/zhehekeji/web/lib/CameraConnMap.java | 17 +++++ .../zhehekeji/web/lib/CaptureReceiveCB.java | 2 +- .../zhehekeji/web/lib/CaptureRunnable.java | 75 ++++++++++--------- .../zhehekeji/web/lib/DisConnectCallBack.java | 22 ------ .../com/zhehekeji/web/lib/LoginModule.java | 16 ++-- .../com/zhehekeji/web/lib/Mp4ReceiveCB.java | 16 ---- .../zhehekeji/web/lib/PtzControlModule.java | 22 +++--- .../zhehekeji/web/lib/StopDownLoadThread.java | 16 ++++ .../zhehekeji/web/mapper/CameraIOMapper.java | 11 +++ .../web/mapper/OrderLastMediaMapper.java | 5 ++ .../com/zhehekeji/web/pojo/OrderSaveReq.java | 17 +++-- .../com/zhehekeji/web/pojo/OrderSearch.java | 4 + .../web/pojo/camera/CameraSearchReq.java | 18 +++++ .../zhehekeji/web/pojo/camera/IOImport.java | 9 +++ .../zhehekeji/web/service/CameraService.java | 36 +++++++++ .../web/service/IOImportListener.java | 65 ++++++++++++++++ .../zhehekeji/web/service/InitService.java | 39 ++++++++++ .../zhehekeji/web/service/OrderService.java | 25 +++++++ .../main/resources/mapper/CameraIOMapper.xml | 13 ++++ 26 files changed, 476 insertions(+), 119 deletions(-) create mode 100644 web/src/main/java/com/zhehekeji/web/entity/CameraIO.java create mode 100644 web/src/main/java/com/zhehekeji/web/lib/CallBack.java delete mode 100644 web/src/main/java/com/zhehekeji/web/lib/DisConnectCallBack.java delete mode 100644 web/src/main/java/com/zhehekeji/web/lib/Mp4ReceiveCB.java create mode 100644 web/src/main/java/com/zhehekeji/web/lib/StopDownLoadThread.java create mode 100644 web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java create mode 100644 web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java create mode 100644 web/src/main/java/com/zhehekeji/web/pojo/camera/IOImport.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/IOImportListener.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/InitService.java create mode 100644 web/src/main/resources/mapper/CameraIOMapper.xml diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java index 31cfe57..a14be47 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -26,13 +26,18 @@ public class CameraControlController { @PostMapping("/{id}") @ApiOperation(value = "球机登录") - public Result login(@PathVariable Integer id) { - Camera camera = cameraMapper.selectById(id); + public Result login(@PathVariable Integer id) { + checkLogin(id); + return Result.success(); + } + + private NetSDKLib.LLong cameraLogin(Integer cameraId){ + Camera camera = cameraMapper.selectById(cameraId); Assert.notNull(camera,"球机不存在"); - NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),id); + NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),cameraId); Assert.isTrue(lLong.longValue() > 0,"登陆失败"); - CameraConnMap.conn(id,lLong); - return Result.success(lLong.longValue()); + CameraConnMap.conn(cameraId,lLong); + return lLong; } @PostMapping("/up/{id}") @@ -281,7 +286,7 @@ public class CameraControlController { @ApiOperation(value = "立即拍照") public Result pic(@PathVariable Integer id) { checkLogin(id); - System.out.println(PtzControlModule.pic(id,0)); + System.out.println(PtzControlModule.pic(id,0,"aaa",0)); return Result.success(); } @@ -295,7 +300,8 @@ public class CameraControlController { private void checkLogin(Integer cameraId){ if(CameraConnMap.getConnId(cameraId) == null){ - login(cameraId); + log.info("相机登录 cameraId:{}",cameraId); + checkLogin(cameraId); } } } 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 f5d790a..0314fba 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraController.java @@ -1,15 +1,20 @@ package com.zhehekeji.web.controller; import com.github.pagehelper.PageInfo; +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.pojo.camera.CameraSearchReq; import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.service.CameraService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.IOException; @Api(value = "camera",tags = "球机管理") @RestController @@ -18,6 +23,8 @@ public class CameraController { @Resource private CameraService cameraService; + @Resource + private ValidatorUtil validatorUtil; @PostMapping("/page") @ApiOperation(value = "球机列表分页 ") @@ -31,6 +38,13 @@ public class CameraController { return new Result<>(cameraService.add(camera)); } + @PostMapping("/io/import/{cameraId}") + @ApiOperation(value = "球机IO导入 ") + public Result upload(MultipartFile file,@PathVariable Integer cameraId) throws IOException { + cameraService.importExcel(file,cameraId); + return Result.success(); + } + @PutMapping("") @ApiOperation(value = "球机修改") public Result edit(@RequestBody Camera camera) { @@ -45,5 +59,30 @@ 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") + @ApiOperation(value = "球机IO列表") + public Result> IOPage(@RequestBody CameraSearchReq req) { + validatorUtil.validate(req); + return Result.success(cameraService.IOPage(req)); + } + + @PutMapping("/io") + @ApiOperation(value = "球机IO修改") + public Result editIO(@RequestBody CameraIO cameraIO){ + cameraService.editIO(cameraIO); + return Result.success(); + } + @DeleteMapping("/io/{id}") + @ApiOperation(value = "球机IO删除") + public Result delIO(@PathVariable Integer id){ + cameraService.delIO(id); + return Result.success(); + } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java index b8c1f2b..835c503 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -9,6 +9,7 @@ import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.service.OrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; @@ -32,16 +33,32 @@ public class OrderController { @PostMapping("/") public Result save(@RequestBody OrderSaveReq saveReq){ validatorUtil.validate(saveReq); - Assert.isTrue(postToken.equals(saveReq.getToken()),"token不正确"); + //Assert.isTrue(postToken.equals(saveReq.getToken()),"token不正确"); return Result.success(orderService.add(saveReq)); } + @ApiOperation("工单拍照") + @GetMapping("/camera") + public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("类型 1:入库 3:出库 2:货物图片") @RequestParam Integer type){ + //validatorUtil.validate(saveReq); + orderService.pic(type,orderNum); + return Result.success(); + } + + @ApiOperation("工单录像 结束") + @GetMapping("/video/stop") + public Result video(@ApiParam("工单号") @RequestParam String orderNum){ + //validatorUtil.validate(saveReq); + //Assert.isTrue(postToken.equals(saveReq.getToken()),"token不正确"); + return Result.success(); + } + @PostMapping("/list") @ApiOperation(value = "查询") //@SessionHandler - public Result> findRoleList(@RequestBody OrderSearch orderSearch) { + public Result> orders(@RequestBody OrderSearch orderSearch) { validatorUtil.validate(orderSearch); - return new Result<>(orderService.orders(orderSearch)); + return Result.success(orderService.orders(orderSearch)); } @GetMapping("/media") diff --git a/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java b/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java new file mode 100644 index 0000000..9caf03d --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java @@ -0,0 +1,24 @@ +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") +public class CameraIO { + + @TableId(type = IdType.AUTO) + private Integer id; + + private Integer cameraId; + + private String name; + + private Integer ptzId; + + 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 d39401b..e420d32 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -21,8 +21,10 @@ public class Order { private String shelveId; + @TableField("`row`") private Integer row; + @TableField("`column`") private Integer column; // @ApiModelProperty("仓位号") @@ -35,7 +37,7 @@ public class Order { private String putPath; @ApiModelProperty("出库照片") - private String outPutPath; + private String outputPath; @ApiModelProperty("货位照片") private String goodsPath; diff --git a/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java b/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java index d9304fc..f5c99c6 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java +++ b/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -10,7 +11,10 @@ import lombok.Data; @Data public class OrderLastMedia { - @TableId + @TableId(type = IdType.AUTO) + private Integer id; + + @TableField private String shelveId; @TableField("`row`") @@ -19,17 +23,17 @@ public class OrderLastMedia { @TableField("`column`") private Integer column; - private Long lastPutOrderId; + private String lastPutOrderNum; @ApiModelProperty("入库照片") private String putPath; - private Long lastOutOrderId; + private String lastOutOrderNum; @ApiModelProperty("出库照片") private String outPutPath; - private Long lastGoodsOrderId; + private String lastGoodsOrderNum; @ApiModelProperty("货位照片") private String goodsPath; diff --git a/web/src/main/java/com/zhehekeji/web/lib/CallBack.java b/web/src/main/java/com/zhehekeji/web/lib/CallBack.java new file mode 100644 index 0000000..7985688 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/lib/CallBack.java @@ -0,0 +1,45 @@ +package com.zhehekeji.web.lib; + +import com.sun.jna.Pointer; +import lombok.extern.slf4j.Slf4j; + +import javax.swing.*; + +@Slf4j +public class CallBack { + + /** + * 球机掉线回调 + */ + public static class DisConnectCallBack implements NetSDKLib.fDisConnect { + + @Override + public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { + Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginID); + log.error("球机:{}掉线",cameraId); + //CameraConnMap.disConn(cameraId); + } + } + + /** + * mp4下载回调 + */ + public static class Mp4ReceiveCB implements NetSDKLib.fTimeDownLoadPosCallBack { + + @Override + public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { + if(dwDownLoadSize == -1) { + StopDownLoadThread stopDownLoadThread = new StopDownLoadThread(lPlayHandle); + stopDownLoadThread.start(); + } + } + } + + public static class HaveReConnect implements NetSDKLib.fHaveReConnect { + @Override + public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { + log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue()); + System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); + } + } +} diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java b/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java index e6c19d2..75ad297 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java @@ -5,22 +5,39 @@ import java.util.Map; public class CameraConnMap{ + /** + * key :cameraId + * value: loginId + */ public static Map cameraMap = new HashMap<>(); + /** + * key:loginId + * value: cameraId + */ + public static Map loginMap = new HashMap<>(); + public static void conn(Integer cameraId,NetSDKLib.LLong handlerId){ synchronized (cameraId.toString().intern()){ cameraMap.put(cameraId,handlerId); + loginMap.put(handlerId,cameraId); } } public static void disConn(Integer cameraId){ synchronized (cameraId.toString().intern()){ + NetSDKLib.LLong lLong = cameraMap.get(cameraId); cameraMap.remove(cameraId); + loginMap.remove(lLong); } } public static NetSDKLib.LLong getConnId(Integer cameraId){ return cameraMap.get(cameraId); } + + public static Integer getCameraIdByLoginId(NetSDKLib.LLong lLong){ + return loginMap.get(lLong); + } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/CaptureReceiveCB.java b/web/src/main/java/com/zhehekeji/web/lib/CaptureReceiveCB.java index 3288f6f..24e0c9d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CaptureReceiveCB.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CaptureReceiveCB.java @@ -35,7 +35,7 @@ public class CaptureReceiveCB implements NetSDKLib.fSnapRev{ /** * 执行线程池 */ - private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 10, 200, + private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000)); @Override diff --git a/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java b/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java index 60ad569..c1f63de 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.lib; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.sun.jna.Pointer; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.entity.Order; @@ -46,65 +47,65 @@ public class CaptureRunnable implements Runnable { public void run() { OrderInfo orderInfo = OrderCmdSerial.getOrderInfo(CmdSerial); OrderCmdSerial.remove(CmdSerial); - if(orderInfo != null){ + if (orderInfo != null) { String path = PathUtil.createFileName(fileType); - String picPath = savePic(pBuf,RevLen,mediaPath+path); - if(picPath == null){ + String picPath = savePic(pBuf, RevLen, mediaPath + path); + if (picPath == null) { return; } - log.debug("save pic orderId:{} path:{}",orderInfo.getOrderId(),picPath); - - OrderLastMedia orderLastMedia = lastMediaMapper.selectById("qqq"); - if(orderLastMedia == null){ - orderLastMedia = initLastOrder(); + log.debug("save pic orderId:{} path:{}", orderInfo.getOrderId(), picPath); + //todo 根据orderNum找到货架,暂时qqq + String shelveId = "qqq"; + Integer row = 1; + Integer column = 1; + OrderLastMedia orderLastMedia = lastMediaMapper.getOne(shelveId,row,column); + if (orderLastMedia == null) { + orderLastMedia = initLastOrder(shelveId,row,column); } Order order = new Order(); - order.setId(orderInfo.getOrderId()); - if(OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())){ + //order.setId(orderInfo.getOrderId()); + if (OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())) { order.setGoodsPath(path); - if(orderInfo.getOrderId()>orderLastMedia.getLastGoodsOrderId()){ - orderLastMedia.setGoodsPath(path); - lastMediaMapper.updateById(orderLastMedia); - } - }else if(OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())){ + orderLastMedia.setLastGoodsOrderNum(orderInfo.getOrderNum()); + orderLastMedia.setGoodsPath(path); + } else if (OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())) { order.setPutPath(path); - if(orderInfo.getOrderId()>orderLastMedia.getLastPutOrderId()){ - orderLastMedia.setPutPath(path); - lastMediaMapper.updateById(orderLastMedia); - } - - }else if(OrderInfo.OrderPathType.OUTPUT.getType().equals(orderInfo.getType())){ - order.setOutPutPath(path); - if(orderInfo.getOrderId()>orderLastMedia.getLastOutOrderId()){ - orderLastMedia.setOutPutPath(path); - lastMediaMapper.updateById(orderLastMedia); - } + orderLastMedia.setLastPutOrderNum(orderInfo.getOrderNum()); + orderLastMedia.setPutPath(path); + } else if (OrderInfo.OrderPathType.OUTPUT.getType().equals(orderInfo.getType())) { + order.setOutputPath(path); + orderLastMedia.setLastOutOrderNum(orderInfo.getOrderNum()); + orderLastMedia.setOutPutPath(path); } - orderMapper.updateById(order); + lastMediaMapper.updateById(orderLastMedia); + orderMapper.update(order, new UpdateWrapper().eq("order_num",orderInfo.getOrderNum())); return; } log.warn("no order"); } - private OrderLastMedia initLastOrder(){ + private OrderLastMedia initLastOrder(String shelveId,Integer row,Integer column) { OrderLastMedia orderLastMedia = new OrderLastMedia(); - orderLastMedia.setShelveId("qqq"); - orderLastMedia.setLastOutOrderId(0L); - orderLastMedia.setLastPutOrderId(0L); - orderLastMedia.setLastGoodsOrderId(0L); + //todo 解析订单号 + orderLastMedia.setShelveId(shelveId); + orderLastMedia.setRow(row); + orderLastMedia.setColumn(column); +// orderLastMedia.setLastOutOrderId(0L); +// orderLastMedia.setLastPutOrderId(0L); +// orderLastMedia.setLastGoodsOrderId(0L); lastMediaMapper.insert(orderLastMedia); return orderLastMedia; } - private String savePic(Pointer pBuf, int RevLen,String path){ + private String savePic(Pointer pBuf, int RevLen, String path) { BufferedImage bufferedImage = null; - if(pBuf != null && RevLen > 0) { + if (pBuf != null && RevLen > 0) { byte[] buf = pBuf.getByteArray(0, RevLen); ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf); try { bufferedImage = ImageIO.read(byteArrInput); - if(bufferedImage == null) { + if (bufferedImage == null) { return null; } File file = PathUtil.getFile(path); @@ -112,8 +113,8 @@ public class CaptureRunnable implements Runnable { return path; } catch (IOException e) { e.printStackTrace(); - }finally { - if(bufferedImage != null){ + } finally { + if (bufferedImage != null) { bufferedImage.flush(); } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/DisConnectCallBack.java b/web/src/main/java/com/zhehekeji/web/lib/DisConnectCallBack.java deleted file mode 100644 index cb694a3..0000000 --- a/web/src/main/java/com/zhehekeji/web/lib/DisConnectCallBack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.zhehekeji.web.lib; - -import com.sun.jna.Pointer; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class DisConnectCallBack implements NetSDKLib.fDisConnect { - - private Integer cameraId; - - public DisConnectCallBack(Integer id){ - cameraId = id; - } - - @Override - public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { - log.info("球机:{}掉线",cameraId); - CameraConnMap.disConn(cameraId); - } - - -} diff --git a/web/src/main/java/com/zhehekeji/web/lib/LoginModule.java b/web/src/main/java/com/zhehekeji/web/lib/LoginModule.java index 9aa0b83..ab205a4 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/LoginModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/LoginModule.java @@ -1,18 +1,10 @@ package com.zhehekeji.web.lib; -import com.sun.jna.Pointer; import com.zhehekeji.common.util.SpringContextUtil; import com.zhehekeji.web.lib.NetSDKLib.LLong; import com.zhehekeji.web.lib.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY; import com.zhehekeji.web.lib.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY; -import com.zhehekeji.web.lib.common.Res; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.IOException; /** * 登陆接口实现 @@ -26,6 +18,10 @@ public class LoginModule { // 设备信息 public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); + private static CallBack.DisConnectCallBack disConnectCallBack = new CallBack.DisConnectCallBack(); + + private static CallBack.HaveReConnect haveReConnect = new CallBack.HaveReConnect(); + // 登陆句柄 public static LLong m_hLoginHandle = new LLong(0); @@ -70,7 +66,7 @@ public class LoginModule { //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S - int tryTimes = 1; //登录时尝试建立链接1次 + int tryTimes = 3; //登录时尝试建立链接1次 netsdk.CLIENT_SetConnectTime(waitTime, tryTimes); @@ -113,7 +109,7 @@ public class LoginModule { public static LLong login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword,Integer id) { //IntByReference nError = new IntByReference(0); //入参 - init(new DisConnectCallBack(id),null); + init(disConnectCallBack,haveReConnect); NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam=new NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY(); pstInParam.nPort=m_nPort; pstInParam.szIP=m_strIp.getBytes(); diff --git a/web/src/main/java/com/zhehekeji/web/lib/Mp4ReceiveCB.java b/web/src/main/java/com/zhehekeji/web/lib/Mp4ReceiveCB.java deleted file mode 100644 index eef3cdd..0000000 --- a/web/src/main/java/com/zhehekeji/web/lib/Mp4ReceiveCB.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.zhehekeji.web.lib; - -import com.sun.jna.Pointer; - -public class Mp4ReceiveCB implements NetSDKLib.fTimeDownLoadPosCallBack { - - @Override - public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { - System.out.println("ing.... dwDownLoadSize:"+dwDownLoadSize+" dwTotalSize:"+dwTotalSize+ - " lPlayHandle:"+lPlayHandle.longValue()+" index:"+index); - if(dwDownLoadSize == -1) { - System.out.println("下载结束"); - LoginModule.netsdk.CLIENT_StopDownload(lPlayHandle); - } - } -} diff --git a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java index 7a40d08..43e533f 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java @@ -2,13 +2,8 @@ package com.zhehekeji.web.lib; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; +import com.zhehekeji.web.lib.common.ErrorCode; -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; import java.time.LocalDateTime; import java.util.UUID; @@ -18,6 +13,8 @@ import java.util.UUID; */ public class PtzControlModule { + private static CallBack.Mp4ReceiveCB mp4ReceiveCB = new CallBack.Mp4ReceiveCB(); + /** * 向上 */ @@ -214,7 +211,7 @@ public class PtzControlModule { 0, 0, 0, 1); } - public static boolean pic(Integer cameraId,int nChannelID) { + public static boolean pic(Integer cameraId,int nChannelID,String orderNum,Integer type) { NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS(); stuSnapParams.Channel = nChannelID; // channel stuSnapParams.mode = 0; // capture picture mode @@ -222,10 +219,10 @@ public class PtzControlModule { stuSnapParams.InterSnap = 0; // timer capture picture time interval stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial(); Long orderId = 1L; - OrderInfo orderInfo = new OrderInfo(orderId,"qwe",1); + OrderInfo orderInfo = new OrderInfo(orderId,orderNum,type); OrderCmdSerial.put(stuSnapParams.CmdSerial,orderInfo); IntByReference reserved = new IntByReference(0); - return LoginModule.netsdk.CLIENT_SnapPictureEx(CameraConnMap.getConnId(cameraId), stuSnapParams, reserved); + return LoginModule.netsdk.CLIENT_SnapPictureEx(CameraConnMap.getConnId(cameraId), stuSnapParams, reserved); } @@ -245,7 +242,7 @@ public class PtzControlModule { download_by_data_type.szSavedFileName="d:/qq/"+u+".mp4"; download_by_data_type.emDataType = 3; download_by_data_type.emRecordType = 0; - download_by_data_type.cbDownLoadPos = new Mp4ReceiveCB(); + download_by_data_type.cbDownLoadPos = mp4ReceiveCB; NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE net_out_download_by_data_type = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE(); //NetSDKLib.LLong l = LoginModule.netsdk.CLIENT_DownloadByTimeEx2(CameraConnMap.getConnId(cameraId),channelId,0,startTime,endTime,"./q2q.mp4",null,null,null,null,3,null); @@ -254,11 +251,14 @@ public class PtzControlModule { NetSDKLib.LLong l = LoginModule.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId),download_by_data_type,net_out_download_by_data_type,0); System.out.println("下载句柄: "+l.longValue()); if(l.longValue() == 0){ - System.out.println(ToolKits.getErrorCodePrint()); + System.out.println(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); + //System.out.println(ToolKits.getErrorCodePrint()); } } + + } diff --git a/web/src/main/java/com/zhehekeji/web/lib/StopDownLoadThread.java b/web/src/main/java/com/zhehekeji/web/lib/StopDownLoadThread.java new file mode 100644 index 0000000..cde7774 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/lib/StopDownLoadThread.java @@ -0,0 +1,16 @@ +package com.zhehekeji.web.lib; + +public class StopDownLoadThread extends Thread { + + private NetSDKLib.LLong lPlayHandle; + + public StopDownLoadThread(NetSDKLib.LLong lPlayHandle){ + this.lPlayHandle = lPlayHandle; + } + + @Override + public void run() { + System.out.println("下载结束"+lPlayHandle.longValue()); + LoginModule.netsdk.CLIENT_StopDownload(lPlayHandle); + } +} diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java new file mode 100644 index 0000000..3c22f89 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/mapper/CameraIOMapper.java @@ -0,0 +1,11 @@ +package com.zhehekeji.web.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhehekeji.web.entity.CameraIO; + +import java.util.List; + +public interface CameraIOMapper extends BaseMapper { + + void batchInsert(List list); +} diff --git a/web/src/main/java/com/zhehekeji/web/mapper/OrderLastMediaMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/OrderLastMediaMapper.java index f663ff4..055b5f7 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/OrderLastMediaMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/OrderLastMediaMapper.java @@ -2,6 +2,11 @@ package com.zhehekeji.web.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhehekeji.web.entity.OrderLastMedia; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; public interface OrderLastMediaMapper extends BaseMapper { + + @Select("select * from order_last_media where shelve_id = #{shelveId} and `row` = #{row} and `column` = #{column} limit 1") + OrderLastMedia getOne(@Param("shelveId")String shelveId,@Param("row")Integer row,@Param("column")Integer column); } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/OrderSaveReq.java b/web/src/main/java/com/zhehekeji/web/pojo/OrderSaveReq.java index b47e9cc..3c9554e 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/OrderSaveReq.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/OrderSaveReq.java @@ -9,15 +9,18 @@ import javax.validation.constraints.NotNull; @Data public class OrderSaveReq { - @ApiModelProperty("订单号") + @ApiModelProperty("订单号 序号+巷道+垛机ID+货位号+动作") @NotEmpty(message = "orderNum(订单号)不能为空") private String orderNum; - @ApiModelProperty("仓位号") - @NotEmpty(message = "positionNum(仓位号)不能为空") - private String positionNum; +// @ApiModelProperty("仓位号") +// @NotEmpty(message = "positionNum(仓位号)不能为空") +// private String positionNum; - @ApiModelProperty("约定token") - @NotEmpty(message = "token不能为空") - private String token; +// @ApiModelProperty("约定token") +// @NotEmpty(message = "token不能为空") +// private String token; + + @NotEmpty(message = "plcId不能为空") + private String plcId; } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java index af0fa74..70873bb 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java @@ -9,4 +9,8 @@ public class OrderSearch { @NotEmpty(message = "订单号不能为空") private String orderNum; + + private Long startTimestamp; + + private Long endTimestamp; } 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 new file mode 100644 index 0000000..3e422cc --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/CameraSearchReq.java @@ -0,0 +1,18 @@ +package com.zhehekeji.web.pojo.camera; + +import lombok.Data; + +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/pojo/camera/IOImport.java b/web/src/main/java/com/zhehekeji/web/pojo/camera/IOImport.java new file mode 100644 index 0000000..caf3f35 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/IOImport.java @@ -0,0 +1,9 @@ +package com.zhehekeji.web.pojo.camera; + +import lombok.Data; + +@Data +public class IOImport { + + private String name; +} 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 d3bd3e0..4bd3f56 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -1,18 +1,27 @@ package com.zhehekeji.web.service; +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.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Camera; +import com.zhehekeji.web.entity.CameraIO; +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.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; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.IOException; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; @@ -25,6 +34,8 @@ public class CameraService { private CameraMapper cameraMapper; @Resource private StreetMapper streetMapper; + @Resource + private CameraIOMapper ioMapper; @Value("${cameraPassword}") private String cameraPassword; @@ -68,5 +79,30 @@ public class CameraService { 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(); + } + + public Integer addIO(CameraIO cameraIO){ + cameraIO.setUpdateTime(LocalDateTime.now()); + ioMapper.insert(cameraIO); + return cameraIO.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); + } + + public void editIO(CameraIO cameraIO){ + cameraIO.setUpdateTime(LocalDateTime.now()); + ioMapper.updateById(cameraIO); + } + + public void delIO(Integer id){ + ioMapper.deleteById(id); + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java new file mode 100644 index 0000000..785f5a7 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java @@ -0,0 +1,65 @@ +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.pojo.camera.IOImport; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class IOImportListener extends AnalysisEventListener { + + private static Integer LENGTH = 5000; + + private CameraIOMapper cameraIOMapper; + + private Integer cameraId; + + 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)); + if(cameraIOS.size() >0){ + this.names = cameraIOS.stream().map(CameraIO::getName).collect(Collectors.toList()); + } + } + + private List stocks = new ArrayList<>(LENGTH); + + @Override + public void invoke(IOImport ioImport, AnalysisContext analysisContext) { + if(!names.contains(ioImport.getName())){ + CameraIO cameraIO = new CameraIO(); + cameraIO.setName(ioImport.getName()); + cameraIO.setCameraId(cameraId); + cameraIO.setUpdateTime(LocalDateTime.now()); + stocks.add(cameraIO); + if(stocks.size() > LENGTH){ + save(stocks); + stocks.clear(); + } + } + + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + save(stocks); + log.info("导入球机IO"); + } + + private void save(List stocks) { + if(stocks.size() > 0){ + cameraIOMapper.batchInsert(stocks); + } + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java new file mode 100644 index 0000000..4073d45 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -0,0 +1,39 @@ +package com.zhehekeji.web.service; + +import com.zhehekeji.web.entity.Camera; +import com.zhehekeji.web.lib.CameraConnMap; +import com.zhehekeji.web.lib.LoginModule; +import com.zhehekeji.web.lib.NetSDKLib; +import com.zhehekeji.web.mapper.CameraMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +@Component +@Slf4j +public class InitService implements ApplicationRunner { + + + @Resource + private CameraMapper cameraMapper; + + @Override + public void run(ApplicationArguments args) throws Exception { + List cameras = cameraMapper.selectByMap(new HashMap<>(0)); + cameras.forEach(camera -> { + NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),camera.getId()); + if(lLong.longValue() <= 0){ + log.error("初始相机 登录失败:cameraId{}",camera.getId()); + }else { + CameraConnMap.conn(camera.getId(),lLong); + log.debug("初始相机登录成功 cameraId:{}",camera.getId()); + } + }); + + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/OrderService.java b/web/src/main/java/com/zhehekeji/web/service/OrderService.java index 1ab4e03..905c6ae 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -3,7 +3,12 @@ package com.zhehekeji.web.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Order; +import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.entity.StreetShelve; +import com.zhehekeji.web.lib.PtzControlModule; import com.zhehekeji.web.mapper.OrderMapper; +import com.zhehekeji.web.mapper.StreetMapper; +import com.zhehekeji.web.mapper.StreetShelveMapper; import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; import org.springframework.beans.BeanUtils; @@ -11,6 +16,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -21,6 +27,10 @@ public class OrderService { @Resource private OrderMapper orderMapper; + @Resource + private StreetShelveMapper streetShelveMapper; + @Resource + private StreetMapper streetMapper; @Value("${picPort}") private String picPort; @@ -31,6 +41,20 @@ public class OrderService { return orders; } + public void pic(Integer type,String orderNum){ + //todo 根据订单号直接找到货架号 + String shelveId = "aaa"; + List streetShelves = streetShelveMapper.selectList(new QueryWrapper().eq("shelve_id",shelveId)); + if(streetShelves.size() > 0){ + Street street = streetMapper.selectById(streetShelves.get(0).getStreetId()); + if(street.getCamera1Id() != null){ + PtzControlModule.pic(street.getCamera1Id(),0,orderNum,type); + }else if(street.getCamera2Id() != null){ + PtzControlModule.pic(street.getCamera2Id(),0,orderNum,type); + } + } + } + public Long add(OrderSaveReq saveReq){ Order order = new Order(); String orderNum = saveReq.getOrderNum(); @@ -38,6 +62,7 @@ public class OrderService { order.setColumn(1); order.setShelveId("aaa"); order.setRow(1); + order.setOrderNum(orderNum); order.setCreateTime(LocalDateTime.now()); orderMapper.insert(order); return order.getId(); diff --git a/web/src/main/resources/mapper/CameraIOMapper.xml b/web/src/main/resources/mapper/CameraIOMapper.xml new file mode 100644 index 0000000..b629857 --- /dev/null +++ b/web/src/main/resources/mapper/CameraIOMapper.xml @@ -0,0 +1,13 @@ + + + + + + insert into camera_io( + name,camera_id + ) values + + (#{item.name},#{item.cameraId}) + + +