@ -1,16 +1,12 @@
package com.zhehekeji.web.service ;
import com.baomidou.mybatisplus.core.conditions. update.Update Wrapper;
import com.baomidou.mybatisplus.core.conditions. query.Query Wrapper;
import com.zhehekeji.common.util.PathUtil ;
import com.zhehekeji.web.entity.Order ;
import com.zhehekeji.web.entity.Street ;
import com.zhehekeji.web.entity.Warn ;
import com.zhehekeji.web.entity.* ;
import com.zhehekeji.web.lib.OrderInfo ;
import com.zhehekeji.web.lib.OrderRealtime ;
import com.zhehekeji.web.lib.PtzControlModule ;
import com.zhehekeji.web.mapper.OrderMapper ;
import com.zhehekeji.web.mapper.StreetMapper ;
import com.zhehekeji.web.mapper.StreetShelveMapper ;
import com.zhehekeji.web.mapper.WarnMapper ;
import com.zhehekeji.web.mapper.* ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.stereotype.Service ;
@ -18,19 +14,29 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource ;
import java.time.LocalDateTime ;
import java.util.ArrayList ;
import java.util.List ;
/ * *
* @Description plc 信 号 指 令 处 理 类
* 对 plcId 做 同 步 处 理 , 防 止 内 存 中 保 存 的 正 在 运 行 的 订 单 信 息 错 乱
* @Author qiushui
* @Date 2021 / 1 / 19 13 : 45
* * /
@Service
@Slf4j
public class PlcService {
@Resource
private OrderMapper orderMapper ;
@Resource
private StreetShelveMapper streetShelveMapper ;
// @Resource
// private StreetShelveMapper streetShelveMapper;
@Resource
private StreetMapper streetMapper ;
@Resource
private WarnMapper warnMapper ;
@Resource
private OrderService orderService ;
@Value ( "${picPort}" )
private String picPort ;
@ -38,13 +44,10 @@ public class PlcService {
@Value ( "${mp4Path}" )
private String mp4Path ;
private Street getStreetByPlcId ( String plcId ) {
Street street = streetMapper . getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
log . error ( "巷道不存在plcId:{}" , plcId ) ;
}
return street ;
}
@Resource
private StreetService streetService ;
@Resource
private CameraIOMapper ioMapper ;
/ * *
* 开 始 工 单
@ -53,113 +56,172 @@ public class PlcService {
* /
public void orderStart ( String orderNum , String plcId ) {
Order order = new Order ( ) ;
String orderNumber = plcId + orderNum ;
order . setOrderNum ( orderNumber ) ;
order . setOrderNum ( orderNum ) ;
order . setStartTime ( LocalDateTime . now ( ) ) ;
Street street = getStreetByPlcId ( plcId ) ;
order . setCreateTime ( LocalDateTime . now ( ) ) ;
Street street = streetService . getStreetByPlcId ( plcId ) ;
if ( street ! = null ) {
OrderRealtime . startOrder ( street . getId ( ) , orderNumber ) ;
orderMapper . update ( order , new UpdateWrapper < 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 ;
}
order . setOrderNum ( orderNumber ) ;
order . setEndTime ( LocalDateTime . now ( ) ) ;
OrderInfo orderInfo = new OrderInfo ( 0 L , plcOrderInfo . getOrderNum ( ) , shelveId , row , column ) ;
PtzControlModule . pic ( street . getCamera1Id ( ) , 0 , orderInfo ) ;
PtzControlModule . pic ( street . getCamera2Id ( ) , 0 , orderInfo ) ;
}
if ( street . getCamera1Id ( ) ! = null ) {
String path = PathUtil . createFileName ( "mp4" ) ;
PtzControlModule . downloadMp4 ( street . getCamera1Id ( ) , mp4Path + path , orderNumber , order . getStartTime ( ) , order . getEndTime ( ) ) ;
order . setVideoPath1 ( path ) ;
/ * *
* 根 据 plc 指 令 转 动 摄 像 头 到 预 置 点
* @param cameraId1
* @param cameraId2
* @param code
* /
public void move ( Integer cameraId1 , Integer cameraId2 , String code ) {
List < 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 ) {
public void warnStart ( String plcId ) {
Street street = streetService . getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
return ;
}
synchronized ( plcId . intern ( ) ) {
Street street = getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
return ;
}
String orderNum = OrderRealtime . getOrderByStreetId ( street . getId ( ) ) ;
Long warnId = null ;
if ( StringUtils . isEmpty ( orderNum ) ) {
//空的 说明没有正在执行的订单
//新增 告警
Warn warn = new Warn ( ) ;
warn . setStartTime ( LocalDateTime . now ( ) ) ;
warn . setStreetId ( street . getId ( ) ) ;
warnMapper . insert ( warn ) ;
warnId = warn . getId ( ) ;
if ( OrderRealtime . getWarnId ( street . getId ( ) ) = = null ) {
//不存在正在执行的告警记录,就新增
Warn warn = new Warn ( ) ;
warn . setStartTime ( LocalDateTime . now ( ) ) ;
warn . setStreetId ( street . getId ( ) ) ;
warnMapper . insert ( warn ) ;
OrderRealtime . startWarn ( street . getId ( ) , warn . getId ( ) ) ;
} else {
log . debug ( "{}:exist warn" , plcId ) ;
}
} else {
log . debug ( "{}:warn.... exist order" , plcId ) ;
}
OrderRealtime . startWarn ( street . getId ( ) , warnNum , warnId ) ;
}
}
/ * *
* 发 生 告 警 , 如 果 仍 有 运 行 的 订 单 , 需 要 将 该 订 单 标 记 为 告 警 , 并 下 载 录 像
* 告 警 结 束 信 号
* 是 否 存 在 订 单 , 存 在 - 》 保 存 该 订 单 的 视 频
* 如 果 没 有 订 单 - 》 是 否 存 在 告 警 记 录 - 》 有 告 警 记 录 的 话 , 保 存 视 频
* @param plcId
* /
public void wearnStop ( String plcId , String warnNum ) {
public void warnStop ( String plcId ) {
Street street = streetMapper . getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
return ;
}
synchronized ( plcId . intern ( ) ) {
Street street = streetMapper . getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
return ;
}
Boolean hasWarn = OrderRealtime . stopWarn ( street . getId ( ) , warnNum ) ;
if ( ! hasWarn ) {
//不存在告警了
//是否存在未结束的订单
String orderNum = OrderRealtime . getOrderByStreetId ( street . getId ( ) ) ;
if ( ! StringUtils . isEmpty ( orderNum ) ) {
//存在未结束的订单
orderStop ( orderNum , 1 , plcId ) ;
} else {
//是否有告警
Long warnId = OrderRealtime . getWarnId ( street . getId ( ) ) ;
if ( warnId ! = null ) {
OrderRealtime . cleanWarn ( street . getId ( ) ) ;
Warn warn = warnMapper . selectById ( warnId ) ;
if ( warn ! = null ) {
warn . setEndTime ( LocalDateTime . now ( ) ) ;
//是否存在未结束的订单
String orderNum = OrderRealtime . getOrderByStreetId ( street . getId ( ) ) ;
if ( ! StringUtils . isEmpty ( orderNum ) ) {
//存在未结束的订单
//清了订单缓存,结束订单
OrderRealtime . stopOrder ( street . getId ( ) ) ;
orderService . orderStop ( orderNum , street , Boolean . TRUE ) ;
} else {
//没有未结束的订单
//是否有告警
Long warnId = OrderRealtime . getWarnId ( street . getId ( ) ) ;
if ( warnId ! = null ) {
//存在告警
//先内存中清除该告警
OrderRealtime . cleanWarn ( street . getId ( ) ) ;
Warn warn = warnMapper . selectById ( warnId ) ;
if ( warn ! = null ) {
//结束该告警,并录像
warn . setEndTime ( LocalDateTime . now ( ) ) ;
if ( street . getCamera1Id ( ) ! = null ) {
String path = PathUtil . createFileName ( "mp4" ) ;
PtzControlModule . downloadMp4 ( street . getCamera1Id ( ) , mp4Path + path , warnId . toString ( ) , warn . getStartTime ( ) , warn . getEndTime ( ) ) ;
warn . setVideoPath1 ( path ) ;
}
if ( street . getCamera2Id ( ) ! = null ) {
String path = PathUtil . createFileName ( "mp4" ) ;
PtzControlModule . downloadMp4 ( street . getCamera2Id ( ) , mp4Path + path , warnId . toString ( ) , warn . getStartTime ( ) , warn . getEndTime ( ) ) ;
warn . setVideoPath2 ( path ) ;
}
warnMapper . updateById ( warn ) ;
}
}
}
@ -167,4 +229,27 @@ public class PlcService {
}
/ * *
* 工 单 结 束 信 息
* 判 断 有 没 有 告 警 , 有 告 警 的 不 做 处 理
* 没 有 告 警 , 且 存 在 未 结 束 工 单 , 修 改 保 存 工 单 信 息
* @param plcId
* @param orderNum
* /
public void orderStop ( String plcId , String orderNum ) {
Street street = streetMapper . getStreetByPlcId ( plcId ) ;
if ( street = = null ) {
return ;
}
synchronized ( plcId . intern ( ) ) {
Long warnId = OrderRealtime . getWarnId ( street . getId ( ) ) ;
if ( warnId = = null ) {
String order = OrderRealtime . stopOrder ( street . getId ( ) ) ;
if ( ! StringUtils . isEmpty ( order ) ) {
orderService . orderStop ( orderNum , street , Boolean . FALSE ) ;
}
}
}
}
}