From 569af10f6684d42bab127861667725e6294ebda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Tue, 2 Jul 2024 13:30:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=98=86=E8=88=B9=E9=93=BE=E6=8E=A5=202.?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BF=AE=E6=94=B9=203.=E5=B7=A6=E5=8F=B3?= =?UTF-8?q?=E4=B8=8D=E8=B0=83=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/PLCController.java | 9 +- .../com/zhehekeji/web/entity/CheckLog.java | 3 + .../java/com/zhehekeji/web/entity/Order.java | 94 +++++------ .../java/com/zhehekeji/web/entity/Stock.java | 4 +- .../web/lib/CameraControlModule.java | 1 + .../lib/hik/HikCameraControlModuleImpl.java | 12 ++ .../JoywareCameraControlModuleImpl.java | 4 + .../com/zhehekeji/web/mapper/OrderMapper.java | 2 +- .../com/zhehekeji/web/pojo/OrderSearch.java | 3 + .../zhehekeji/web/pojo/stock/StockCheck.java | 3 + .../zhehekeji/web/service/CameraService.java | 28 ++++ .../web/service/CheckLogService.java | 27 ++- .../com/zhehekeji/web/service/CronTab.java | 20 +++ .../web/service/EmptyCheckService.java | 24 +-- .../zhehekeji/web/service/InitService.java | 9 +- .../zhehekeji/web/service/OrderService.java | 43 ++--- .../com/zhehekeji/web/service/PlcCmdInfo.java | 6 + .../com/zhehekeji/web/service/PlcService.java | 156 ++++++++++++++++-- .../zhehekeji/web/service/StockService.java | 57 ++++--- .../web/service/ksec/KsecDecoder.java | 28 ++-- .../web/service/ksec/KsecNettyClient.java | 5 +- web/src/main/resources/application-prod.yml | 4 +- web/src/main/resources/mapper/OrderMapper.xml | 3 + 23 files changed, 385 insertions(+), 160 deletions(-) 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 bc95587..f8c91b4 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/PLCController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/PLCController.java @@ -7,7 +7,6 @@ import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.service.*; import com.zhehekeji.web.service.ksec.KsecNettyClient; -import com.zhehekeji.web.service.putian.PuTianNettyClient; import com.zhehekeji.web.service.robotic.NettyClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,8 +31,6 @@ public class PLCController { private ConfigProperties configProperties; @Resource private KsecNettyClient ksecNettyClient; - @Resource - private PuTianNettyClient puTianNettyClient; @GetMapping("/tcp") @@ -41,7 +38,7 @@ public class PLCController { public Result tcp(@RequestParam Integer id){ if(configProperties.getServerMode() == 1){ try { - puTianNettyClient.createClient(configProperties.getKsec()); + ksecNettyClient.createClient(configProperties.getKsec()); }catch (Exception e){ Assert.isTrue(false,"连接失败,ip:"+configProperties.getKsec().getIp()+",port:"+configProperties.getKsec().getPort()); } @@ -78,8 +75,8 @@ public class PLCController { @GetMapping("/orderAction") @ApiOperation(value = "执行的工单情况") - public Result orderAction(){ - return Result.success(GoodsActionTimes.get()); + public Result orderAction(){ + return Result.success(); } } diff --git a/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java b/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java index d82887a..897de9b 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java +++ b/web/src/main/java/com/zhehekeji/web/entity/CheckLog.java @@ -13,6 +13,9 @@ import java.time.LocalDateTime; public class CheckLog { private Integer streetId; + @TableField(exist = false) + private String streetName; + private Integer direction; 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 e9100bf..ec25c49 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Order.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Order.java @@ -9,7 +9,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; -import java.util.List; @Data @TableName("`order`") @@ -23,8 +22,12 @@ public class Order { @ApiModelProperty("订单号") private String orderNum; -// @ApiModelProperty("0:正常 1:告警") -// private Integer status; + @ApiModelProperty("wms任务号") + @TableField(value = "`task_wms_id`") + private String taskWMSId; + + @ApiModelProperty("0:正常 1:告警") + private Integer status; /** * 前两个命令 库内?库口? 1:库内 2:库口 @@ -46,35 +49,25 @@ public class Order { */ private Integer row1; - private String intoStockPic; - - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime intoStockTime; + /** + * 后两个命令 库内?库口? 1:库内 2:库口 + */ + private Integer inOut2; - private String intoStockOverPic; + /** + * 后两个命令 左?右? 1:左 2:右 + */ + private Integer leftRight2; - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") - private LocalDateTime intoStockOverTime; + /** + * 后两个 列号 + */ + private Integer column2; -// /** -// * 后两个命令 库内?库口? 1:库内 2:库口 -// */ -// private Integer inOut2; -// -// /** -// * 后两个命令 左?右? 1:左 2:右 -// */ -// private Integer leftRight2; -// -// /** -// * 后两个 列号 -// */ -// private Integer column2; -// -// /** -// * 后两个 行号 -// */ -// private Integer row2; + /** + * 后两个 行号 + */ + private Integer row2; // private String shelveId; // @@ -87,29 +80,26 @@ public class Order { // @ApiModelProperty("仓位号") // private String positionNum; -// @ApiModelProperty("视频图片地址") -// @TableField("`video_path_1`") -// private String videoPath1; -// -// @ApiModelProperty("视频图片地址") -// @TableField("`video_path_2`") -// private String videoPath2; -// -// @ApiModelProperty("图片地址,分隔") -// private String picPaths; + @ApiModelProperty("视频图片地址") + @TableField("`video_path_1`") + private String videoPath1; -// @ApiModelProperty("入库照片") -// private String putPath; -// -// @ApiModelProperty("出库照片") -// private String outputPath; -// -// @ApiModelProperty("货位照片") -// private String goodsPath; + @ApiModelProperty("视频图片地址") + @TableField("`video_path_2`") + private String videoPath2; -// @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") -// private LocalDateTime startTime; -// -// @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") -// private LocalDateTime endTime; + @ApiModelProperty("图片地址,分隔") + private String picPaths; + + + private String wmsTrayCode; + + private String wmsCode; + private String subtag; + + @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/entity/Stock.java b/web/src/main/java/com/zhehekeji/web/entity/Stock.java index 166c329..c021890 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -53,6 +53,8 @@ public class Stock { @ApiModelProperty("扫描出的托盘码") private String trayCode; + @TableField(exist = false) + private String streetName; private Integer streetId; @@ -77,8 +79,6 @@ public class Stock { @ApiModelProperty("操作后的图片") private String overoperationPic; - @ApiModelProperty("0:没检测 1:空货物(有托盘) 2:有货物 3:空托盘") - private Integer emptyStatus; @ApiModelProperty("盘点图片") private String checkPic; diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java index c2d7827..edcf5fd 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java @@ -137,4 +137,5 @@ public interface CameraControlModule { void toPtzSlow(Integer cameraId, Integer x); + boolean setCameraTime(Integer id); } diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java index f991a80..13a7f1a 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Timer; import static com.zhehekeji.web.lib.hik.HCNetSDK.NET_DVR_GET_PTZPOS; +import static com.zhehekeji.web.lib.hik.HCNetSDK.NET_DVR_SET_TIMECFG; /** * 云台控制接口实现 @@ -463,4 +464,15 @@ public class HikCameraControlModuleImpl implements CameraControlModule { } } + + public boolean setCameraTime(Integer cameraId) { + int lUserId = CameraConnMap.getConnId(cameraId).intValue(); + HCNetSDK.NET_DVR_TIME time = new HCNetSDK.NET_DVR_TIME(); + LocalDateTime localDateTime = LocalDateTime.now(); + time.setTime(localDateTime.getYear(),localDateTime.getMonthValue(),localDateTime.getDayOfMonth(),localDateTime.getHour(),localDateTime.getMinute(),localDateTime.getSecond()); + time.write(); + return HikLoginModuleImpl.hcNetsdk.NET_DVR_SetDVRConfig(lUserId, NET_DVR_SET_TIMECFG, 0,time.getPointer(), time.size()); + + } + } diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java index 1002cb8..8407ea1 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java @@ -338,6 +338,10 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { } } + public boolean setCameraTime(Integer cameraId) { + return false; + } + /** * 转至 预置点 * 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 9640025..1dfe1c5 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/OrderMapper.java @@ -11,7 +11,7 @@ import java.util.List; public interface OrderMapper extends BaseMapper { - @Select("select * from `order` where order_num = #{orderNum} order by into_stock_time desc limit 1") + @Select("select * from `order` where order_num = #{orderNum} order by start_time desc limit 1") Order getOneByOrderNum(String orderNum); List list(@Param("req")OrderSearch orderSearch); 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 c70d7e3..39da5ad 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/OrderSearch.java @@ -9,6 +9,9 @@ import java.time.LocalDateTime; @Data public class OrderSearch { + + private String streetId; + @NotEmpty(message = "订单号不能为空") private String orderNum; diff --git a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java index 3f6787c..3fb25e2 100644 --- a/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java +++ b/web/src/main/java/com/zhehekeji/web/pojo/stock/StockCheck.java @@ -14,6 +14,7 @@ public class StockCheck { // private String shelveId; private Integer streetId; + private String streetPlc; private Integer direction; @@ -27,4 +28,6 @@ public class StockCheck { @ApiModelProperty("列") private Integer column; + private Integer ok; + } diff --git a/web/src/main/java/com/zhehekeji/web/service/CameraService.java b/web/src/main/java/com/zhehekeji/web/service/CameraService.java index 1684943..b243e84 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -330,4 +330,32 @@ public class CameraService { } + public void cameraTimeUpdate() { + log.info(" cameraTimeUpdate"); + long timeStamp = System.currentTimeMillis(); + List cameras = cameraMapper.selectList(new QueryWrapper<>()); + for (Camera camera : cameras){ + cameraTimeUpdate( camera); + } + } + + public void cameraTimeUpdate(Camera camera) { + Boolean ok = false; + if (CameraConnMap.getConnId(camera.getId() )!=null) { + if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) { + ok = HikLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId()).intValue()); + } else { + ok = JoywareLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId())); + } + } + + if(ok){ + cameraControlModule.setCameraTime(camera.getId()); + }else { + CameraConnMap.disConn(camera.getId()); + camera.setStatus("未连接"); + log.error("camera "+camera.getIp() +"未连接"); + cameraLogin(camera); + } + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/CheckLogService.java b/web/src/main/java/com/zhehekeji/web/service/CheckLogService.java index a1e65b4..141b10a 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CheckLogService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CheckLogService.java @@ -6,20 +6,29 @@ import com.github.pagehelper.PageInfo; import com.zhehekeji.web.entity.CheckLog; import com.zhehekeji.web.mapper.CheckLogMapper; import com.zhehekeji.web.pojo.stock.CheckLogSearch; +import com.zhehekeji.web.pojo.street.StreetVO; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class CheckLogService { @Resource private CheckLogMapper checkLogMapper; + @Resource + private StreetService streetService; public PageInfo list(CheckLogSearch search){ - + List list = streetService.list(); + Map map = new HashMap<>(); + list.forEach(l->{ + map.put(l.getId(),l.getName()); + }); PageHelper.startPage(search.getPageNum(),search.getPageSize()); QueryWrapper wrapper = new QueryWrapper<>(); if(!StringUtils.isEmpty(search.getLotnum())){ @@ -28,20 +37,26 @@ public class CheckLogService { if(search.getStartTimestamp() != null && search.getEndTimestamp() != null){ wrapper.ge("create_time",search.getStartTimestamp()).le("create_time",search.getEndTimestamp()); } - if(search.getLeftRight() != null && search.getLeftRight() > 0){ + if(search.getLeftRight() != null && (search.getLeftRight() != 0 && search.getLeftRight() !=-1)){ wrapper.eq("`direction`",search.getLeftRight()); } - if(search.getSide() != null && search.getSide() > 0){ + if(search.getSide() != null &&(search.getSide() != 0 && search.getSide() !=-1)){ wrapper.eq("`side`",search.getSide()); } - if(search.getRow() != null && search.getRow() > 0){ + if(search.getRow() != null && search.getRow() != 0){ wrapper.eq("`row`",search.getRow()); } - if(search.getColumn() != null && search.getColumn() > 0){ + if(search.getColumn() != null && search.getColumn() != 0){ wrapper.eq("`column`",search.getColumn()); } + if(search.getStreetId() != null && search.getStreetId() != 0){ + wrapper.eq("`street_id`",search.getStreetId()); + } + wrapper.orderByDesc("create_Time"); ListstockChecks = checkLogMapper.selectList(wrapper); - + stockChecks.forEach(l->{ + l.setStreetName(map.get(l.getStreetId())); + }); return new PageInfo<>(stockChecks); } } diff --git a/web/src/main/java/com/zhehekeji/web/service/CronTab.java b/web/src/main/java/com/zhehekeji/web/service/CronTab.java index 200cf10..2f99f20 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CronTab.java +++ b/web/src/main/java/com/zhehekeji/web/service/CronTab.java @@ -2,7 +2,13 @@ package com.zhehekeji.web.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.web.config.ConfigProperties; +import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.LightSource; +import com.zhehekeji.web.lib.CameraConnMap; +import com.zhehekeji.web.lib.CameraControlModule; +import com.zhehekeji.web.lib.hik.HikLoginModuleImpl; +import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; +import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.LightSourceMapper; import com.zhehekeji.web.service.damLightSource.JYDAMEquip; import com.zhehekeji.web.service.damLightSource.JYDamHelper; @@ -69,6 +75,20 @@ public class CronTab { lightTimeMap.put(streetId,System.currentTimeMillis()); } + + @Resource + private CameraMapper cameraMapper; + + @Resource + private CameraService cameraService; + + @Resource + private CameraControlModule cameraControlModule; + + @Scheduled(cron = "0 0/1 * * * ?") + public void cameraTimeUpdate() { + cameraService.cameraTimeUpdate(); + } @Scheduled(cron = "0 0/1 * * * ?") public void lightStatus() { log.debug(" lightStatus"); diff --git a/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java b/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java index 5da8df6..88991f3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java +++ b/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java @@ -82,18 +82,18 @@ public class EmptyCheckService { * 有货物的数量 */ Integer goodsCount = 0; - for(Stock stock: stockList){ - if(stock.getEmptyStatus() == 3){ - //没托盘 - emptyCount++; - }else if(stock.getEmptyStatus() == 2){ - //有货物 - goodsCount++; - }else if(stock.getEmptyStatus() == 1){ - //有托盘 没货物 - emptyGoodsCount++; - } - } +// for(Stock stock: stockList){ +// if(stock.getEmptyStatus() == 3){ +// //没托盘 +// emptyCount++; +// }else if(stock.getEmptyStatus() == 2){ +// //有货物 +// goodsCount++; +// }else if(stock.getEmptyStatus() == 1){ +// //有托盘 没货物 +// emptyGoodsCount++; +// } +// } //更新盘点统计 List checkStreetSummaries = checkStreetSummaryMapper.selectList(new QueryWrapper().eq("street_id",street.getId()).eq("lotnum",taskId)); if(checkStreetSummaries.size() > 0){ 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 aedd8b6..bb46bdf 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -43,6 +43,8 @@ public class InitService implements ApplicationRunner { private StreetMapper streetMapper; @Resource private PuTianNettyClient puTianNettyClient; + @Resource + private KsecNettyClient ksecNettyClient; @Resource private ConfigProperties configProperties; @@ -99,15 +101,17 @@ public class InitService implements ApplicationRunner { if(ksec != null){ StreetConn.init(1,"ksec"); try { - puTianNettyClient.createClient(ksec); + + ksecNettyClient.createClient(ksec); }catch (Exception e){ log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort()); + ksecNettyClient.reconnect(0); } }else { log.error("ksec no config"); } - //TaskDelayExecutor.runMp4DownloadExecutor(); + TaskDelayExecutor.runMp4DownloadExecutor(); } class LoginThread extends Thread{ @@ -121,6 +125,7 @@ public class InitService implements ApplicationRunner { @Override public void run() { cameraService.cameraLogin(camera); + cameraService.cameraTimeUpdate(camera); } } 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 a17c78e..f89ac26 100644 --- a/web/src/main/java/com/zhehekeji/web/service/OrderService.java +++ b/web/src/main/java/com/zhehekeji/web/service/OrderService.java @@ -1,5 +1,6 @@ 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.web.config.ConfigProperties; @@ -46,29 +47,13 @@ public class OrderService { } - //计算订单的时间 -// 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 = String.format("%02d:%02d", minutes,remainingSeconds); -// orderVO.setTimeLength(timeLength); -// } -// if (!StringUtils.isEmpty(orderVO.getPicPaths())) { -// String[] pics = orderVO.getPicPaths().split(","); -// orderVO.setPics(pics); -// } -// if(configProperties.getCameraConfig().getCameraType() == 1 && !StringUtils.isEmpty(orderVO.getVideoPath1())){ -// orderVO.setCmd1(" VSPlayer "+ orderVO.getVideoPath1()); -// } -// if(configProperties.getCameraConfig().getCameraType() == 1 && !StringUtils.isEmpty(orderVO.getVideoPath2())){ -// orderVO.setCmd1(" VSPlayer "+ orderVO.getVideoPath2()); -// } orderVO.setGoodsLocation(location(orderVO,streetMap.get(orderVO.getStreetId()))); - if(orderVO.getIntoStockPic() != null ) { - orderVO.setIntoStockPics(orderVO.getIntoStockPic().split(";")); + if (orderVO.getPicPaths() != null && orderVO.getPicPaths().split(",").length > 0){ + orderVO.setPics(orderVO.getPicPaths().split(",")); } +// if(orderVO.getIntoStockPic() != null ) { +// orderVO.setIntoStockPics(orderVO.getIntoStockPic().split(";")); +// } }); return new PageInfo<>(orders); } @@ -83,12 +68,20 @@ public class OrderService { } public String location(OrderVO orderVO,Street street){ + String location = ""; + if(orderVO.getLeftRight1() != null){ + String leftRightS = orderVO.getLeftRight1() == 1 ? "左" : "右"; + location = leftRightS; + } + if(orderVO.getInOut1() != null){ + + String side = orderVO.getInOut1() == 1?"浅":"深"; + location = location + "-" + side +"-"; + } - String leftRightS = orderVO.getLeftRight1() == 1 ? "左" : "右"; - String side = orderVO.getInOut1() == 1?"浅":"深"; //里外 现在无法判断 这个项目全是 里 - String location = "%s-%s-%s层%s列"; - return String.format(location, leftRightS, side, orderVO.getRow1(),orderVO.getColumn1()); + + return location +orderVO.getRow1()+"层"+orderVO.getColumn1()+"列"; } diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java index 051893f..e3b5bf0 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcCmdInfo.java @@ -69,6 +69,11 @@ public class PlcCmdInfo { private Integer times; private String lotnum; + private Integer streetId; + + private String wmsCode; + private String wmsTrayCode; + private String trayCode; public PlcCmdInfo(String plcId, String taskId, Integer side1, Integer leftRight1, Integer column1, Integer row1, Integer separation1, Integer side2, Integer leftRight2, Integer column2, Integer row2, Integer separation2,String lotnum) { this.taskId = taskId; @@ -107,4 +112,5 @@ public class PlcCmdInfo { return ""; } } + } 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 3d6e205..003a160 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -24,6 +24,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.net.SocketTimeoutException; +import java.time.Duration; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ArrayBlockingQueue; @@ -100,7 +102,38 @@ public class PlcService { * @param plcCmdInfo */ public void orderStart(PlcCmdInfo plcCmdInfo) { + Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); + if (street != null) { + if (plcCmdInfo.getLeftRight1() == 1) { + if (plcCmdInfo.getRow1() > street.getLeftRow() && plcCmdInfo.getColumn1() > street.getLeftColumn()) { + log.error("row:{},column:{},error in streetId:{} left", plcCmdInfo.getRow1(), plcCmdInfo.getColumn1(), street.getId()); + return; + } + } else { + if (plcCmdInfo.getRow1() > street.getRightRow() && plcCmdInfo.getColumn1() > street.getRightColumn()) { + log.error("row:{},column:{},error in streetId:{} right", plcCmdInfo.getRow1(), plcCmdInfo.getColumn1(), street.getId()); + return; + } + } + plcCmdInfo.setStreetId(street.getId()); + Order order = new Order(); + order.setOrderNum(plcCmdInfo.getOrderNum()); + order.setStatus(0); + order.setStartTime(LocalDateTime.now()); + order.setStreetId(street.getId()); + order.setInOut1(plcCmdInfo.getSide1()); + order.setLeftRight1(plcCmdInfo.getLeftRight1()); + order.setColumn1(plcCmdInfo.getColumn1()); + order.setRow1(plcCmdInfo.getRow1()); + order.setWmsTrayCode(plcCmdInfo.getWmsTrayCode()); + order.setWmsCode(plcCmdInfo.getWmsCode()); + //todo 昆船的项目 ,取货 放货是独立的 + //取货是是不知道放货的位置的,所以订单开始的时候只写1位置 + //订单结束写2位置 + orderMapper.insert(order); + OrderRealtime.startOrder(street.getId(), plcCmdInfo.getOrderNum()); + } } /** @@ -111,6 +144,40 @@ public class PlcService { * @param plcCmdInfo */ public void orderStop(PlcCmdInfo plcCmdInfo) { + LocalDateTime endTime = LocalDateTime.now(); + Street street = streetMapper.getStreetByPlcId(plcCmdInfo.getPlcId()); + if (street == null) { + return; + } + Order order = orderMapper.getOneByOrderNum(plcCmdInfo.getOrderNum()); + if (order == null) { + log.error("订单结束信号,订单不存在,orderNum:{}", plcCmdInfo.getOrderNum()); + return; + } + plcCmdInfo.setStreetId(street.getId()); + OrderRealtime.stopOrder(street.getId()); + Order update = new Order(); + update.setId(order.getId()); + update.setEndTime(endTime); + update.setInOut2(plcCmdInfo.getSide2()); + update.setLeftRight2(plcCmdInfo.getLeftRight2()); + update.setColumn2(plcCmdInfo.getColumn2()); + update.setRow2(plcCmdInfo.getRow2()); + LocalDateTime endDownLoadTime = endTime.plusSeconds(10); + Duration duration = Duration.between(order.getStartTime(), endDownLoadTime); + + if (duration.toMinutes() > 50) { + endDownLoadTime = order.getStartTime().plusMinutes(50); + } + if (street.getCamera1Id() != null) { + String path = cameraVideo(street.getCamera1Id(), order.getStartTime(), endDownLoadTime); + update.setVideoPath1(path); + } + if (street.getCamera2Id() != null) { + String path = cameraVideo(street.getCamera2Id(), order.getStartTime(), endDownLoadTime); + update.setVideoPath2(path); + } + orderMapper.updateById(update); } @@ -256,28 +323,31 @@ public class PlcService { } } - public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode,String wmsCatagary){ + public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode,String wmsCatagary){ long startTime = System.currentTimeMillis(); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); CronTab.putTime(street.getId()); List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); lightSources.forEach(lightSource -> { - HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); + try { + HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); + }catch (Exception e){ + log.error("open light"+lightSource.getIp()+" error",e); + } + }); Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); - //蜜雪冰城拍摄货物顶部时用同侧相机 - Integer leftRightTop = plcCmdInfo.getLeftRight1() == 1 ? 2 : 1; - Integer cameraIdTop = getCameraByPlcCmd(plcCmdInfo, leftRightTop); if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ //内测 String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; log.info("camera ptz"+c); - gyrateCameraByCode(cameraIdTop, c); + gyrateCameraByCode(cameraId, c); }else { - log.info("camera ptz"+cmdCode); - gyrateCameraByCode(cameraIdTop, cmdCode); + String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1); + log.info("camera ptz"+c); + gyrateCameraByCode(cameraId, c); try { Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); } catch (InterruptedException e) { @@ -383,13 +453,16 @@ public class PlcService { log.warn("sick ocr error:{}", trayCode); } } else { - if (StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) { + if ((StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")) ){ trayCode = "扫码枪识别异常"; trayGoodCheck = Boolean.FALSE; log.warn("sick ocr error:{}", trayCode); - } else { - //扫到就认为正常 + } else if(trayCode.equals(wmsTrayCode)){ + //扫到码 trayGoodCheck = Boolean.TRUE; + }else { + + trayGoodCheck = Boolean.FALSE; } } } @@ -465,7 +538,6 @@ public class PlcService { // StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties,sensorGun); // threadPoolExecutor.execute(stockCheckRunnable); //还原相机 - gyrateCameraByCode(cameraId, "C5"); long end = System.currentTimeMillis(); long s = end - startTime; log.info("time:{}millisecond", s); @@ -644,7 +716,57 @@ public class PlcService { * @param path */ public void captureUpdateOrderAndStock(OrderInfo orderInfo, String path) { - + synchronized (orderInfo.getOrderNum().intern()) { + Order order = orderMapper.getOneByOrderNum(orderInfo.getOrderNum()); + if (order != null) { + //update picPath in stock if code is C2/C4 + if (orderInfo.getCode().startsWith("C2") || orderInfo.getCode().startsWith("C4")) { + StockLog stockLog = new StockLog(); + stockLog.setStreetId(orderInfo.getStreetId()); + stockLog.setDirection(orderInfo.getLeftRight()); + stockLog.setSide(orderInfo.getSeparation()); + stockLog.setRow(orderInfo.getRow()); + stockLog.setColumn(orderInfo.getColumn()); + stockLog.setPic(path); + String type = orderInfo.getCode().substring(1, 2); + stockLog.setType(Integer.valueOf(type)); + stockLog.setOrderNum(orderInfo.getOrderNum()); + stockLog.setCreateTime(LocalDateTime.now()); + stockLogMapper.insert(stockLog); +// Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(), orderInfo.getRow(), orderInfo.getColumn()); +// if (stock == null) { +// stock = new Stock(); +// stock.setShelveId(orderInfo.getShelveId()); +// stock.setColumn(orderInfo.getColumn()); +// stock.setRow(orderInfo.getRow()); +// //stock.setStatus(0); +// //if the stock is null,take over path only +// stock.setOveroperationPic(path); +// stock.setOrderNum(order.getOrderNum()); +// stockMapper.insert(stock); +// } else { +// //take the previous picture path to the lasted over picture path +// //take the lasted picture path to the new one +// stock.setPreoperationPic(stock.getOveroperationPic()); +// stock.setOveroperationPic(path); +// stock.setOrderNum(order.getOrderNum()); +// //stock.setStatus(0); +// stockMapper.updateById(stock); +// } + } + String pics = order.getPicPaths(); + if (StringUtils.isEmpty(pics)) { + order.setPicPaths(path); + } else { + order.setPicPaths(pics + "," + path); + } + Order update = new Order(); + update.setId(order.getId()); + update.setPicPaths(order.getPicPaths()); + log.debug(" update order set pics:{},orderNum:{}", update.getPicPaths(), orderInfo.getOrderNum()); + orderMapper.updateById(update); + } + } } public Integer getCameraByPlcCmd(PlcCmdInfo plcCmdInfo,Integer leftRight){ @@ -871,7 +993,7 @@ public class PlcService { order.setOrderNum(taskId); order.setLeftRight1(leftRight); order.setInOut1(inout); - order.setIntoStockTime(LocalDateTime.now()); + order.setEndTime(LocalDateTime.now()); order.setRow1(row); order.setColumn1(column); // if (oldOrder != null){ @@ -894,7 +1016,7 @@ public class PlcService { String[] pics = picName.split(";"); String picNameDataBase = ip+pics[0]+";"+ ip+pics[1]; Order oldOrder = orderMapper.getOneByOrderNum(taskId); - oldOrder.setIntoStockPic(picNameDataBase); + oldOrder.setPicPaths(picNameDataBase); orderMapper.updateById(oldOrder); return ip+pics[0]+"*"+ ip+pics[1]; } @@ -991,8 +1113,8 @@ public class PlcService { if(order != null){ Order upd = new Order(); upd.setId(order.getId()); - upd.setIntoStockOverPic(path); - upd.setIntoStockOverTime(LocalDateTime.now()); + upd.setPicPaths(path); + upd.setEndTime(LocalDateTime.now()); orderMapper.updateById(upd); } cameraCapture(cameraId,false,0l,path); diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index e6c29d9..8ae8c7d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -3,6 +3,7 @@ package com.zhehekeji.web.service; import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSONObject; 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.core.util.Assert; @@ -318,30 +319,35 @@ public class StockService { * @return */ public Stock stockInfo(StockCheck stockCheck) { - Street street = streetService.streetById(stockCheck.getStreetId()); - Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); - if(stock == null){ + + Street street = streetMapper.selectOne(new QueryWrapper() + //.eq(stockCheck.getStreetPlc()!=null&& !"".equals(stockCheck.getStreetPlc()),"plc_Id", stockCheck.getStreetPlc()) + .eq(stockCheck.getStreetId()!=null,"id", stockCheck.getStreetId())); + + Stock stock = stockMapper.selectOne(new QueryWrapper().eq("`row`", stockCheck.getRow()) + .eq("`column`", stockCheck.getColumn()) + .eq("`direction`", stockCheck.getDirection()) + .eq("`side`", stockCheck.getSide()) + .eq(street.getId()!=null,"`street_id`", street.getId())); + if (stock == null) { stock = new Stock(); stock.setColumn(stockCheck.getColumn()); stock.setRow(stockCheck.getRow()); //stock.setShelveId(stockCheck.getShelveId()); stock.setStatus(0); + stock.setStreetName(street.getName()); + } else { + stock.setStreetName(street.getName()); + + List stockLogs = stockLogMapper.selectList(new QueryWrapper().eq("`row`", stockCheck.getRow()).eq("`column`", stockCheck.getColumn()).eq("street_id", stockCheck.getStreetId()).eq("direction", stockCheck.getDirection()).eq("side", stockCheck.getSide()).orderByDesc("create_time").last(" limit 2")); + if (stockLogs.size() == 1) { + stock.setOveroperationPic(stockLogs.get(0).getPic()); + } else if (stockLogs.size() == 2) { + stock.setOveroperationPic(stockLogs.get(0).getPic()); + stock.setPreoperationPic(stockLogs.get(1).getPic()); + } } - List stockLogs = stockLogMapper.selectList(new QueryWrapper().eq("`row`",stockCheck.getRow()).eq("`column`",stockCheck.getColumn()).eq("street_id",stockCheck.getStreetId()).eq("direction",stockCheck.getDirection()).eq("side",stockCheck.getSide()).orderByDesc("create_time").last(" limit 2")); - if(stockLogs.size() == 1){ - stock.setOveroperationPic(stockLogs.get(0).getPic()); - }else if(stockLogs.size() == 2){ - stock.setOveroperationPic(stockLogs.get(0).getPic()); - stock.setPreoperationPic(stockLogs.get(1).getPic()); - } - String ip ="http://"+ street.getPlcIp()+":9009/pic/"+stock.getCode()+"/"+stock.getCheckNum()+"/"; - stock.setSidePic1(String.format("%s1.png",ip)); - stock.setSidePic2(String.format("%s2.png",ip)); - stock.setSidePic3(String.format("%s3.png",ip)); - stock.setSidePic4(String.format("%s4.png",ip)); - stock.setTopPic1(String.format("%s5.png",ip)); - stock.setTopPic2(String.format("%s6.png",ip)); return stock; } @@ -372,10 +378,14 @@ public class StockService { Stock stock = stockInfo(stockCheck); Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录"); Integer oldStatus = stock.getStatus(); - Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对"); + //Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对"); - log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); - stock.setStatus(StockStatus.MANUAL.getStatus()); + log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(), stockCheck.getDirection(), stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn()); + if (stockCheck.getOk() == 1) { + stock.setStatus(StockStatus.MANUAL.getStatus()); + } else { + stock.setStatus(StockStatus.ERROR.getStatus()); + } stockMapper.updateById(stock); checkLog(stock); return stock; @@ -394,7 +404,12 @@ public class StockService { checkLog.setStatus(stock.getStatus()); checkLog.setCode(stock.getCode()); checkLog.setCreateTime(LocalDateTime.now()); - checkLogMapper.insert(checkLog); + checkLogMapper.update(checkLog, new UpdateWrapper() + .eq("check_num", stock.getCheckNum()) + .eq("`column`", stock.getColumn()) + .eq("`row`", stock.getRow()) + .eq("direction", stock.getDirection()) + .eq("side", stock.getSide())); } /** diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java index 3533245..f593257 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java @@ -33,7 +33,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { private static String lastLotnum; - //private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000)); + private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000)); private PlcService plcService; @@ -49,8 +49,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { log.debug("no data"); return null; } - //KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService); - //threadPoolExecutor.execute(kescRunnable); + KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService); + threadPoolExecutor.execute(kescRunnable); return null; } @@ -86,17 +86,17 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { String srmNumber = null; String cmdName = null; if(dataInfo != null){ - //左右换过来 - if(dataInfo.getFromDirection() == 1){ - dataInfo.setFromDirection(2); - }else { - dataInfo.setFromDirection(1); - } - if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){ - dataInfo.setToDirection(2); - }else { - dataInfo.setToDirection(1); - } + //左右不调换 +// if(dataInfo.getFromDirection() == 1){ +// dataInfo.setFromDirection(2); +// }else { +// dataInfo.setFromDirection(1); +// } +// if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){ +// dataInfo.setToDirection(2); +// }else { +// dataInfo.setToDirection(1); +// } plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); srmNumber = dataInfo.getSRMNumber(); diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecNettyClient.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecNettyClient.java index 66b0f4f..f99361d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecNettyClient.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecNettyClient.java @@ -54,6 +54,10 @@ public class KsecNettyClient { * @param upId */ public void reconnect(Integer upId) { + if (channel != null) { + channel.disconnect(); + channel.close(); + } Boolean isConnected = false; int num = 0; ConfigProperties.KSEC ksec = configProperties.getKsec(); @@ -76,7 +80,6 @@ public class KsecNettyClient { try { createClient(ksec); } catch (Exception e) { - channel.close(); //没连上 继续 log.error("reconnect error num:{}", num); //关闭当前链接 diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index 47f51da..4707bde 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -61,6 +61,8 @@ serverMode: 1 ksec: ip: 127.0.0.1 port: 3000 + platformIp: 127.0.0.1 + platformPort: 3000 #断点重连的次数:-1->不断重连 # reconnectNum: -1 # #断点重连的时间间隔(单位:ms) @@ -86,7 +88,7 @@ lightSource: # 扫码模式 0:此处不盘点 1:球机扫码 2:sick扫码枪 3:南北达RFID scanCodeMode: tray: 0 - goods: 0 + goods: 2 goodsCodeTypes: - 14 trayCodeTypes: diff --git a/web/src/main/resources/mapper/OrderMapper.xml b/web/src/main/resources/mapper/OrderMapper.xml index d1c2aa2..229309d 100644 --- a/web/src/main/resources/mapper/OrderMapper.xml +++ b/web/src/main/resources/mapper/OrderMapper.xml @@ -12,6 +12,9 @@ and t.into_stock_time >= #{req.startTimestamp} and t.into_stock_time <= #{req.endTimestamp} + + and t.street_id = #{req.streetId} + order by t.id desc