动作执行

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.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication(scanBasePackages = {"com.zhehekeji"}) @SpringBootApplication(scanBasePackages = {"com.zhehekeji"})
@MapperScan("com.zhehekeji.**.mapper.**") @MapperScan("com.zhehekeji.**.mapper.**")

@ -286,7 +286,7 @@ public class CameraControlController {
@ApiOperation(value = "立即拍照") @ApiOperation(value = "立即拍照")
public Result pic(@PathVariable Integer id) { public Result pic(@PathVariable Integer id) {
checkLogin(id); checkLogin(id);
System.out.println(PtzControlModule.pic(id,0,"aaa",0)); //System.out.println(PtzControlModule.pic(id,0,"aaa"));
return Result.success(); return Result.success();
} }

@ -43,29 +43,36 @@ public class OrderController {
@ApiOperation("工单拍照") @ApiOperation("工单拍照")
@GetMapping("/camera") @GetMapping("/camera")
public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("类型 1入库 3出库 2货物图片") @RequestParam Integer type){ public Result camera(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plcId") @RequestParam String plcId){
orderService.pic(type,orderNum); //orderService.pic(orderNum,plcId);
return Result.success(); return Result.success();
} }
@ApiOperation("工单开始信号") @ApiOperation("工单开始信号")
@GetMapping("/start") @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); plcService.orderStart(orderNum,plcId);
return Result.success(); return Result.success();
} }
@ApiOperation("工单结束信号") @ApiOperation("工单结束信号")
@GetMapping("/stop") @GetMapping("/stop")
public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")String plcId){ public Result orderStop(@ApiParam("工单号") @RequestParam String orderNum,@ApiParam("plc")@RequestParam String plcId){
plcService.orderStop(orderNum,null,plcId); plcService.orderStop(plcId,orderNum);
return Result.success(); return Result.success();
} }
@ApiOperation("工单被告警打断") @ApiOperation("发生告警")
@GetMapping("/error") @GetMapping("/error")
public Result orderError(@ApiParam("plc") @RequestParam String plcId,@RequestParam String warnNum){ public Result orderError(@ApiParam("plc") @RequestParam String plcId){
plcService.warnStart(plcId,warnNum); plcService.warnStart(plcId);
return Result.success();
}
@ApiOperation("告警结束")
@GetMapping("/errorStop")
public Result errorStop(@ApiParam("plc") @RequestParam String plcId){
plcService.warnStop(plcId);
return Result.success(); return Result.success();
} }

