1.不采用缓存

2.照片采用和视觉控制器相连
bozhou-古井贡酒
LAPTOP-S9HJSOEB\昊天 2 years ago
parent 1335eed45a
commit 1960790526

@ -18,6 +18,11 @@
</properties>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!--websocket支持包-->
<dependency>
<groupId>org.springframework.boot</groupId>

@ -0,0 +1,143 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.pojo.Cmd;
import com.zhehekeji.web.service.GoodsActionTimes;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
@Api(value = "client",tags = "球机管理")
@RestController
@RequestMapping("/北起服务管理")
@Slf4j
public class BQClientController {
@Resource
PlcService plcService;
@PostMapping("/message")
@ApiOperation(value = "分类导入")
public Result distribute(KsecInfo ksecInfo) throws IOException {
KsecDataInfo dataInfo = ksecInfo.getData();
String lotnum = dataInfo.getLotnum();
PlcCmdInfo plcCmdInfo = null;
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();
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())) {
// plcService.check()
}
//找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
return null;
}
}

@ -297,8 +297,8 @@ public class CameraControlController {
public Result pic(@PathVariable Integer id) {
checkLogin(id);
String path = "D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".jpeg";
TaskDelayExecutor.addPicDelayTask(id,path,2000L);
return Result.success();
TaskDelayExecutor.addPicDelayTask(id,path,0L);
return Result.success(path);
}
@Resource
@ -319,6 +319,7 @@ public class CameraControlController {
return Result.success();
}
@PostMapping("/mp4/{id}")
@ApiOperation(value = "录像")
public Result MP4(@PathVariable Integer id) {

@ -132,7 +132,7 @@ public class CameraController {
@PostMapping("/io/toPtz")
@ApiOperation(value = "转至球机IO配置点")
public Result toPtz(@RequestBody CameraIOPtz req) {
Integer ptzId = cameraService.getPtzId(req.getCameraIOId());
Integer ptzId = cameraService.getPtzId(req.getCameraIOId(),req.getCode(),req.getCameraId());
cameraControlModule.toPtz(ptzId,req.getCameraId());
return Result.success();
}

@ -75,8 +75,8 @@ public class PLCController {
@GetMapping("/orderAction")
@ApiOperation(value = "执行的工单情况")
public Result<Map> orderAction(){
return Result.success(GoodsActionTimes.get());
public Result<Integer> orderAction(){
return Result.success(GoodsActionTimes.get(""));
}
}

@ -32,18 +32,11 @@ public class TestController {
}
@ApiOperation("自动盘点")
@GetMapping("/1")
public Result test(){
RFIDSocket rfidSocket = new RFIDSocket("127.0.0.1", 4001);
rfidSocket.startCheck(1,true);
try {
Thread.sleep(1000*15);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
rfidSocket.stopCheck();
System.out.println(rfidSocket.getTags());
@PostMapping("/1")
public Result test(@RequestBody String id){
System.out.println("656+565+29+5" +
"62+95+65");
return Result.success();
}

@ -87,5 +87,22 @@ public class Stock {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime exportTime;
@TableField(exist=false)
private String topPic1;
@TableField(exist=false)
private String topPic2;
@TableField(exist=false)
private String sidePic1;
@TableField(exist=false)
private String sidePic2;
@TableField(exist=false)
private String sidePic3;
@TableField(exist=false)
private String sidePic4;
}

@ -9,56 +9,5 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class OrderRealtime {
/**
* key :streetId
* value:
*/
private static Map<Integer, String> orderMap = new ConcurrentHashMap<>();
/**
* key: streetId
* value:id warn
*/
private static Map<Integer, Long> warnIdMap = new ConcurrentHashMap<>();
public static void startOrder(Integer streetId, String orderNum) {
orderMap.put(streetId, orderNum);
}
/**
*
*
* @param streetId
* @return
*/
public static String getOrderByStreetId(Integer streetId) {
return orderMap.get(streetId);
}
public static void startWarn(Integer streetId, Long warnId) {
if (warnId != null) {
warnIdMap.put(streetId, warnId);
}
}
public static Long getWarnId(Integer streetId) {
return warnIdMap.get(streetId);
}
public static void cleanWarn(Integer streetId) {
warnIdMap.remove(streetId);
}
/**
*
*
* @param streetId
* @return
*/
public static String stopOrder(Integer streetId) {
String orderNum = orderMap.get(streetId);
orderMap.remove(streetId);
return orderNum;
}
}

@ -245,7 +245,7 @@ public class CameraService {
* @param IOId
* @param cameraId
*/
@CacheEvict(value = "ptz",key = "#cameraId+'-'+#code")
public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type,String code) {
Camera camera = cameraMapper.selectById(cameraId);
Assert.notNull(camera, "球机不存在");
@ -295,7 +295,6 @@ public class CameraService {
* @param cameraId
* @return
*/
@Cacheable(value = "ptz",key = "#cameraId+'-'+#code")
public Integer getPtzIdByCodeAndCameraId(String code,Integer cameraId){
CameraIO cameraIO = ioMapper.getByCodeAndCameraId(code,cameraId);
if(cameraIO != null){
@ -304,10 +303,28 @@ public class CameraService {
return null;
}
public Integer getPtzId(Integer ioId){
public Integer getPtzId(Integer ioId,String code,Integer cameraId){
if (ioId != null && ioId!= 0){
CameraIO cameraIO = ioMapper.selectById(ioId);
Assert.notNull(cameraIO,"IO配置不存在");
return cameraIO.getPtzId();
}else {
if (code != null && !"".equals(code)) {
Assert.notNull(null,"IO配置不存在");
return null;
} else {
CameraIO cameraIO = ioMapper.selectOne(new QueryWrapper<CameraIO>()
.eq("code", code)
.eq("camera_id", cameraId)
.last("limit 1"));
Assert.notNull(cameraIO,"IO配置不存在");
return cameraIO.getPtzId();
}
}
}
private void conver(CameraIO cameraIO,Integer type){

@ -15,38 +15,8 @@ import java.util.Map;
@Slf4j
public class GoodsActionTimes {
private static Map<String, Integer> orderActions = new HashMap<>();
/**
*
* 4
*
* @param orderNum
* @return
*/
public static Integer put(String orderNum) {
//对订单号加锁 统计数量
synchronized (orderNum.intern()) {
if (orderActions.get(orderNum) == null) {
orderActions.put(orderNum, 1);
return 1;
}
int times = orderActions.get(orderNum);
times++;
//该订单的任务达到4次了不会再有任务了清除缓存
//具体看取货、放货、货物库内转移的流程
if (times >= 4) {
log.info("remove oderNum:{},times:{}", orderNum, times);
orderActions.remove(orderNum);
} else {
orderActions.put(orderNum, times);
log.info("oderNum:{},times:{}", orderNum, times);
}
return times;
}
}
public static Map<String, Integer> get() {
return orderActions;
public static Integer get(String cmdCode) {
return Integer.parseInt(cmdCode.replace("C",""));
}
}

@ -0,0 +1,53 @@
package com.zhehekeji.web.service.HttpServe;
import com.google.gson.Gson;
import org.apache.http.entity.StringEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
public class HttpService {
public String sendHttp(){
RestTemplate restTemplate = new RestTemplate();
/* // 发送 GET 请求
String url = "http://example.com/api/getData";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
String responseBody = response.getBody();*/
// 发送 POST 请求
String url = "http://example.com/api/postData";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map<String, Object> body = new HashMap<>();
body.put("key1", "value1");
body.put("key2", "value2");
// 创建Gson对象
Gson gson = new Gson();
String jsonString = gson.toJson(body);
// StringEntity entity = new StringEntity("", headers);
restTemplate.postForEntity(url, jsonString, String.class);
System.out.println();
return null;
}
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
Map<String, Object> body = new HashMap<>();
body.put("key1", "value1");
body.put("key2", "value2");
// 创建Gson对象
Gson gson = new Gson();
String jsonString = gson.toJson(body);
// StringEntity entity = new StringEntity("", headers);
ResponseEntity<String> response =restTemplate.postForEntity("http://127.0.0.1:8099/api/test/1", jsonString, String.class);
System.out.println(jsonString);
}
}

@ -154,7 +154,6 @@ public class PlcService {
//取货是是不知道放货的位置的所以订单开始的时候只写1位置
//订单结束写2位置
orderMapper.insert(order);
OrderRealtime.startOrder(street.getId(), plcCmdInfo.getOrderNum());
}
}
@ -176,7 +175,6 @@ public class PlcService {
log.error("订单结束信号订单不存在orderNum:{}", plcCmdInfo.getOrderNum());
return;
}
OrderRealtime.stopOrder(street.getId());
Order update = new Order();
update.setId(order.getId());
update.setEndTime(endTime);
@ -438,15 +436,13 @@ public class PlcService {
}
synchronized (plcId.intern()) {
//新增 告警
if (OrderRealtime.getWarnId(street.getId()) != null) {
log.debug("{}:exist warn", plcId);
return;
}
//不存在正在执行的告警记录,就新增
Warn warn = new Warn();
warn.setStartTime(LocalDateTime.now());
warn.setStreetId(street.getId());
String orderNum = OrderRealtime.getOrderByStreetId(street.getId());
//暂时不处理
String orderNum = "";
if (StringUtils.isEmpty(orderNum)) {
log.debug("{}:warn start...., but no order running", plcId);
} else {
@ -466,7 +462,6 @@ public class PlcService {
//没有正在执行的工单 不需要填写location
warn.setSignal(signal);
warnMapper.insert(warn);
OrderRealtime.startWarn(street.getId(), warn.getId());
}
}
@ -483,11 +478,10 @@ public class PlcService {
return;
}
synchronized (plcId.intern()) {
Long warnId = OrderRealtime.getWarnId(street.getId());
//暂时不做处理
Long warnId = 0L;
if (warnId != null) {
//存在告警
//先内存中清除该告警
OrderRealtime.cleanWarn(street.getId());
Warn warn = warnMapper.selectById(warnId);
if (warn != null) {
//结束该告警,并录像

@ -320,6 +320,7 @@ public class StockService {
*/
public Stock stockInfo(StockCheck stockCheck) {
Street street = streetService.streetById(stockCheck.getStreetId());
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(stockCheck.getStreetId(),stockCheck.getDirection(),stockCheck.getSide(), stockCheck.getRow(), stockCheck.getColumn());
if(stock == null){
stock = new Stock();
@ -327,10 +328,8 @@ public class StockService {
stock.setRow(stockCheck.getRow());
//stock.setShelveId(stockCheck.getShelveId());
stock.setStatus(0);
Street street = streetMapper.selectById(stockCheck.getStreetId());
stock.setStreetName(street.getName());
}else {
Street street = streetMapper.selectById(stock.getStreetId());
stock.setStreetName(street.getName());
}
//不再需要操作照片
@ -341,14 +340,29 @@ public class StockService {
stock.setOveroperationPic(stockLogs.get(0).getPic());
stock.setPreoperationPic(stockLogs.get(1).getPic());
}
String ip ="http://"+ street.getPlcIp()+":9009/pic/"+stock.getCode()+"/"+stock.getCheckNum()+"/";
stock.setSidePic1(String.format("%s1.png",ip));
stock.setSidePic2(String.format("%s2.png",ip));
stock.setSidePic3(String.format("%s3.png",ip));
stock.setSidePic4(String.format("%s4.png",ip));
stock.setTopPic1(String.format("%s5.png",ip));
stock.setTopPic2(String.format("%s6.png",ip));
return stock;
}
public Stock stock(StockCheckSearch stockCheckSearch){
// String shelveId = streetService.getShevelId(stockCheckSearch.getSRMNumber(),stockCheckSearch.getDirection(),stockCheckSearch.getSeparation());
// Assert.notNull(shelveId,"无该货架信息");
Street street = streetService.getStreetByPlcId(stockCheckSearch.getSRMNumber());
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),stockCheckSearch.getDirection(),stockCheckSearch.getSeparation(),stockCheckSearch.getRow(),stockCheckSearch.getColumn());
if(stock != null){
String ip ="http://"+ street.getPlcIp()+":9009/pic/"+stock.getCode()+"/"+stock.getLotnum()+"/"+stock.getLotnum()+"/";
stock.setSidePic1(String.format("%s1.png",ip));
stock.setSidePic2(String.format("%s2.png",ip));
stock.setSidePic3(String.format("%s3.png",ip));
stock.setSidePic4(String.format("%s4.png",ip));
stock.setTopPic1(String.format("%s5.png",ip));
stock.setTopPic2(String.format("%s6.png",ip));
}
return stock;
}

@ -56,15 +56,7 @@ public class StreetService {
@Transactional(rollbackFor = Exception.class)
@Caching(
put = {
@CachePut(value = {"street"},key = "#streetVO.id"),
@CachePut(value = {"streetByPlcId"},key = "#streetVO.plcId"),
},
evict = {
@CacheEvict(value = "getStreetCount")
}
)
public Street add(StreetVO streetVO) {
Street street = new Street();
BeanUtils.copyProperties(streetVO,street);
@ -121,7 +113,6 @@ public class StreetService {
@Cacheable(value = "streetByPlcId",key = "#plcId")
public Street getStreetByPlcId(String plcId) {
Street street = streetMapper.getStreetByPlcId(plcId);
if (street == null) {
@ -131,10 +122,6 @@ public class StreetService {
}
@Caching(evict = {
@CacheEvict(value = "street",key = "#id"),
@CacheEvict(value = "getStreetCount")
})
public void del(Integer id) {
Street street = streetMapper.selectById(id);
if(street != null){
@ -149,18 +136,11 @@ public class StreetService {
StreetConn.del(id);
}
//只是为了删除缓存
@CacheEvict(value = "streetByPlcId",key = "#{plcId}")
public void delByPlcId(String plcId){
return;
}
@Caching(
evict = {
@CacheEvict(value = "street",key="#streetVO.id"),
@CacheEvict(value = "streetByPlcId",key="#streetVO.plcId"),
}
)
public void edit(StreetVO streetVO) {
Street street = new Street();
BeanUtils.copyProperties(streetVO,street);
@ -196,7 +176,8 @@ public class StreetService {
RFIDConfig(streetVO,street.getId());
}
@Cacheable(value = "street",key = "#id")
public Street streetById(Integer id) {
return streetMapper.selectById(id);
}

@ -165,7 +165,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString());
if (Cmd.isBaseAction(code)) {
//执行动作,需要保存执行到第几步了
Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
Integer times = GoodsActionTimes.get(dataInfo.getCmdName());
plcCmdInfo.setTimes(times);
code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times);
//执行动作

@ -127,7 +127,7 @@ public class ProtocolDecoder extends FixedLengthFrameDecoder {
log.info("action code,{} plcId:{},orderInfo:{}", code, plcId, plcCmdInfo.toString());
if(code.equals("C1") || code.equals("C2") || code.equals("C3") || code.equals("C4")){
// 只有取放货的命令 才能增加 times
Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum());
Integer times = GoodsActionTimes.get(code);
//执行动作
plcService.action(plcCmdInfo, times, code);
}

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

Loading…
Cancel
Save