蜜雪冰城盘点

shandong-hongrunshihua
yiming 3 years ago
parent f5ae3d9505
commit a7a431daa0

@ -12,11 +12,12 @@ import java.time.LocalDateTime;
@Data
public class CheckLog {
@TableId(type = IdType.AUTO)
private Long id;
private Integer streetId;
@TableField(exist = false)
private String streetName;
private Integer direction;
private Integer side;
@ -49,6 +50,9 @@ public class CheckLog {
private String lotnum;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime exportTime;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@ -27,4 +27,6 @@ public class StockCheck {
@ApiModelProperty("列")
private Integer column;
private Integer ok;
}

@ -6,20 +6,29 @@ import com.github.pagehelper.PageInfo;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.mapper.CheckLogMapper;
import com.zhehekeji.web.pojo.stock.CheckLogSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CheckLogService {
@Resource
private CheckLogMapper checkLogMapper;
@Resource
private StreetService streetService;
public PageInfo<CheckLog> list(CheckLogSearch search){
List<StreetVO> list = streetService.list();
Map<Integer,String> map = new HashMap<>();
list.forEach(l->{
map.put(l.getId(),l.getName());
});
PageHelper.startPage(search.getPageNum(),search.getPageSize());
QueryWrapper<CheckLog> wrapper = new QueryWrapper<>();
if(!StringUtils.isEmpty(search.getLotnum())){
@ -40,8 +49,13 @@ public class CheckLogService {
if(search.getColumn() != null && search.getColumn() != 0){
wrapper.eq("`column`",search.getColumn());
}
if(search.getStreetId() != null && search.getStreetId() != 0){
wrapper.eq("`street_id`",search.getStreetId());
}
List<CheckLog>stockChecks = checkLogMapper.selectList(wrapper);
stockChecks.forEach(l->{
l.setStreetName(map.get(l.getStreetId()));
});
return new PageInfo<>(stockChecks);
}
}

@ -577,112 +577,36 @@ public class PlcService {
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);
}
}
//拍照暂停1s再拍
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
cameraCapture(cameraId,false,null,path);
//成都蜜雪冰城 只拍照人工核对
}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());
stock = new Stock(null,null,plcCmdInfo.getOrderNum(),plcCmdInfo.getLotnum(),"", null,null,wmsCode,null,null,wmsTrayCode,"",orderInfo.getStreetId(),orderInfo.getLeftRight(),orderInfo.getSeparation(),orderInfo.getRow(),orderInfo.getColumn(),0,null,null,path, LocalDateTime.now());
stockMapper.insert(stock);
}else {
stock.setStatus(status);
//stock.setStatus(status);
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
//stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stock.setCode(scanCode);
//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);

@ -355,10 +355,15 @@ public class StockService {
Stock stock = stockInfo(stockCheck);
Assert.isTrue(stock != null && stock.getId() != null, "该货位暂时没有记录");
Integer oldStatus = stock.getStatus();
Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对");
//Assert.isTrue(StockStatus.ERROR.getStatus().equals(oldStatus), "无需核对");
log.info("check stock correct, street_id:{},direction:{},side:{},row:{},column:{}", stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn());
if(stockCheck.getOk() == 1){
stock.setStatus(StockStatus.MANUAL.getStatus());
}else {
stock.setStatus(StockStatus.ERROR.getStatus());
}
stockMapper.updateById(stock);
checkLog(stock);
return stock;
@ -373,10 +378,14 @@ public class StockService {
checkLog.setColumn(stock.getColumn());
checkLog.setCheckNum(stock.getCheckNum());
checkLog.setPic(stock.getCheckPic());
checkLog.setDirection(stock.getDirection());
checkLog.setSide(stock.getSide());
checkLog.setStreetId(stock.getStreetId());
//checkLog.setShelveId(stock.getShelveId());
checkLog.setStatus(stock.getStatus());
checkLog.setCode(stock.getCode());
checkLog.setCreateTime(LocalDateTime.now());
checkLog.setExportTime(stock.getExportTime());
checkLogMapper.insert(checkLog);
}

@ -86,17 +86,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
String srmNumber = null;
String cmdName = null;
if(dataInfo != null){
//左右换过来
if(dataInfo.getFromDirection() == 1){
dataInfo.setFromDirection(2);
}else {
dataInfo.setFromDirection(1);
}
if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){
dataInfo.setToDirection(2);
}else {
dataInfo.setToDirection(1);
}
plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum);
srmNumber = dataInfo.getSRMNumber();
@ -184,28 +174,22 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
//盘点
//转球机到盘点位 然后拍照
// if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){
// //需要把stock表truncate
// FileUtil.save(lotnum,"lastLotnum");
// tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum);
// plcService.truncateStock();
// lastLotnum = lotnum;
// }
// plcCmdInfo.setTimes(1);
// Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
// if(ok){
// ksecInfo.getData().setAckStatus(1);
// }else {
// ksecInfo.getData().setAckStatus(0);
// }
// ctx.channel().writeAndFlush(ksecInfo);
//rfid的逻辑
String code = dataInfo.getCmdName();
if("E1".equals(code)){
plcService.RFIDCheck(plcCmdInfo);
if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){
//需要把stock表truncate
FileUtil.save(lotnum,"lastLotnum");
tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum);
plcService.truncateStock();
lastLotnum = lotnum;
}
plcCmdInfo.setTimes(1);
Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode());
if(ok){
ksecInfo.getData().setAckStatus(1);
}else {
plcService.RFIDStop(plcCmdInfo);
ksecInfo.getData().setAckStatus(0);
}
ctx.channel().writeAndFlush(ksecInfo);
}
//找到该货位的最后一张照片与现在的照片比照

@ -14,7 +14,7 @@ spring:
testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://192.168.77.91:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号
@ -27,10 +27,10 @@ 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
@ -61,8 +61,8 @@ savePath:
# ------------服务端类型 0TCP(罗伯泰克) 1:KSEC(JSON)(昆船)
serverMode: 1
ksec:
ip: 127.0.0.1
port: 3000
ip: 192.168.168.11
port: 8001
# ------------ 实时视频流 全部页面的格式 行列数量
videoStyleConfig:
videoStyleRow: 4

Loading…
Cancel
Save