Compare commits

...

6 Commits

Author SHA1 Message Date
yiming 753f56a345 台湾盘点测试 4 years ago
yiming f21442807b 台湾盘点测试 4 years ago
yiming f20a61d1ea 台湾盘点测试 4 years ago
yiming 09de22e8f7 台湾盤點修復bug 4 years ago
yiming ce5930cd54 台湾繁體字 4 years ago
yiming bb56c8e89f 台湾盘点 4 years ago

@ -26,14 +26,14 @@ public class PathUtil {
public static String createFileName(String fileType,Integer cameraId) {
LocalDateTime now = LocalDateTime.now();
String time = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/"+cameraId;
return time + "/" + now.format(DateTimeFormatter.ofPattern("HHmmss-"))+getRandomString(10) + "."+fileType;
String time = now.format(DateTimeFormatter.ofPattern("yyyy\\MM\\dd")) + "\\"+cameraId;
return time + "\\" + now.format(DateTimeFormatter.ofPattern("HHmmss-"))+getRandomString(10) + "."+fileType;
}
public static String createFileNameByRowColumn(String fileType,Integer cameraId,Integer row,Integer column){
LocalDateTime now = LocalDateTime.now();
String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return cameraId+"/"+row+"-"+column+"/"+date + "/" +now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-"))+row+"-"+column + "."+fileType;
return cameraId+"\\"+row+"-"+column+"\\"+date + "\\" +now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-"))+row+"-"+column + "."+fileType;
}
/**

@ -40,7 +40,7 @@ public class PLCController {
try {
ksecNettyClient.createClient(configProperties.getKsec());
}catch (Exception e){
Assert.isTrue(false,"连接失败ip"+configProperties.getKsec().getIp()+",port:"+configProperties.getKsec().getPort());
Assert.isTrue(false,"連接失敗ip"+configProperties.getKsec().getIp()+",port:"+configProperties.getKsec().getPort());
}
}else {
@ -51,7 +51,7 @@ public class PLCController {
try {
nettyClient.createClient(street);
}catch (Exception e){
Assert.isTrue(false,"连接失败ip"+street.getPlcIp()+",port:"+street.getPlcPort());
Assert.isTrue(false,"連接失敗ip"+street.getPlcIp()+",port:"+street.getPlcPort());
}
}
}

@ -80,5 +80,15 @@ public class Stock {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime exportTime;
/**
*
*/
@TableField(exist = false)
private String checkPathTaiWan;
@TableField(exist = false)
private String checkPicTaiWan;
}

@ -98,7 +98,7 @@ public class CameraService {
public void del(Integer id) {
Integer count = streetMapper.checkCamera(id);
Assert.isTrue(count == null || count == 0, "球机已被绑定");
Assert.isTrue(count == null || count == 0, "球機已被綁定");
cameraMapper.deleteById(id);
}

@ -59,9 +59,13 @@ public class CategoryService {
}
public void edit(Category category){
Assert.notNull(category.getId(),"ID不能为空");
Assert.notNull(category.getId(),"ID空");
category.setUpdateTime(LocalDateTime.now());
try {
categoryMapper.updateById(category);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"品規已存在");
}
}
public void del(Integer id){
@ -73,7 +77,7 @@ public class CategoryService {
try {
categoryMapper.insert(category);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"品已存在");
Assert.isTrue(false,"品已存在");
}
return category.getId();
}

