From c0e33bbd0656da42bd7b3a6ec2d466fc51bcf25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E9=B8=A3?= Date: Tue, 5 Jan 2021 17:45:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E9=A2=91=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhehekeji/common/util/PathUtil.java | 11 ++ .../controller/CameraControlController.java | 14 +-- .../web/controller/OrderController.java | 21 +++- .../java/com/zhehekeji/web/entity/Order.java | 19 ++- .../java/com/zhehekeji/web/lib/CallBack.java | 3 + .../com/zhehekeji/web/lib/OrderRealtime.java | 36 +++++- .../zhehekeji/web/lib/PtzControlModule.java | 16 +-- .../com/zhehekeji/web/mapper/OrderMapper.java | 4 + .../zhehekeji/web/mapper/StreetMapper.java | 3 + .../zhehekeji/web/service/OrderService.java | 109 +++++++++++++++--- web/src/main/resources/application-dev.yml | 1 + web/src/main/resources/application-test.yml | 1 + 12 files changed, 194 insertions(+), 44 deletions(-) diff --git a/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java b/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java index 07c0f40..ca089df 100644 --- a/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java +++ b/modules/common/src/main/java/com/zhehekeji/common/util/PathUtil.java @@ -17,6 +17,17 @@ public class PathUtil { return time + "/" + UUID.randomUUID() + "."+fileType; } + /** + * 检查文件的文件夹是否存在,不存在则新建 + * @param url + */ + public static void checkDirc(String url){ + File file = new File(url); + if(!file.getParentFile().exists()){ + file.getParentFile().mkdirs(); + } + } + public static File getFile(String url){ File file = new File(url); //如果文件不存在,则新建一个 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 a14be47..8f74892 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -290,13 +290,13 @@ public class CameraControlController { return Result.success(); } - @PostMapping("/mp4/{id}") - @ApiOperation(value = "录像") - public Result MP4(@PathVariable Integer id) { - checkLogin(id); - PtzControlModule.downloadMp4(id,0); - return Result.success(); - } +// @PostMapping("/mp4/{id}") +// @ApiOperation(value = "录像") +// public Result MP4(@PathVariable Integer id) { +// checkLogin(id); +// PtzControlModule.downloadMp4(id); +// return Result.success(); +// } private void checkLogin(Integer cameraId){ if(CameraConnMap.getConnId(cameraId) == null){ 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 835c503..b0250d8 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -40,14 +40,27 @@ public class OrderController { @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){ + @ApiOperation("工单开始信号") + @GetMapping("/start") + public Result orderStart(@ApiParam("工单号") @RequestParam String orderNum){ + orderService.orderStart(orderNum); + return Result.success(); + } + + @ApiOperation("工单结束信号") + @GetMapping("/stop") + public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum){ + orderService.orderStop(orderNum,null); + return Result.success(); + } + + @ApiOperation("工单被告警打断") + @GetMapping("/error") + public Result orderError(@ApiParam("工单号") @RequestParam String orderNum){ //validatorUtil.validate(saveReq); //Assert.isTrue(postToken.equals(saveReq.getToken()),"token不正确"); return Result.success(); 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 02cf0d0..7b0b5d3 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -19,13 +19,16 @@ public class Order { @ApiModelProperty("订单号") private String orderNum; - private String shelveId; + @ApiModelProperty("0:正常 1:告警") + private Integer status; - @TableField("`row`") - private Integer row; - - @TableField("`column`") - private Integer column; +// private String shelveId; +// +// @TableField("`row`") +// private Integer row; +// +// @TableField("`column`") +// private Integer column; // @ApiModelProperty("仓位号") // private String positionNum; @@ -47,5 +50,9 @@ public class Order { @ApiModelProperty("货位照片") private String goodsPath; + private LocalDateTime startTime; + + private LocalDateTime endTime; + private LocalDateTime createTime; } 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 a1666ef..3bd8594 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CallBack.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CallBack.java @@ -1,6 +1,8 @@ package com.zhehekeji.web.lib; import com.sun.jna.Pointer; +import com.zhehekeji.web.entity.Order; +import com.zhehekeji.web.mapper.OrderMapper; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -27,6 +29,7 @@ public class CallBack { @Override public void invoke(NetSDKLib.LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { if(dwDownLoadSize == -1) { + OrderRealtime.overDownload(lPlayHandle); StopDownLoadThread stopDownLoadThread = new StopDownLoadThread(lPlayHandle); stopDownLoadThread.start(); } diff --git a/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java b/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java index 5aef4d3..ec624f5 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java +++ b/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java @@ -1,6 +1,5 @@ package com.zhehekeji.web.lib; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -16,6 +15,12 @@ public class OrderRealtime { */ private static Map orderMap = new ConcurrentHashMap<>(); + /** + * 下载句柄与订单号的关联 + * key: 下载句柄 + * value: 订单号 + */ + private static Map playOrderMap = new ConcurrentHashMap<>(); public static void startOrder(Integer streetId,String orderNum){ synchronized (streetId.toString().intern()){ @@ -23,6 +28,20 @@ public class OrderRealtime { } } + /** + * 获取当前巷道 正在执行的订单 + * @param streetId + * @return + */ + public static String getOrderByStreetId(Integer streetId){ + return orderMap.get(streetId); + } + + /** + * 结束订单,返回订单号 + * @param streetId + * @return + */ public static String stopOrder(Integer streetId){ synchronized (streetId.toString().intern()){ String orderNum = orderMap.get(streetId); @@ -30,4 +49,19 @@ public class OrderRealtime { return orderNum; } } + + public static void startDownload(NetSDKLib.LLong play,String orderNum){ + playOrderMap.put(play,orderNum); + } + + /** + * 下载完成,删除关联关系,并返回订单号 + * @param play + * @return + */ + public static String overDownload(NetSDKLib.LLong play){ + String orderNum = playOrderMap.get(play); + playOrderMap.remove(play); + return orderNum; + } } 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 521f6fd..0b668db 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java @@ -2,8 +2,11 @@ package com.zhehekeji.web.lib; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; +import com.zhehekeji.common.util.PathUtil; +import com.zhehekeji.common.util.SpringContextUtil; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.lib.common.ErrorCode; +import com.zhehekeji.web.mapper.OrderMapper; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; @@ -229,20 +232,18 @@ public class PtzControlModule { } - public static void downloadMp4(Integer cameraId,int channelId){ - NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime start = now.minusMinutes(80); + public static void downloadMp4(Integer cameraId,String path,String orderNum,LocalDateTime start,LocalDateTime end){ + PathUtil.checkDirc(path); + NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); startTime.setTime(start.getYear(),start.getMonthValue(),start.getDayOfMonth(),start.getHour(),start.getMinute(),start.getSecond()); NetSDKLib.NET_TIME endTime = new NetSDKLib.NET_TIME(); - LocalDateTime end = now.minusMinutes(75); endTime.setTime(end.getYear(),end.getMonthValue(),end.getDayOfMonth(),end.getHour(),end.getMinute(),end.getSecond()); NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE download_by_data_type = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE(); download_by_data_type.nChannelID = 0; download_by_data_type.stStartTime = startTime; download_by_data_type.stStopTime = endTime; - String u = UUID.randomUUID().toString(); - download_by_data_type.szSavedFileName="d:/qq/"+u+".mp4"; + System.out.println("path:"+path); + download_by_data_type.szSavedFileName=path; download_by_data_type.emDataType = 3; download_by_data_type.emRecordType = 0; download_by_data_type.cbDownLoadPos = mp4ReceiveCB; @@ -254,6 +255,7 @@ 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){ + OrderRealtime.startDownload(l,orderNum); System.out.println(ErrorCode.getErrorCode(LoginModule.netsdk.CLIENT_GetLastError())); //System.out.println(ToolKits.getErrorCodePrint()); } diff --git a/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java index 1069b06..3b45c03 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java @@ -2,6 +2,10 @@ package com.zhehekeji.web.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhehekeji.web.entity.Order; +import org.apache.ibatis.annotations.Select; public interface OrderMapper extends BaseMapper { + + @Select("select * from `order` where order_num = #{orderNum} limit 1") + Order getOneByOrderNum(String orderNum); } diff --git a/web/src/main/java/com/zhehekeji/web/mapper/StreetMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/StreetMapper.java index 3e2ca72..786fb1a 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/StreetMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/StreetMapper.java @@ -14,4 +14,7 @@ public interface StreetMapper extends BaseMapper { Integer checkCamera(Integer cameraId); List list(); + + @Select("select * from street where plc_id = #{plcId} limit 1") + Street getStreetByPlcId(String plcId); } 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 905c6ae..ac6b5cf 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -1,28 +1,28 @@ package com.zhehekeji.web.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.zhehekeji.core.util.Assert; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.entity.StreetShelve; +import com.zhehekeji.web.lib.OrderRealtime; 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; +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.util.StringUtils; -import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @Service +@Slf4j public class OrderService { @Resource @@ -35,37 +35,108 @@ public class OrderService { @Value("${picPort}") private String picPort; - public List orders(OrderSearch orderSearch){ - QueryWrapper queryWrapper = new QueryWrapper().eq("order_num",orderSearch.getOrderNum()); + @Value("${mp4Path}") + private String mp4Path; + + public List orders(OrderSearch orderSearch) { + QueryWrapper queryWrapper = new QueryWrapper().eq("order_num", orderSearch.getOrderNum()); List orders = orderMapper.selectList(queryWrapper); return orders; } - public void pic(Integer type,String orderNum){ + 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){ + 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); + 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){ + public Long add(OrderSaveReq saveReq) { Order order = new Order(); String orderNum = saveReq.getOrderNum(); - //todo 转换row shelveId column - order.setColumn(1); - order.setShelveId("aaa"); - order.setRow(1); + order.setStatus(0); order.setOrderNum(orderNum); order.setCreateTime(LocalDateTime.now()); orderMapper.insert(order); return order.getId(); } + public void orderStart(String orderNum) { + Order order = new Order(); + order.setOrderNum(orderNum); + order.setStartTime(LocalDateTime.now()); + //todo 根据订单号,找到plcId,找到巷道 + String plcId = "123"; + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + log.error("订单开始信号,巷道不存在,orderNum:{},plcId:{}", orderNum,plcId); + return; + } + OrderRealtime.startOrder(street.getId(), orderNum); + orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); + } + + /** + * 结束订单,下载该段时间的视频 + * @param orderNum + * @param type 是否告警 1:是 + */ + public void orderStop(String orderNum,Integer type) { + Order order = orderMapper.getOneByOrderNum(orderNum); + if (order == null) { + log.error("订单结束信号,订单不存在,orderNum:{}", orderNum); + return; + } + if (order.getStartTime() == null) { + log.error("订单结束信号,订单未开始,orderNum:{}", orderNum); + return; + } + if(type != null && type == 1){ + order.setStatus(type); + } + order.setOrderNum(orderNum); + order.setEndTime(LocalDateTime.now()); + //todo 根据订单号,找到plcId,找到巷道 + String plcId = "123"; + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + log.error("订单结束信号,巷道不存在,orderNum:{},plcId:{}", orderNum,plcId); + return; + } + if (street.getCamera1Id() != null) { + String path = PathUtil.createFileName("mp4"); + PtzControlModule.downloadMp4(street.getCamera1Id(), mp4Path + path, orderNum, order.getStartTime(), order.getEndTime()); + order.setVideoPath1(path); + } + if (street.getCamera2Id() != null) { + String path = PathUtil.createFileName("mp4"); + PtzControlModule.downloadMp4(street.getCamera2Id(), mp4Path + path, orderNum, order.getStartTime(), order.getEndTime()); + order.setVideoPath2(path); + } + orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); + OrderRealtime.stopOrder(street.getId()); + } + + /** + * 发生告警,如果仍有运行的订单,需要将该订单标记为告警,并下载录像 + * @param plcId + */ + public void error(String plcId){ + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + return; + } + String orderNum = OrderRealtime.stopOrder(street.getId()); + //停止订单 + orderStop(orderNum,1); + + } + } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 2c45a8c..b1c44d0 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -37,3 +37,4 @@ cameraPassword: admin123 cameraUser: admin cameraPort: 37777 mediaPath: d:\\media\ +mp4Path: d:\\mp4\ diff --git a/web/src/main/resources/application-test.yml b/web/src/main/resources/application-test.yml index 6b4074d..59057f7 100644 --- a/web/src/main/resources/application-test.yml +++ b/web/src/main/resources/application-test.yml @@ -37,3 +37,4 @@ cameraPassword: hzleaper123 cameraUser: admin cameraPort: 37777 mediaPath: d:\\media\ +mp4Path: d:\\media_mp4\