diff --git a/web/src/main/java/com/zhehekeji/web/controller/EmptyCheckController.java b/web/src/main/java/com/zhehekeji/web/controller/EmptyCheckController.java new file mode 100644 index 0000000..15e4182 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/controller/EmptyCheckController.java @@ -0,0 +1,36 @@ +package com.zhehekeji.web.controller; + +import com.github.pagehelper.PageInfo; +import com.zhehekeji.core.pojo.Result; +import com.zhehekeji.web.entity.CheckStreetSummary; +import com.zhehekeji.web.entity.CheckSummary; +import com.zhehekeji.web.pojo.empty.EmptyCheckSearch; +import com.zhehekeji.web.service.EmptyCheckService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "盘点统计") +@RequestMapping("/checkSummary") +@RestController +public class EmptyCheckController { + + @Resource + private EmptyCheckService emptyCheckService; + + @ApiOperation("盘点统计") + @PostMapping("") + public Result> list(@RequestBody EmptyCheckSearch emptyCheckSearch){ + return Result.success(emptyCheckService.checkSummaryPageInfo(emptyCheckSearch)); + } + + @ApiOperation("巷道盘点统计") + @GetMapping("/street/task") + public Result> CheckStreetSummarys(String taskId){ + return Result.success(emptyCheckService.checkStreetSummaries(taskId)); + } + +} diff --git a/web/src/main/java/com/zhehekeji/web/entity/CheckStreetSummary.java b/web/src/main/java/com/zhehekeji/web/entity/CheckStreetSummary.java new file mode 100644 index 0000000..8354c5b --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/entity/CheckStreetSummary.java @@ -0,0 +1,46 @@ +package com.zhehekeji.web.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CheckStreetSummary { + + @TableId(type = IdType.AUTO) + private Integer id; + + private Integer streetId; + + @TableField(exist = false) + private String streetName; + + private String taskId; + + private Integer type; + + /** + * 空货位的数量 + */ + private Integer emptyCount; + + /** + * 空托盘的数量(只有托盘没有货物) + */ + private Integer emptyGoodsCount; + + /** + * 有货物的数量 + */ + private Integer goodsCount; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/web/src/main/java/com/zhehekeji/web/entity/CheckSummary.java b/web/src/main/java/com/zhehekeji/web/entity/CheckSummary.java new file mode 100644 index 0000000..2338305 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/entity/CheckSummary.java @@ -0,0 +1,25 @@ +package com.zhehekeji.web.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CheckSummary { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String taskId; + + private Integer type; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} 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 9d53521..c250401 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Stock.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Stock.java @@ -76,6 +76,9 @@ public class Stock { @ApiModelProperty("操作后的图片") private String overoperationPic; + @ApiModelProperty("0:没检测 1:空货物(有托盘) 2:有货物 3:空托盘") + private Integer emptyStatus; + @ApiModelProperty("盘点图片") private String checkPic; diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CheckStreetSummaryMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CheckStreetSummaryMapper.java new file mode 100644 index 0000000..d0d4b4e --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/mapper/CheckStreetSummaryMapper.java @@ -0,0 +1,16 @@ +package com.zhehekeji.web.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhehekeji.web.entity.CheckStreetSummary; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +public interface CheckStreetSummaryMapper extends BaseMapper { + + @Select(" select c.*,t.name as streetName from check_street_summary c" + + " left join street t " + + " on c.street_id = t.id" + + " where c.task_id = #{taskId} ") + List list(String taskId); +} diff --git a/web/src/main/java/com/zhehekeji/web/mapper/CheckSummaryMapper.java b/web/src/main/java/com/zhehekeji/web/mapper/CheckSummaryMapper.java new file mode 100644 index 0000000..1560f56 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/mapper/CheckSummaryMapper.java @@ -0,0 +1,8 @@ +package com.zhehekeji.web.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhehekeji.web.entity.CheckSummary; +import com.zhehekeji.web.entity.LightSource; + +public interface CheckSummaryMapper extends BaseMapper { +} diff --git a/web/src/main/java/com/zhehekeji/web/pojo/empty/EmptyCheckSearch.java b/web/src/main/java/com/zhehekeji/web/pojo/empty/EmptyCheckSearch.java new file mode 100644 index 0000000..9df4dd0 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/pojo/empty/EmptyCheckSearch.java @@ -0,0 +1,22 @@ +package com.zhehekeji.web.pojo.empty; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class EmptyCheckSearch { + + private Integer pageSize; + + private Integer pageNum; + + private String taskId; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java b/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java new file mode 100644 index 0000000..167636e --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/EmptyCheckService.java @@ -0,0 +1,148 @@ +package com.zhehekeji.web.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.zhehekeji.web.entity.CheckStreetSummary; +import com.zhehekeji.web.entity.CheckSummary; +import com.zhehekeji.web.entity.Stock; +import com.zhehekeji.web.entity.Street; +import com.zhehekeji.web.mapper.CheckStreetSummaryMapper; +import com.zhehekeji.web.mapper.CheckSummaryMapper; +import com.zhehekeji.web.mapper.StockMapper; +import com.zhehekeji.web.pojo.empty.EmptyCheckSearch; +import com.zhehekeji.web.service.client.ECTransmission; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@Slf4j +public class EmptyCheckService { + + @Resource + private StreetService streetService; + @Resource + private StockMapper stockMapper; + @Resource + private CheckSummaryMapper checkSummaryMapper; + @Resource + private CheckStreetSummaryMapper checkStreetSummaryMapper; + + public PageInfo checkSummaryPageInfo(EmptyCheckSearch emptyCheckSearch){ + PageHelper.startPage(emptyCheckSearch.getPageNum(),emptyCheckSearch.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(!StringUtils.isEmpty(emptyCheckSearch.getTaskId())){ + queryWrapper.eq("task_id",emptyCheckSearch.getTaskId()); + } + if(emptyCheckSearch.getStartTime() != null ){ + queryWrapper.gt("start_time",emptyCheckSearch.getStartTime()); + } + if(emptyCheckSearch.getEndTime() != null){ + queryWrapper.lt("start_time",emptyCheckSearch.getEndTime()); + } + List checkSummaries = checkSummaryMapper.selectList(queryWrapper); + return new PageInfo<>(checkSummaries); + } + + public List checkStreetSummaries(String taskId){ + return checkStreetSummaryMapper.list(taskId); + } + + /** + * 盘点统计 + */ + public void CheckSummary(String SRMNumber,String taskId){ + Street street = streetService.getStreetByPlcId(SRMNumber); + if(street == null){ + log.error(" no SRMNumer:{}",SRMNumber); + return; + } + List stockList = stockMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); + /** + * 空货位的数量 + */ + Integer emptyCount = 0; + + /** + * 空托盘的数量(只有托盘没有货物) + */ + Integer emptyGoodsCount = 0; + + /** + * 有货物的数量 + */ + Integer goodsCount = 0; + for(Stock stock: stockList){ + if(stock.getEmptyStatus() == 3){ + //没托盘 + emptyCount++; + }else if(stock.getEmptyStatus() == 2){ + //有货物 + goodsCount++; + }else if(stock.getEmptyStatus() == 1){ + //有托盘 没货物 + emptyGoodsCount++; + } + } + //更新盘点统计 + List checkStreetSummaries = checkStreetSummaryMapper.selectList(new QueryWrapper().eq("street_id",street.getId()).eq("lotnum",taskId)); + if(checkStreetSummaries.size() > 0){ + CheckStreetSummary checkStreetSummary = checkStreetSummaries.get(0); + checkStreetSummary.setStreetId(street.getId()); + checkStreetSummary.setEmptyCount(emptyCount); + checkStreetSummary.setEmptyGoodsCount(emptyGoodsCount); + checkStreetSummary.setGoodsCount(goodsCount); + checkStreetSummary.setEndTime(LocalDateTime.now()); + checkStreetSummaryMapper.updateById(checkStreetSummary); + } + + } + + /** + * 空托盘检测开始 + * @param ecTransmission + */ + public void emptyCheckStart(ECTransmission ecTransmission){ + Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber()); + if(street == null){ + log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber()); + return; + } + Map map = new HashMap<>(); + map.put("street_id",street.getId()); + stockMapper.deleteByMap(map); + //新增空的盘点统计 + CheckStreetSummary checkStreetSummary = new CheckStreetSummary(); + checkStreetSummary.setTaskId(ecTransmission.getTaskId()); + checkStreetSummary.setStartTime(LocalDateTime.now()); + checkStreetSummary.setStreetId(street.getId()); + checkStreetSummaryMapper.insert(checkStreetSummary); + } + + public void emptyCheckLog(ECTransmission ecTransmission){ + Street street = streetService.getStreetByPlcId(ecTransmission.getSRMNumber()); + if(street == null){ + log.error(" no SRMNumer:{}",ecTransmission.getSRMNumber()); + return; + } + Stock stock = new Stock(); + stock.setStreetId(street.getId()); + stock.setSide(ecTransmission.getSide()); + stock.setDirection(ecTransmission.getDirection()); + if(ecTransmission.getIsEmpty().equals("N")){ + stock.setEmptyStatus(3); + } + stock.setRow(ecTransmission.getRow()); + stock.setColumn(ecTransmission.getColumn()); + stockMapper.insert(stock); + } + + +} diff --git a/web/src/main/java/com/zhehekeji/web/service/GoodsEmptyMap.java b/web/src/main/java/com/zhehekeji/web/service/GoodsEmptyMap.java index 583565c..f5e089a 100644 --- a/web/src/main/java/com/zhehekeji/web/service/GoodsEmptyMap.java +++ b/web/src/main/java/com/zhehekeji/web/service/GoodsEmptyMap.java @@ -12,23 +12,79 @@ import java.util.Set; */ public class GoodsEmptyMap { - private static Map> shelveEmptyMap = new HashMap<>(); + private static Map shelveEmptyInfo = new HashMap<>(); + /** + * 开始的时候,直接清空巷道的数据 + * @param SRMNumber + */ public void startEmptyCheck(String SRMNumber){ - shelveEmptyMap.put(SRMNumber,new HashSet<>()); + shelveEmptyInfo.put(SRMNumber,new HashMap()); } - public Set getEmptyCheck(String SRMNumber){ - return shelveEmptyMap.get(SRMNumber); - } /** - * + * 新增空货位信息数据 + * @param SRMNumber 巷道标识 + * @param direction 左右 + * @param side 深浅 + * @param row + * @param column + * @param YN */ - public void Position(){ + public void AddEmptyInfos(String SRMNumber,Integer direction,Integer side,Integer row,Integer column,String YN){ + Map SRMMap = shelveEmptyInfo.get(SRMNumber); + if(SRMMap == null){ + SRMMap = new HashMap<>(); + } + Map directionMap = SRMMap.get(direction); + if(directionMap == null){ + directionMap = new HashMap<>(); + } + Map> sideMap = SRMMap.get(side); + if(sideMap == null){ + sideMap = new HashMap<>(); + } + Set goodsInfos = sideMap.get(side); + if(goodsInfos == null){ + goodsInfos = new HashSet<>(); + } + GoodsInfo goodsInfo = new GoodsInfo(row, column, YN); + goodsInfos.add(goodsInfo); + sideMap.put(side,goodsInfos); + directionMap.put(direction,sideMap); + shelveEmptyInfo.put(SRMNumber,directionMap); } + @Data + public static class GoodsInfo{ + private Integer row; + private Integer column; + private String YN; + + public boolean equals(Object obj){ + if(this == obj){ + return true; + } + if(obj instanceof GoodsInfo){ + //行列相等 则相同 + if(((GoodsInfo) obj).getRow() == row && ((GoodsInfo) obj).getColumn() == column){ + return true; + } + } + return false; + } + + public GoodsInfo(Integer row,Integer column,String YN){ + this.column = column; + this.row = row; + this.YN = YN; + } + } + + + // @Data // public static class ShelveEmptyMap{ // diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java index afffa22..d5f50d9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -8,7 +8,6 @@ import com.zhehekeji.web.lib.hik.HikCameraControlModuleImpl; import com.zhehekeji.web.lib.hik.HikLoginModuleImpl; import com.zhehekeji.web.lib.joyware.JoywareCameraControlModuleImpl; import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; -import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.SensorGunMapper; import com.zhehekeji.web.mapper.StreetMapper; @@ -51,6 +50,8 @@ public class InitService implements ApplicationRunner { private PlcService plcService; @Resource private CameraService cameraService; + @Resource + private NettyServer nettyServer; @Bean public CameraControlLoginModule cameraControlLoginModule(){ @@ -79,7 +80,7 @@ public class InitService implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { - NettyServer.CreateNettyServer(3001); + nettyServer.CreateNettyServer(3001); //球机登录 List cameras = cameraMapper.selectByMap(new HashMap<>(0)); cameras.forEach(camera -> { 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 c473388..67ec5a1 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 codeDetector.BarcodeDetector; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.web.config.ConfigProperties; @@ -10,9 +9,6 @@ import com.zhehekeji.web.mapper.*; import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.service.RFID.RFIDMap; import com.zhehekeji.web.service.RFID.RFIDSocket; -import com.zhehekeji.web.service.hikLightSource.HikControlSocket; -import com.zhehekeji.web.service.ksec.KsecNettyClient; -import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -21,11 +17,8 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.Duration; import java.time.LocalDateTime; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -71,6 +64,8 @@ public class PlcService { private RFIDService rfidService; @Resource private CheckLogMapper checkLogMapper; + @Resource + private CheckStreetSummaryMapper checkStreetSummaryMapper; private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,8,200,TimeUnit.MINUTES,new ArrayBlockingQueue<>(100000)); @@ -550,144 +545,28 @@ public class PlcService { @Resource private LightSourceMapper lightSourceMapper; + /** + * 给到客户端 + * @param plcCmdInfo + * @param cmdCode + * @param wmsCode + * @param wmsTrayCode + * @return + */ public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){ long startTime = System.currentTimeMillis(); - Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); - CronTab.putTime(street.getId()); - List lightSources = lightSourceMapper.selectList(new QueryWrapper().eq("street_id",street.getId())); - lightSources.forEach(lightSource -> { - HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); - }); - Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); - - if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ - //内测 - String c = cmdCode + "-" + plcCmdInfo.getLeftRightStr(1) + "-IN"; - log.info("camera ptz"+c); - gyrateCameraByCode(cameraId, c); - }else { - gyrateCameraByCode(cameraId, cmdCode); - try { - Thread.sleep(configProperties.getCameraConfig().getDelayCaptureTime()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - - String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - cameraCapture(cameraId,false,null,path); - //托盘码 - String trayCode = null; - Boolean trayCheck = Boolean.TRUE; - //如果是用扫码枪 扫 托盘码,就直接扫 - //if(configProperties.getScanCodeMode().getTray() == 2){ - SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(),plcCmdInfo.getLeftRight1()); - if(plcCmdInfo.getSeparation1() == 1 && configProperties.getScanCodeMode().getTray() == 2){ - //托盘使用sick扫码枪 - - if(sensorGun == null){ - trayCode = "识别异常"; - trayCheck = Boolean.FALSE; - log.error("no sensor gun config in database ,street id:{},direction:{}",street.getId(),plcCmdInfo.getLeftRight1()); - }else { - trayCode = SickSocket.readOCR(sensorGun.getIp(),sensorGun.getPort()); - log.info("sensor tray code:{}",trayCode); - if("".equals(wmsTrayCode)){ - //托盘码为空,无货物 - //只要扫码枪未识别出条码,即认为盘点正确 - if(StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")){ - trayCode = ""; - trayCheck = Boolean.TRUE; - }else { - trayCode = "识别异常"; - trayCheck = Boolean.FALSE; - log.warn("sick ocr error:{}",trayCode); - } - }else { - if(StringUtils.isEmpty(trayCode) || trayCode.equals("NoRead")){ - trayCode = "识别异常"; - trayCheck = Boolean.FALSE; - log.warn("sick ocr error:{}",trayCode); - }else { - trayCheck = wmsTrayCode.equals(trayCode); - } - } - - } - - }else if(configProperties.getScanCodeMode().getTray() == 3){ - //RFID - RFID rfid = rfidService.getRFIDByPlc(street.getId()); - - } - OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); - Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn()); - String scanCode = null; - Boolean codeCheck = Boolean.TRUE; - Boolean trayCodeCheck = Boolean.TRUE; - //货物使用球机扫码 - - if(configProperties.getScanCodeMode().getTray() == 2 && plcCmdInfo.getSeparation1() == 2){ - //托盘使用球机扫码 - if("".equals(wmsTrayCode)){ - //空货物的处理 - //如果系统货物为空,则只要扫码识别未出结果,就认为无货物 - trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes()); - log.info("tray code:{},sys trayCode:{}",trayCode,wmsTrayCode); - if(StringUtils.isEmpty(trayCode)|| trayCode.equals("Unrecognized")){ - trayCheck = Boolean.TRUE; - trayCode = ""; - }else { - trayCheck = wmsTrayCode.equals(trayCode); - } - }else { - trayCode = BarcodeDetector.detectBestCodeUntilOK(configProperties.getSavePath().getMediaPath()+path,configProperties.getScanCodeMode().getTrayCodeTypes()); - if(StringUtils.isEmpty(trayCode)){ - log.error("row:{},cloumn:{}",plcCmdInfo.getRow1(),plcCmdInfo.getColumn1()); - log.error("detectBestBarCode:{}",trayCode); - trayCode = "识别异常"; - trayCheck = Boolean.FALSE; - }else { - trayCheck = wmsTrayCode.equals(trayCode); - } - } - - } - log.info("code:{}",scanCode); - //核对异常 - Integer status = 1; - //托盘和货物都正确 - if(trayCheck && codeCheck){ - status = 2; - } - if(stock == null){ - stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now()); - stockMapper.insert(stock); - }else { - stock.setStatus(status); - stock.setLotnum(plcCmdInfo.getLotnum()); - 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,sensorGun); -// threadPoolExecutor.execute(stockCheckRunnable); - long end = System.currentTimeMillis(); long s = end - startTime; log.info("time:{}millisecond",s); return true; } + + + + public void checkLog(Stock stock){ CheckLog checkLog = new CheckLog(); checkLog.setCheckNum(stock.getCheckNum()); diff --git a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java index b588608..1a0a69c 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockCheckRunnable.java @@ -96,22 +96,22 @@ public class StockCheckRunnable implements Runnable { if(trayCheck && codeCheck){ status = 2; } - if(stock == null){ - stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now()); - stockMapper.insert(stock); - }else { - stock.setStatus(status); - stock.setLotnum(plcCmdInfo.getLotnum()); - 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); +// if(stock == null){ +// stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),scanCode, null,null,wmsCode,null,null,wmsTrayCode,trayCode,orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),status,null,null,path, LocalDateTime.now()); +// stockMapper.insert(stock); +// }else { +// stock.setStatus(status); +// stock.setLotnum(plcCmdInfo.getLotnum()); +// 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){ diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java index 5a2224b..4761e5e 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/ClientChanel.java @@ -3,6 +3,9 @@ package com.zhehekeji.web.service.client; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; @@ -10,8 +13,11 @@ import java.util.Map; /** * 所有的客户端的chanel */ +@Slf4j public class ClientChanel { + private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); + /** * key : 巷道标识符 */ @@ -29,4 +35,12 @@ public class ClientChanel { public static Channel get(String key){ return channelMap.get(key); } + + public static void write(String data,String key){ + if(channelMap.get(key) != null){ + channelMap.get(key).writeAndFlush(data); + }else { + tcpLogger.info("no connect client:{}",key); + } + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java b/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java index 4eb15c8..f36d8f3 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/Decoder.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service.client; +import com.zhehekeji.web.service.PlcService; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -16,11 +17,12 @@ import java.nio.charset.Charset; @Slf4j public class Decoder extends DelimiterBasedFrameDecoder { - private static final Logger tcpLogger = LoggerFactory.getLogger("client_tcp"); + private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); - - public Decoder() { + private PlcService plcService; + public Decoder(PlcService plcService) { super(200,true,false, Unpooled.copiedBuffer(";".getBytes())); + this.plcService = plcService; } @Override @@ -35,28 +37,26 @@ public class Decoder extends DelimiterBasedFrameDecoder { //心跳 HBTransmission hbTransmission = new HBTransmission(body); //回复客户端心跳 - ctx.channel().writeAndFlush(hbTransmission.toString()); tcpLogger.info("client:{} heart", hbTransmission.getSRMNumber()); in.release(); } else if(body.startsWith(TMTransmission.getHeader())){ - //盘点与空货位扫描相关的指令 + //盘点指令 TMTransmission tmTransmission = new TMTransmission(body); - if(tmTransmission.getType() == 1){ - //空货位扫描 - }else { - //盘点 - } in.release(); }else if(body.startsWith(CETransmission.getHEADER())){ - //建立连接 + //客户端建立连接 CETransmission ceTransmission = new CETransmission(body); //回复客户端,建立连接完成 ctx.channel().writeAndFlush(ceTransmission.toString()); ClientChanel.connect(ceTransmission.getSRMNumber(), ctx.channel()); tcpLogger.info("client:{} connect", ceTransmission.getSRMNumber()); in.release(); + }else if(body.startsWith(ECTransmission.getHEADER())){ + //空货位盘点 + ECTransmission ecTransmission = new ECTransmission(body); + }else if(body.startsWith("DC")){ //客户端断开连接 String [] strings = body.split(","); diff --git a/web/src/main/java/com/zhehekeji/web/service/client/ECTransmission.java b/web/src/main/java/com/zhehekeji/web/service/client/ECTransmission.java new file mode 100644 index 0000000..7a26964 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/ECTransmission.java @@ -0,0 +1,85 @@ +package com.zhehekeji.web.service.client; + +import lombok.Data; + +@Data +/** + * 空货位盘点 + * + * ■ EC,SRM001,BY201710250940368150001,START;(服务端发送) + * ■ EC,SRM001,BY201710250940368150001,R010002001(货位号), Y/N;(客户端对每个货位回复有无,对于双伸的货位需要回复两次(浅深货位)) + * ■ EC,SRM001,BY201710250940368150001,END ;(服务端发送)。 + * + */ +public class ECTransmission { + + private static String HEADER = "EC"; + + private static String Split = ","; + + private String SRMNumber; + + private String taskId; + + private String type; + + private String goodsLocation; + + private String isEmpty; + + /** + * 左右 1:左 2:右 + */ + private Integer direction; + + /** + * 深浅 1:浅 2:深 + */ + private Integer side; + + private Integer row; + + private Integer column; + + public String toString(){ + return HEADER + "," + SRMNumber; + } + + public static String getHEADER(){ + return HEADER; + } + + public ECTransmission(String body){ + String [] strings = body.split(","); + if(strings != null && strings.length == 4 && HEADER.equals(strings[0])){ + SRMNumber = strings[1]; + taskId = strings[2]; + goodsLocation = strings[3]; + isEmpty = strings[4]; + direction = goodsLocation.substring(0).equals("L") ? 1:2; + side = Integer.valueOf(goodsLocation.substring(2,3)); + row = Integer.valueOf(goodsLocation.substring(3,6)); + column = Integer.valueOf(goodsLocation.substring(6,9)); + } + } + + /** + * 空托盘检测开始信息 + * @return + */ + public String toEmptyCheckStartString(){ + StringBuffer sb = new StringBuffer(HEADER); + sb.append(Split).append(SRMNumber).append(Split).append("START"); + return sb.toString(); + } + + /** + * 空托盘检测 结束信号 + * @return + */ + public String toEmptyCheckEndString(){ + StringBuffer sb = new StringBuffer(HEADER); + sb.append(Split).append(SRMNumber).append(Split).append("END"); + return sb.toString(); + } +} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/EmptyTrayCheckTransmission.java b/web/src/main/java/com/zhehekeji/web/service/client/EmptyTrayCheckTransmission.java deleted file mode 100644 index 9e68c8c..0000000 --- a/web/src/main/java/com/zhehekeji/web/service/client/EmptyTrayCheckTransmission.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.zhehekeji.web.service.client; - -import lombok.Data; - -@Data -/** - * 空托盘检测 - */ -public class EmptyTrayCheckTransmission { - - -} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/Encoder.java b/web/src/main/java/com/zhehekeji/web/service/client/Encoder.java index a5903a7..f21246d 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/Encoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/Encoder.java @@ -1,10 +1,10 @@ package com.zhehekeji.web.service.client; -import com.alibaba.fastjson.JSONObject; -import com.zhehekeji.web.service.ksec.KsecInfo; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.nio.charset.StandardCharsets; @@ -13,10 +13,11 @@ import java.nio.charset.StandardCharsets; */ public class Encoder extends MessageToByteEncoder { - + private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); @Override protected void encode(ChannelHandlerContext channelHandlerContext, String data, ByteBuf byteBuf) throws Exception { data = data + ";"; + tcpLogger.info(data); byteBuf.writeBytes(data.getBytes(StandardCharsets.UTF_8)); } } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/MessageConverter.java b/web/src/main/java/com/zhehekeji/web/service/client/MessageConverter.java new file mode 100644 index 0000000..5f767f0 --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/service/client/MessageConverter.java @@ -0,0 +1,13 @@ +package com.zhehekeji.web.service.client; + +import org.springframework.stereotype.Component; + +/** + * 普天的消息 转给盘点客户端 + */ +@Component +public class MessageConverter { + + + +} diff --git a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java index 507cf86..cf53775 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/NettyServer.java @@ -1,5 +1,6 @@ package com.zhehekeji.web.service.client; +import com.zhehekeji.web.service.PlcService; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; @@ -8,10 +9,17 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.SneakyThrows; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class NettyServer { - public static void CreateNettyServer(int port) throws InterruptedException { + @Resource + private PlcService plcService; + + public void CreateNettyServer(int port) throws InterruptedException { Thread thread = new Thread(new Runnable() { @SneakyThrows @Override @@ -29,7 +37,7 @@ public class NettyServer { .childHandler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) { - ch.pipeline().addLast(new Decoder()); + ch.pipeline().addLast(new Decoder(plcService)); ch.pipeline().addLast(new Encoder()); }}); // 子处理器,用于处理workerGroup diff --git a/web/src/main/java/com/zhehekeji/web/service/client/TMTransmission.java b/web/src/main/java/com/zhehekeji/web/service/client/TMTransmission.java index 9fd4e81..c48f384 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/TMTransmission.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/TMTransmission.java @@ -5,6 +5,7 @@ import lombok.Data; /** * 盘点指令 * 与客户端的传输内容 + * */ @Data public class TMTransmission { @@ -35,18 +36,20 @@ public class TMTransmission { private Integer count; + + private String visualTest; + + private String isDisConnect; + /** - * 盘点方式 + * 左右 1:左 2:右 */ - private String checkType; + private Integer direction; /** - * 1: 空托盘检测 - * 0: 正常盘点 + * 深浅 1:浅 2:深 */ - private Integer type; - - private String isEmpty; + private Integer side; private static String Split = ","; @@ -54,29 +57,11 @@ public class TMTransmission { StringBuffer sb = new StringBuffer(header); sb.append(Split).append(SRMNumber).append(Split).append(taskNo).append(Split) .append(goodsLocation).append(Split).append(trayNo).append(Split).append(code) - .append(Split).append(count).append(Split).append(count).append(Split).append(checkType); + .append(Split).append(count).append(Split).append(count).append(Split).append(visualTest); return sb.toString(); } - /** - * 空托盘检测开始信息 - * @return - */ - public String toEmptyCheckStartString(){ - StringBuffer sb = new StringBuffer(header); - sb.append(Split).append(SRMNumber).append(Split).append("START"); - return sb.toString(); - } - /** - * 空托盘检测 结束信号 - * @return - */ - public String toEmptyCheckEndString(){ - StringBuffer sb = new StringBuffer(header); - sb.append(Split).append(SRMNumber).append(Split).append("END"); - return sb.toString(); - } public static String getHeader(){ return header; @@ -84,23 +69,22 @@ public class TMTransmission { public TMTransmission(String body){ String [] strings = body.split(Split); - if(strings != null && strings.length >0 && strings[0].equals(header)){ - if(strings.length == 8){ - type = 0; + if(strings != null && strings.length > 9 && strings[0].equals(header)){ + if(strings.length == 9){ SRMNumber = strings[1]; taskNo = strings[2]; goodsLocation = strings[3]; trayNo = strings[4]; code = strings[5]; count = Integer.valueOf(strings[6]); - checkType = strings[7]; - - }else if(strings.length == 4){ - type = 1; - SRMNumber = strings[1]; - goodsLocation = strings[2]; - isEmpty = strings[3]; - + visualTest = strings[7]; + isDisConnect = strings[8]; + direction = goodsLocation.substring(0).equals("L") ? 1:2; + side = Integer.valueOf(goodsLocation.substring(2,3)); + //checkType = strings[7]; + if("Y".equals(isDisConnect)){ + //需要拆分之前的 + } } } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index bfa02a1..27f76ac 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -14,7 +14,7 @@ spring: testWhileIdle: false timeBetweenEvictionRunsMillis: 60000 type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://115.236.65.98:12004/lia_duoji_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + url: jdbc:mysql://115.236.65.98:12004/lia_duoji_nanjing_wuliu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL # --------本服务端口号