@ -16,6 +16,8 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
@ -525,17 +527,16 @@ public class PlcService {
log.info("test endTime:{},time:{}millisecond",endTime,(endTime - startTime));
}
public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){
public Stock check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){
long startTime = System.currentTimeMillis();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1());
gyrateCameraByCode(cameraId, cmdCode);
try {
Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime());
} catch (InterruptedException e) {
e.printStackTrace();
if(street == null){
return new Stock();
}
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1());
//台湾项目只有托盘码使用sick扫码枪,
//使用球机直接拍照并把图片返回给wcs
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1());
cameraCapture(cameraId,false,null,path);
//托盘码
@ -546,7 +547,7 @@ public class PlcService {
//托盘使用sick扫码枪
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1());
if(sensorGun == null){
trayCode = "识别异常";
trayCode = "識別異常";
trayCheck = Boolean.FALSE;
log.error("no sensor gun config in database ,street id:{},direction:{}",street.getId(),plcCmdInfo.getLeftRight1());
}else {
@ -559,13 +560,13 @@ public class PlcService {
trayCode = "";
trayCheck = Boolean.TRUE;
}else {
trayCode = "识别异常";
trayCode = "識別異常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}",trayCode);
}
}else {
if(StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")){
trayCode = "识别异常";
trayCode = "識別異常";
trayCheck = Boolean.FALSE;
log.warn("sick ocr error:{}",trayCode);
}else {
@ -580,19 +581,77 @@ public class PlcService {
RFID rfid = rfidService.getRFIDByPlc(street.getId());
}
StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties);
threadPoolExecutor.execute(stockCheckRunnable);
OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode);
Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn());
Integer status = 1;
//托盘
if(trayCheck ){
status = 2;
}
if(stock == null){
stock = new Stock();
stock.setStatus(status);
stock.setShelveId(orderInfo.getShelveId());
stock.setRow(orderInfo.getRow());
stock.setColumn(orderInfo.getColumn());
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stockMapper.insert(stock);
}else {
stock.setStatus(status);
stock.setShelveId(orderInfo.getShelveId());
stock.setRow(orderInfo.getRow());
stock.setColumn(orderInfo.getColumn());
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stockMapper.updateById(stock);
}
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond",s);
return true;
log.debug("time:{}millisecond",s);
String ip = null;
try {
ip = InetAddress.getLocalHost().getHostAddress()+"\\"+configProperties.getSavePath().getMediaPath()+path;
} catch (UnknownHostException e) {
e.printStackTrace();
}
String p = path.substring(path.lastIndexOf("\\")+1,path.lastIndexOf("."));
stock.setCheckPicTaiWan(ip);
stock.setCheckPathTaiWan(p);
//判断照片是否存在,确认已保存再返回
//return checkPathExist(stock);
checkLog(stock);
return stock;
}
public void truncateStock(){
stockMapper.truncate();
}
public void checkLog(Stock stock){
CheckLog checkLog = new CheckLog();
checkLog.setLotnum(stock.getLotnum());
checkLog.setCheckNum(stock.getCheckNum());
checkLog.setPic(stock.getCheckPic());
checkLog.setShelveId(stock.getShelveId());
checkLog.setCode(stock.getCode());
checkLog.setWmsCode(stock.getWmsCode());
checkLog.setStatus(stock.getStatus());
checkLog.setRow(stock.getRow());
checkLog.setColumn(stock.getColumn());
checkLog.setCreateTime(LocalDateTime.now());
checkLog.setTrayCode(stock.getTrayCode());
checkLog.setWmsTrayCode(stock.getWmsTrayCode());
checkLog.setLotnum(stock.getLotnum());
checkLogMapper.insert(checkLog);
}
}