@ -1,13 +1,11 @@
package com.zhehekeji.web.controller; package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result; import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert; import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.pojo.street.StreetSearch; import com.zhehekeji.web.service.NettyClient;
import com.zhehekeji.web.pojo.street.StreetVO; import com.zhehekeji.web.service.StreetConn;
import com.zhehekeji.web.service.ClientMap;
import com.zhehekeji.web.service.StreetService; import com.zhehekeji.web.service.StreetService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -25,15 +23,28 @@ public class PLCController {
@Resource @Resource
private StreetMapper streetMapper; private StreetMapper streetMapper;
@Resource @Resource
private ClientMap clientMap; private NettyClient nettyClient;
@GetMapping("/heart") @GetMapping("/tcp")
@ApiOperation(value = "心跳") @ApiOperation(value = "连接plc,发起请求")
public Result heart(@RequestParam Integer id) throws InterruptedException { public Result heart(@RequestParam Integer id){
Street street = streetMapper.selectById(id); Street street = streetMapper.selectById(id);
Assert.isTrue(street!= null && street.getPlcIp() != null && street.getPlcPort() != null,"未配置IP"); 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(); return Result.success();
} }

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

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

@ -42,14 +42,17 @@ public class Order {
@TableField("`video_path_2`") @TableField("`video_path_2`")
private String videoPath2; private String videoPath2;
@ApiModelProperty("入库照片") @ApiModelProperty("图片地址,分隔")
private String putPath; private String picPaths;
@ApiModelProperty("出库照片") // @ApiModelProperty("入库照片")
private String outputPath; // private String putPath;
//
@ApiModelProperty("货位照片") // @ApiModelProperty("出库照片")
private String goodsPath; // private String outputPath;
//
// @ApiModelProperty("货位照片")
// private String goodsPath;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime; private LocalDateTime startTime;

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

@ -19,9 +19,6 @@ public class Warn {
private Integer streetId; private Integer streetId;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime; private LocalDateTime startTime;

@ -53,30 +53,30 @@ public class CaptureRunnable implements Runnable {
if (picPath == null) { if (picPath == null) {
return; return;
} }
log.debug("save pic orderId:{} path:{}", orderInfo.getOrderId(), picPath); log.debug("save pic orderNum:{} path:{}", orderInfo.getOrderNum(), picPath);
//todo 根据orderNum找到货架暂时qqq //todo 根据orderNum找到货架暂时qqq
String shelveId = "qqq"; String shelveId = orderInfo.getShelveId();
Integer row = 1; Integer row = orderInfo.getRow();
Integer column = 1; Integer column = orderInfo.getColumn();
OrderLastMedia orderLastMedia = lastMediaMapper.getOne(shelveId,row,column); OrderLastMedia orderLastMedia = lastMediaMapper.getOne(shelveId,row,column);
if (orderLastMedia == null) { if (orderLastMedia == null) {
orderLastMedia = initLastOrder(shelveId,row,column); orderLastMedia = initLastOrder(shelveId,row,column);
} }
Order order = new Order(); Order order = new Order();
//order.setId(orderInfo.getOrderId()); //order.setId(orderInfo.getOrderId());
if (OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())) { // if (OrderInfo.OrderPathType.GOODS.getType().equals(orderInfo.getType())) {
order.setGoodsPath(path); // order.setGoodsPath(path);
orderLastMedia.setLastGoodsOrderNum(orderInfo.getOrderNum()); // orderLastMedia.setLastGoodsOrderNum(orderInfo.getOrderNum());
orderLastMedia.setGoodsPath(path); // orderLastMedia.setGoodsPath(path);
} else if (OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())) { // } else if (OrderInfo.OrderPathType.PUT.getType().equals(orderInfo.getType())) {
order.setPutPath(path); // order.setPutPath(path);
orderLastMedia.setLastPutOrderNum(orderInfo.getOrderNum()); // orderLastMedia.setLastPutOrderNum(orderInfo.getOrderNum());
orderLastMedia.setPutPath(path); // orderLastMedia.setPutPath(path);
} else if (OrderInfo.OrderPathType.OUTPUT.getType().equals(orderInfo.getType())) { // } else if (OrderInfo.OrderPathType.OUTPUT.getType().equals(orderInfo.getType())) {
order.setOutputPath(path); // order.setOutputPath(path);
orderLastMedia.setLastOutOrderNum(orderInfo.getOrderNum()); // orderLastMedia.setLastOutOrderNum(orderInfo.getOrderNum());
orderLastMedia.setOutPutPath(path); // orderLastMedia.setOutPutPath(path);
} // }
lastMediaMapper.updateById(orderLastMedia); lastMediaMapper.updateById(orderLastMedia);
orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num",orderInfo.getOrderNum())); orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num",orderInfo.getOrderNum()));
return; return;

