1.添加视觉控制的http方式

2.与北起连接采用http方式
3.盘点历史逻辑修改
4.
bozhou-古井贡酒
LAPTOP-S9HJSOEB\昊天 2 years ago
parent f245bf582c
commit c14541a1fa

@ -41,6 +41,14 @@ public class ConfigProperties {
private AsyncExecutorThread asyncExecutorThread;
private VisualSense visualSense;
@Data
public static class VisualSense{
//连接视觉控制的url
private String url = "/api/comm/algorithm";
private Boolean able = true;
}
@Data
public static class AsyncExecutorThread{
//# 异步线程配置

@ -0,0 +1,13 @@
package com.zhehekeji.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

@ -3,12 +3,15 @@ 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.entity.ResultResp;
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.ksec.KsecDataInfo;
import com.zhehekeji.web.service.ksec.KsecInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -62,6 +65,14 @@ public class OrderController {
return Result.success();
}
@ApiOperation("随行或盘点请求接口")
@PostMapping("/orderDecoder")
public ResultResp<KsecDataInfo> orderDecoder(@ApiParam("工单信息") @RequestBody KsecInfo ksecInfo){
KsecDataInfo ksecDataInfo = plcService.orderDecoder(ksecInfo);
return ResultResp.success(ksecDataInfo);
}
@ApiOperation("发生告警")
@GetMapping("/error")
public Result orderError(@ApiParam("plc") @RequestParam String plcId){

@ -1,6 +1,7 @@
package com.zhehekeji.web.controller;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.AlgorithmPojo;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.TestService;
import io.swagger.annotations.Api;
@ -39,5 +40,14 @@ public class TestController {
return Result.success();
}
@ApiOperation("自动盘点")
@PostMapping("/2")
public AlgorithmPojo test(@RequestBody AlgorithmPojo algorithmPojo){
algorithmPojo.setResult(1);
algorithmPojo.setGoodsNumberResult(algorithmPojo.getGoodsNumber());
algorithmPojo.setGoodsTypeResult(algorithmPojo.getGoodsType());
return algorithmPojo;
}
}

@ -0,0 +1,31 @@
package com.zhehekeji.web.entity;
import com.zhehekeji.web.service.ksec.KsecDataInfo;
import lombok.Data;
@Data
public class AlgorithmPojo {
String ip;
Integer port;
private String code = "";
private Integer streetId;
private String taskId;
private Integer ack =1;
private Integer id;
private String goodsType;
private Integer goodsNumber;
private Integer result;
private String goodsTypeResult;
private Integer goodsNumberResult;
public static AlgorithmPojo buildAlgorithmPojo(Street street, KsecDataInfo dataInfo) {
AlgorithmPojo algorithmPojo = new AlgorithmPojo();
algorithmPojo.setIp( street.getPlcIp());
algorithmPojo.setPort( street.getPlcPort());
algorithmPojo.setStreetId( street.getId());
algorithmPojo.setTaskId( dataInfo.getTaskId());
algorithmPojo.setGoodsNumber(dataInfo.getGoodsNumber());
algorithmPojo.setGoodsType(dataInfo.getGoodsType());
return algorithmPojo;
}
}

@ -0,0 +1,190 @@
package com.zhehekeji.web.entity;
import com.zhehekeji.core.pojo.HttpStatus;
public class ResultResp <T>{
private String header = "LP";
private Integer code;
private String message;
private T data;
public ResultResp(T data) {
this.code = HttpStatus.SUCCESS.getCode();
this.data = data;
}
public static <T> ResultResp<T> success(T data) {
ResultResp<T> ResultResp = new ResultResp();
ResultResp.setData(data);
ResultResp.setCode(HttpStatus.SUCCESS.getCode());
ResultResp.setMessage("SUCCESS");
return ResultResp;
}
public static <T> ResultResp<T> success(T data, String msg) {
ResultResp<T> ResultResp = new ResultResp();
ResultResp.setData(data);
ResultResp.setCode(HttpStatus.SUCCESS.getCode());
ResultResp.setMessage(msg);
return ResultResp;
}
public static ResultResp success() {
return builder().code(HttpStatus.SUCCESS.getCode()).message("SUCCESS").build();
}
public static <T> ResultResp<T> error(Integer code, String message) {
ResultResp<T> ResultResp = new ResultResp();
ResultResp.setCode(code);
ResultResp.setMessage(message);
return ResultResp;
}
public static <T> ResultResp.ResultRespBuilder<T> builder() {
return new ResultResp.ResultRespBuilder();
}
public Integer getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
public T getData() {
return this.data;
}
public void setCode(Integer code) {
this.code = code;
}
public void setMessage(String message) {
this.message = message;
}
public void setData(T data) {
this.data = data;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof ResultResp)) {
return false;
} else {
ResultResp<?> other = (ResultResp)o;
if (!other.canEqual(this)) {
return false;
} else {
label47: {
Object this$code = this.getCode();
Object other$code = other.getCode();
if (this$code == null) {
if (other$code == null) {
break label47;
}
} else if (this$code.equals(other$code)) {
break label47;
}
return false;
}
Object this$message = this.getMessage();
Object other$message = other.getMessage();
if (this$message == null) {
if (other$message != null) {
return false;
}
} else if (!this$message.equals(other$message)) {
return false;
}
Object this$data = this.getData();
Object other$data = other.getData();
if (this$data == null) {
if (other$data != null) {
return false;
}
} else if (!this$data.equals(other$data)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof ResultResp;
}
public int hashCode() {
boolean PRIME = true;
int ResultResp = 1;
Object $code = this.getCode();
ResultResp = ResultResp * 59 + ($code == null ? 43 : $code.hashCode());
Object $message = this.getMessage();
ResultResp = ResultResp * 59 + ($message == null ? 43 : $message.hashCode());
Object $data = this.getData();
ResultResp = ResultResp * 59 + ($data == null ? 43 : $data.hashCode());
return ResultResp;
}
public String toString() {
return "ResultResp(code=" + this.getCode() + ", message=" + this.getMessage() + ", data=" + this.getData() + ")";
}
public ResultResp(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public ResultResp() {
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public static class ResultRespBuilder<T> {
private Integer code;
private String message;
private T data;
ResultRespBuilder() {
}
public ResultResp.ResultRespBuilder<T> code(Integer code) {
this.code = code;
return this;
}
public ResultResp.ResultRespBuilder<T> message(String message) {
this.message = message;
return this;
}
public ResultResp.ResultRespBuilder<T> data(T data) {
this.data = data;
return this;
}
public ResultResp<T> build() {
return new ResultResp(this.code, this.message, this.data);
}
public String toString() {
return "ResultResp.ResultRespBuilder(code=" + this.code + ", message=" + this.message + ", data=" + this.data + ")";
}
}
}

@ -23,37 +23,25 @@ public class CheckLogService {
private StreetService streetService;
public PageInfo<CheckLog> list(CheckLogSearch search){
public PageInfo<CheckLog> list(CheckLogSearch search) {
PageHelper.startPage(search.getPageNum(),search.getPageSize());
PageHelper.startPage(search.getPageNum(), search.getPageSize());
QueryWrapper<CheckLog> wrapper = new QueryWrapper<>();
if(!StringUtils.isEmpty(search.getLotnum())){
wrapper.eq("lotnum",search.getLotnum());
}
if(search.getStartTimestamp() != null && search.getEndTimestamp() != null){
wrapper.ge("create_time",search.getStartTimestamp()).le("create_time",search.getEndTimestamp());
}
if(search.getLeftRight() != null &&( search.getLeftRight() != 0 && search.getLeftRight() != -1)){
wrapper.eq("`direction`",search.getLeftRight());
}
if(search.getSide() != null &&( search.getSide() != 0 && search.getSide() != -1)){
wrapper.eq("`side`",search.getSide());
}
if(search.getRow() != null &&( search.getRow() != 0 && search.getRow() != -1)){
wrapper.eq("`row`",search.getRow());
}
if(search.getColumn() != null &&( search.getColumn() != 0 && search.getColumn() != -1)){
wrapper.eq("`column`",search.getColumn());
}
if(ToolUtil.isNotEmpty(search.getStreetId() )){
wrapper.eq("`street_id`",search.getStreetId());
}
wrapper.eq(!StringUtils.isEmpty(search.getLotnum()), "lotnum", search.getLotnum())
.ge(search.getStartTimestamp() != null , "create_time", search.getStartTimestamp())
.le(search.getEndTimestamp() != null,"create_time", search.getEndTimestamp())
.eq(search.getLeftRight() != null && (search.getLeftRight() != 0 && search.getLeftRight() != -1), "`direction`", search.getLeftRight())
.eq(search.getSide() != null && (search.getSide() != 0 && search.getSide() != -1), "`side`", search.getSide())
.eq(search.getRow() != null && (search.getRow() != 0 && search.getRow() != -1), "`row`", search.getRow())
.eq(search.getColumn() != null && (search.getColumn() != 0 && search.getColumn() != -1), "`column`", search.getColumn())
.eq(ToolUtil.isNotEmpty(search.getStreetId()), "`street_id`", search.getStreetId());
wrapper.orderByDesc("create_time");
List<CheckLog>stockChecks = checkLogMapper.selectList(wrapper);
List<CheckLog> stockChecks = checkLogMapper.selectList(wrapper);
List<StreetVO> streetVOS = streetService.list();
for (CheckLog checkLog : stockChecks){
for (StreetVO streetVO : streetVOS){
if(streetVO.getId().equals(checkLog.getStreetId())){
for (CheckLog checkLog : stockChecks) {
for (StreetVO streetVO : streetVOS) {
if (streetVO.getId().equals(checkLog.getStreetId())) {
checkLog.setStreetName(streetVO.getName());
break;
}

@ -11,12 +11,16 @@ import com.zhehekeji.web.config.WebSocketConfig;
import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.Cmd;
import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.pojo.websocket.WebSocketVo;
import com.zhehekeji.web.service.RFID.RFIDMap;
import com.zhehekeji.web.service.RFID.RFIDSocket;
import com.zhehekeji.web.service.algorithm.AlgorithmService;
import com.zhehekeji.web.service.hikLightSource.HikControlSocket;
import com.zhehekeji.web.service.interfaces.RfidLiveService;
import com.zhehekeji.web.service.ksec.KsecDataInfo;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.sick.SickSocket;
import com.zhehekeji.web.util.ToolUtil;
@ -620,8 +624,10 @@ public class PlcService {
WebSocketServer.sendInfo(JSONObject.toJSONString(webSocketVo), null);
return JSONObject.toJSONString(webSocketVo);
}
@Resource
AlgorithmService algorithmService;
public Boolean check(PlcCmdInfo plcCmdInfo, String cmdCode, String wmsCode, String wmsTrayCode) {
public AlgorithmPojo check(PlcCmdInfo plcCmdInfo, String cmdCode, KsecDataInfo dataInfo) {
long startTime = System.currentTimeMillis();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
@ -656,100 +662,30 @@ public class PlcService {
} catch (NullPointerException e) {
log.error("相机{}未连接无法拍照", cameraId);
}
//托盘码
String trayCode = null;
Boolean trayCheck = Boolean.TRUE;
//如果是用扫码枪 扫 托盘码,就直接扫
//if(configProperties.getScanCodeMode().getTray() == 2){
log.info("扫码类型:" + configProperties.getScanCodeMode().getTray());
//托盘使用sick扫码枪
SensorGun sensorGun = sensorService.getSensorByPlc(street.getId(), plcCmdInfo.getLeftRight1());
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);
}
}
}
// RFID
// RFID rfid = rfidService.getRFIDByPlc(street.getId(),plcCmdInfo.getLeftRight1());
//视觉盘点品规个数
Boolean trayRFIDCheck = Boolean.FALSE;
Set<String> tags = new HashSet<>();
try {
RFIDCheck(plcCmdInfo, true);
Thread.sleep(1000 * configProperties.getRfid().getScanTime());
} catch (Exception e) {
e.printStackTrace();
} finally {
tags = RFIDStop(plcCmdInfo);
log.info("盘点rfid扫描结果" + tags);
}
if (tags != null && tags.size() > 0) {
if (tags.containsAll(wmsTrayCodeMapByTask.get(plcCmdInfo.getOrderNum()))) {
trayRFIDCheck = Boolean.TRUE;
} else {
if(trayCheck){
trayCode = "RFID扫描失败";
}else
trayCode += ";RFID扫描失败";
trayRFIDCheck = Boolean.FALSE;
}
wmsTrayCodeMapByTask.remove(plcCmdInfo.getOrderNum());
RFID rfid = rfidMapper.selectOne(new QueryWrapper<RFID>().eq("street_id", street.getId()));
if (!rfidLiveService.getRfidLive(plcCmdInfo, street, wmsTrayCode)) {
rfidLiveService.rfidRemoveLive(plcCmdInfo, street, rfid);
}
rfidLiveService.rfidSave(plcCmdInfo, String.join(",", tags), street, rfid);
}
OrderInfo orderInfo = new OrderInfo(street, plcCmdInfo, 1, cmdCode);
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(orderInfo.getStreetId(), plcCmdInfo.getFromDirection(), orderInfo.getSeparation(), orderInfo.getRow(), orderInfo.getColumn());
String scanCode = null;
AlgorithmPojo algorithmPojo = algorithmService.getGoodResult(street,dataInfo);
//货物使用球机扫码
log.info("code:{}", scanCode);
log.info("盘点信息:{}", algorithmPojo.toString());
//核对异常
Integer status = 1;
//托盘和货物都正确
if (trayCheck && trayRFIDCheck ) {
if (algorithmPojo.getResult()==1
&& algorithmPojo.getGoodsNumber().equals(algorithmPojo.getGoodsNumberResult())
&& algorithmPojo.getGoodsType().equals(algorithmPojo.getGoodsTypeResult())) {
status = 2;
}
if (stock == null) {
stock = Stock.builder()
.checkNum(plcCmdInfo.getOrderNum())
.lotnum(plcCmdInfo.getLotnum())
.code(scanCode)
.wmsCode(wmsCode)
.wmsTrayCode(wmsTrayCode)
.trayCode(trayCode)
.count(algorithmPojo.getGoodsNumberResult())
.category(algorithmPojo.getGoodsTypeResult())
.streetId(orderInfo.getStreetId())
.direction(plcCmdInfo.getFromDirection())
.side(orderInfo.getSeparation())
@ -763,12 +699,10 @@ public class PlcService {
stock.setStatus(status);
stock.setLotnum(plcCmdInfo.getLotnum());
stock.setExportTime(LocalDateTime.now());
stock.setCount(algorithmPojo.getGoodsNumberResult());
stock.setCategory(algorithmPojo.getGoodsTypeResult());
stock.setCheckPic(path);
stock.setCheckNum(plcCmdInfo.getOrderNum());
stock.setTrayCode(trayCode);
stock.setWmsTrayCode(wmsTrayCode);
stock.setCode(scanCode);
stock.setWmsCode(wmsCode);
stockMapper.updateById(stock);
}
checkLog(stock);
@ -779,17 +713,8 @@ public class PlcService {
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond", s);
WebSocketVo<PlcCmdInfo> webSocketVo = WebSocketVo.<PlcCmdInfo>builder()
.message(plcCmdInfo)
.messageType("object")
.type("InventoryPush")
.build();
try {
WebSocketServer.sendInfo(JSONObject.toJSONString(webSocketVo), "");
} catch (IOException e) {
throw new RuntimeException(e);
}
return true;
return algorithmPojo;
}
@ -862,4 +787,136 @@ public class PlcService {
return configProperties;
}
public KsecDataInfo orderDecoder(KsecInfo ksecInfo) {
KsecDataInfo dataInfo = ksecInfo.getData();
if (Cmd.A.name().equals(ksecInfo.getType())) {
return dataInfo;
}
String lotnum = dataInfo.getLotnum();
PlcCmdInfo plcCmdInfo = null;
String srmNumber = null;
String cmdName = null;
if(dataInfo != null){
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);
plcCmdInfo.setFromDirection(dataInfo.getFromDirection());
plcCmdInfo.setToDirection(dataInfo.getToDirection());
plcCmdInfo.setToColumn(dataInfo.getToColumn());
plcCmdInfo.setToRow(dataInfo.getToRow());
plcCmdInfo.setFromRow(dataInfo.getFromRow());
plcCmdInfo.setFromColumn(dataInfo.getFromColumn());
plcCmdInfo.setFromSide(dataInfo.getFromSide());
plcCmdInfo.setFromSeparation(dataInfo.getFromSeparation());
plcCmdInfo.setToSeparation(dataInfo.getToSeparation());
plcCmdInfo.setToSide(dataInfo.getToSide());
//左右不换过来
if(dataInfo.getFromDirection() == 1){
//dataInfo.setFromDirection(2);
plcCmdInfo.setLeftRight1(dataInfo.getFromDirection());
}else {
//dataInfo.setFromDirection(1);
plcCmdInfo.setLeftRight1(dataInfo.getFromDirection());
}
if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){
//dataInfo.setToDirection(2);
plcCmdInfo.setLeftRight2(dataInfo.getToDirection());
}else {
//dataInfo.setToDirection(1);
plcCmdInfo.setLeftRight2(dataInfo.getToDirection());
}
srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName();
}
if (Cmd.A.name().equals(ksecInfo.getType())) {
//心跳
log.debug("receieve heart ");
} else if (Cmd.B.name().equals(ksecInfo.getType())) {
//任务
if (Cmd.B1.name().equals(cmdName)) {
//昆船盘点模式下也会发B1 ,但是不会发送B2
//这里判断下,是否存在盘点批次号 若存在既是盘点的B1,无需处理若不存在lotnum则是随行的B1
if(StringUtils.isEmpty(dataInfo.getLotnum())){
//任务开始 旋转到原点位
gyrateCamera(plcCmdInfo,Cmd.C5.name());
orderStart(plcCmdInfo);
}else {
log.info("check move");
}
} else if (Cmd.B2.name().equals(cmdName)) {
//B2 C4 一起发的需要停止等B2
//这里判断是不是双伸
if(plcCmdInfo.getSeparation2() == 2){
//深测货架延迟
try {
Thread.sleep(getConfigProperties().getCameraConfig().getB2OutDelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//浅侧延迟
try {
Thread.sleep(getConfigProperties().getCameraConfig().getB2DelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
gyrateCamera(plcCmdInfo,Cmd.C5.name());
orderStop(plcCmdInfo);
}
} else if (Cmd.C.name().equals(ksecInfo.getType())) {
//动作
String code = dataInfo.getCmdName();
log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (Cmd.isBaseAction(code)) {
//执行动作,需要保存执行到第几步了
Integer times = GoodsActionTimes.get(dataInfo.getCmdName());
plcCmdInfo.setTimes(times);
code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times);
//执行动作
try {
action(plcCmdInfo, times, code);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
log.info("other C code :{}",code);
}
} else if (Cmd.D.name().equals(ksecInfo.getType())) {
//柳州去掉告警
// String code = dataInfo.getCmdName();
// if(code.equals(Cmd.D1.name())){
// log.info("plcId:{},warn start",plcCmdInfo.getPlcId());
// //根据告警code转动camera
// String warnCode = dataInfo.getWarnCode();
// if(!StringUtils.isEmpty(warnCode)){
// String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0];
// plcService.warnAction(plcCmdInfo,warnCode0);
// }
// plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode());
// }else if(code.equals(Cmd.D2.name())){
// log.info("plcId:{},warn stop",plcCmdInfo.getPlcId());
// plcService.warnStop(plcCmdInfo.getPlcId());
// }else {
// log.info("other D code :{}",code);
// }
} else if (Cmd.E.name().equals(ksecInfo.getType()) ) {
String code = dataInfo.getCmdName();
log.info("盘点指令:{}", ksecInfo);
AlgorithmPojo algorithmPojo = check(plcCmdInfo,ksecInfo.getType(),dataInfo);
ksecInfo.getData().setAckStatus(1);
dataInfo.setResult(algorithmPojo.getResult());
dataInfo.setGoodsTypeResult(algorithmPojo.getGoodsTypeResult());
dataInfo.setGoodsNumberResult(algorithmPojo.getGoodsNumberResult());
log.info("盘点完成");
}
return dataInfo;
}
}

@ -20,8 +20,12 @@ public class StockLogService {
public PageInfo<StockLog> page(StockLogSearch search){
PageHelper.startPage(search.getPageNum(),search.getPageSize());
List<StockLog> stockLogs =
stockLogMapper.selectList(new QueryWrapper<StockLog>().eq("`row`",search.getRow()).eq("`column`",search.getColumn()).eq("street_id",search.getStreetId()).eq("direction",search.getDirection()).eq("side",search.getSide()));
List<StockLog> stockLogs = stockLogMapper.selectList(new QueryWrapper<StockLog>()
.eq("`row`",search.getRow())
.eq("`column`",search.getColumn())
.eq("street_id",search.getStreetId())
.eq("direction",search.getDirection())
.eq("side",search.getSide()));
return new PageInfo<>(stockLogs);
}
}

@ -415,7 +415,7 @@ public class StockService {
Integer oldStatus = stock.getStatus();
String oldCategory = stock.getCategory();
Integer count = stock.getCount();
stock.setStatus(StockStatus.ERROR.getStatus());
stock.setStatus(StockStatus.MANUAL.getStatus());
stock.setCategory(checkByMan.getCategory());
stock.setCount(checkByMan.getCount());
stockMapper.updateById(stock);

@ -117,6 +117,7 @@ public class StreetService {
Street street = streetMapper.getStreetByPlcId(plcId);
if (street == null) {
log.error("巷道不存在plcId:{}", plcId);
Assert.isTrue(false, "巷道不存在");
}
return street;
}

@ -45,7 +45,7 @@ public class TestService {
PlcCmdInfo plcCmdInfo = new PlcCmdInfo(street.getPlcId(),taskId,1,leftRight,j,i,1,1,1,1,1,1,"");
plcCmdInfo.setTimes(1);
int co = j%3 + 1;
plcService.check(plcCmdInfo,"E"+co,code,code);
// plcService.check(plcCmdInfo,"E"+co,code,code);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {

@ -0,0 +1,49 @@
package com.zhehekeji.web.service.algorithm;
import com.baomidou.mybatisplus.extension.api.R;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.AlgorithmPojo;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.service.ksec.KsecDataInfo;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@Service
public class AlgorithmService {
@Resource
RestTemplate restTemplate;
@Resource
ConfigProperties configProperties;
public AlgorithmPojo getGoodResult(AlgorithmPojo algorithmPojo) {
String url = "http://"+algorithmPojo.getIp()+":"+algorithmPojo.getPort()+configProperties.getVisualSense().getUrl();
ResponseEntity<AlgorithmPojo> body = null;
try {
body = restTemplate.postForEntity(url, algorithmPojo, AlgorithmPojo.class);
}catch (RestClientException e){
//Assert.isTrue(false,"请求失败,视觉服务未连接");
e.printStackTrace();
}
return body.getBody();
}
public AlgorithmPojo getGoodResult(Street street, KsecDataInfo dataInfo ) {
AlgorithmPojo algorithmPojo = AlgorithmPojo.buildAlgorithmPojo(street, dataInfo);
if(configProperties.getVisualSense().getAble()) {
algorithmPojo = getGoodResult(algorithmPojo);
}else {
algorithmPojo.setResult(1);
algorithmPojo.setGoodsNumberResult(algorithmPojo.getGoodsNumber());
algorithmPojo.setGoodsTypeResult(algorithmPojo.getGoodsType());
}
return algorithmPojo;
}
}

@ -1,10 +1,12 @@
package com.zhehekeji.web.service.ksec;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.core.annotation.AliasFor;
@Data
public class KsecDataInfo {
@JsonProperty( value= "SRMNumber")
private String SRMNumber;
private String cmdName;
@ -42,5 +44,10 @@ public class KsecDataInfo {
/**
*
*/
private String lotnum;
private String goodsType;
private Integer goodsNumber;
private String goodsTypeResult;
private Integer goodsNumberResult;
private Integer result = 1;
private String lotnum ;
}

@ -77,136 +77,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
// 去掉首尾标识符
body = body.substring(1, body.length());
KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class);
if (Cmd.A.name().equals(ksecInfo.getType())) {
in.release();
return ;
}
KsecDataInfo dataInfo = ksecInfo.getData();
String lotnum = dataInfo.getLotnum();
PlcCmdInfo plcCmdInfo = null;
String srmNumber = null;
String cmdName = null;
if(dataInfo != null){
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);
plcCmdInfo.setFromDirection(dataInfo.getFromDirection());
plcCmdInfo.setToDirection(dataInfo.getToDirection());
plcCmdInfo.setToColumn(dataInfo.getToColumn());
plcCmdInfo.setToRow(dataInfo.getToRow());
plcCmdInfo.setFromRow(dataInfo.getFromRow());
plcCmdInfo.setFromColumn(dataInfo.getFromColumn());
plcCmdInfo.setFromSide(dataInfo.getFromSide());
plcCmdInfo.setFromSeparation(dataInfo.getFromSeparation());
plcCmdInfo.setToSeparation(dataInfo.getToSeparation());
plcCmdInfo.setToSide(dataInfo.getToSide());
//左右不换过来
if(dataInfo.getFromDirection() == 1){
//dataInfo.setFromDirection(2);
plcCmdInfo.setLeftRight1(dataInfo.getFromDirection());
}else {
//dataInfo.setFromDirection(1);
plcCmdInfo.setLeftRight1(dataInfo.getFromDirection());
}
if(dataInfo.getToDirection() != null && dataInfo.getToDirection() == 1){
//dataInfo.setToDirection(2);
plcCmdInfo.setLeftRight2(dataInfo.getToDirection());
}else {
//dataInfo.setToDirection(1);
plcCmdInfo.setLeftRight2(dataInfo.getToDirection());
}
srmNumber = dataInfo.getSRMNumber();
cmdName = dataInfo.getCmdName();
}
if (Cmd.A.name().equals(ksecInfo.getType())) {
//心跳
log.debug("receieve heart ");
} else if (Cmd.B.name().equals(ksecInfo.getType())) {
//任务
if (Cmd.B1.name().equals(cmdName)) {
//昆船盘点模式下也会发B1 ,但是不会发送B2
//这里判断下,是否存在盘点批次号 若存在既是盘点的B1,无需处理若不存在lotnum则是随行的B1
if(StringUtils.isEmpty(dataInfo.getLotnum())){
//任务开始 旋转到原点位
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStart(plcCmdInfo);
}else {
log.info("check move");
}
} else if (Cmd.B2.name().equals(cmdName)) {
//B2 C4 一起发的需要停止等B2
//这里判断是不是双伸
if(plcCmdInfo.getSeparation2() == 2){
//深测货架延迟
try {
Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//浅侧延迟
try {
Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name());
plcService.orderStop(plcCmdInfo);
}
} else if (Cmd.C.name().equals(ksecInfo.getType())) {
//动作
String code = dataInfo.getCmdName();
log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (Cmd.isBaseAction(code)) {
//执行动作,需要保存执行到第几步了
Integer times = GoodsActionTimes.get(dataInfo.getCmdName());
plcCmdInfo.setTimes(times);
code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times);
//执行动作
try {
plcService.action(plcCmdInfo, times, code);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
log.info("other C code :{}",code);
}
} else if (Cmd.D.name().equals(ksecInfo.getType())) {
//柳州去掉告警
// String code = dataInfo.getCmdName();
// if(code.equals(Cmd.D1.name())){
// log.info("plcId:{},warn start",plcCmdInfo.getPlcId());
// //根据告警code转动camera
// String warnCode = dataInfo.getWarnCode();
// if(!StringUtils.isEmpty(warnCode)){
// String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0];
// plcService.warnAction(plcCmdInfo,warnCode0);
// }
// plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode());
// }else if(code.equals(Cmd.D2.name())){
// log.info("plcId:{},warn stop",plcCmdInfo.getPlcId());
// plcService.warnStop(plcCmdInfo.getPlcId());
// }else {
// log.info("other D code :{}",code);
// }
} else if (Cmd.E.name().equals(ksecInfo.getType()) ) {
//rfid的逻辑
String code = dataInfo.getCmdName();
log.info("盘点指令:{}", ksecInfo);
plcService.check(plcCmdInfo,ksecInfo.getType(),dataInfo.getCode(),dataInfo.getTrayCode());
ksecInfo.getData().setAckStatus(1);
ctx.channel().writeAndFlush(ksecInfo);
log.info("盘点完成");
}
//找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
}

@ -77,7 +77,8 @@ lightSource:
index: 1
# -----tray 托盘
# -----goods 货物
# 扫码模式 0:此处不盘点 1球机扫码 2sick扫码枪 3:南北达RFID
# 扫码模式 0:此处不盘点 1球机扫码 2sick扫码枪 3:南北达RFID 4.视觉控制器
#该项目只支持视觉控制器
scanCodeMode:
tray: 1
goods: 0
@ -87,8 +88,9 @@ scanCodeMode:
- 14
# 照片 視頻保存多久
deleteFileDays: 365
visualSense:
url: "/api/test/2"
able: false
#rfid
rfid:
#rfid连续扫描时间默认5s 单位s

Loading…
Cancel
Save