From 46928100de62abe574e8f4ebeafae75c5e94f419 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 7 Apr 2022 14:31:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=98=E7=82=B9=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/code_scan/BarcodeDetectorJNI.dll | Bin 0 -> 24576 bytes .../BarcodeDetector.java} | 47 ++++++-- .../com/aijiao/test/com_aijiao_test_JNIDemo.h | 21 ---- .../web/config/ConfigProperties.java | 4 +- .../web/controller/TestController.java | 16 +-- .../java/com/zhehekeji/web/entity/Stock.java | 4 + .../com/zhehekeji/web/mapper/StockMapper.java | 2 +- .../com/zhehekeji/web/service/PlcService.java | 88 ++------------ .../web/service/StockCheckRunnable.java | 112 ++++++++++++++++++ .../zhehekeji/web/service/StockService.java | 64 ++++------ .../zhehekeji/web/service/StreetService.java | 22 ++++ .../zhehekeji/web/service/TestService.java | 12 +- web/src/main/resources/application-dev.yml | 5 +- web/src/main/resources/application-prod.yml | 10 +- web/src/main/resources/application-test.yml | 6 +- web/src/main/resources/mapper/StockMapper.xml | 4 +- 16 files changed, 240 insertions(+), 177 deletions(-) create mode 100644 libs/code_scan/BarcodeDetectorJNI.dll rename web/src/main/java/{com/aijiao/test/JNIDemo.java => codeDetector/BarcodeDetector.java} (54%) delete mode 100644 web/src/main/java/com/aijiao/test/com_aijiao_test_JNIDemo.h create mode 100644 web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java diff --git a/libs/code_scan/BarcodeDetectorJNI.dll b/libs/code_scan/BarcodeDetectorJNI.dll new file mode 100644 index 0000000000000000000000000000000000000000..24507ffd80e76932bd00f8d39ea7ee3bbfa27342 GIT binary patch literal 24576 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 + * 0x0000001, //"EAN-8" ->1 + * 0x00000002, //"UPC-E" + * 0x00000004, //"ISBN-10", + * 0x00000008, //"UPC-A" + * 0x00000010, //"EAN-13" + * 0x00000020, //"ISBN-13" + * 0x00000040, //"EAN/UPC" + * 0x00000080, //"Interleaved 2 of 5" + * 0x00000100, //DataBar" + * 0x00000200, //"DataBar Expanded" + * 0x00000400, //"CodaBar" + * 0x00000800, //"Code 39" + * 0x00001000, //"Code 93" + * 0x00002000 //"Code 128" ->14 + * }; + */ - public static String detectBestCodeUntilOK(String filePath){ + public static native String detectBestBarCode(String filePath,int[]codeTypes); + + + public static String detectBestCodeUntilOK(String filePath,int[]codeTypes){ String code = null; long startTime = System.currentTimeMillis(); - System.out.println("start:"); - System.out.println(startTime); //只要code为空或者图片为Empty,就继续查,直到5s为止 - while ((code == null || "Empty".equals(code)) && (System.currentTimeMillis() - startTime < 5000)){ + while ((code == null || "ImageEmpty".equals(code)) && (System.currentTimeMillis() - startTime < 5000)){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } - code = JNIDemo.detectBestBarCode(filePath); - + code = BarcodeDetector.detectBestBarCode(filePath,codeTypes); } - System.out.println(System.currentTimeMillis()); return code; } + static { try{ @@ -44,7 +66,7 @@ public class JNIDemo { System.loadLibrary("libnlopt-0"); System.loadLibrary("lpv"); System.loadLibrary("libCyclops"); - System.loadLibrary("TestJNI"); + System.loadLibrary("BarcodeDetectorJNI"); }catch(Exception e) { log.error("detectBestBarCode:"+e); @@ -55,7 +77,8 @@ public class JNIDemo { public static void main(String[] args) { //String code = barCodeScan.detectBestBarCode("d:\\data\\media\\2022\\01\\12\\10\\camera25\\1324-hfhaegaaag.jpg"); - String code = JNIDemo.detectBestCodeUntilOK("C:\\Users\\user\\Desktop\\abc\\552-iajgcbfhfd.jpg"); + int[]codeTypes = new int[]{14}; + String code = BarcodeDetector.detectBestCodeUntilOK("C:\\Users\\user\\Desktop\\aaa\\0913-efifgfafbd.jpg",codeTypes); System.out.println(code); } } diff --git a/web/src/main/java/com/aijiao/test/com_aijiao_test_JNIDemo.h b/web/src/main/java/com/aijiao/test/com_aijiao_test_JNIDemo.h deleted file mode 100644 index 34c551e..0000000 --- a/web/src/main/java/com/aijiao/test/com_aijiao_test_JNIDemo.h +++ /dev/null @@ -1,21 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* 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 diff --git a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java index 8c1efb5..809be34 100644 --- a/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java +++ b/web/src/main/java/com/zhehekeji/web/config/ConfigProperties.java @@ -51,8 +51,6 @@ public class ConfigProperties { private Long delayCaptureTime; - private Long delayScanTime; - } @Data @@ -88,5 +86,7 @@ public class ConfigProperties { public static class ScanCodeMode{ private Integer tray; private Integer goods; + private int [] goodsCodeTypes; + private int [] trayCodeTypes; } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/TestController.java b/web/src/main/java/com/zhehekeji/web/controller/TestController.java index 2a3824f..d2e7469 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/TestController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/TestController.java @@ -1,19 +1,9 @@ package com.zhehekeji.web.controller; -import com.github.pagehelper.PageInfo; -import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.core.pojo.Result; -import com.zhehekeji.web.pojo.OrderSaveReq; -import com.zhehekeji.web.pojo.OrderSearch; -import com.zhehekeji.web.pojo.OrderVO; -import com.zhehekeji.web.service.OrderService; -import com.zhehekeji.web.service.PlcCmdInfo; -import com.zhehekeji.web.service.PlcService; import com.zhehekeji.web.service.TestService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -29,9 +19,9 @@ public class TestController { @ApiOperation("新增") - @GetMapping("/check/{id}") - public Result save(@PathVariable Integer id){ - testService.CheckTest(id); + @GetMapping("/check/{id}/{leftRight}") + public Result test(@PathVariable Integer id,@PathVariable Integer leftRight){ + testService.CheckTest(id,leftRight); return Result.success(); } diff --git a/web/src/main/java/com/zhehekeji/web/entity/Stock.java b/web/src/main/java/com/zhehekeji/web/entity/Stock.java index 79f4582..2de7bc0 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -6,12 +6,16 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @TableName("`stock`") +@NoArgsConstructor +@AllArgsConstructor public class Stock { @TableId(type = IdType.AUTO) diff --git a/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java index 222a738..c5b5320 100644 --- a/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java +++ b/web/src/main/java/com/zhehekeji/web/mapper/StockMapper.java @@ -9,7 +9,7 @@ import java.util.List; public interface StockMapper extends BaseMapper { - void batchInsert(List stocks); + void batchInsert(@Param("stocks") List stocks); void insertOrUpdate(@Param("req") Stock stock); diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 8c8ff59..ffd66ea 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -1,6 +1,5 @@ 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.web.config.ConfigProperties; @@ -17,6 +16,10 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * @Description plc信号指令处理类 @@ -54,8 +57,10 @@ public class PlcService { private CameraControlModule cameraControlModule; @Resource private SensorService sensorService; + @Resource + private CheckLogMapper checkLogMapper; - private static JNIDemo barCodeScan = new JNIDemo(); + private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,8,200,TimeUnit.MINUTES,new ArrayBlockingQueue<>(100000)); public void setCameraControlModule(CameraControlModule cameraControlModule){ this.cameraControlModule = cameraControlModule; @@ -465,26 +470,10 @@ public class PlcService { e.printStackTrace(); } String path = cameraCapture(cameraId,false,null); - OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); - Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn()); - log.info("pic path:{}",configProperties.getSavePath().getMediaPath()+path); - - String scanCode = null; + //托盘码 String trayCode = null; - Boolean codeCheck = Boolean.TRUE; - //货物使用球机扫码 - if(configProperties.getScanCodeMode().getGoods() == 1){ - scanCode = JNIDemo.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path); - if(StringUtils.isEmpty(scanCode)){ - log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - log.error("detectBestBarCode:{}",scanCode); - scanCode = "识别异常"; - codeCheck = Boolean.FALSE; - }else { - codeCheck = wmsCode.equals(scanCode); - } - } Boolean trayCheck = Boolean.TRUE; + //如果是用扫码枪 扫 托盘码,就直接扫 if(configProperties.getScanCodeMode().getTray() == 2){ //托盘使用sick扫码枪 if(configProperties.getSensor().getType() == 1){ @@ -504,68 +493,13 @@ public class PlcService { trayCheck = wmsTrayCode.equals(trayCode); } } - } - - } - - log.info("code:{}",scanCode); - //核对异常 - Integer status = 1; - //托盘和货物都正确 - if(trayCheck && codeCheck){ - status = 2; } - 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.setTrayCode(trayCode); - stock.setWmsTrayCode(wmsTrayCode); - 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.setTrayCode(trayCode); - stock.setWmsTrayCode(wmsTrayCode); - stock.setCode(scanCode); - stock.setWmsCode(wmsCode); - stockMapper.updateById(stock); - } - checkLog(stock); + StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties); + threadPoolExecutor.execute(stockCheckRunnable); long end = System.currentTimeMillis(); long s = end - startTime; log.info("time:{}millisecond",s); - } - @Resource - private CheckLogMapper checkLogMapper; - - public void checkLog(Stock stock){ - CheckLog checkLog = new CheckLog(); - 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()); - checkLogMapper.insert(checkLog); - } - - } diff --git a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java new file mode 100644 index 0000000..ea868b8 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java @@ -0,0 +1,112 @@ +package com.zhehekeji.web.service; + +import codeDetector.BarcodeDetector; +import com.zhehekeji.web.config.ConfigProperties; +import com.zhehekeji.web.entity.CheckLog; +import com.zhehekeji.web.entity.Stock; +import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.lib.OrderInfo; +import com.zhehekeji.web.mapper.CheckLogMapper; +import com.zhehekeji.web.mapper.StockMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.time.LocalDateTime; + +@Slf4j +public class StockCheckRunnable implements Runnable { + + private Street street; + + private PlcCmdInfo plcCmdInfo; + + private String cmdCode; + private StockMapper stockMapper; + private String path; + private CheckLogMapper checkLogMapper; + + private Integer goodsScanCodeMode; + private String wmsCode; + private String wmsTrayCode; + private String trayCode; + private Boolean trayCheck; + + private ConfigProperties configProperties; + + + public StockCheckRunnable(Street street, PlcCmdInfo plcCmdInfo, String cmdCode, StockMapper stockMapper,String path,CheckLogMapper checkLogMapper,Integer goodsActionTimes,String wmsCode,String wmsTrayCode,String trayCode,Boolean trayCheck,ConfigProperties configProperties){ + this.street = street; + this.plcCmdInfo = plcCmdInfo; + this.cmdCode = cmdCode; + this.stockMapper = stockMapper; + this.path = path; + this.checkLogMapper = checkLogMapper; + this.goodsScanCodeMode = goodsActionTimes; + this.wmsCode = wmsCode; + this.wmsTrayCode = wmsTrayCode; + this.trayCode = trayCode; + this.trayCheck = trayCheck; + this.configProperties = configProperties; + + } + + @Override + public void run() { + OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); + Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn()); + String scanCode = null; + Boolean codeCheck = Boolean.TRUE; + //货物使用球机扫码 + if(goodsScanCodeMode == 1){ + scanCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getGoodsCodeTypes()); + if(StringUtils.isEmpty(scanCode)){ + log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); + log.error("detectBestBarCode:{}",scanCode); + scanCode = "识别异常"; + codeCheck = Boolean.FALSE; + }else { + codeCheck = wmsCode.equals(scanCode); + } + } + + + log.info("code:{}",scanCode); + //核对异常 + Integer status = 1; + //托盘和货物都正确 + if(trayCheck && codeCheck){ + status = 2; + } + if(stock == null){ + stock = new Stock(null,null,plcCmdInfo.getOrderNum(),scanCode,null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now()); + stockMapper.insert(stock); + }else { + stock.setStatus(status); + stock.setExportTime(LocalDateTime.now()); + stock.setCheckPic(path); + stock.setCheckNum(plcCmdInfo.getOrderNum()); + stock.setTrayCode(trayCode); + stock.setWmsTrayCode(wmsTrayCode); + stock.setCode(scanCode); + stock.setWmsCode(wmsCode); + stockMapper.updateById(stock); + } + checkLog(stock); + } + + public void checkLog(Stock stock){ + CheckLog checkLog = new CheckLog(); + 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()); + checkLogMapper.insert(checkLog); + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 12275fc..68abdda 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -13,6 +13,7 @@ import com.zhehekeji.web.mapper.CheckLogMapper; import com.zhehekeji.web.mapper.StockMapper; import com.zhehekeji.web.pojo.category.PageSearch; import com.zhehekeji.web.pojo.stock.*; +import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -97,13 +98,14 @@ public class StockService { ListstockList = new ArrayList<>(); + //默认全部盘点正确 Map rowTabStatus = new LinkedHashMap<>(); for(String rowTab: rowColumnStatus.getRowTabs()){ - rowTabStatus.put(rowTab,0); + rowTabStatus.put(rowTab,2); } Map columnTabStatus = new LinkedHashMap<>(); for(String column:rowColumnStatus.getColumnTabs()){ - columnTabStatus.put(column,0); + columnTabStatus.put(column,2); } List stocks = stockMapper.selectList(new QueryWrapper().select("status","`row`","`column`","`shelve_id`").eq("`shelve_id`",rowColumnStatus.getShelveId())); if(CollectionUtils.isEmpty(stocks)){ @@ -174,40 +176,6 @@ public class StockService { } - public static void main(String[] args) { - List 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> map = new HashMap<>(); - Map rowMap = new HashMap<>(); - readyList.forEach(stockw -> { - if(map.get(stockw.getRow()) == null){ - Map columnMap = new HashMap<>(); - columnMap.put(stockw.getColumn(),true); - map.put(stockw.getRow(),columnMap); - }else { - Map 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 tabStatus,String tab){ @@ -215,13 +183,11 @@ public class StockService { tabStatus.put(tab,stock.getStatus()); }else { Integer status = tabStatus.get(tab); - if(status == 1 || stock.getStatus() == 1){ + if(stock.getStatus() == 1){ //盘点异常为最高 tabStatus.put(tab,1); - }else if(status == 0 || stock.getStatus() == 0) { + }else if(stock.getStatus() == 0 && status != 1) { tabStatus.put(tab, 0); - }else if(status == 2 || stock.getStatus() == 2){ - tabStatus.put(tab,2); } } } @@ -340,6 +306,24 @@ public class StockService { } + public void init(String shelveId, Integer row, Integer column){ + Map map = new HashMap<>(); + map.put("shelve_id",shelveId); + stockMapper.deleteByMap(map); + for(int i = 1;i<=row;i++){ + List stocks = new ArrayList<>(column); + for(int j = 1;j<=column;j++){ + Stock stock = new Stock(); + stock.setShelveId(shelveId); + stock.setRow(i); + stock.setColumn(j); + stock.setStatus(0); + stocks.add(stock); + } + stockMapper.batchInsert(stocks); + } + } + } diff --git a/web/src/main/java/com/zhehekeji/web/service/StreetService.java b/web/src/main/java/com/zhehekeji/web/service/StreetService.java index 1662a23..54d43b5 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StreetService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StreetService.java @@ -39,6 +39,8 @@ public class StreetService { private NettyClient nettyClient; @Resource private LightSourceMapper lightSourceMapper; + @Resource + private StockService stockService; @Transactional(rollbackFor = Exception.class) @@ -93,9 +95,29 @@ public class StreetService { lightSourceMapper.insert(lightSource); } streetVO.setId(street.getId()); + Thread thread2 = new Thread(new Runnable() { + @Override + public void run() { + if (StreetType.SINGLE.getType().equals(street.getLeftType())) { + stockService.init(street.getLeftShelveId(),street.getLeftRow(),street.getLeftColumn()); + }else if(StreetType.DOUBLE.getType().equals(street.getLeftType())){ + stockService.init(street.getLeftInsideShelveId(),street.getLeftRow(),street.getLeftColumn()); + stockService.init(street.getLeftOutsideShelveId(),street.getLeftRow(),street.getLeftColumn()); + } + if (StreetType.SINGLE.getType().equals(street.getRightType())) { + stockService.init(street.getRightShelveId(),street.getRightRow(),street.getRightColumn()); + }else if (StreetType.DOUBLE.getType().equals(street.getRightType())) { + stockService.init(street.getRightInsideShelveId(),street.getRightRow(),street.getRightColumn()); + stockService.init(street.getRightOutsideShelveId(),street.getRightRow(),street.getRightColumn()); + } + } + }); + thread2.start(); return street; } + + @Cacheable(value = "streetByPlcId",key = "#plcId") public Street getStreetByPlcId(String plcId) { Street street = streetMapper.getStreetByPlcId(plcId); diff --git a/web/src/main/java/com/zhehekeji/web/service/TestService.java b/web/src/main/java/com/zhehekeji/web/service/TestService.java index ddffb9c..0a943f5 100644 --- a/web/src/main/java/com/zhehekeji/web/service/TestService.java +++ b/web/src/main/java/com/zhehekeji/web/service/TestService.java @@ -22,18 +22,24 @@ public class TestService { - public void CheckTest(Integer StreetId){ + public void CheckTest(Integer StreetId,Integer leftRight){ if(!isRunning){ isRunning = Boolean.TRUE; Street street = streetService.streetById(StreetId); Integer row = street.getLeftRow(); Integer column = street.getLeftColumn(); + if(leftRight == 2){ + row = street.getRightRow(); + column = street.getRightColumn(); + } + for(int i = 1;i<=row;i++){ for(int j = 0; j<= column;j++){ String code = "3224112150069"; String taskId = i +"-"+ j+"-"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("hhmmss")); - PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,1,j,i,1,1,1,1,1,1); - plcService.check(plcCmdInfo,"E1",code,"21234-trayCode"); + PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,leftRight,j,i,1,1,1,1,1,1); + int co = j%4 + 1; + plcService.check(plcCmdInfo,"E"+co,code,"21234-trayCode"); try { Thread.sleep(1000); } catch (InterruptedException e) { diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index e4b5db4..be3d2c6 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -67,4 +67,7 @@ sensor: scanCodeMode: tray: 2 goods: 1 - + goodsCodeTypes: + - 14 + trayCodeTypes: + - 14 diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index acbb72d..10965a8 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -33,9 +33,7 @@ cameraConfig: cameraPort: 37777 videoServer: 127.0.0.1:8083 #相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 - delayCaptureTime: 2200 - #OCR识别延迟 毫秒 - delayScanTime: 1500 + delayCaptureTime: 2500 # ------------ # -----图片 mp4下载地址 savePath: @@ -65,4 +63,8 @@ sensor: # 扫码模式 1:球机扫码 2:扫码枪 scanCodeMode: tray: 0 - goods: 1 \ No newline at end of file + goods: 1 + goodsCodeTypes: + - 14 + trayCodeTypes: + - 14 \ No newline at end of file diff --git a/web/src/main/resources/application-test.yml b/web/src/main/resources/application-test.yml index 7a6ef6d..4c6df38 100644 --- a/web/src/main/resources/application-test.yml +++ b/web/src/main/resources/application-test.yml @@ -65,4 +65,8 @@ sensor: # 扫码模式 1:球机扫码 2:扫码枪 scanCodeMode: tray: 2 - goods: 1 \ No newline at end of file + goods: 1 + goodsCodeTypes: + - 14 + trayCodeTypes: + - 14 \ No newline at end of file diff --git a/web/src/main/resources/mapper/StockMapper.xml b/web/src/main/resources/mapper/StockMapper.xml index 6b5baef..d930c32 100644 --- a/web/src/main/resources/mapper/StockMapper.xml +++ b/web/src/main/resources/mapper/StockMapper.xml @@ -4,10 +4,10 @@ insert into stock( - category,count,shelve_id,row,column,status,export_time + `shelve_id`,`row`,`column`,`status` ) values - (#{item.category},#{item.count},#{item.shelveId},#{item.row},#{item.column},#{item.status},#{item.exportTime}) + (#{item.shelveId},#{item.row},#{item.column},#{item.status})