@ -13,22 +13,28 @@ public class OrderInfo {
private String orderNum; private String orderNum;
/** private String shelveId;
* 1: 2 3
*/
private Integer type;
@AllArgsConstructor private Integer row;
@Getter
public enum OrderPathType{
PUT(1),
OUTPUT(3),
GOODS(2),
; private Integer column;
private Integer type;
} /**
* 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; package com.zhehekeji.web.lib;
import org.springframework.util.CollectionUtils;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
@ -16,9 +13,12 @@ public class OrderRealtime {
* key :streetId * key :streetId
* value: * value:
*/ */
private static Map<Integer,String> orderMap = new ConcurrentHashMap<>(); 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<>(); private static Map<Integer, Long> warnIdMap = new ConcurrentHashMap<>();
/** /**
@ -26,74 +26,60 @@ public class OrderRealtime {
* key: * key:
* value: * value:
*/ */
private static Map<NetSDKLib.LLong,String> playOrderMap = new ConcurrentHashMap<>(); private static Map<NetSDKLib.LLong, String> playOrderMap = new ConcurrentHashMap<>();
public static void startOrder(Integer streetId,String orderNum){ public static void startOrder(Integer streetId, String orderNum) {
orderMap.put(streetId,orderNum); orderMap.put(streetId, orderNum);
} }
/** /**
* *
*
* @param streetId * @param streetId
* @return * @return
*/ */
public static String getOrderByStreetId(Integer streetId){ public static String getOrderByStreetId(Integer streetId) {
return orderMap.get(streetId); return orderMap.get(streetId);
} }
public static void startWarn(Integer streetId,String orderNum,Long warnId){ public static void startWarn(Integer streetId, Long warnId) {
Set<String> set = warnMap.get(streetId); if (warnId != null) {
set.add(orderNum); warnIdMap.put(streetId, warnId);
warnMap.put(streetId,set);
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){ public static Long getWarnId(Integer streetId) {
return warnIdMap.get(streetId); return warnIdMap.get(streetId);
} }
public static void cleanWarn(Integer streetId){ public static void cleanWarn(Integer streetId) {
warnIdMap.remove(streetId); warnIdMap.remove(streetId);
} }
/** /**
* *
*
* @param streetId * @param streetId
* @return * @return
*/ */
public static String stopOrder(Integer streetId){ public static String stopOrder(Integer streetId) {
String orderNum = orderMap.get(streetId);
String orderNum = orderMap.get(streetId); orderMap.remove(streetId);
orderMap.remove(streetId); return orderNum;
return orderNum;
} }
public static void startDownload(NetSDKLib.LLong play,String orderNum){ public static void startDownload(NetSDKLib.LLong play, String orderNum) {
playOrderMap.put(play,orderNum); playOrderMap.put(play, orderNum);
} }
/** /**
* *
*
* @param play * @param play
* @return * @return
*/ */
public static String overDownload(NetSDKLib.LLong play){ public static String overDownload(NetSDKLib.LLong play) {
String orderNum = playOrderMap.get(play); String orderNum = playOrderMap.get(play);
playOrderMap.remove(play); playOrderMap.remove(play);
return orderNum; return orderNum;

@ -3,14 +3,10 @@ package com.zhehekeji.web.lib;
import com.sun.jna.Pointer; import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.IntByReference;
import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.common.util.SpringContextUtil;
import com.zhehekeji.core.util.Assert; 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 lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.UUID;
/** /**
* *
@ -217,15 +213,13 @@ public class PtzControlModule {
0, 0, 0, 1); 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(); NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS();
stuSnapParams.Channel = nChannelID; // channel stuSnapParams.Channel = nChannelID; // channel
stuSnapParams.mode = 0; // capture picture mode stuSnapParams.mode = 0; // capture picture mode
stuSnapParams.Quality = 3; // picture quality stuSnapParams.Quality = 3; // picture quality
stuSnapParams.InterSnap = 0; // timer capture picture time interval stuSnapParams.InterSnap = 0; // timer capture picture time interval
stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial(); stuSnapParams.CmdSerial = OrderCmdSerial.nextSerial();
Long orderId = 1L;
OrderInfo orderInfo = new OrderInfo(orderId,orderNum,type);
OrderCmdSerial.put(stuSnapParams.CmdSerial,orderInfo); OrderCmdSerial.put(stuSnapParams.CmdSerial,orderInfo);
IntByReference reserved = new IntByReference(0); IntByReference reserved = new IntByReference(0);
return LoginModule.netsdk.CLIENT_SnapPictureEx(CameraConnMap.getConnId(cameraId), stuSnapParams, reserved); 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.nChannelID = 0;
download_by_data_type.stStartTime = startTime; download_by_data_type.stStartTime = startTime;
download_by_data_type.stStopTime = endTime; download_by_data_type.stStopTime = endTime;
System.out.println("path:"+path);
download_by_data_type.szSavedFileName=path; download_by_data_type.szSavedFileName=path;
download_by_data_type.emDataType = 3; download_by_data_type.emDataType = 3;
download_by_data_type.emRecordType = 0; 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.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); //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("开始"); log.debug("start download mp4");
System.out.println("loginId"+CameraConnMap.getConnId(cameraId));
NetSDKLib.LLong l = LoginModule.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId),download_by_data_type,net_out_download_by_data_type,0); 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){ if(l.longValue() == 0){
log.error("download error :{}",LoginModule.netsdk.CLIENT_GetLastError());
}else {
OrderRealtime.startDownload(l,orderNum); 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 { public class IOImport {
private String name; private String name;
private String code;
} }

@ -1,15 +1,11 @@
package com.zhehekeji.web.service; package com.zhehekeji.web.service;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent; import io.netty.handler.timeout.IdleStateEvent;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.nio.charset.Charset;
/** /**
* *
* *
@ -33,6 +29,8 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter {
*/ */
@Override @Override
public void channelActive(ChannelHandlerContext ctx) throws Exception { public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("streetId:{}连接成功",streetId);
StreetConn.conn(streetId);
ctx.fireChannelActive(); ctx.fireChannelActive();
} }
@ -41,7 +39,8 @@ public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter {
*/ */
@Override @Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception { 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())){ if(!names.contains(ioImport.getName())){
CameraIOConfig cameraIO = new CameraIOConfig(); CameraIOConfig cameraIO = new CameraIOConfig();
cameraIO.setName(ioImport.getName()); cameraIO.setName(ioImport.getName());
cameraIO.setCode(ioImport.getCode());
cameraIO.setUpdateTime(LocalDateTime.now()); cameraIO.setUpdateTime(LocalDateTime.now());
stocks.add(cameraIO); stocks.add(cameraIO);
if(stocks.size() > LENGTH){ if(stocks.size() > LENGTH){

@ -1,6 +1,7 @@
package com.zhehekeji.web.service; package com.zhehekeji.web.service;
import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraConnMap;
import com.zhehekeji.web.lib.LoginModule; import com.zhehekeji.web.lib.LoginModule;
import com.zhehekeji.web.lib.NetSDKLib; import com.zhehekeji.web.lib.NetSDKLib;
@ -24,12 +25,26 @@ public class InitService implements ApplicationRunner {
private CameraMapper cameraMapper; private CameraMapper cameraMapper;
@Resource @Resource
private StreetMapper streetMapper; private StreetMapper streetMapper;
@Resource
private NettyClient nettyClient;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
//球机登录
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0)); List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
loginThread loginThread = new loginThread(cameras); loginThread loginThread = new loginThread(cameras);
loginThread.start(); 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()); CharSequence plc = in.readCharSequence(6, Charset.defaultCharset());
String plcId = plc.toString(); String plcId = plc.toString();
log.debug("plcId:{}", plcId); log.info("plcId:{}", plcId);
// OA=心跳 OB=工单 OC=任务 OD=告警 // OA=心跳 OB=工单 OC=任务 OD=告警
CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset()); CharSequence typeChar = in.readCharSequence(2, Charset.defaultCharset());
String type = typeChar.toString(); 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 short1 = in.readShort();
short short2 = in.readShort(); short short2 = in.readShort();
@ -59,31 +59,13 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder {
short short6 = in.readShort(); short short6 = in.readShort();
short short7 = in.readShort(); short short7 = in.readShort();
short short8 = 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); PlcOrderInfo plcOrderInfo = new PlcOrderInfo(taskId,(int)short1,(int)short2,(int)short3,(int)short4,(int)short5,(int)short6,(int)short7,(int)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")) {
} else {
}
byte maohao = in.readByte(); byte maohao = in.readByte();
log.info(":{}", maohao);
byte leixing = in.readByte(); byte leixing = in.readByte();
log.info("---leixing:{}", leixing);
byte w = in.readByte(); byte w = in.readByte();
log.info("---w:{}", w); Character character = new Character((char)leixing);
String code = character.toString()+w;
byte b1 = in.readByte(); byte b1 = in.readByte();
byte b2 = in.readByte(); byte b2 = in.readByte();
byte b3 = in.readByte(); byte b3 = in.readByte();
@ -92,6 +74,38 @@ public class MyProtocolDecoder extends FixedLengthFrameDecoder {
byte b6 = in.readByte(); byte b6 = in.readByte();
byte b7 = in.readByte(); byte b7 = in.readByte();
byte b8 = 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); log.info("b1:{},b2:{},b3:{},b4:{},b5:{},b6:{},b7:{},b8:{}", b1, b2, b3, b4, b5, b6, b7, b8);
in.release(); in.release();
return null; return null;

@ -7,29 +7,37 @@ import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
@Slf4j @Slf4j
@Component @Component
public class ClientMap { public class NettyClient {
private static EventLoopGroup group = new NioEventLoopGroup(); private static EventLoopGroup group = new NioEventLoopGroup();
@Resource @Resource
private PlcService plcService; 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(); Bootstrap client = new Bootstrap();
// 第1步 定义线程组处理读写和链接事件没有了accept事件 // 第1步 定义线程组处理读写和链接事件没有了accept事件
client.group(group); client.group(group);
// 第2步 绑定客户端通道 // 第2步 绑定客户端通道
client.channel(NioSocketChannel.class); client.channel(NioSocketChannel.class);
// 第3步 给NIoSocketChannel初始化handler 处理读写事件 // 第3步 给NIoSocketChannel初始化handler 处理读写事件
SendHeart sendHeart = new SendHeart(street.getPlcId(),"0A"); SendHeart sendHeart = new SendHeart(street.getPlcId());
client.handler(new HeartNettyClientFilter(street.getId(),sendHeart,plcService)); client.handler(new HeartNettyClientFilter(street.getId(),sendHeart,plcService));
// 连接服务端 // 连接服务端
client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel(); try {
client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel();
} catch (InterruptedException e) {
log.error("plc连接 被打断或无法连接:{}",e);
}
} }
public static void close() { 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.common.util.PathUtil;
import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.entity.Order;
import com.zhehekeji.web.entity.Street; 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.lib.PtzControlModule;
import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.mapper.OrderMapper;
import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.mapper.StreetShelveMapper;
import com.zhehekeji.web.pojo.OrderSaveReq; import com.zhehekeji.web.pojo.OrderSaveReq;
import com.zhehekeji.web.pojo.OrderSearch; import com.zhehekeji.web.pojo.OrderSearch;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -28,8 +25,8 @@ public class OrderService {
@Resource @Resource
private OrderMapper orderMapper; private OrderMapper orderMapper;
@Resource // @Resource
private StreetShelveMapper streetShelveMapper; // private StreetShelveMapper streetShelveMapper;
@Resource @Resource
private StreetMapper streetMapper; private StreetMapper streetMapper;
@ -51,20 +48,6 @@ public class OrderService {
return orders; 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) { public Long add(OrderSaveReq saveReq) {
Order order = new Order(); Order order = new Order();
String orderNum = saveReq.getOrderNum(); String orderNum = saveReq.getOrderNum();
@ -75,6 +58,45 @@ public class OrderService {
return order.getId(); 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; 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.common.util.PathUtil;
import com.zhehekeji.web.entity.Order; import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.lib.OrderInfo;
import com.zhehekeji.web.entity.Warn;
import com.zhehekeji.web.lib.OrderRealtime; import com.zhehekeji.web.lib.OrderRealtime;
import com.zhehekeji.web.lib.PtzControlModule; import com.zhehekeji.web.lib.PtzControlModule;
import com.zhehekeji.web.mapper.OrderMapper; import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.mapper.StreetShelveMapper;
import com.zhehekeji.web.mapper.WarnMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -18,19 +14,29 @@ import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* @Description plc
* plcId
* @Author qiushui
* @Date 2021/1/19 13:45
**/
@Service @Service
@Slf4j @Slf4j
public class PlcService { public class PlcService {
@Resource @Resource
private OrderMapper orderMapper; private OrderMapper orderMapper;
@Resource // @Resource
private StreetShelveMapper streetShelveMapper; // private StreetShelveMapper streetShelveMapper;
@Resource @Resource
private StreetMapper streetMapper; private StreetMapper streetMapper;
@Resource @Resource
private WarnMapper warnMapper; private WarnMapper warnMapper;
@Resource
private OrderService orderService;
@Value("${picPort}") @Value("${picPort}")
private String picPort; private String picPort;
@ -38,13 +44,10 @@ public class PlcService {
@Value("${mp4Path}") @Value("${mp4Path}")
private String mp4Path; private String mp4Path;
private Street getStreetByPlcId(String plcId){ @Resource
Street street = streetMapper.getStreetByPlcId(plcId); private StreetService streetService;
if(street == null){ @Resource
log.error("巷道不存在plcId:{}",plcId); private CameraIOMapper ioMapper;
}
return street;
}
/** /**
* *
@ -53,113 +56,172 @@ public class PlcService {
*/ */
public void orderStart(String orderNum,String plcId) { public void orderStart(String orderNum,String plcId) {
Order order = new Order(); Order order = new Order();
String orderNumber = plcId+orderNum; order.setOrderNum(orderNum);
order.setOrderNum(orderNumber);
order.setStartTime(LocalDateTime.now()); order.setStartTime(LocalDateTime.now());
Street street = getStreetByPlcId(plcId); order.setCreateTime(LocalDateTime.now());
Street street = streetService.getStreetByPlcId(plcId);
if(street != null){ if(street != null){
OrderRealtime.startOrder(street.getId(), orderNumber); OrderRealtime.startOrder(street.getId(), orderNum);
orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num", orderNumber)); orderMapper.insert(order);
//orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num", orderNum));
} }
} }
/** /**
* , * //times == 1 ,做动作
* @param orderNum * //times == 2 ,拍照
* @param warn 1 * //times == 3 ,做动作
* //times == 4 ,拍照
* @param plcOrderInfo
* @param plcId
* @param times
*/ */
public void orderStop(String orderNum,Integer warn,String plcId) { public void action(PlcOrderInfo plcOrderInfo,String plcId,Integer times,String code){
Street street = getStreetByPlcId(plcId); Street street = streetService.getStreetByPlcId(plcId);
if(street == null){ if(street == null){
return; return;
} }
String orderNumber = plcId+orderNum; if(times == 1 || times == 3){
Order order = orderMapper.getOneByOrderNum(orderNumber); //找到球机IO配置的预置点
if (order == null) { move(street.getCamera1Id(),street.getCamera2Id(),code);
log.error("订单结束信号订单不存在orderNum:{}", orderNumber);
return; 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; return;
} }
if(warn != null && warn == 1){ //2 得到相应的货架号(目前订单 只支持单伸货架)
order.setStatus(warn); //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); OrderInfo orderInfo = new OrderInfo(0L,plcOrderInfo.getOrderNum(),shelveId,row,column);
order.setEndTime(LocalDateTime.now()); PtzControlModule.pic(street.getCamera1Id(),0,orderInfo);
PtzControlModule.pic(street.getCamera2Id(),0,orderInfo);
}
if (street.getCamera1Id() != null) { /**
String path = PathUtil.createFileName("mp4"); * plc
PtzControlModule.downloadMp4(street.getCamera1Id(), mp4Path + path, orderNumber, order.getStartTime(), order.getEndTime()); * @param cameraId1
order.setVideoPath1(path); * @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) { if(cameraId2 != null){
String path = PathUtil.createFileName("mp4"); cameraIds.add(cameraId1);
PtzControlModule.downloadMp4(street.getCamera2Id(), mp4Path + path, orderNumber, order.getStartTime(), order.getEndTime());
order.setVideoPath2(path);
} }
orderMapper.update(order, new UpdateWrapper<Order>().eq("order_num", orderNumber)); List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code",code).in("camera_id",cameraIds));
OrderRealtime.stopOrder(street.getId()); ioConfigs.forEach(ioConfig->{
if(ioConfig.getPtzId() != null && ioConfig.getPtzId() > 0){
PtzControlModule.toPtz(ioConfig.getPtzId(),ioConfig.getCameraId());
}
});
} }
/** /**
* *
* 1.
* 2.
* @param plcId * @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()){ synchronized (plcId.intern()){
Street street = getStreetByPlcId(plcId);
if(street == null){
return;
}
String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
Long warnId = null;
if(StringUtils.isEmpty(orderNum)){ if(StringUtils.isEmpty(orderNum)){
//空的 说明没有正在执行的订单 //空的 说明没有正在执行的订单
//新增 告警 //新增 告警
Warn warn = new Warn(); if(OrderRealtime.getWarnId(street.getId()) == null){
warn.setStartTime(LocalDateTime.now()); //不存在正在执行的告警记录,就新增
warn.setStreetId(street.getId()); Warn warn = new Warn();
warnMapper.insert(warn); warn.setStartTime(LocalDateTime.now());
warnId = warn.getId(); 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 * @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()){ synchronized (plcId.intern()){
Street street = streetMapper.getStreetByPlcId(plcId); //是否存在未结束的订单
if(street == null){ String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
return; if(!StringUtils.isEmpty(orderNum)){
} //存在未结束的订单
Boolean hasWarn = OrderRealtime.stopWarn(street.getId(),warnNum); //清了订单缓存,结束订单
if(!hasWarn){ OrderRealtime.stopOrder(street.getId());
//不存在告警了 orderService.orderStop(orderNum,street,Boolean.TRUE);
//是否存在未结束的订单 }else {
String orderNum = OrderRealtime.getOrderByStreetId(street.getId()); //没有未结束的订单
if(!StringUtils.isEmpty(orderNum)){ //是否有告警
//存在未结束的订单 Long warnId = OrderRealtime.getWarnId(street.getId());
orderStop(orderNum,1,plcId); if(warnId != null){
}else { //存在告警
//是否有告警 //先内存中清除该告警
Long warnId = OrderRealtime.getWarnId(street.getId()); OrderRealtime.cleanWarn(street.getId());
if(warnId != null){ Warn warn = warnMapper.selectById(warnId);
OrderRealtime.cleanWarn(street.getId()); if(warn != null){
Warn warn = warnMapper.selectById(warnId); //结束该告警,并录像
if(warn != null){ warn.setEndTime(LocalDateTime.now());
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);
}
}
}
}
} }

@ -28,9 +28,9 @@ public class SendHeart {
private byte[] emp = new byte[8]; private byte[] emp = new byte[8];
public SendHeart(String plcIdStr, String typeStr) { public SendHeart(String plcIdStr) {
plcId = plcIdStr.getBytes(); plcId = plcIdStr.getBytes();
type = typeStr.getBytes(); type = "0A".getBytes();
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
ids[i] = (short) 1; 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; package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.util.Assert; import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.entity.StreetShelve;
import com.zhehekeji.web.mapper.OrderLastMediaMapper; import com.zhehekeji.web.mapper.OrderLastMediaMapper;
import com.zhehekeji.web.mapper.StreetMapper; 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.StreetSearch;
import com.zhehekeji.web.pojo.street.StreetType; import com.zhehekeji.web.pojo.street.StreetType;
import com.zhehekeji.web.pojo.street.StreetVO; import com.zhehekeji.web.pojo.street.StreetVO;
@ -16,15 +13,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
@ -32,8 +25,10 @@ public class StreetService {
@Resource @Resource
private StreetMapper streetMapper; private StreetMapper streetMapper;
// @Resource
// private StreetShelveMapper streetShelveMapper;
@Resource @Resource
private StreetShelveMapper streetShelveMapper; private NettyClient nettyClient;
@Resource @Resource
private OrderLastMediaMapper lastMediaMapper; private OrderLastMediaMapper lastMediaMapper;
@ -47,14 +42,18 @@ public class StreetService {
}catch (DuplicateKeyException e){ }catch (DuplicateKeyException e){
Assert.isTrue(false,"PLC ID已存在"); Assert.isTrue(false,"PLC ID已存在");
} }
StreetConn.init(street.getId());
streetShelve(shelves,street.getId()); //连接
nettyClient.createClient(street);
return street.getId(); return street.getId();
} }
public List<String> shelvesByStreetId(Integer streetId){ public Street getStreetByPlcId(String plcId){
List<StreetShelve> streetShelves = streetShelveMapper.selectList(new QueryWrapper<StreetShelve>().eq("street_id",streetId)); Street street = streetMapper.getStreetByPlcId(plcId);
return streetShelves.stream().map(StreetShelve::getShelveId).collect(Collectors.toList()); if(street == null){
log.error("巷道不存在plcId:{}",plcId);
}
return street;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -65,7 +64,7 @@ public class StreetService {
// if(!CollectionUtils.isEmpty(sheleves)){ // if(!CollectionUtils.isEmpty(sheleves)){
// lastMediaMapper.deleteBatchIds(sheleves); // lastMediaMapper.deleteBatchIds(sheleves);
// } // }
delStreetShelve(id); StreetConn.del(id);
} }
@ -96,37 +95,16 @@ public class StreetService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void edit(Street street){ public void edit(Street street){
List<String> shelves = check(street); check(street);
try { try {
streetMapper.updateById(street); streetMapper.updateById(street);
}catch (DuplicateKeyException e){ }catch (DuplicateKeyException e){
Assert.isTrue(false,"PLC ID已存在"); Assert.isTrue(false,"PLC ID已存在");
} }
delStreetShelve(street.getId());
streetShelve(shelves,street.getId());
} }
private void delStreetShelve(Integer streetId){ public Street streetById(Integer id){
Map<String,Object> params = new HashMap<>(1); return streetMapper.selectById(id);
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 PageInfo<StreetVO> page(StreetSearch search){ 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 id="batchInsert" parameterType="java.util.List">
insert into camera_io_config( insert into camera_io_config(
name,update_time name,update_time,code
) values ) values
<foreach collection="list" item="item" separator=","> <foreach collection="list" item="item" separator=",">
(#{item.name},#{item.updateTime}) (#{item.name},#{item.updateTime},#{item.code})
</foreach> </foreach>
</insert> </insert>
</mapper> </mapper>

Loading…
Cancel
Save