@ -116,7 +116,7 @@ public class StockCheckRunnable implements Runnable {
status = 2;
}
if(stock == null){
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now());
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now(),null,null);
stockMapper.insert(stock);
}else {
stock.setStatus(status);

@ -50,7 +50,7 @@ public class StockLogService {
if(search.getColumn() != null && search.getColumn() != 0){
wrapper.eq("`column`",search.getColumn());
}
wrapper.orderByDesc("shelve_id","`row`","`column`");
wrapper.orderByDesc("shelve_id","`row`","`column`","id");
List<CheckLog>stockChecks = checkLogMapper.selectList(wrapper);
return new PageInfo<>(stockChecks);

@ -42,7 +42,7 @@ public class StockService {
try {
EasyExcel.read(file.getInputStream(), StockExcel.class, new StockImport(stockMapper)).sheet().doRead();
}catch (Exception e){
Assert.isTrue(false,"导入出错");
Assert.isTrue(false,"導入出錯");
}
}
@ -136,6 +136,7 @@ public class StockService {
for(String columnTab: rowColumnStatus.getColumnTabs()){
if(isRowColumnInTab(stock,columnTab,false)){
tabStatus(stock,columnTabStatus,columnTab);
if(stock.getStatus() != 0 && stock.getStatus() != 1) {
if (columnTabCorrectCount.get(columnTab) == null) {
columnTabCorrectCount.put(columnTab, 1);
} else {
@ -146,12 +147,13 @@ public class StockService {
}
}
}
}
for(Map.Entry<String,Integer> entry: rowTabCorrectCount.entrySet()){
String [] strings = entry.getKey().split(" - ");
Integer tabStart = Integer.valueOf(strings[0]);
Integer tabEnd = Integer.valueOf(strings[1]);
int counts = (tabEnd- tabStart) * rows;
int counts = (tabEnd- tabStart + 1) * rows;
if(counts == entry.getValue()){
rowTabStatus.put(entry.getKey(),2);
}
@ -160,7 +162,7 @@ public class StockService {
String [] strings = entry.getKey().split(" - ");
Integer tabStart = Integer.valueOf(strings[0]);
Integer tabEnd = Integer.valueOf(strings[1]);
int counts = (tabEnd- tabStart) * rows;
int counts = (tabEnd- tabStart + 1) * rows;
if(counts == entry.getValue()){
columnTabStatus.put(entry.getKey(),2);
}
@ -206,9 +208,6 @@ public class StockService {
}
//0 : 未盘点 1盘点异常 2盘点正确
//1>0>2 替换为
// 盘点异常 未盘点 盘点正确
// 1000 100 10
private void tabStatus(Stock stock,Map<String,Integer> tabStatus,String tab){
if(tabStatus.get(tab) == null){
@ -305,13 +304,13 @@ public class StockService {
*/
public Stock checkCorrect(StockCheck stockCheck) {
Stock stock = stockInfo(stockCheck);
Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录");
Assert.isTrue(stock != null && stock.getId() != null, "該貨位暫時沒有記錄");
Integer oldStatus = stock.getStatus();
if(StockStatus.SUCCESS.getStatus().equals(oldStatus)){
return stock;
}
Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "無需核對");
log.info("check stock correct, shelveID:{},row:{},column:{}", stockCheck.getShelveId(), stockCheck.getRow(), stockCheck.getColumn());
stock.setStatus(StockStatus.SUCCESS.getStatus());
stock.setStatus(StockStatus.MANUAL.getStatus());
stockMapper.updateById(stock);
checkLog(stock);
return stock;
@ -322,6 +321,10 @@ public class StockService {
private void checkLog(Stock stock){
CheckLog checkLog = new CheckLog();
checkLog.setRow(stock.getRow());
checkLog.setColumn(stock.getColumn());
checkLog.setCheckNum(stock.getCheckNum());
checkLog.setPic(stock.getCheckPic());
checkLog.setShelveId(stock.getShelveId());
@ -339,9 +342,9 @@ public class StockService {
*/
public Stock checkByMan(CheckByMan checkByMan) {
Stock stock = stockMapper.getByShelveIdAndRowColumn(checkByMan.getShelveId(), checkByMan.getRow(), checkByMan.getColumn());
Assert.notNull(stock, "该货位暂时没有记录");
Assert.notNull(stock, "該貨位暫時沒有記錄");
Boolean same = checkByMan.getCategory().equals(stock.getCategory()) && checkByMan.getCount().equals(stock.getCount());
Assert.isTrue(!same, "品规和数量与原有记录相同");
Assert.isTrue(!same, "品規、數量與原有紀錄相同");
Integer oldStatus = stock.getStatus();
String oldCategory = stock.getCategory();
Integer count = stock.getCount();

@ -31,26 +31,19 @@ public class TestService {
row = street.getRightRow();
column = street.getRightColumn();
}
String lotnum = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
for(int i = 1;i<=row;i++){
for(int j = 1; j<= column;j++){
String code = "123456789013";
String code = "J83572603";
if(j % 9==0){
code = "dsawqwe";
}
String taskId = i +"-"+ j+"-"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("hhmmss"));
PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,leftRight,j,i,1,1,1,1,1,1,"");
PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,leftRight,j,i,1,1,1,1,1,1,lotnum);
plcCmdInfo.setTimes(1);
int co = j%3 + 1;
plcService.check(plcCmdInfo,"E"+co,code,"123456789013");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
plcService.gyrateCameraByCode(plcService.getCameraByPlcCmd(plcCmdInfo,leftRight),"C5");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
plcService.check(plcCmdInfo,"E"+co,code,code);
}
}
}

@ -16,6 +16,22 @@ public class KescEncoder extends MessageToByteEncoder<KsecInfo> {
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, KsecInfo ksecInfo, ByteBuf byteBuf) throws Exception {
String body = "<" + JSONObject.toJSONString(ksecInfo) + ">";
if(!ksecInfo.getType().equals("A")){
body = body.replaceAll("\\\\\\\\", "\\\\");
}
byteBuf.writeBytes(body.getBytes(StandardCharsets.UTF_8));
}
public static void main(String[] args) {
KsecInfo ksecInfo = KsecInfo.heart();
KsecDataInfo ksecDataInfo = new KsecDataInfo();
ksecDataInfo.setCheckPath("d:\\\\data\\media\\3\\3-7\\20220509\\20220509093154-3-7.jpeg");
ksecInfo.setData(ksecDataInfo);
String body = JSONObject.toJSONString(ksecInfo);
System.out.println(body);
String s = body.replaceAll("\\\\\\\\", "\\\\");
System.out.println(s);
}
}

@ -43,4 +43,8 @@ public class KsecDataInfo {
*
*/
private String lotnum;
private String checkPic;
private String checkPath;
}

@ -1,6 +1,7 @@
package com.zhehekeji.web.service.ksec;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.pojo.Cmd;
import com.zhehekeji.web.service.GoodsActionTimes;
import com.zhehekeji.web.service.PlcCmdInfo;
@ -112,13 +113,21 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
plcService.truncateStock();
lastLotnum = lotnum;
}
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
if(ok){
Stock stock = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
if(stock != null && stock.getStatus() == 2){
ksecInfo.getData().setAckStatus(1);
}else {
ksecInfo.getData().setAckStatus(0);
}
if(stock != null){
dataInfo.setCheckPath(stock.getCheckPathTaiWan());
dataInfo.setCheckPic(stock.getCheckPicTaiWan());
}
ksecInfo.setHeader("TL");
ksecInfo.setData(dataInfo);
ctx.channel().writeAndFlush(ksecInfo);
tcpLogger.info("send info:{}",dataInfo.toString());
}
//找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
@ -126,17 +135,4 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
in.release();
return null;
}
public class StopThread extends Thread {
private PlcCmdInfo plcCmdInfo;
public StopThread(PlcCmdInfo plcCmdInfo){
this.plcCmdInfo = plcCmdInfo;
}
@Override
public void run() {
plcService.orderStop(plcCmdInfo);
}
}
}

@ -1,6 +1,8 @@
package com.zhehekeji.web.service.sick;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.InetSocketAddress;
@ -13,6 +15,8 @@ import java.nio.charset.StandardCharsets;
@Slf4j
public class SickSocket {
private static final Logger tcpLogger = LoggerFactory.getLogger("sick");
public static void main(String[] args) {
String code = readOCR("192.168.8.236", 2002);
System.out.println(code);
@ -29,10 +33,12 @@ public class SickSocket {
writeCmd(os);
is = socket.getInputStream();
code = read(is);
tcpLogger.info(code);
if(code!= null){
code = code.replace("\\n","");
}
} catch (IOException e) {
tcpLogger.error("sick time out,ip:{},info:{}",ip,e);
log.error("sick time out,ip:{},info:{}",ip,e);
}finally {
if(os != null){
@ -63,6 +69,7 @@ public class SickSocket {
String startCmd = "start";
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
os.write(bytes);
tcpLogger.info(startCmd);
}
private static String read(InputStream inStream) throws IOException {

@ -27,7 +27,7 @@ userUrl: http://115.236.65.98:11001
# ----默认摄像头的连接信息
cameraConfig:
# ------------球機選擇--- 0:利珀 1海康
cameraType: 1
cameraType: 0
cameraPassword: a1234567
cameraUser: admin
cameraPort: 37777

@ -27,13 +27,13 @@ userUrl: http://115.236.65.98:11001
# ----默认摄像头的连接信息
cameraConfig:
# ------------球機選擇--- 0:利珀 1海康
cameraType: 0
cameraType: 1
cameraPassword: a1234567
cameraUser: admin
cameraPort: 37777
cameraPort: 8000
videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
delayCaptureTime: 3500
delayCaptureTime: 0
# 下载mp4延迟 海康的下载mp4需要2分钟
# 利珀延迟10s就可
# 单位毫秒
@ -64,7 +64,7 @@ lightSource:
# -----goods 货物
# 扫码模式 0:此处不盘点 1球机扫码 2sick扫码枪 3:南北达RFID
scanCodeMode:
tray: 1
tray: 2
goods: 0
goodsCodeTypes:
- 14

Loading…
Cancel
Save