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 c97fd6b..b4bf364 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/OrderController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/OrderController.java @@ -1,11 +1,13 @@ 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.core.util.Assert; import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; +import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.service.OrderService; import com.zhehekeji.web.service.PlcService; import io.swagger.annotations.Api; @@ -48,12 +50,12 @@ public class OrderController { return Result.success(); } - @ApiOperation("工单开始信号") - @GetMapping("/start") - public Result orderStart(@ApiParam("工单号") @RequestParam String orderNum, @ApiParam("plc")@RequestParam String plcId){ - plcService.orderStart(orderNum,plcId); - return Result.success(); - } +// @ApiOperation("工单开始信号") +// @GetMapping("/start") +// public Result orderStart(@ApiParam("工单号") @RequestParam String orderNum, @ApiParam("plc")@RequestParam String plcId){ +// plcService.orderStart(orderNum,plcId); +// return Result.success(); +// } @ApiOperation("工单结束信号") @GetMapping("/stop") @@ -79,24 +81,11 @@ public class OrderController { @PostMapping("/list") @ApiOperation(value = "查询") //@SessionHandler - public Result> orders(@RequestBody OrderSearch orderSearch) { + public Result> orders(@RequestBody OrderSearch orderSearch) { //validatorUtil.validate(orderSearch); return Result.success(orderService.orders(orderSearch)); } - @GetMapping("/media") - //@ApiOperation(value = "视频测试") - //@SessionHandler(userType = UserType.ACCOUNT) - public void media() { - - } - - - - - - - /*@GetMapping("/userCenter") @ApiOperation("用户中心地址") public Result userCenter(){ 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 9ad3a6a..0f00274 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java @@ -49,11 +49,11 @@ public class PLCController { @GetMapping("/disPlc") @ApiOperation(value = "未连接的PLC") public Result> disConn(){ - return Result.success(plcService.disStreets()); + return Result.success(StreetConn.disConnList()); } @GetMapping("/plcStatus") - @ApiOperation(value = "是否存在连接异常的PLC 返回 true 表示有存在异常的") + @ApiOperation(value = "返回连接异常的PLC数量") public Result plcStatus(){ return Result.success(plcService.plcStatus()); } diff --git a/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java b/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java index 64f061f..e0f0b7b 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/RealTimeController.java @@ -27,12 +27,12 @@ public class RealTimeController { return Result.success(realTimeService.realTimes()); } - @GetMapping("/lychee") - @ApiOperation(value = "获取荔枝的ip") - //@SessionHandler - public Result lychee() { - return Result.success(realTimeService.lychee()); - } +// @GetMapping("/lychee") +// @ApiOperation(value = "获取荔枝的ip") +// //@SessionHandler +// public Result lychee() { +// return Result.success(realTimeService.lychee()); +// } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/WarnController.java b/web/src/main/java/com/zhehekeji/web/controller/WarnController.java index f7789c4..a11beff 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/WarnController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/WarnController.java @@ -8,6 +8,7 @@ import com.zhehekeji.web.entity.Warn; import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.warn.WarnSearch; +import com.zhehekeji.web.pojo.warn.WarnVO; import com.zhehekeji.web.service.OrderService; import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.WarnService; @@ -33,24 +34,10 @@ public class WarnController { @PostMapping("/list") @ApiOperation(value = "查询") //@SessionHandler - public Result> orders(@RequestBody WarnSearch warnSearch) { + public Result> orders(@RequestBody WarnSearch warnSearch) { validatorUtil.validate(warnSearch); return Result.success(warnService.page(warnSearch)); } - - @GetMapping("/media") - //@ApiOperation(value = "视频测试") - //@SessionHandler(userType = UserType.ACCOUNT) - public void media() { - - } - - - - - - - /*@GetMapping("/userCenter") @ApiOperation("用户中心地址") public Result userCenter(){ 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 b1a3175..55c8354 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -25,6 +25,46 @@ public class Order { @ApiModelProperty("0:正常 1:告警") private Integer status; + /** + * 前两个命令 库内?库口? 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 shelveId; // // @TableField("`row`") @@ -61,7 +101,4 @@ public class Order { @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; - - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; } 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 f5c99c6..6536b55 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java +++ b/web/src/main/java/com/zhehekeji/web/entity/OrderLastMedia.java @@ -23,18 +23,22 @@ public class OrderLastMedia { @TableField("`column`") private Integer column; - private String lastPutOrderNum; - - @ApiModelProperty("入库照片") - private String putPath; - - private String lastOutOrderNum; - - @ApiModelProperty("出库照片") - private String outPutPath; - - private String lastGoodsOrderNum; - - @ApiModelProperty("货位照片") - private String goodsPath; + private String lastOrderNum; + + private String pics; + +// private String lastPutOrderNum; +// +// @ApiModelProperty("入库照片") +// private String putPath; +// +// private String lastOutOrderNum; +// +// @ApiModelProperty("出库照片") +// private String outPutPath; +// +// +// +// @ApiModelProperty("货位照片") +// private String goodsPath; } 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 065ce04..1596beb 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CaptureRunnable.java @@ -1,6 +1,5 @@ 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; @@ -8,6 +7,7 @@ import com.zhehekeji.web.entity.OrderLastMedia; import com.zhehekeji.web.mapper.OrderLastMediaMapper; import com.zhehekeji.web.mapper.OrderMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -53,16 +53,37 @@ public class CaptureRunnable implements Runnable { if (picPath == null) { return; } - log.debug("save pic orderNum:{} path:{}", orderInfo.getOrderNum(), picPath); - //todo 根据orderNum找到货架,暂时qqq + log.debug("save pic orderNum:{} path:{}", orderInfo.getOrderNum(), path); 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); + + //同步 防止有照片丢失 + synchronized (orderInfo.getOrderNum().intern()){ + Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum()); + if(order != null){ + OrderLastMedia orderLastMedia = lastMediaMapper.getOne(shelveId,row,column); + if (orderLastMedia == null) { + orderLastMedia = initLastOrder(shelveId,row,column,orderInfo.getOrderNum()); + } + String pics = order.getPicPaths(); + if(StringUtils.isEmpty(pics)){ + order.setPicPaths(path); + }else { + order.setPicPaths(pics+","+path); + } + orderMapper.updateById(order); + //todo 盘点图片 先不做 +// if(StringUtils.isEmpty(orderLastMedia.getPics())){ +// orderLastMedia.setPics(picPath); +// }else { +// orderLastMedia.setPics(pics+","+picPath); +// } +// lastMediaMapper.updateById(orderLastMedia); + } + } - Order order = new Order(); + //order.setId(orderInfo.getOrderId()); // if (OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())) { // order.setGoodsPath(path); @@ -77,19 +98,17 @@ public class CaptureRunnable implements Runnable { // orderLastMedia.setLastOutOrderNum(orderInfo.getOrderNum()); // orderLastMedia.setOutPutPath(path); // } - lastMediaMapper.updateById(orderLastMedia); - orderMapper.update(order, new UpdateWrapper().eq("order_num",orderInfo.getOrderNum())); return; } log.warn("no order"); } - private OrderLastMedia initLastOrder(String shelveId,Integer row,Integer column) { + private OrderLastMedia initLastOrder(String shelveId,Integer row,Integer column,String orderNum) { OrderLastMedia orderLastMedia = new OrderLastMedia(); - //todo 解析订单号 orderLastMedia.setShelveId(shelveId); orderLastMedia.setRow(row); orderLastMedia.setColumn(column); + orderLastMedia.setLastOrderNum(orderNum); // orderLastMedia.setLastOutOrderId(0L); // orderLastMedia.setLastPutOrderId(0L); // orderLastMedia.setLastGoodsOrderId(0L); 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 3b45c03..22f6cc8 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java @@ -2,10 +2,17 @@ package com.zhehekeji.web.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhehekeji.web.entity.Order; +import com.zhehekeji.web.pojo.OrderSearch; +import com.zhehekeji.web.pojo.OrderVO; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.util.List; + public interface OrderMapper extends BaseMapper { @Select("select * from `order` where order_num = #{orderNum} limit 1") Order getOneByOrderNum(String orderNum); + + List list(@Param("req")OrderSearch orderSearch); } diff --git a/web/src/main/java/com/zhehekeji/web/mapper/WarnMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/WarnMapper.java index a027232..2f4c12d 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/WarnMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/WarnMapper.java @@ -2,8 +2,15 @@ package com.zhehekeji.web.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zhehekeji.web.entity.Warn; +import com.zhehekeji.web.pojo.warn.WarnSearch; +import com.zhehekeji.web.pojo.warn.WarnVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; public interface WarnMapper extends BaseMapper { + List list(@Param("req") WarnSearch warnSearch); + } 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 e0626be..c70d7e3 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java @@ -17,4 +17,8 @@ public class OrderSearch { @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime endTimestamp; + + private Integer pageSize; + + private Integer pageNum; } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/OrderVO.java b/web/src/main/java/com/zhehekeji/web/pojo/OrderVO.java new file mode 100644 index 0000000..45f6cd0 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/OrderVO.java @@ -0,0 +1,27 @@ +package com.zhehekeji.web.pojo; + +import com.zhehekeji.web.entity.Order; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class OrderVO extends Order { + + @ApiModelProperty("货架类型 0:单伸 1:双伸") + private Integer streetType; + + @ApiModelProperty("巷道") + private String streetName; + + @ApiModelProperty("货位号") + private String goodsLocation; + + @ApiModelProperty("时长") + private String timeLength; + + private String [] pics; + + +} diff --git a/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java index 4845ddd..9024640 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnSearch.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.pojo.warn; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import javax.validation.constraints.NotNull; @@ -14,7 +15,9 @@ public class WarnSearch { @NotNull(message = "pageSize不能为空") private Integer pageSize; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; } diff --git a/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnVO.java b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnVO.java new file mode 100644 index 0000000..8939a5c --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/warn/WarnVO.java @@ -0,0 +1,12 @@ +package com.zhehekeji.web.pojo.warn; + +import com.zhehekeji.web.entity.Warn; +import lombok.Data; + +@Data +public class WarnVO extends Warn { + + private String streetName; + + private String timeLength; +} diff --git a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientFilter.java b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientFilter.java index 769317d..da68aa3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientFilter.java +++ b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientFilter.java @@ -10,7 +10,7 @@ import java.util.concurrent.TimeUnit; import static java.nio.ByteOrder.BIG_ENDIAN; /** - * 客户端过滤器,如编解码和心跳的设置 + * 客户端过滤器,编解码和心跳的设置 * * @author Administrator * @@ -32,11 +32,10 @@ public class HeartNettyClientFilter extends ChannelInitializer { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline ph = ch.pipeline(); - //因为服务端设置的超时时间是5秒,所以客户端设置4秒 + //4秒发一次心跳 ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)); - ph.addLast(new MyProtocolDecoder(null,plcService)); + ph.addLast(new MyProtocolDecoder(plcService)); ph.addLast(new MyProtocolEncoder()); - //处理客户端的业务逻辑 ph.addLast(new HeartNettyClientHandler(streetId,sendHeart)); } } 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 9069316..5eda023 100644 --- a/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java +++ b/web/src/main/java/com/zhehekeji/web/service/HeartNettyClientHandler.java @@ -7,7 +7,7 @@ import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; /** - * 处理客户端业务逻辑:心跳超时处理、服务端返回的数据处理 + * 与PLC心跳 处理 * * @author Administrator * 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 6f15f0a..6ec5bfb 100644 --- a/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java +++ b/web/src/main/java/com/zhehekeji/web/service/IOImportListener.java @@ -13,6 +13,9 @@ import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; +/** + * IO表导入 + */ @Slf4j public class IOImportListener extends AnalysisEventListener { 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 41c38fd..028bacd 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -28,6 +28,8 @@ public class InitService implements ApplicationRunner { @Resource private NettyClient nettyClient; + public static Integer cameraNum; + @Override public void run(ApplicationArguments args) throws Exception { //球机登录 @@ -36,7 +38,12 @@ public class InitService implements ApplicationRunner { loginThread.start(); //plc 连接状态初始化 List streets = streetMapper.selectByMap(new HashMap<>(0)); + streets.forEach(street -> { + //随便找一个巷道,只要配置了一个球机,就是单个球机的项目 + if((street.getCamera1Id() != null && street.getCamera2Id() == null)||(street.getCamera2Id() != null && street.getCamera1Id() == null)){ + cameraNum = 1; + } StreetConn.init(street.getId(),street.getPlcId()); try { nettyClient.createClient(street); 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 2c80c4c..6d0fb8d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/MyProtocolDecoder.java @@ -12,17 +12,21 @@ import java.util.concurrent.ThreadPoolExecutor; @Slf4j public class MyProtocolDecoder extends FixedLengthFrameDecoder { - private ThreadPoolExecutor threadPoolExecutor; - private PlcService plcService; - public MyProtocolDecoder(ThreadPoolExecutor threadPoolExecutor, PlcService plcService) { - + public MyProtocolDecoder(PlcService plcService) { super(43); - this.threadPoolExecutor = threadPoolExecutor; this.plcService = plcService; } + /** + * 解析TCP数据包 + * + * @param ctx + * @param in + * @return + * @throws Exception + */ @Override protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { in = (ByteBuf) super.decode(ctx, in); @@ -51,13 +55,13 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { short short6 = in.readShort(); short short7 = in.readShort(); short short8 = in.readShort(); - PlcOrderInfo plcOrderInfo = new PlcOrderInfo(plcId,taskId,(int)short1,(int)short2,(int)short3,(int)short4,(int)short5,(int)short6,(int)short7,(int)short8); + PlcOrderInfo plcOrderInfo = new PlcOrderInfo(plcId, taskId, (int) short1, (int) short2, (int) short3, (int) short4, (int) short5, (int) short6, (int) short7, (int) short8); byte maohao = in.readByte(); byte leixing = in.readByte(); byte w = in.readByte(); - Character character = new Character((char)leixing); - String code = character.toString()+w; + Character character = new Character((char) leixing); + String code = character.toString() + w; byte b1 = in.readByte(); byte b2 = in.readByte(); byte b3 = in.readByte(); @@ -66,51 +70,51 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { byte b6 = in.readByte(); byte b7 = in.readByte(); byte b8 = in.readByte(); - byte[]bytes=new byte[]{b1,b2,b3,b4,b5,b6,b7,b8}; + byte[] bytes = new byte[]{b1, b2, b3, b4, b5, b6, b7, b8}; if (type.equals("0A")) { //心跳 - log.debug("receive heart plcId:{}",plcId); + log.debug("receive heart plcId:{}", plcId); } else if (type.equals("0B")) { if ("B1".equals(code)) { - log.info("order start ,plcId:{},orderInfo:{}",plcId, plcOrderInfo.toString()); - plcService.orderStart(plcOrderInfo.getOrderNum(), plcId); + log.info("order start ,plcId:{},orderInfo:{}", plcId, plcOrderInfo.toString()); + plcService.orderStart(plcOrderInfo, plcId); } else if ("B2".equals(code)) { - log.info("order end, plcId:{},orderInfo:{}",plcId, plcOrderInfo.toString()); - plcService.orderStop(plcId,plcOrderInfo.getOrderNum()); + 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()); + log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcOrderInfo.toString()); Integer times = OrderAction.put(plcOrderInfo.getOrderNum()); //执行动作 - plcService.action(plcOrderInfo,plcId,times,code); + 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:{},warnInfo:b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}",plcId,b1, b2, b3, b4, b5, b6, b7, b8); + } else if (type.equals("0D")) { + log.info(" warn code:{}", code); + if ("D0".equals(code)) { + log.info("warn start ,plcId:{},warnInfo:b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}", plcId, b1, b2, b3, b4, b5, b6, b7, b8); plcService.warnStart(plcId); //动作 //解析具体的告警 具体规则见文档 int n = 1; int warn = 0; - for(byte b: bytes){ - warn = warn(b,8*n); - if(warn > 0){ + for (byte b : bytes) { + warn = warn(b, 8 * n); + if (warn > 0) { break; } n++; } - if(warn > 0){ + if (warn > 0) { //执行动作 //times = 1 只执行动作 //code 写作"D{warn}" - plcService.action(plcOrderInfo,plcId,1,"D"+warn); + plcService.action(plcOrderInfo, plcId, 1, "D" + warn); } - }else if("D100".equals(code)){ - log.info("warn end ,plcId:{}",plcId); + } else if ("D100".equals(code)) { + log.info("warn end ,plcId:{}", plcId); plcService.warnStop(plcId); } } @@ -119,13 +123,19 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder { } - private Integer warn(byte b,Integer num){ + /** + * 告警的二进制计算规则 + * @param b + * @param num + * @return + */ + private Integer warn(byte b, Integer num) { String tString = Integer.toBinaryString((b & 0xFF) + 0x100).substring(1); Integer warn = 0; for (int i = 0; i < 8; i++) { char item = tString.charAt(i); - if(String.valueOf(item).equals("1")){ - warn = num-i; + if (String.valueOf(item).equals("1")) { + warn = num - i; } } return warn; diff --git a/web/src/main/java/com/zhehekeji/web/service/NettyClient.java b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java index 81ade25..90ab614 100644 --- a/web/src/main/java/com/zhehekeji/web/service/NettyClient.java +++ b/web/src/main/java/com/zhehekeji/web/service/NettyClient.java @@ -36,7 +36,7 @@ public class NettyClient { try { client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); } catch (InterruptedException e) { - log.error("plc连接 被打断或无法连接:{}",e); + log.error("plc连接异常:{}",e); } } 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 190a41f..1e43153 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -2,6 +2,8 @@ package com.zhehekeji.web.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.entity.Street; @@ -10,14 +12,18 @@ import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSearch; +import com.zhehekeji.web.pojo.OrderVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.time.Duration; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service @Slf4j @@ -25,7 +31,7 @@ public class OrderService { @Resource private OrderMapper orderMapper; -// @Resource + // @Resource // private StreetShelveMapper streetShelveMapper; @Resource private StreetMapper streetMapper; @@ -36,16 +42,84 @@ public class OrderService { @Value("${mp4Path}") private String mp4Path; - public List orders(OrderSearch orderSearch) { - QueryWrapper queryWrapper = new QueryWrapper(); - if(!StringUtils.isEmpty(orderSearch.getOrderNum())){ - queryWrapper.eq("order_num", orderSearch.getOrderNum()); - } - if(orderSearch.getStartTimestamp() != null && orderSearch.getEndTimestamp() != null){ - queryWrapper.between("create_time",orderSearch.getStartTimestamp(),orderSearch.getEndTimestamp()); - } - List orders = orderMapper.selectList(queryWrapper); - return orders; + public PageInfo orders(OrderSearch orderSearch) { +// QueryWrapper queryWrapper = new QueryWrapper(); +// if(!StringUtils.isEmpty(orderSearch.getOrderNum())){ +// queryWrapper.eq("order_num", orderSearch.getOrderNum()); +// } +// if(orderSearch.getStartTimestamp() != null && orderSearch.getEndTimestamp() != null){ +// queryWrapper.between("create_time",orderSearch.getStartTimestamp(),orderSearch.getEndTimestamp()); +// } + List streets = streetMapper.selectByMap(new HashMap<>(0)); + Map streetMap = new HashMap<>(); + streets.forEach(street -> { + streetMap.put(street.getId(), street); + }); + PageHelper.startPage(orderSearch.getPageNum(), orderSearch.getPageSize()); + List orders = orderMapper.list(orderSearch); + orders.forEach(orderVO -> { + if (streetMap.get(orderVO.getStreetId()) != null) { + orderVO.setStreetName(streetMap.get(orderVO.getStreetId()).getName()); + } + //from to 模型 + if (orderVO.getInOut1() != null && orderVO.getInOut2() != null) { + //左右货架 货位号 + //库内转库内 看 to + Integer column = 0; + Integer row = 0; + //左货架 ? 右货架 ? + Integer leftRight = 0; + if (orderVO.getInOut1() == 1 && orderVO.getInOut2() == 1) { + leftRight = orderVO.getLeftRight2(); + column = orderVO.getColumn2(); + row = orderVO.getRow2(); + } else if (orderVO.getInOut1() == 1) { + leftRight = orderVO.getLeftRight1(); + //看from + orderVO.setStreetType(orderVO.getLeftRight1()); + column = orderVO.getColumn1(); + row = orderVO.getRow1(); + } else if (orderVO.getInOut2() == 1) { + leftRight = orderVO.getLeftRight2(); + //看to + orderVO.setStreetType(orderVO.getLeftRight2()); + column = orderVO.getColumn2(); + row = orderVO.getRow2(); + } + if (leftRight > 0) { + //PLC 1是左 2是由 + Street street = streetMap.get(orderVO.getStreetId()); + if(street != null){ + if(leftRight == 1){ + orderVO.setStreetType(street.getLeftType()); + }else { + orderVO.setStreetType(street.getRightType()); + } + + } + String leftRightS = leftRight == 1 ? "左" : "右"; + //里外 现在无法判断 这个项目全是 里 + String location = "%s-里-%s列%s行"; + orderVO.setGoodsLocation(String.format(location, leftRightS, column, row)); + } + } + //计算订单的时间 + if (orderVO.getEndTime() != null && orderVO.getStartTime() != null) { + Duration duration = Duration.between(orderVO.getStartTime(), orderVO.getEndTime()); + Long seconds = duration.getSeconds(); + int minutes = seconds.intValue() / 60; + int remainingSeconds = seconds.intValue() % 60; + String timeLength = minutes + ":" + remainingSeconds; + orderVO.setTimeLength(timeLength); + } + if (!StringUtils.isEmpty(orderVO.getPicPaths())) { + String[] pics = orderVO.getPicPaths().split(","); + orderVO.setPics(pics); + } + + + }); + return new PageInfo<>(orders); } public Long add(OrderSaveReq saveReq) { @@ -53,18 +127,18 @@ public class OrderService { String orderNum = saveReq.getOrderNum(); order.setStatus(0); order.setOrderNum(orderNum); - order.setCreateTime(LocalDateTime.now()); orderMapper.insert(order); return order.getId(); } /** * 订单结束 + * * @param orderNum 订单号 - * @param street 巷道 - * @param warn 是否有告警 true 告警 + * @param street 巷道 + * @param warn 是否有告警 true 告警 */ - public void orderStop(String orderNum,Street street,Boolean warn) { + public void orderStop(String orderNum, Street street, Boolean warn) { Order order = orderMapper.getOneByOrderNum(orderNum); if (order == null) { @@ -75,9 +149,9 @@ public class OrderService { log.error("订单结束信号,订单未开始,orderNum:{}", orderNum); return; } - if(warn){ + if (warn) { order.setStatus(1); - }else { + } else { order.setStatus(0); } order.setOrderNum(orderNum); @@ -98,5 +172,4 @@ public class OrderService { } - } 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 9a093e5..8b0a9e9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -51,11 +51,6 @@ public class PlcService { @Resource private CameraIOMapper ioMapper; - public List disStreets(){ - - return StreetConn.disConnList(); - } - public Integer plcStatus(){ List streets = streetMapper.selectByMap(new HashMap<>(0)); List connIds = StreetConn.connList(); @@ -64,18 +59,25 @@ public class PlcService { /** * 开始工单 - * @param orderNum + * @param plcOrderInfo * @param plcId */ - public void orderStart(String orderNum,String plcId) { + public void orderStart(PlcOrderInfo plcOrderInfo,String plcId) { Order order = new Order(); - order.setOrderNum(orderNum); + order.setOrderNum(plcOrderInfo.getOrderNum()); order.setStartTime(LocalDateTime.now()); - order.setCreateTime(LocalDateTime.now()); Street street = streetService.getStreetByPlcId(plcId); if(street != null){ - OrderRealtime.startOrder(street.getId(), orderNum); + OrderRealtime.startOrder(street.getId(), plcOrderInfo.getOrderNum()); order.setStreetId(street.getId()); + order.setInOut1(plcOrderInfo.getInOut1()); + order.setLeftRight1(plcOrderInfo.getLeftRight1()); + order.setColumn1(plcOrderInfo.getColumn1()); + order.setRow1(plcOrderInfo.getRow1()); + order.setInOut2(plcOrderInfo.getInOut2()); + order.setLeftRight2(plcOrderInfo.getLeftRight2()); + order.setColumn2(plcOrderInfo.getColumn2()); + order.setRow2(plcOrderInfo.getRow2()); orderMapper.insert(order); //orderMapper.update(order, new UpdateWrapper().eq("order_num", orderNum)); } diff --git a/web/src/main/java/com/zhehekeji/web/service/RealTimeService.java b/web/src/main/java/com/zhehekeji/web/service/RealTimeService.java index 3fddb21..916c4bc 100644 --- a/web/src/main/java/com/zhehekeji/web/service/RealTimeService.java +++ b/web/src/main/java/com/zhehekeji/web/service/RealTimeService.java @@ -27,11 +27,11 @@ public class RealTimeService { @Resource private LycheeMapper lycheeMapper; - public String lychee(){ - Lychee lychee = lycheeMapper.selectById(1); - Assert.notNull(lychee,"未配置荔枝转码服务"); - return lychee.getIp(); - } +// public String lychee(){ +// Lychee lychee = lycheeMapper.selectById(1); +// Assert.notNull(lychee,"未配置荔枝转码服务"); +// return lychee.getIp(); +// } public List realTimes(){ List streets = streetMapper.selectByMap(new HashMap<>(0)); diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetConn.java b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java index d72a010..e59765f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetConn.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetConn.java @@ -52,6 +52,10 @@ public class StreetConn { return disConnIds; } + /** + * 未连接的PLC列表 + * @return + */ public static List disConnList(){ List plcStatuses = new ArrayList<>(); @@ -69,6 +73,7 @@ public class StreetConn { */ public static void init(Integer streetId,String plcId){ PlcStatus plcStatus = new PlcStatus(); + plcStatus.streetId = streetId; plcStatus.status = Boolean.FALSE; plcStatus.time = LocalDateTime.now(); plcStatus.plcId = plcId; @@ -102,6 +107,8 @@ public class StreetConn { private LocalDateTime time; private String plcId; + + private Integer streetId; } } diff --git a/web/src/main/java/com/zhehekeji/web/service/WarnService.java b/web/src/main/java/com/zhehekeji/web/service/WarnService.java index 89d2ab9..cce135f 100644 --- a/web/src/main/java/com/zhehekeji/web/service/WarnService.java +++ b/web/src/main/java/com/zhehekeji/web/service/WarnService.java @@ -6,9 +6,11 @@ import com.github.pagehelper.PageInfo; import com.zhehekeji.web.entity.Warn; import com.zhehekeji.web.mapper.WarnMapper; import com.zhehekeji.web.pojo.warn.WarnSearch; +import com.zhehekeji.web.pojo.warn.WarnVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.Duration; import java.util.List; @Service @@ -17,13 +19,21 @@ public class WarnService { @Resource private WarnMapper warnMapper; - public PageInfo page(WarnSearch warnSearch){ + public PageInfo page(WarnSearch warnSearch){ PageHelper.startPage(warnSearch.getPageNum(),warnSearch.getPageSize()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - if(warnSearch.getStartTime() != null && warnSearch.getEndTime() != null){ - queryWrapper.between("start_time",warnSearch.getStartTime(),warnSearch.getEndTime()); - } - List warns = warnMapper.selectList(queryWrapper); + + List warns = warnMapper.list(warnSearch); + warns.forEach(warnVO -> { + if(warnVO.getStartTime() != null && warnVO.getEndTime() != null){ + Duration duration = Duration.between(warnVO.getStartTime(), warnVO.getEndTime()); + Long seconds = duration.getSeconds(); + int minutes = seconds.intValue() / 60; + int remainingSeconds = seconds.intValue() % 60; + String timeLength = minutes+":"+remainingSeconds; + warnVO.setTimeLength(timeLength); + } + + }); return new PageInfo<>(warns); } } diff --git a/web/src/main/resources/mapper/OrderMapper.xml b/web/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..bd556c7 --- /dev/null +++ b/web/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/web/src/main/resources/mapper/WarnMapper.xml b/web/src/main/resources/mapper/WarnMapper.xml new file mode 100644 index 0000000..f752acb --- /dev/null +++ b/web/src/main/resources/mapper/WarnMapper.xml @@ -0,0 +1,17 @@ + + + + + + +