增加视觉盘点功能

merge-requests/3/head
qiushui 4 years ago
parent 1b14f41e6f
commit 7e528d4037

@ -1,17 +1,21 @@
package com.zhehekeji.web.lib;
package com.aijiao.test;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
@Slf4j
public class BarCodeScan {
public class JNIDemo {
public static native String detectBestBarCode(String filePath);
static
{
try{
//BarCodeScan barCodeScan = Native.load(".\\libs\\code_scan\\TestJNI", BarCodeScan.class);
String path = System.getProperty("user.dir")+"\\libs\\code_scan";
System.setProperty("java.library.path", path);
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
@ -30,4 +34,10 @@ public class BarCodeScan {
}
}
public static void main(String[] args) {
JNIDemo barCodeScan = new JNIDemo();
String code = barCodeScan.detectBestBarCode("d:\\data\\media\\2022\\01\\12\\10\\camera25\\1324-hfhaegaaag.jpg");
System.out.println(code);
}
}

@ -0,0 +1,21 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_aijiao_test_JNIDemo */
#ifndef _Included_com_aijiao_test_JNIDemo
#define _Included_com_aijiao_test_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_aijiao_test_JNIDemo
* Method: detectBestBarCode
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_aijiao_test_JNIDemo_detectBestBarCode
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif

@ -55,6 +55,7 @@ public class ConfigProperties {
public static class SavePath{
private String mediaPath;
private String mp4Path;
private String checkPath;
}
@Data

@ -293,7 +293,7 @@ public class CameraControlController {
public Result pic(@PathVariable Integer id) {
checkLogin(id);
String path = "D:\\work\\qqq.jpeg";
OrderInfo orderInfo = new OrderInfo(0L,"SRM123","AAA",1,1,"C5",true,1,1);
cameraControlModule.pic(id,0,path);
return Result.success();
}

@ -19,6 +19,8 @@ public class Stock {
private String orderNum;
private String checkNum;
@ApiModelProperty("条码")
private String code;
@ -56,6 +58,8 @@ public class Stock {
@ApiModelProperty("操作后的图片")
private String overoperationPic;
private String checkPic;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime exportTime;

@ -36,6 +36,8 @@ public class OrderInfo {
*/
private Integer separation;
private String cmdCode;
public OrderInfo(Street street, PlcCmdInfo plcCmdInfo, Integer times, String c) {
if (street == null) {
return;
@ -87,6 +89,7 @@ public class OrderInfo {
orderId = 0L;
orderNum = plcCmdInfo.getOrderNum();
code = c;
cmdCode = c + ((leftRight == 1) ? "-L":"-R") + ((separation == 1) ? "":"-out");
}

@ -113,9 +113,13 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
*
*/
public boolean ptzControlLeftDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) {
return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID,
NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
lParam1, lParam2, 0, 0);
if(!ok){
log.error("ptzControlLeftDownStart error :{},cameraId:{}", ToolKits.getErrorCodePrint(),cameraId);
}
return ok;
}
public boolean ptzControlLeftDownEnd(Integer cameraId, int nChannelID) {

@ -1,7 +1,9 @@
package com.zhehekeji.web.service;
import com.aijiao.test.JNIDemo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhehekeji.common.util.PathUtil;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.lib.*;
@ -54,6 +56,8 @@ public class PlcService {
private CameraControlModule cameraControlModule;
private static JNIDemo barCodeScan = new JNIDemo();
public void setCameraControlModule(CameraControlModule cameraControlModule){
this.cameraControlModule = cameraControlModule;
}
@ -80,7 +84,19 @@ public class PlcService {
*/
public void orderStart(PlcCmdInfo plcCmdInfo) {
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
if (street != null) {
if(plcCmdInfo.getLeftRight1() == 1){
if(plcCmdInfo.getRow1()>street.getLeftRow() && plcCmdInfo.getColumn1() > street.getLeftColumn()){
log.error("row:{},column:{},error in streetId:{} left",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1(),street.getId());
return;
}
}else {
if(plcCmdInfo.getRow1()>street.getRightRow() && plcCmdInfo.getColumn1() > street.getRightColumn()){
log.error("row:{},column:{},error in streetId:{} right",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1(),street.getId());
return;
}
}
Order order = new Order();
order.setOrderNum(plcCmdInfo.getOrderNum());
order.setStatus(0);
@ -186,22 +202,9 @@ public class PlcService {
* camera2
*
*/
if (street.getCamera1Id() != null && street.getCamera2Id() != null && street.getCamera1Id() != 0 && street.getCamera2Id() != 0) {
if (orderInfo.getLeftRight() == 1) {
gyrateCameraByCode(street.getCamera1Id(), code);
if (needCapture) {
if(code.startsWith("C1") || code.startsWith("C3")){
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
path = cameraCapture(street.getCamera1Id());
}
} else {
gyrateCameraByCode(street.getCamera2Id(), code);
if (needCapture) {
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,orderInfo.getLeftRight());
gyrateCameraByCode(cameraId,code);
if(needCapture){
if(code.startsWith("C1") || code.startsWith("C3")){
try {
Thread.sleep(1200);
@ -209,22 +212,13 @@ public class PlcService {
e.printStackTrace();
}
}
path = cameraCapture(street.getCamera2Id());
}
}
} else {
Integer cameraId = street.getCamera1Id() != null && street.getCamera1Id() != 0 ? street.getCamera1Id() : street.getCamera2Id();
if (cameraId != null && cameraId != 0) {
gyrateCameraByCode(cameraId, code);
if (needCapture) {
path = cameraCapture(cameraId);
}
}
}
//update order info after capture
if (path != null && needCapture) {
captureUpdateOrderAndStock(orderInfo, path);
}
//转向原点位
if(times == 2){
if(street.getCamera2Id() != null){
gyrateCameraByCode(street.getCamera2Id(),"C5");
@ -232,7 +226,6 @@ public class PlcService {
if(street.getCamera1Id() != null){
gyrateCameraByCode(street.getCamera1Id(),"C5");
}
}
}
@ -432,78 +425,73 @@ public class PlcService {
}
}
// /**
// * 执行动作 旋转360,然后执行C8动作
// *
// * @param plcId
// * @Param ptzId 旋转360之后再转到这个预置点
// */
// public void turn360AndC8(String plcId) {
// Street street = streetMapper.getStreetByPlcId(plcId);
// if (street == null) {
// return;
// }
//
// if (street.getCamera1Id() != null) {
// List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code", "C8").eq("camera_id", street.getCamera1Id()));
// Integer ptzId = null;
// if (ioConfigs.size() > 0) {
// ptzId = ioConfigs.get(0).getPtzId();
// }
// JoywarePtzControlModule.turn360C8(street.getCamera1Id(), ptzId);
// }
// if (street.getCamera2Id() != null) {
// List<CameraIO> ioConfigs = ioMapper.selectList(new QueryWrapper<CameraIO>().eq("code", "C8").eq("camera_id", street.getCamera2Id()));
// Integer ptzId = null;
// if (ioConfigs.size() > 0) {
// ptzId = ioConfigs.get(0).getPtzId();
// }
// JoywarePtzControlModule.turn360C8(street.getCamera2Id(), ptzId);
// }
// }
/**
*
*
* @param plcCmdInfo
* @param barCodeSys
* @param boxNumSys
* @param boxNumAlgo
*/
public void recordStock(PlcCmdInfo plcCmdInfo, String barCodeSys, int boxNumSys, int boxNumAlgo) {
public Integer getCameraByPlcCmd(PlcCmdInfo plcCmdInfo,Integer leftRight){
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
if (street == null) {
return;
}
//判断左右 行列号
Integer leftRight = plcCmdInfo.getLeftRight2();
String shelveId;
if (street.getCamera1Id() != null && street.getCamera2Id() != null && street.getCamera1Id() != 0 && street.getCamera2Id() != 0) {
if (leftRight == 1) {
shelveId = street.getLeftShelveId();
return street.getCamera1Id();
} else {
shelveId = street.getRightShelveId();
}
Stock stock = stockMapper.getByShelveIdAndRowColumn(shelveId, plcCmdInfo.getRow2(), plcCmdInfo.getColumn2());
if (stock != null) {
stock.setCategory(barCodeSys);
stock.setCount(boxNumSys);
String prevFile = configProperties.getSavePath().getMediaPath() + stock.getPreoperationPic();
String overFile = configProperties.getSavePath().getMediaPath() + stock.getOveroperationPic();
String code = BarCodeScan.detectBestBarCode(overFile);
if (boxNumSys == boxNumAlgo && code.equals(barCodeSys)) {
stock.setStatus(StockStatus.SUCCESS.getStatus());
log.info("核对正确");
stockMapper.updateById(stock);
return street.getCamera2Id();
}
} else {
log.info("核对失败");
stock.setStatus(StockStatus.ERROR.getStatus());
stockMapper.updateById(stock);
Integer cameraId = street.getCamera1Id() != null && street.getCamera1Id() != 0 ? street.getCamera1Id() : street.getCamera2Id();
return cameraId;
}
}
public void check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode){
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,1);
gyrateCameraByCode(cameraId, cmdCode);
//暂停2500ms再抓图
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//核对记录 todo
// StockLog stockLog = new StockLog();
// stockLog.set
String path = cameraCapture(cameraId);
OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode);
Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn());
System.out.println(configProperties.getSavePath().getMediaPath()+path);
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
String scanCode = barCodeScan.detectBestBarCode(configProperties.getSavePath().getMediaPath()+path);
if(StringUtils.isEmpty(scanCode)){
scanCode = "识别异常";
}
System.out.println(scanCode);
//核对正确
Integer status = 2;
if(!wmsCode.equals(scanCode)){
status = 1;
}
if(stock == null){
stock = new Stock();
stock.setStatus(status);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setShelveId(orderInfo.getShelveId());
stock.setRow(orderInfo.getRow());
stock.setColumn(orderInfo.getColumn());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.insert(stock);
}else {
stock.setStatus(status);
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.updateById(stock);
}
}
}

@ -28,8 +28,6 @@ public class RealTimeService {
@Resource
private CameraMapper cameraMapper;
@Value("${mediaServer}")
private String mediaServer;
@Autowired
private ConfigProperties configProperties;
@ -38,10 +36,6 @@ public class RealTimeService {
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
Map<Integer,Camera> cameraMap = new HashMap<>(cameras.size());
cameras.forEach(camera -> {
if(StringUtils.isEmpty(camera.getM3u8())){
String m3u8 = String.format(mediaServer,camera.getId());
camera.setM3u8(m3u8);
}
cameraMap.put(camera.getId(),camera);
});
List<RealTime> realTimes = new ArrayList<>();

@ -15,6 +15,7 @@ import com.zhehekeji.web.mapper.StockMapper;
import com.zhehekeji.web.pojo.category.PageSearch;
import com.zhehekeji.web.pojo.stock.*;
import com.zhehekeji.web.pojo.street.StreetType;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -98,10 +99,7 @@ public class StockService {
checkStatus.setRowEnd(rowColumnStatus.getRowEnd());
checkStatus.setShelveId(rowColumnStatus.getShelveId());
List<Stock> stocks = stockMapper.selectList(new QueryWrapper<Stock>().select("status","`row`","`column`","`shelve_id`").eq("`shelve_id`",rowColumnStatus.getShelveId()));
if(CollectionUtils.isEmpty(stocks)){
return checkStatus;
}
List<Stock>stockList = new ArrayList<>();
Map<String,Integer> rowTabStatus = new LinkedHashMap<>();
for(String rowTab: rowColumnStatus.getRowTabs()){
@ -111,12 +109,19 @@ public class StockService {
for(String column:rowColumnStatus.getColumnTabs()){
columnTabStatus.put(column,0);
}
List<Stock> stocks = stockMapper.selectList(new QueryWrapper<Stock>().select("status","`row`","`column`","`shelve_id`").eq("`shelve_id`",rowColumnStatus.getShelveId()));
if(CollectionUtils.isEmpty(stocks)){
stockInit(rowColumnStatus.getRowStart(), rowColumnStatus.getRowEnd(), rowColumnStatus.getColumnStart(), rowColumnStatus.getColumnEnd(), rowColumnStatus.getShelveId(),stocks);
checkStatus.setStocks(stocks);
checkStatus.setRowTabStatus(rowTabStatus);
checkStatus.setColumnTabStatus(columnTabStatus);
return checkStatus;
}
for(Stock stock: stocks){
if(stock.getStatus() == null){
continue;
}
if(stock.getRow()>= rowColumnStatus.getColumnStart() && stock.getRow()<= rowColumnStatus.getColumnEnd() && stock.getColumn() >= rowColumnStatus.getColumnStart() && stock.getColumn()<= rowColumnStatus.getColumnEnd()){
if(stock.getColumn()>= rowColumnStatus.getColumnStart() && stock.getColumn()<= rowColumnStatus.getColumnEnd() && stock.getRow() >= rowColumnStatus.getRowStart() && stock.getRow()<= rowColumnStatus.getRowEnd()){
stockList.add(stock);
}
if(!CollectionUtils.isEmpty(rowColumnStatus.getRowTabs())){
@ -136,10 +141,77 @@ public class StockService {
}
checkStatus.setColumnTabStatus(columnTabStatus);
checkStatus.setRowTabStatus(rowTabStatus);
checkStatus.setStocks(stockList);
checkStatus.setStocks(stockInit(rowColumnStatus.getRowStart(), rowColumnStatus.getRowEnd(), rowColumnStatus.getColumnStart(), rowColumnStatus.getColumnEnd(), rowColumnStatus.getShelveId(),stockList));
return checkStatus;
}
private List<Stock> stockInit(Integer rowStart, Integer rowEnd,Integer columnStart,Integer columnEnd,String shelveId,List<Stock> readyList){
Map<Integer,Map<Integer,Boolean>> map = new HashMap<>();
readyList.forEach(stock -> {
if(map.get(stock.getRow()) == null){
Map<Integer,Boolean> columnMap = new HashMap<>();
columnMap.put(stock.getColumn(),true);
map.put(stock.getRow(),columnMap);
}else {
Map<Integer,Boolean> columnMap = map.get(stock.getRow());
if(columnMap.get(stock.getColumn()) == null){
columnMap.put(stock.getColumn(),true);
}
map.put(stock.getRow(),columnMap);
}
});
for(int i = rowStart;i<=rowEnd;i++){
Map<Integer,Boolean> columnMap = map.get(i);
for(int j = columnStart;j<=columnEnd;j++){
if(columnMap == null || columnMap.get(j) == null){
Stock stock = new Stock();
stock.setColumn(j);
stock.setRow(i);
stock.setStatus(0);
stock.setShelveId(shelveId);
readyList.add(stock);
}
}
}
return readyList;
}
public static void main(String[] args) {
List<Stock> readyList = new ArrayList<>();
Stock stock = new Stock();
stock.setRow(1);
stock.setColumn(1);
readyList.add(stock);
Stock stock2 = new Stock();
stock2.setRow(2);
stock2.setColumn(4);
readyList.add(stock2);
Map<Integer,Map<Integer,Boolean>> map = new HashMap<>();
Map<Integer,Boolean> rowMap = new HashMap<>();
readyList.forEach(stockw -> {
if(map.get(stockw.getRow()) == null){
Map<Integer,Boolean> columnMap = new HashMap<>();
columnMap.put(stockw.getColumn(),true);
map.put(stockw.getRow(),columnMap);
}else {
Map<Integer,Boolean> columnMap = map.get(stockw.getRow());
if(columnMap.get(stockw.getColumn()) == null){
columnMap.put(stockw.getColumn(),true);
}
map.put(stockw.getRow(),columnMap);
}
});
System.out.println(map);
}
//0 : 未盘点 1盘点异常 2盘点正确
private void tabStatus(Stock stock,Map<String,Integer> tabStatus,String tab){
@ -158,10 +230,7 @@ public class StockService {
}
}
public static void main(String[] args) {
Map<String,Integer> ss = new HashMap<>();
}
private Boolean isRowColumnInTab(Stock stock,String tab,Boolean isRow){
String [] strings = tab.split(" - ");

@ -99,8 +99,10 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
} else if (Cmd.E.name().equals(ksecInfo.getType())) {
tcpLogger.info("info:{}",body);
//盘点
//转球机到盘点位 然后拍照
plcService.check(plcCmdInfo,Cmd.E1.name(), dataInfo.getCode());
//找到该货位的最后一张照片与现在的照片比照
plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
}
}
in.release();

@ -114,7 +114,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
} else {
log.info("盘点模式");
log.info("Verification mode. Code er(algorithm):{}", barCodeSys, boxNumSys, boxNumAlgo);
plcService.recordStock(plcCmdInfo,barCodeSys,boxNumSys,boxNumAlgo);
//plcService.recordStock(plcCmdInfo,barCodeSys,boxNumSys,boxNumAlgo);
}
}

@ -31,13 +31,14 @@ cameraConfig:
cameraPassword: a1234567
cameraUser: admin
cameraPort: 37777
videoServer: 127.0.0.1:8083
videoServer: 192.168.8.140:8083
# ------------
# -----图片 mp4下载地址
savePath:
mediaPath: d:\\data\media\
mp4Path: d:\\data\mp4\
checkPath: d:\\data\check\
# ------------服务端类型 0TCP(罗伯泰克) 1:KSEC(JSON)(昆船)
serverMode: 1
ksec:
@ -48,8 +49,3 @@ ksec:
videoStyleConfig:
videoStyleRow: 1
videoStyleColumn: 2
# ------------球机m3u8默认地址 %d是球机数据库id如果数据库没有就使用此默认值
mediaServer: http://127.0.0.1:9080/hls/camera%d.m3u8
rtcServer:
rtcServerIp: 127.0.0.1
rtcServerPort: 8083

Loading…
Cancel
Save