package com.zy.acs.manager.core.integrate.conveyor; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.common.config.ConveyorProperties; import com.zy.acs.manager.common.utils.HttpGo; import com.zy.acs.manager.core.integrate.dto.ConveyorStaDto; import com.zy.acs.manager.core.integrate.dto.HttpResult; import com.zy.acs.manager.manager.entity.Segment; import com.zy.acs.manager.manager.entity.Sta; import com.zy.acs.manager.manager.entity.Task; import com.zy.acs.manager.manager.enums.StaReserveType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class SiemensConveyorStationService implements ConveyorStationService { @Autowired private ConveyorProperties conveyorProperties; private HttpGo http; @PostConstruct public void init() { this.http = HttpGo.builder() .connectTimeout(Duration.ofSeconds(8)) .readTimeout(Duration.ofSeconds(15)) // .defaultHeader("User-Agent", "HttpGo/1.0") // .trustAllSsl(true) // ONLY if you really need it (self-signed internal) .build(); } @Override public boolean allowAgvWork(Sta sta, Task task, Segment seg, StaReserveType type) { final String staNo = sta.getStaNo(); // url String url = this.buildUrl("/station/query"); // headers Map headers = new HashMap<>(); // params Map params = new HashMap<>(); List list = new ArrayList<>(); list.add(staNo); params.put("staNos", list); // do request HttpResult> result; try { result = postForResult(url, headers, params); Integer code = result.getCode(); if (null == code || 200 != code) { return false; } List dtoList = result.getData(); if (Cools.isEmpty(list)) { return false; } ConveyorStaDto staDto = dtoList.stream() .filter(dto -> !Cools.isEmpty(dto.getStaNo()) && dto.getStaNo().equals(staNo)) .findFirst().orElse(null); if (null == staDto) { return false; } if (!staDto.getOnline()) { return false; } // outbound: checkout nothing and inEnable if (type.equals(StaReserveType.IN)) { if (staDto.getOccupied()) { return false; } if (!staDto.getInEnable()) { return false; } } // inbound: checkout occupied and outEnable if (type.equals(StaReserveType.OUT)) { if (!staDto.getOccupied()) { return false; } if (!staDto.getOutEnable()) { return false; } } } catch (Exception e) { log.error("Conveyor query failed, FAIL-OPEN. staNo={}, taskId={}, type={}", sta.getStaNo(), task.getSeqNum(), type, e); return false; } // ok return true; } private String buildUrl(String path) { String host = conveyorProperties.getHost(); Integer port = conveyorProperties.getPort(); String p = (path == null) ? "" : (path.startsWith("/") ? path : ("/" + path)); return "http://" + host + ":" + port + p; } private HttpResult> postForResult(String url , Map headers, Map params) throws Exception { String json = JSON.toJSONString(params); HttpGo.HttpResponse response = this.http.postJson(url, headers, json); int status = response.statusCode(); if (status != 200) { throw new RuntimeException("Conveyor HTTP error: status=" + status + ", body=" + response.body()); } String body = response.body(); if (Cools.isEmpty(body)) { throw new RuntimeException("Conveyor empty response body."); } HttpResult> result = JSON.parseObject(body, new TypeReference>>() {}); if (result == null) { throw new RuntimeException("Conveyor parse HttpResult failed: body=" + body); } return result; } }