package com.zy.common.route; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.zy.asrs.entity.AgvInfo; import com.zy.asrs.entity.rcs.RcsReporterEqpt; import com.zy.asrs.entity.rcs.RcsReporterTask; import com.zy.asrs.entity.rcs.RcsReturn; import com.zy.asrs.mapper.AgvInfoMapper; import com.zy.asrs.service.RcsService; import com.zy.asrs.service.impl.RcsServiceImpl; import lombok.Value; import lombok.extern.slf4j.Slf4j; import org.apache.tika.utils.StringUtils; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; @Slf4j @Component public class RouteFilter implements HandlerInterceptor { private static final String[] WAREHOUSE_CODE = {"dj", "jg", "ljq", "hk"}; // private static final String[] WAREHOUSE = {"刀具库", "加工库", "联结器装配库", "滑块库"}; // @Value("${mes}") private static Integer CURRENT_WMS_ID = 4; //滑块 @Resource private RcsService rcsService; @Resource private AgvInfoMapper agvInfoMapper; // 请求前 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // if (findIndex(request) != CURRENT_WMS_ID) { // // 转发 // // 获取RequestDispatcher对象 // RequestDispatcher dispatcher = request.getRequestDispatcher("/SecondServlet"); // // // 转发请求到SecondServlet // dispatcher.forward(request, response); // //// forward(request); // } forward(request, response); // long startTime = System.currentTimeMillis(); // System.out.println("preHandle,In:" + startTime); // request.setAttribute("startTime", startTime); return true; } // TODO:请求转发与响应重定向 //TODO:HttpServletRequest读取一次后不能再使用,需重构下逻辑顺序 private void forward(HttpServletRequest request, HttpServletResponse response) throws IOException { String url = request.getRequestURI(); StringBuilder body = new StringBuilder(); BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8)); String line; while ((line = in.readLine()) != null) { body.append(line); } JSONObject bodyJson = JSONObject.parseObject(body.toString()); String singleRobotCode = bodyJson.getString("singleRobotCode"); if (!StringUtils.isBlank(singleRobotCode)) { //任务回馈接口 int index = findIndex(singleRobotCode); if (index != CURRENT_WMS_ID) { String wmsId = WAREHOUSE_CODE[index - 1]; //存储所有AGV所属库区 url = url.replace(WAREHOUSE_CODE[CURRENT_WMS_ID - 1], wmsId); // 转发 String returns = RcsServiceImpl.sendPost(url, body.toString()); log.info("转发请求url:{},body:{},返回:{}", url, body, returns); response(response, returns); } else { // 内部逻辑处理 RcsReporterTask param = JSONObject.toJavaObject(bodyJson, RcsReporterTask.class); RcsReturn rcsReturn = rcsService.reporterTask(param); response(response, rcsReturn.toString()); } } else { //请求外设(封锁区),封锁区由当前程序管理不转发 RcsReporterEqpt param = JSONObject.toJavaObject(bodyJson, RcsReporterEqpt.class); RcsReturn rcsReturn = rcsService.reporterEqpt(param); response(response, rcsReturn.toString()); } } private int findIndex(String agvNo) { AgvInfo agvInfo = agvInfoMapper.selectById(agvNo); if (agvInfo != null) { return Integer.parseInt(agvInfo.getBelongArea()); } return -1; } public static void response(HttpServletResponse response, String baseRes){ response.setCharacterEncoding("utf-8"); response.setContentType("application/json; charset=utf-8"); try (PrintWriter out = response.getWriter()) { out.print(JSON.toJSONString(baseRes)); out.flush(); } catch (Exception e) { log.error(e.getMessage(), e); // e.printStackTrace(); } } // public static void response(HttpServletResponse response, String baseRes){ // response.setCharacterEncoding("utf-8"); // response.setContentType("application/json; charset=utf-8"); // try (PrintWriter out = response.getWriter()) { // R r = R.parse(baseRes); // JSONObject jsonObject = new JSONObject(); // jsonObject.put("total", "0"); // jsonObject.put("record", ""); // r.add(jsonObject); // out.print(JSON.toJSONString(r)); // out.flush(); // } catch (Exception e) { // e.printStackTrace(); // } // } // /** // * 设置webflux模型响应 // * // * @param response ServerHttpResponse // * @param contentType content-type // * @param status http状态码 // * @param code 响应状态码 // * @param value 响应内容 // * @return Mono // */ // public static Mono webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) // { // response.setStatusCode(status); // response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); // RcsReturn result = RcsReturn.fail(code, value.toString()); // DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes()); // return response.writeWith(Mono.just(dataBuffer)); // } }