动作执行

camera_merge
王一鸣 5 years ago
parent f64804cf58
commit e3232e781c

@ -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.**")

@ -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();
}

@ -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();
}

@ -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();
}

@ -18,6 +18,8 @@ public class CameraIO {
private Integer cameraId;
private String code;
private String name;
@ApiModelProperty("位置")

@ -16,5 +16,7 @@ public class CameraIOConfig {
private String name;
private String code;
private LocalDateTime updateTime;
}

@ -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;

@ -33,7 +33,6 @@ public class Street {
private Integer leftRow;
@ApiModelProperty("左内侧货架号-双伸")
@TableField(strategy = FieldStrategy.IGNORED)
private String leftInsideShelveId;

@ -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;

@ -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<Order>().eq("order_num",orderInfo.getOrderNum()));
return;

@ -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;
//
// }
}

@ -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;
/**
@ -18,7 +15,10 @@ public class OrderRealtime {
*/
private static Map<Integer, String> orderMap = new ConcurrentHashMap<>();
private static Map<Integer, Set<String>> warnMap = new ConcurrentHashMap<>();
/**
* key: streetId
* value:id warn
*/
private static Map<Integer, Long> warnIdMap = new ConcurrentHashMap<>();
/**
@ -34,6 +34,7 @@ public class OrderRealtime {
/**
*
*
* @param streetId
* @return
*/
@ -41,27 +42,12 @@ public class OrderRealtime {
return orderMap.get(streetId);
}
public static void startWarn(Integer streetId,String orderNum,Long warnId){
Set<String> set = warnMap.get(streetId);
set.add(orderNum);
warnMap.put(streetId,set);
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<String> set = warnMap.get(streetId);
set.remove(orderNum);
warnMap.put(streetId,set);
return !set.isEmpty();
}
public static Long getWarnId(Integer streetId) {
return warnIdMap.get(streetId);
@ -73,15 +59,14 @@ public class OrderRealtime {
/**
*
*
* @param streetId
* @return
*/
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) {
@ -90,6 +75,7 @@ public class OrderRealtime {
/**
*
*
* @param play
* @return
*/

@ -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());
}
}

@ -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<StreetShelve> {
void batchInsert(@Param("streetShelves") List<StreetShelve> streetShelves);
}

@ -6,4 +6,6 @@ import lombok.Data;
public class IOImport {
private String name;
private String code;
}

@ -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);
}
/**

@ -37,6 +37,7 @@ public class IOImportListener extends AnalysisEventListener<IOImport> {
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){

@ -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<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
loginThread loginThread = new loginThread(cameras);
loginThread.start();
//plc 连接状态初始化
List<Street> 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());
}
});
}

@ -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;

@ -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));
// 连接服务端
try {
client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel();
} catch (InterruptedException e) {
log.error("plc连接 被打断或无法连接:{}",e);
}
}
public static void close() {

@ -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<String,Integer> 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;
}
}

@ -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<StreetShelve> streetShelves = streetShelveMapper.selectList(new QueryWrapper<StreetShelve>().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<Order>().eq("order_num", orderNum));
}
}

@ -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;
}
}

@ -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,118 +56,200 @@ 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<Order>().eq("order_num", orderNumber));
OrderRealtime.startOrder(street.getId(), orderNum);
orderMapper.insert(order);
//orderMapper.update(order, new UpdateWrapper<Order>().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;
}
OrderInfo orderInfo = new OrderInfo(0L,plcOrderInfo.getOrderNum(),shelveId,row,column);
PtzControlModule.pic(street.getCamera1Id(),0,orderInfo);
PtzControlModule.pic(street.getCamera2Id(),0,orderInfo);
}
order.setOrderNum(orderNumber);
order.setEndTime(LocalDateTime.now());
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<Integer> 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<Order>().eq("order_num", orderNumber));
OrderRealtime.stopOrder(street.getId());
List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().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){
synchronized (plcId.intern()){
Street street = getStreetByPlcId(plcId);
public void warnStart(String plcId){
Street street = streetService.getStreetByPlcId(plcId);
if(street == null){
return;
}
synchronized (plcId.intern()){
String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
Long warnId = null;
if(StringUtils.isEmpty(orderNum)){
//空的 说明没有正在执行的订单
//新增 告警
if(OrderRealtime.getWarnId(street.getId()) == null){
//不存在正在执行的告警记录,就新增
Warn warn = new Warn();
warn.setStartTime(LocalDateTime.now());
warn.setStreetId(street.getId());
warnMapper.insert(warn);
warnId = warn.getId();
OrderRealtime.startWarn(street.getId(),warn.getId());
}else {
log.debug("{}:exist warn",plcId);
}
OrderRealtime.startWarn(street.getId(),warnNum,warnId);
}else {
log.debug("{}:warn.... exist order",plcId);
}
}
}
/**
*
*
* -
* --
* @param plcId
*/
public void wearnStop(String plcId,String warnNum){
synchronized (plcId.intern()){
public void warnStop(String plcId){
Street street = streetMapper.getStreetByPlcId(plcId);
if(street == null){
return;
}
Boolean hasWarn = OrderRealtime.stopWarn(street.getId(),warnNum);
if(!hasWarn){
//不存在告警了
synchronized (plcId.intern()){
//是否存在未结束的订单
String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
if(!StringUtils.isEmpty(orderNum)){
//存在未结束的订单
orderStop(orderNum,1,plcId);
//清了订单缓存,结束订单
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);
}
}
}
}
}
}
/**
*
*
*
* @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);
}
}
}
}
}

@ -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;
}

@ -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<Integer,Boolean> 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<Integer> connList(){
List<Integer> 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);
}
}

@ -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<String> shelvesByStreetId(Integer streetId){
List<StreetShelve> streetShelves = streetShelveMapper.selectList(new QueryWrapper<StreetShelve>().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<String> 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<String,Object> params = new HashMap<>(1);
params.put("street_id",streetId);
streetShelveMapper.deleteByMap(params);
}
private void streetShelve(List<String> shelves,Integer streetId){
if(CollectionUtils.isEmpty(shelves) || streetId == null){
return;
}
List<StreetShelve> 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<StreetVO> page(StreetSearch search){

@ -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<SocketChannel>() {
// @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();
// }
// }
}

@ -4,10 +4,10 @@
<insert id="batchInsert" parameterType="java.util.List">
insert into camera_io_config(
name,update_time
name,update_time,code
) values
<foreach collection="list" item="item" separator=",">
(#{item.name},#{item.updateTime})
(#{item.name},#{item.updateTime},#{item.code})
</foreach>
</insert>
</mapper>

Loading…
Cancel
Save