233 lines
9.6 KiB
Plaintext
233 lines
9.6 KiB
Plaintext
<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8" %>
|
||
<%@ page import="java.io.*" %>
|
||
<%@ page import="java.net.*" %>
|
||
<%@ page import="java.util.*" %>
|
||
<%@ page import="org.json.JSONObject" %>
|
||
<%@ page import="org.json.JSONArray" %>
|
||
|
||
<%
|
||
// 跨域指标查询代理 JSP
|
||
// 用途:调用 C# MetricsController 的 API 端点,解决跨域问题
|
||
|
||
response.setHeader("Access-Control-Allow-Origin", "*");
|
||
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
||
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
||
|
||
String action = request.getParameter("action");
|
||
String handoverNumber = request.getParameter("handoverNumber");
|
||
String neutralWaybillNumber = request.getParameter("neutralWaybillNumber");
|
||
String date = request.getParameter("date");
|
||
String startDate = request.getParameter("startDate");
|
||
String endDate = request.getParameter("endDate");
|
||
String waybillsJson = request.getParameter("waybills");
|
||
String callback = request.getParameter("callback");
|
||
|
||
// 获取响应格式 (JSON 或 JSONP)
|
||
String format = request.getParameter("format");
|
||
if (format == null) {
|
||
format = (callback != null && !callback.isEmpty()) ? "jsonp" : "json";
|
||
}
|
||
|
||
// 获取基础URL
|
||
String environment = request.getParameter("env");
|
||
if (environment == null) {
|
||
environment = "test";
|
||
}
|
||
|
||
String baseUrl;
|
||
if ("local".equals(environment)) {
|
||
baseUrl = "http://localhost:5002";
|
||
} else if ("production".equals(environment)) {
|
||
baseUrl = "https://lr.tooexp.com";
|
||
} else {
|
||
baseUrl = "http://172.232.21.79:5002";
|
||
}
|
||
|
||
String apiUrl = null;
|
||
JSONObject resultJson = new JSONObject();
|
||
|
||
try {
|
||
if ("getLabelRate".equals(action)) {
|
||
// 获取标签率
|
||
if (handoverNumber == null || handoverNumber.isEmpty()) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "handoverNumber is required");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/label-rate?handoverNumber=" + URLEncoder.encode(handoverNumber, "UTF-8");
|
||
}
|
||
}
|
||
else if ("getOrderAssessment".equals(action)) {
|
||
// 获取订单评估
|
||
if (neutralWaybillNumber == null || neutralWaybillNumber.isEmpty()) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "neutralWaybillNumber is required");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/order-assessment?neutralWaybillNumber=" + URLEncoder.encode(neutralWaybillNumber, "UTF-8");
|
||
}
|
||
}
|
||
else if ("getDailySummary".equals(action)) {
|
||
// 获取每日汇总
|
||
if (date != null && !date.isEmpty()) {
|
||
apiUrl = baseUrl + "/api/metrics/daily-summary?date=" + URLEncoder.encode(date, "UTF-8");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/daily-summary";
|
||
}
|
||
}
|
||
else if ("getDailySummaries".equals(action)) {
|
||
// 获取日期范围汇总
|
||
if ((startDate == null || startDate.isEmpty()) || (endDate == null || endDate.isEmpty())) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "startDate and endDate are required");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/daily-summaries?startDate=" + URLEncoder.encode(startDate, "UTF-8") +
|
||
"&endDate=" + URLEncoder.encode(endDate, "UTF-8");
|
||
}
|
||
}
|
||
else if ("get24HCompletionRate".equals(action)) {
|
||
// 获取24小时完成率
|
||
if (date != null && !date.isEmpty()) {
|
||
apiUrl = baseUrl + "/api/metrics/24h-completion-rate?date=" + URLEncoder.encode(date, "UTF-8");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/24h-completion-rate";
|
||
}
|
||
}
|
||
else if ("getDailyCompletionRate".equals(action)) {
|
||
// 获取每日完成率
|
||
if (date != null && !date.isEmpty()) {
|
||
apiUrl = baseUrl + "/api/metrics/daily-completion-rate?date=" + URLEncoder.encode(date, "UTF-8");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/daily-completion-rate";
|
||
}
|
||
}
|
||
else if ("getDailyDashboard".equals(action)) {
|
||
// 获取日汇总完整仪表盘数据
|
||
if (date != null && !date.isEmpty()) {
|
||
apiUrl = baseUrl + "/api/metrics/daily-dashboard?date=" + URLEncoder.encode(date, "UTF-8");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/daily-dashboard";
|
||
}
|
||
}
|
||
else if ("getBatchOrderMetrics".equals(action)) {
|
||
// 批量获取订单指标
|
||
if (waybillsJson == null || waybillsJson.isEmpty()) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "waybills is required");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/batch-order-metrics";
|
||
}
|
||
}
|
||
else if ("recalculateLabelRate".equals(action)) {
|
||
// 重新计算标签率
|
||
if (handoverNumber == null || handoverNumber.isEmpty()) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "handoverNumber is required");
|
||
} else {
|
||
apiUrl = baseUrl + "/api/metrics/recalculate-label-rate";
|
||
}
|
||
}
|
||
else {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", "Unknown action: " + action);
|
||
}
|
||
|
||
// 如果没有错误,调用API
|
||
if (apiUrl != null) {
|
||
String method = "getBatchOrderMetrics".equals(action) || "recalculateLabelRate".equals(action) ? "POST" : "GET";
|
||
String response_text = callApi(apiUrl, method, waybillsJson, handoverNumber);
|
||
|
||
// 处理 JSONP 响应格式
|
||
if ("jsonp".equals(format) && callback != null && !callback.isEmpty()) {
|
||
if (callback.matches("^[a-zA-Z_$][a-zA-Z0-9_$]*$")) {
|
||
out.print(callback + "(" + response_text + ");");
|
||
} else {
|
||
out.print("jsonp_error({\"error\": \"Invalid callback name\"});");
|
||
}
|
||
} else {
|
||
out.print(response_text);
|
||
}
|
||
return;
|
||
}
|
||
|
||
} catch (Exception e) {
|
||
resultJson.put("success", false);
|
||
resultJson.put("error", e.getMessage());
|
||
}
|
||
|
||
// 输出结果(支持 JSONP 格式)
|
||
if ("jsonp".equals(format) && callback != null && !callback.isEmpty()) {
|
||
if (callback.matches("^[a-zA-Z_$][a-zA-Z0-9_$]*$")) {
|
||
out.print(callback + "(" + resultJson.toString() + ");");
|
||
} else {
|
||
out.print("jsonp_error({\"error\": \"Invalid callback name\"});");
|
||
}
|
||
} else {
|
||
out.print(resultJson.toString());
|
||
}
|
||
%>
|
||
|
||
<%!
|
||
private String callApi(String urlString, String method, String bodyForBatch, String handoverNumberForRecalc) {
|
||
try {
|
||
URL url = new URL(urlString);
|
||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||
connection.setRequestMethod(method);
|
||
connection.setRequestProperty("Content-Type", "application/json");
|
||
connection.setRequestProperty("Accept", "application/json");
|
||
connection.setConnectTimeout(10000);
|
||
connection.setReadTimeout(10000);
|
||
|
||
// 如果是 POST 请求,发送请求体
|
||
if ("POST".equals(method)) {
|
||
connection.setDoOutput(true);
|
||
|
||
String requestBody = null;
|
||
if (bodyForBatch != null && !bodyForBatch.isEmpty()) {
|
||
// 批量订单指标请求
|
||
requestBody = bodyForBatch;
|
||
} else if (handoverNumberForRecalc != null && !handoverNumberForRecalc.isEmpty()) {
|
||
// 重新计算标签率请求
|
||
org.json.JSONObject json = new org.json.JSONObject();
|
||
json.put("handoverNumber", handoverNumberForRecalc);
|
||
requestBody = json.toString();
|
||
} else {
|
||
requestBody = "{}";
|
||
}
|
||
|
||
try (OutputStream os = connection.getOutputStream()) {
|
||
byte[] input = requestBody.getBytes("utf-8");
|
||
os.write(input, 0, input.length);
|
||
}
|
||
}
|
||
|
||
// 读取响应
|
||
int responseCode = connection.getResponseCode();
|
||
BufferedReader reader;
|
||
if (responseCode >= 200 && responseCode < 300) {
|
||
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
|
||
} else {
|
||
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "utf-8"));
|
||
}
|
||
|
||
StringBuilder response = new StringBuilder();
|
||
String line;
|
||
while ((line = reader.readLine()) != null) {
|
||
response.append(line);
|
||
}
|
||
reader.close();
|
||
connection.disconnect();
|
||
|
||
return response.toString();
|
||
|
||
} catch (Exception e) {
|
||
org.json.JSONObject error = new org.json.JSONObject();
|
||
try {
|
||
error.put("success", false);
|
||
error.put("error", e.getMessage());
|
||
} catch (Exception ex) {
|
||
// ignore
|
||
}
|
||
return error.toString();
|
||
}
|
||
}
|
||
%>
|