From e3232e781c487fd7cabc8f6a70e2177ef7ecf6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E9=B8=A3?= Date: Wed, 20 Jan 2021 17:23:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E4=BD=9C=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zhehekeji/web/Application.java | 1 + .../controller/CameraControlController.java | 2 +- .../web/controller/OrderController.java | 23 +- .../web/controller/PLCController.java | 29 +- .../com/zhehekeji/web/entity/CameraIO.java | 2 + .../zhehekeji/web/entity/CameraIOConfig.java | 2 + .../java/com/zhehekeji/web/entity/Order.java | 17 +- .../java/com/zhehekeji/web/entity/Street.java | 1 - .../java/com/zhehekeji/web/entity/Warn.java | 3 - .../zhehekeji/web/lib/CaptureRunnable.java | 34 +-- .../java/com/zhehekeji/web/lib/OrderInfo.java | 32 ++- .../com/zhehekeji/web/lib/OrderRealtime.java | 62 ++--- .../zhehekeji/web/lib/PtzControlModule.java | 19 +- .../web/mapper/StreetShelveMapper.java | 14 - .../zhehekeji/web/pojo/camera/IOImport.java | 2 + .../web/service/HeartNettyClientHandler.java | 9 +- .../web/service/IOImportListener.java | 1 + .../zhehekeji/web/service/InitService.java | 15 + .../web/service/MyProtocolDecoder.java | 62 +++-- .../{ClientMap.java => NettyClient.java} | 16 +- .../zhehekeji/web/service/OrderAction.java | 39 +++ .../zhehekeji/web/service/OrderService.java | 60 ++-- .../zhehekeji/web/service/PlcOrderInfo.java | 69 +++++ .../com/zhehekeji/web/service/PlcService.java | 257 ++++++++++++------ .../com/zhehekeji/web/service/SendHeart.java | 4 +- .../com/zhehekeji/web/service/StreetConn.java | 76 ++++++ .../zhehekeji/web/service/StreetService.java | 54 ++-- .../zhehekeji/web/service/TcpListener.java | 57 ---- .../resources/mapper/CameraIOConfigMapper.xml | 4 +- 29 files changed, 605 insertions(+), 361 deletions(-) delete mode 100644 web/src/main/java/com/zhehekeji/web/mapper/StreetShelveMapper.java rename web/src/main/java/com/zhehekeji/web/service/{ClientMap.java => NettyClient.java} (66%) create mode 100644 web/src/main/java/com/zhehekeji/web/service/OrderAction.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java create mode 100644 web/src/main/java/com/zhehekeji/web/service/StreetConn.java delete mode 100644 web/src/main/java/com/zhehekeji/web/service/TcpListener.java diff --git a/web/src/main/java/com/zhehekeji/web/Application.java b/web/src/main/java/com/zhehekeji/web/Application.java index 374f60b..fd31041 100644 --- a/web/src/main/java/com/zhehekeji/web/Application.java +++ b/web/src/main/java/com/zhehekeji/web/Application.java @@ -3,6 +3,7 @@ package com.zhehekeji.web; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication(scanBasePackages = {"com.zhehekeji"}) @MapperScan("com.zhehekeji.**.mapper.**") 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 8f74892..70ece83 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -286,7 +286,7 @@ public class CameraControlController { @ApiOperation(value = "立即拍照") public Result pic(@PathVariable Integer id) { checkLogin(id); - System.out.println(PtzControlModule.pic(id,0,"aaa",0)); + //System.out.println(PtzControlModule.pic(id,0,"aaa")); 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 cb04dcb..c97fd6b 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -43,29 +43,36 @@ public class OrderController { @ApiOperation("工单拍照") @GetMapping("/camera") - public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("类型 1:入库 3:出库 2:货物图片") @RequestParam Integer type){ - orderService.pic(type,orderNum); + public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plcId") @RequestParam String plcId){ + //orderService.pic(orderNum,plcId); return Result.success(); } @ApiOperation("工单开始信号") @GetMapping("/start") - public Result orderStart(@ApiParam("工单号") @RequestParam String orderNum, @ApiParam("plc")String plcId){ + public Result orderStart(@ApiParam("工单号") @RequestParam String orderNum, @ApiParam("plc")@RequestParam String plcId){ plcService.orderStart(orderNum,plcId); return Result.success(); } @ApiOperation("工单结束信号") @GetMapping("/stop") - public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")String plcId){ - plcService.orderStop(orderNum,null,plcId); + public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")@RequestParam String plcId){ + plcService.orderStop(plcId,orderNum); return Result.success(); } - @ApiOperation("工单被告警打断") + @ApiOperation("发生告警") @GetMapping("/error") - public Result orderError(@ApiParam("plc") @RequestParam String plcId,@RequestParam String warnNum){ - plcService.warnStart(plcId,warnNum); + public Result orderError(@ApiParam("plc") @RequestParam String plcId){ + plcService.warnStart(plcId); + return Result.success(); + } + + @ApiOperation("告警结束") + @GetMapping("/errorStop") + public Result errorStop(@ApiParam("plc") @RequestParam String plcId){ + plcService.warnStop(plcId); return Result.success(); } diff --git a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java index 8a9ecb0..54a5c40 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java @@ -1,13 +1,11 @@ package com.zhehekeji.web.controller; -import com.github.pagehelper.PageInfo; import com.zhehekeji.core.pojo.Result; import com.zhehekeji.core.util.Assert; import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.mapper.StreetMapper; -import com.zhehekeji.web.pojo.street.StreetSearch; -import com.zhehekeji.web.pojo.street.StreetVO; -import com.zhehekeji.web.service.ClientMap; +import com.zhehekeji.web.service.NettyClient; +import com.zhehekeji.web.service.StreetConn; import com.zhehekeji.web.service.StreetService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,15 +23,28 @@ public class PLCController { @Resource private StreetMapper streetMapper; @Resource - private ClientMap clientMap; + private NettyClient nettyClient; - @GetMapping("/heart") - @ApiOperation(value = "心跳") - public Result heart(@RequestParam Integer id) throws InterruptedException { + @GetMapping("/tcp") + @ApiOperation(value = "连接plc,发起请求") + public Result heart(@RequestParam Integer id){ Street street = streetMapper.selectById(id); Assert.isTrue(street!= null && street.getPlcIp() != null && street.getPlcPort() != null,"未配置IP"); - clientMap.createClient(street); + //先判断该链接是否正常 + if(!StreetConn.checkStreetConn(id)){ + try { + nettyClient.createClient(street); + }catch (Exception e){ + Assert.isTrue(false,"连接失败,ip:"+street.getPlcIp()+",port:"+street.getPlcPort()); + } + } + return Result.success(); + } + + @GetMapping("/disPlc") + @ApiOperation(value = "未连接的PLC") + public Result disConn(){ return Result.success(); } 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 a676fe8..1d6ca73 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CameraIO.java @@ -18,6 +18,8 @@ public class CameraIO { private Integer cameraId; + private String code; + private String name; @ApiModelProperty("位置") diff --git a/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java b/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java index 954dce6..231bc68 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CameraIOConfig.java @@ -16,5 +16,7 @@ public class CameraIOConfig { private String name; + private String code; + 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 fc677d6..3b07f1b 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -42,14 +42,17 @@ public class Order { @TableField("`video_path_2`") private String videoPath2; - @ApiModelProperty("入库照片") - private String putPath; + @ApiModelProperty("图片地址,分隔") + private String picPaths; - @ApiModelProperty("出库照片") - private String outputPath; - - @ApiModelProperty("货位照片") - private String goodsPath; +// @ApiModelProperty("入库照片") +// private String putPath; +// +// @ApiModelProperty("出库照片") +// private String outputPath; +// +// @ApiModelProperty("货位照片") +// private String goodsPath; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; diff --git a/web/src/main/java/com/zhehekeji/web/entity/Street.java b/web/src/main/java/com/zhehekeji/web/entity/Street.java index 774b38f..28dbbeb 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Street.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Street.java @@ -33,7 +33,6 @@ public class Street { private Integer leftRow; @ApiModelProperty("左内侧货架号-双伸") - @TableField(strategy = FieldStrategy.IGNORED) private String leftInsideShelveId; diff --git a/web/src/main/java/com/zhehekeji/web/entity/Warn.java b/web/src/main/java/com/zhehekeji/web/entity/Warn.java index 9c988a1..3e906d5 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Warn.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Warn.java @@ -19,9 +19,6 @@ public class Warn { private Integer streetId; - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; 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 c1f63de..065ce04 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java @@ -53,30 +53,30 @@ public class CaptureRunnable implements Runnable { if (picPath == null) { return; } - log.debug("save pic orderId:{} path:{}", orderInfo.getOrderId(), picPath); + log.debug("save pic orderNum:{} path:{}", orderInfo.getOrderNum(), picPath); //todo 根据orderNum找到货架,暂时qqq - String shelveId = "qqq"; - Integer row = 1; - Integer column = 1; + String shelveId = orderInfo.getShelveId(); + Integer row = orderInfo.getRow(); + Integer column = orderInfo.getColumn(); 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.setGoodsPath(path); - orderLastMedia.setLastGoodsOrderNum(orderInfo.getOrderNum()); - orderLastMedia.setGoodsPath(path); - } else if (OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())) { - order.setPutPath(path); - 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); - } +// if (OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())) { +// order.setGoodsPath(path); +// orderLastMedia.setLastGoodsOrderNum(orderInfo.getOrderNum()); +// orderLastMedia.setGoodsPath(path); +// } else if (OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())) { +// order.setPutPath(path); +// 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); +// } lastMediaMapper.updateById(orderLastMedia); orderMapper.update(order, new UpdateWrapper().eq("order_num",orderInfo.getOrderNum())); return; diff --git a/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java b/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java index 03bc654..5f9ca42 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java +++ b/web/src/main/java/com/zhehekeji/web/lib/OrderInfo.java @@ -13,22 +13,28 @@ public class OrderInfo { private String orderNum; - /** - * 1:入库 2:货位 3:出库 - */ - private Integer type; + private String shelveId; - @AllArgsConstructor - @Getter - public enum OrderPathType{ - PUT(1), - OUTPUT(3), - GOODS(2), + private Integer row; - ; - private Integer type; + private Integer column; - } + /** + * 1:入库 2:货位 3:出库 + */ +// private Integer type; + +// @AllArgsConstructor +// @Getter +// public enum OrderPathType{ +// PUT(1), +// OUTPUT(3), +// GOODS(2), +// +// ; +// private Integer type; +// +// } } 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 fadb3ff..16958c9 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java +++ b/web/src/main/java/com/zhehekeji/web/lib/OrderRealtime.java @@ -1,9 +1,6 @@ package com.zhehekeji.web.lib; -import org.springframework.util.CollectionUtils; - import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -16,9 +13,12 @@ public class OrderRealtime { * key :streetId * value: 订单号 */ - private static Map orderMap = new ConcurrentHashMap<>(); + private static Map orderMap = new ConcurrentHashMap<>(); - private static Map> warnMap = new ConcurrentHashMap<>(); + /** + * key: streetId + * value:告警id warn表 + */ private static Map warnIdMap = new ConcurrentHashMap<>(); /** @@ -26,74 +26,60 @@ public class OrderRealtime { * key: 下载句柄 * value: 订单号 */ - private static Map playOrderMap = new ConcurrentHashMap<>(); + private static Map playOrderMap = new ConcurrentHashMap<>(); - public static void startOrder(Integer streetId,String orderNum){ - orderMap.put(streetId,orderNum); + public static void startOrder(Integer streetId, String orderNum) { + orderMap.put(streetId, orderNum); } /** * 获取当前巷道 正在执行的订单 + * * @param streetId * @return */ - public static String getOrderByStreetId(Integer streetId){ + public static String getOrderByStreetId(Integer streetId) { return orderMap.get(streetId); } - public static void startWarn(Integer streetId,String orderNum,Long warnId){ - Set set = warnMap.get(streetId); - set.add(orderNum); - warnMap.put(streetId,set); - if(warnId != null){ - warnIdMap.put(streetId,warnId); + public static void startWarn(Integer streetId, Long warnId) { + if (warnId != null) { + warnIdMap.put(streetId, warnId); } } - /** - * 结束告警,返回是否还存在告警 - * true:存在告警 - * @param streetId - * @return - */ - public static Boolean stopWarn(Integer streetId,String orderNum){ - Set set = warnMap.get(streetId); - set.remove(orderNum); - warnMap.put(streetId,set); - return !set.isEmpty(); - } - public static Long getWarnId(Integer streetId){ + public static Long getWarnId(Integer streetId) { return warnIdMap.get(streetId); } - public static void cleanWarn(Integer streetId){ + public static void cleanWarn(Integer streetId) { warnIdMap.remove(streetId); } /** * 结束订单,返回订单号 + * * @param streetId * @return */ - public static String stopOrder(Integer streetId){ - - String orderNum = orderMap.get(streetId); - orderMap.remove(streetId); - return orderNum; - + public static String stopOrder(Integer streetId) { + String orderNum = orderMap.get(streetId); + orderMap.remove(streetId); + return orderNum; } - public static void startDownload(NetSDKLib.LLong play,String orderNum){ - playOrderMap.put(play,orderNum); + public static void startDownload(NetSDKLib.LLong play, String orderNum) { + playOrderMap.put(play, orderNum); } /** * 下载完成,删除关联关系,并返回订单号 + * * @param play * @return */ - public static String overDownload(NetSDKLib.LLong play){ + 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 0b668db..0ae8b28 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/PtzControlModule.java @@ -3,14 +3,10 @@ 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; -import java.util.UUID; /** * 云台控制接口实现 @@ -217,15 +213,13 @@ public class PtzControlModule { 0, 0, 0, 1); } - public static boolean pic(Integer cameraId,int nChannelID,String orderNum,Integer type) { + public static boolean pic(Integer cameraId,int nChannelID,OrderInfo orderInfo) { NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS(); stuSnapParams.Channel = nChannelID; // channel stuSnapParams.mode = 0; // capture picture mode stuSnapParams.Quality = 3; // picture quality stuSnapParams.InterSnap = 0; // timer capture picture time interval stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial(); - Long orderId = 1L; - 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); @@ -242,7 +236,6 @@ public class PtzControlModule { download_by_data_type.nChannelID = 0; download_by_data_type.stStartTime = startTime; download_by_data_type.stStopTime = endTime; - System.out.println("path:"+path); download_by_data_type.szSavedFileName=path; download_by_data_type.emDataType = 3; download_by_data_type.emRecordType = 0; @@ -250,14 +243,14 @@ public class PtzControlModule { 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); - System.out.println("开始"); - System.out.println("loginId:"+CameraConnMap.getConnId(cameraId)); + log.debug("start download mp4"); + 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()); + log.debug("mp4 long:{} "+l.longValue()); if(l.longValue() == 0){ + log.error("download error :{}",LoginModule.netsdk.CLIENT_GetLastError()); + }else { 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/StreetShelveMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/StreetShelveMapper.java deleted file mode 100644 index 92e6022..0000000 --- a/web/src/main/java/com/zhehekeji/web/mapper/StreetShelveMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zhehekeji.web.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.zhehekeji.web.entity.Stock; -import com.zhehekeji.web.entity.StreetShelve; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -public interface StreetShelveMapper extends BaseMapper { - - void batchInsert(@Param("streetShelves") List streetShelves); - -} 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 index caf3f35..67494ef 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/camera/IOImport.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/camera/IOImport.java @@ -6,4 +6,6 @@ import lombok.Data; public class IOImport { private String name; + + private String code; } diff --git a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java index d339e40..f7b3d1b 100644 --- a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java @@ -1,15 +1,11 @@ package com.zhehekeji.web.service; -import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; -import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; -import java.nio.charset.Charset; - /** * 处理客户端业务逻辑:心跳超时处理、服务端返回的数据处理 * @@ -33,6 +29,8 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.info("streetId:{}连接成功",streetId); + StreetConn.conn(streetId); ctx.fireChannelActive(); } @@ -41,7 +39,8 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter { */ @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { - log.error("streetId:{}连接被关闭",streetId); + log.info("streetId:{}连接被关闭",streetId); + StreetConn.disConn(streetId); } /** 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 631704f..6f15f0a 100644 --- a/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java +++ b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java @@ -37,6 +37,7 @@ public class IOImportListener extends AnalysisEventListener { if(!names.contains(ioImport.getName())){ CameraIOConfig cameraIO = new CameraIOConfig(); cameraIO.setName(ioImport.getName()); + cameraIO.setCode(ioImport.getCode()); cameraIO.setUpdateTime(LocalDateTime.now()); stocks.add(cameraIO); if(stocks.size() > LENGTH){ diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java index d52c50e..048b838 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -1,6 +1,7 @@ package com.zhehekeji.web.service; import com.zhehekeji.web.entity.Camera; +import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.LoginModule; import com.zhehekeji.web.lib.NetSDKLib; @@ -24,12 +25,26 @@ public class InitService implements ApplicationRunner { private CameraMapper cameraMapper; @Resource private StreetMapper streetMapper; + @Resource + private NettyClient nettyClient; @Override public void run(ApplicationArguments args) throws Exception { + //球机登录 List cameras = cameraMapper.selectByMap(new HashMap<>(0)); loginThread loginThread = new loginThread(cameras); loginThread.start(); + //plc 连接状态初始化 + List streets = streetMapper.selectByMap(new HashMap<>(0)); + streets.forEach(street -> { + StreetConn.init(street.getId()); + try { + nettyClient.createClient(street); + }catch (Exception e){ + log.error("streetId:{}:初始plc连接失败,url:{},port:{}",street.getId(),street.getPlcIp(),street.getPlcPort()); + } + + }); } diff --git a/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java b/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java index d51b854..d54d846 100644 --- a/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java @@ -43,13 +43,13 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { } CharSequence plc = in.readCharSequence(6, Charset.defaultCharset()); String plcId = plc.toString(); - log.debug("plcId:{}", plcId); + log.info("plcId:{}", plcId); // OA=心跳 OB=工单 OC=任务 OD=告警 CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); String type = typeChar.toString(); - int q = in.readInt(); + int taskId = in.readInt(); - log.info("type:{}", type); + log.debug("type:{}", type); short short1 = in.readShort(); short short2 = in.readShort(); @@ -59,31 +59,13 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { short short6 = in.readShort(); short short7 = in.readShort(); short short8 = in.readShort(); - log.info("int:{},1:{},2:{},3:{},4:{},5:{},6:{},7:{},8:{}", q, short1, short2, short3, short4, short5, short6, short7, short8); - if (type.equals("0A")) { - //心跳 - log.info("recieve plc heart"); - } else if (type.equals("0B")) { - String orderNum = "" + q + short1 + short2 + short3 + short4 + short5 + short6 + short7 + short8; - log.info("order:{}", orderNum); - if (q == 1) { - log.info("order start"); - plcService.orderStart(orderNum, plcId); - } else if (q == 2) { - log.info("order end"); - plcService.orderStop(orderNum, null, plcId); - } - } else if (type.equals("0C")) { + PlcOrderInfo plcOrderInfo = new PlcOrderInfo(taskId,(int)short1,(int)short2,(int)short3,(int)short4,(int)short5,(int)short6,(int)short7,(int)short8); - } else { - - } byte maohao = in.readByte(); - log.info(":{}", maohao); byte leixing = in.readByte(); - log.info("---leixing:{}", leixing); byte w = in.readByte(); - log.info("---w:{}", w); + Character character = new Character((char)leixing); + String code = character.toString()+w; byte b1 = in.readByte(); byte b2 = in.readByte(); byte b3 = in.readByte(); @@ -92,6 +74,38 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { byte b6 = in.readByte(); byte b7 = in.readByte(); byte b8 = in.readByte(); + if (type.equals("0A")) { + //心跳 + log.debug("receive plc heart"); + } else if (type.equals("0B")) { + + if ("B1".equals(code)) { + log.info("order start ,plcId:{},orderInfo:{}",plcId, plcOrderInfo.toString()); + plcService.orderStart(plcOrderInfo.getOrderNum(), plcId); + } else if ("B2".equals(code)) { + log.info("order end, plcId:{},orderInfo:{}",plcId, plcOrderInfo.toString()); + plcService.orderStop(plcId,plcOrderInfo.getOrderNum()); + } + + } else if (type.equals("0C")) { + log.info("action code,{} plcId:{},orderInfo:{}",code,plcId, plcOrderInfo.toString()); + Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); + //执行动作 + plcService.action(plcOrderInfo,plcId,times,code); + + } else if(type.equals("0D")){ + log.info(" warn code:{}",code); + if("D0".equals(code)){ + log.info("warn start ,plcId:{}",plcId); + plcService.warnStart(plcId); + //动作 + + }else if("D100".equals(code)){ + log.info("warn end ,plcId:{}",plcId); + plcService.warnStop(plcId); + } + } + log.info("b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}", b1, b2, b3, b4, b5, b6, b7, b8); in.release(); return null; diff --git a/web/src/main/java/com/zhehekeji/web/service/ClientMap.java b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java similarity index 66% rename from web/src/main/java/com/zhehekeji/web/service/ClientMap.java rename to web/src/main/java/com/zhehekeji/web/service/NettyClient.java index 18120f2..81ade25 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ClientMap.java +++ b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java @@ -7,29 +7,37 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import javax.annotation.Resource; @Slf4j @Component -public class ClientMap { +public class NettyClient { private static EventLoopGroup group = new NioEventLoopGroup(); @Resource private PlcService plcService; - public void createClient(Street street) throws InterruptedException { + public void createClient(Street street){ + if(StringUtils.isEmpty(street.getPlcIp()) || street.getPlcPort() == null){ + return; + } Bootstrap client = new Bootstrap(); // 第1步 定义线程组,处理读写和链接事件,没有了accept事件 client.group(group); // 第2步 绑定客户端通道 client.channel(NioSocketChannel.class); // 第3步 给NIoSocketChannel初始化handler, 处理读写事件 - SendHeart sendHeart = new SendHeart(street.getPlcId(),"0A"); + SendHeart sendHeart = new SendHeart(street.getPlcId()); client.handler(new HeartNettyClientFilter(street.getId(),sendHeart,plcService)); // 连接服务端 - client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); + try { + client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); + } catch (InterruptedException e) { + log.error("plc连接 被打断或无法连接:{}",e); + } } public static void close() { diff --git a/web/src/main/java/com/zhehekeji/web/service/OrderAction.java b/web/src/main/java/com/zhehekeji/web/service/OrderAction.java new file mode 100644 index 0000000..da3af23 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/OrderAction.java @@ -0,0 +1,39 @@ +package com.zhehekeji.web.service; + +import lombok.Data; + +import java.util.Map; + +/** + * @Description 记录订单任务的次数 + * @Author + * @Date 2021/1/20 13:54 + **/ +@Data +public class OrderAction { + + private static Map orderActions; + + /** + * 订单任务,返回该订单已发送的任务数 + * 一个订单由4个任务完成 + * @param orderNum + * @return + */ + public static Integer put(String orderNum){ + if(orderActions.get(orderNum) == null){ + orderActions.put(orderNum,1); + return 1; + } + int times = orderActions.get(orderNum); + times++; + //该订单的任务达到4次了,不会再有任务了,清除缓存 + //具体看取货、放货、货物库内转移的流程 + if(times >= 4){ + orderActions.remove(orderNum); + }else { + orderActions.put(orderNum,times); + } + return times; + } +} 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 a063059..190a41f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -5,12 +5,9 @@ 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 lombok.extern.slf4j.Slf4j; @@ -28,8 +25,8 @@ public class OrderService { @Resource private OrderMapper orderMapper; - @Resource - private StreetShelveMapper streetShelveMapper; +// @Resource +// private StreetShelveMapper streetShelveMapper; @Resource private StreetMapper streetMapper; @@ -51,20 +48,6 @@ 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(); @@ -75,6 +58,45 @@ public class OrderService { return order.getId(); } + /** + * 订单结束 + * @param orderNum 订单号 + * @param street 巷道 + * @param warn 是否有告警 true 告警 + */ + public void orderStop(String orderNum,Street street,Boolean warn) { + + Order order = orderMapper.getOneByOrderNum(orderNum); + if (order == null) { + log.error("订单结束信号,订单不存在,orderNum:{}", orderNum); + return; + } + if (order.getStartTime() == null) { + log.error("订单结束信号,订单未开始,orderNum:{}", orderNum); + return; + } + if(warn){ + order.setStatus(1); + }else { + order.setStatus(0); + } + order.setOrderNum(orderNum); + order.setEndTime(LocalDateTime.now()); + + 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)); + + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java b/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java new file mode 100644 index 0000000..8330648 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/PlcOrderInfo.java @@ -0,0 +1,69 @@ +package com.zhehekeji.web.service; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class PlcOrderInfo { + + /** + * 任务Id + */ + private Integer taskId; + + /** + * 前两个命令 库内?苦口? 1:库内 2:库口 + */ + private Integer inOut1; + + /** + * 前两个命令 左?右? 1:左 2:右 + */ + private Integer leftRight1; + + /** + * 前两个 列号 + */ + private Integer column1; + + /** + * 前两个 行号 + */ + private Integer row1; + + /** + * 后两个命令 库内?苦口? 1:库内 2:库口 + */ + private Integer inOut2; + + /** + * 后两个命令 左?右? 1:左 2:右 + */ + private Integer leftRight2; + + /** + * 后两个 列号 + */ + private Integer column2; + + /** + * 后两个 行号 + */ + private Integer row2; + + private String orderNum; + + public PlcOrderInfo(Integer taskId, Integer inOut1, Integer leftRight1, Integer column1, Integer row1, Integer inOut2, Integer leftRight2, Integer column2, Integer row2) { + this.taskId = taskId; + this.inOut1 = inOut1; + this.leftRight1 = leftRight1; + this.column1 = column1; + this.row1 = row1; + this.inOut2 = inOut2; + this.leftRight2 = leftRight2; + this.column2 = column2; + this.row2 = row2; + this.orderNum = ""+taskId+inOut1+leftRight1+column1+row1+inOut2+leftRight2+column2+row2; + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 6fc46d2..3b77590 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -1,16 +1,12 @@ package com.zhehekeji.web.service; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.common.util.PathUtil; -import com.zhehekeji.web.entity.Order; -import com.zhehekeji.web.entity.Street; -import com.zhehekeji.web.entity.Warn; +import com.zhehekeji.web.entity.*; +import com.zhehekeji.web.lib.OrderInfo; 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.mapper.WarnMapper; +import com.zhehekeji.web.mapper.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -18,19 +14,29 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; - +import java.util.ArrayList; +import java.util.List; + +/** + * @Description plc信号指令处理类 + * 对plcId做同步处理,防止内存中保存的正在运行的订单信息错乱 + * @Author qiushui + * @Date 2021/1/19 13:45 + **/ @Service @Slf4j public class PlcService { @Resource private OrderMapper orderMapper; - @Resource - private StreetShelveMapper streetShelveMapper; +// @Resource +// private StreetShelveMapper streetShelveMapper; @Resource private StreetMapper streetMapper; @Resource private WarnMapper warnMapper; + @Resource + private OrderService orderService; @Value("${picPort}") private String picPort; @@ -38,13 +44,10 @@ public class PlcService { @Value("${mp4Path}") private String mp4Path; - private Street getStreetByPlcId(String plcId){ - Street street = streetMapper.getStreetByPlcId(plcId); - if(street == null){ - log.error("巷道不存在plcId:{}",plcId); - } - return street; - } + @Resource + private StreetService streetService; + @Resource + private CameraIOMapper ioMapper; /** * 开始工单 @@ -53,113 +56,172 @@ public class PlcService { */ public void orderStart(String orderNum,String plcId) { Order order = new Order(); - String orderNumber = plcId+orderNum; - order.setOrderNum(orderNumber); + order.setOrderNum(orderNum); order.setStartTime(LocalDateTime.now()); - Street street = getStreetByPlcId(plcId); + order.setCreateTime(LocalDateTime.now()); + Street street = streetService.getStreetByPlcId(plcId); if(street != null){ - OrderRealtime.startOrder(street.getId(), orderNumber); - orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNumber)); + OrderRealtime.startOrder(street.getId(), orderNum); + orderMapper.insert(order); + //orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); } } /** - * 结束订单,下载该段时间的视频 - * @param orderNum - * @param warn 是否告警 1:是 + * //times == 1 ,做动作 + * //times == 2 ,拍照 + * //times == 3 ,做动作 + * //times == 4 ,拍照 + * @param plcOrderInfo + * @param plcId + * @param times */ - public void orderStop(String orderNum,Integer warn,String plcId) { - Street street = getStreetByPlcId(plcId); + public void action(PlcOrderInfo plcOrderInfo,String plcId,Integer times,String code){ + Street street = streetService.getStreetByPlcId(plcId); if(street == null){ return; } - String orderNumber = plcId+orderNum; - Order order = orderMapper.getOneByOrderNum(orderNumber); - if (order == null) { - log.error("订单结束信号,订单不存在,orderNum:{}", orderNumber); + if(times == 1 || times == 3){ + //找到球机IO配置的预置点 + move(street.getCamera1Id(),street.getCamera2Id(),code); return; } - if (order.getStartTime() == null) { - log.error("订单结束信号,订单未开始,orderNum:{}", orderNumber); + //拍照 需要知道是哪个货架 + //1 判断是左右货架 1:左货架 2:右货架 + Integer leftRight = 0; + Integer row = 0; + Integer column = 0; + if(times == 2){ + leftRight = plcOrderInfo.getLeftRight1(); + row = plcOrderInfo.getRow1(); + column = plcOrderInfo.getColumn1(); + }else if(times == 4){ + leftRight = plcOrderInfo.getLeftRight2(); + row = plcOrderInfo.getRow2(); + column = plcOrderInfo.getColumn2(); + }else { + log.error("异常的任务次数,orderInfo:{},plcId:{},time:{}",plcOrderInfo.toString(),plcId,times); return; } - if(warn != null && warn == 1){ - order.setStatus(warn); + //2 得到相应的货架号(目前订单 只支持单伸货架) + //todo 后面可能会有双伸,这里要改,plc那里也要改 + String shelveId; + if(leftRight == 1){ + shelveId = street.getLeftShelveId(); + }else { + shelveId = street.getRightShelveId(); + } + if(StringUtils.isEmpty(shelveId) || row == 0 || column == 0){ + log.error("异常的任务号,找不到对应的货架或行列号。orderInfo:{},plcId:{},time:{}",plcOrderInfo.toString(),plcId,times); + return; } - order.setOrderNum(orderNumber); - order.setEndTime(LocalDateTime.now()); + OrderInfo orderInfo = new OrderInfo(0L,plcOrderInfo.getOrderNum(),shelveId,row,column); + PtzControlModule.pic(street.getCamera1Id(),0,orderInfo); + PtzControlModule.pic(street.getCamera2Id(),0,orderInfo); + } - if (street.getCamera1Id() != null) { - String path = PathUtil.createFileName("mp4"); - PtzControlModule.downloadMp4(street.getCamera1Id(), mp4Path + path, orderNumber, order.getStartTime(), order.getEndTime()); - order.setVideoPath1(path); + /** + * 根据plc指令转动摄像头到预置点 + * @param cameraId1 + * @param cameraId2 + * @param code + */ + public void move(Integer cameraId1,Integer cameraId2,String code){ + List cameraIds = new ArrayList<>(); + if(cameraId1 != null){ + cameraIds.add(cameraId1); } - if (street.getCamera2Id() != null) { - String path = PathUtil.createFileName("mp4"); - PtzControlModule.downloadMp4(street.getCamera2Id(), mp4Path + path, orderNumber, order.getStartTime(), order.getEndTime()); - order.setVideoPath2(path); + if(cameraId2 != null){ + cameraIds.add(cameraId1); } - orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNumber)); - OrderRealtime.stopOrder(street.getId()); + List ioConfigs = ioMapper.selectList(new QueryWrapper().eq("code",code).in("camera_id",cameraIds)); + ioConfigs.forEach(ioConfig->{ + if(ioConfig.getPtzId() != null && ioConfig.getPtzId() > 0){ + PtzControlModule.toPtz(ioConfig.getPtzId(),ioConfig.getCameraId()); + } + }); } /** - * 收到告警异常开始信号 + * 收到告警异常信号 + * 1.判断是否有正在进行订单,有的话,不做处理 + * 2.没有订单,新增告警记录 * @param plcId */ - public void warnStart(String plcId,String warnNum){ + public void warnStart(String plcId){ + Street street = streetService.getStreetByPlcId(plcId); + if(street == null){ + return; + } synchronized (plcId.intern()){ - Street street = getStreetByPlcId(plcId); - if(street == null){ - return; - } String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); - Long warnId = null; if(StringUtils.isEmpty(orderNum)){ //空的 说明没有正在执行的订单 //新增 告警 - Warn warn = new Warn(); - warn.setStartTime(LocalDateTime.now()); - warn.setStreetId(street.getId()); - warnMapper.insert(warn); - warnId = warn.getId(); + if(OrderRealtime.getWarnId(street.getId()) == null){ + //不存在正在执行的告警记录,就新增 + Warn warn = new Warn(); + warn.setStartTime(LocalDateTime.now()); + warn.setStreetId(street.getId()); + warnMapper.insert(warn); + OrderRealtime.startWarn(street.getId(),warn.getId()); + }else { + log.debug("{}:exist warn",plcId); + } + + }else { + log.debug("{}:warn.... exist order",plcId); } - OrderRealtime.startWarn(street.getId(),warnNum,warnId); + } } /** - * 发生告警,如果仍有运行的订单,需要将该订单标记为告警,并下载录像 + * 告警结束信号 + * 是否存在订单,存在-》保存该订单的视频 + * 如果没有订单-》是否存在告警记录-》有告警记录的话,保存视频 * @param plcId */ - public void wearnStop(String plcId,String warnNum){ + public void warnStop(String plcId){ + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + return; + } synchronized (plcId.intern()){ - Street street = streetMapper.getStreetByPlcId(plcId); - if(street == null){ - return; - } - Boolean hasWarn = OrderRealtime.stopWarn(street.getId(),warnNum); - if(!hasWarn){ - //不存在告警了 - //是否存在未结束的订单 - String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); - if(!StringUtils.isEmpty(orderNum)){ - //存在未结束的订单 - orderStop(orderNum,1,plcId); - }else { - //是否有告警 - Long warnId = OrderRealtime.getWarnId(street.getId()); - if(warnId != null){ - OrderRealtime.cleanWarn(street.getId()); - Warn warn = warnMapper.selectById(warnId); - if(warn != null){ - warn.setEndTime(LocalDateTime.now()); - - + //是否存在未结束的订单 + String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); + if(!StringUtils.isEmpty(orderNum)){ + //存在未结束的订单 + //清了订单缓存,结束订单 + OrderRealtime.stopOrder(street.getId()); + orderService.orderStop(orderNum,street,Boolean.TRUE); + }else { + //没有未结束的订单 + //是否有告警 + Long warnId = OrderRealtime.getWarnId(street.getId()); + if(warnId != null){ + //存在告警 + //先内存中清除该告警 + OrderRealtime.cleanWarn(street.getId()); + Warn warn = warnMapper.selectById(warnId); + if(warn != null){ + //结束该告警,并录像 + warn.setEndTime(LocalDateTime.now()); + if (street.getCamera1Id() != null) { + String path = PathUtil.createFileName("mp4"); + PtzControlModule.downloadMp4(street.getCamera1Id(), mp4Path + path, warnId.toString(), warn.getStartTime(), warn.getEndTime()); + warn.setVideoPath1(path); } - + if (street.getCamera2Id() != null) { + String path = PathUtil.createFileName("mp4"); + PtzControlModule.downloadMp4(street.getCamera2Id(), mp4Path + path, warnId.toString(), warn.getStartTime(), warn.getEndTime()); + warn.setVideoPath2(path); + } + warnMapper.updateById(warn); } + + } } @@ -167,4 +229,27 @@ public class PlcService { } + + /** + * 工单结束信息 + * 判断有没有告警,有告警的不做处理 + * 没有告警,且存在未结束工单,修改保存工单信息 + * @param plcId + * @param orderNum + */ + public void orderStop(String plcId,String orderNum){ + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + return; + } + synchronized (plcId.intern()){ + Long warnId = OrderRealtime.getWarnId(street.getId()); + if(warnId == null){ + String order = OrderRealtime.stopOrder(street.getId()); + if(!StringUtils.isEmpty(order)){ + orderService.orderStop(orderNum,street,Boolean.FALSE); + } + } + } + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/SendHeart.java b/web/src/main/java/com/zhehekeji/web/service/SendHeart.java index afacdd8..e91fefa 100644 --- a/web/src/main/java/com/zhehekeji/web/service/SendHeart.java +++ b/web/src/main/java/com/zhehekeji/web/service/SendHeart.java @@ -28,9 +28,9 @@ public class SendHeart { private byte[] emp = new byte[8]; - public SendHeart(String plcIdStr, String typeStr) { + public SendHeart(String plcIdStr) { plcId = plcIdStr.getBytes(); - type = typeStr.getBytes(); + type = "0A".getBytes(); for (int i = 0; i < 8; i++) { ids[i] = (short) 1; } diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetConn.java b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java new file mode 100644 index 0000000..97a8809 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java @@ -0,0 +1,76 @@ +package com.zhehekeji.web.service; + +import lombok.Data; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class StreetConn { + + private static Map connMap = new HashMap<>(); + + /** + * plc连接成功 + * @param streetId + */ + public static void conn(Integer streetId){ + connMap.put(streetId,Boolean.TRUE); + } + + /** + * 检查该巷道的plc是否是链接状态 + * @param streetId + * @return + */ + public static Boolean checkStreetConn(Integer streetId){ + Boolean conn = connMap.get(streetId); + if(conn != null && conn){ + return true; + } + return false; + } + + /** + * 获取未连接的plc + * @return + */ + public static List connList(){ + List disConnIds = new ArrayList<>(); + connMap.forEach((k,v)->{ + if(v){ + disConnIds.add(k); + } + }); + return disConnIds; + } + + /** + * plc 初始 + * @param streetId + */ + public static void init(Integer streetId){ + connMap.put(streetId,Boolean.FALSE); + } + + /** + * plc掉线 + * @param streetId + */ + public static void disConn(Integer streetId){ + init(streetId); + } + + /** + * 被删除 + * @param streetId + */ + public static void del(Integer streetId){ + connMap.remove(streetId); + } + + +} diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetService.java b/web/src/main/java/com/zhehekeji/web/service/StreetService.java index f84aaa9..ebb2beb 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -1,14 +1,11 @@ package com.zhehekeji.web.service; -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.Street; -import com.zhehekeji.web.entity.StreetShelve; import com.zhehekeji.web.mapper.OrderLastMediaMapper; import com.zhehekeji.web.mapper.StreetMapper; -import com.zhehekeji.web.mapper.StreetShelveMapper; import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.pojo.street.StreetType; import com.zhehekeji.web.pojo.street.StreetVO; @@ -16,15 +13,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Service @Slf4j @@ -32,8 +25,10 @@ public class StreetService { @Resource private StreetMapper streetMapper; +// @Resource +// private StreetShelveMapper streetShelveMapper; @Resource - private StreetShelveMapper streetShelveMapper; + private NettyClient nettyClient; @Resource private OrderLastMediaMapper lastMediaMapper; @@ -47,14 +42,18 @@ public class StreetService { }catch (DuplicateKeyException e){ Assert.isTrue(false,"PLC ID已存在"); } - - streetShelve(shelves,street.getId()); + StreetConn.init(street.getId()); + //连接 + nettyClient.createClient(street); return street.getId(); } - public List shelvesByStreetId(Integer streetId){ - List streetShelves = streetShelveMapper.selectList(new QueryWrapper().eq("street_id",streetId)); - return streetShelves.stream().map(StreetShelve::getShelveId).collect(Collectors.toList()); + public Street getStreetByPlcId(String plcId){ + Street street = streetMapper.getStreetByPlcId(plcId); + if(street == null){ + log.error("巷道不存在plcId:{}",plcId); + } + return street; } @Transactional(rollbackFor = Exception.class) @@ -65,7 +64,7 @@ public class StreetService { // if(!CollectionUtils.isEmpty(sheleves)){ // lastMediaMapper.deleteBatchIds(sheleves); // } - delStreetShelve(id); + StreetConn.del(id); } @@ -96,37 +95,16 @@ public class StreetService { @Transactional(rollbackFor = Exception.class) public void edit(Street street){ - List shelves = check(street); + check(street); try { streetMapper.updateById(street); }catch (DuplicateKeyException e){ Assert.isTrue(false,"PLC ID已存在"); } - delStreetShelve(street.getId()); - streetShelve(shelves,street.getId()); } - private void delStreetShelve(Integer streetId){ - Map params = new HashMap<>(1); - params.put("street_id",streetId); - streetShelveMapper.deleteByMap(params); - } - - private void streetShelve(List shelves,Integer streetId){ - if(CollectionUtils.isEmpty(shelves) || streetId == null){ - return; - } - List streetShelves = new ArrayList<>(shelves.size()); - shelves.forEach( - s -> { - StreetShelve streetShelve = new StreetShelve(); - streetShelve.setShelveId(s); - streetShelve.setStreetId(streetId); - streetShelves.add(streetShelve); - } - ); - streetShelveMapper.batchInsert(streetShelves); - + public Street streetById(Integer id){ + return streetMapper.selectById(id); } public PageInfo page(StreetSearch search){ diff --git a/web/src/main/java/com/zhehekeji/web/service/TcpListener.java b/web/src/main/java/com/zhehekeji/web/service/TcpListener.java deleted file mode 100644 index 0e6c0ad..0000000 --- a/web/src/main/java/com/zhehekeji/web/service/TcpListener.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.zhehekeji.web.service; - - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -@Component -@Slf4j -public class TcpListener { - -// @Value("${tcpPort}") -// private Integer tcpPort; -// -// private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 100, 200, -// TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000)); -// -// @Resource -// private OrderService orderService; -// -// public void run(){ -// EventLoopGroup boss = new NioEventLoopGroup(); -// EventLoopGroup work = new NioEventLoopGroup(); -// try { -// ServerBootstrap bootstrap = new ServerBootstrap(); -// bootstrap.group(boss,work).channel(NioServerSocketChannel.class).localAddress(tcpPort).childHandler(new ChannelInitializer() { -// @Override -// public void initChannel(SocketChannel ch) { -// ch.pipeline().addLast("handler", new MyProtocolDecoder(1000*10000,6,4,0,0,false,threadPoolExecutor,orderService)); // 自定义业务逻辑处理器 -// } -// }).childOption(ChannelOption.SO_KEEPALIVE, true); -// ChannelFuture future = bootstrap.bind().sync(); -// log.info("netty server started, Listening on " + tcpPort); -// future.channel().closeFuture().sync(); -// }catch (Exception e){ -// log.error("netty出错:{}"+e); -// e.printStackTrace(); -// }finally { -// work.shutdownGracefully(); -// boss.shutdownGracefully(); -// } -// } - -} diff --git a/web/src/main/resources/mapper/CameraIOConfigMapper.xml b/web/src/main/resources/mapper/CameraIOConfigMapper.xml index 7f0bf99..4d40c45 100644 --- a/web/src/main/resources/mapper/CameraIOConfigMapper.xml +++ b/web/src/main/resources/mapper/CameraIOConfigMapper.xml @@ -4,10 +4,10 @@ insert into camera_io_config( - name,update_time + name,update_time,code ) values - (#{item.name},#{item.updateTime}) + (#{item.name},#{item.updateTime},#{item.code})