diff --git a/.classpath b/.classpath index a6ec438..d03727d 100644 --- a/.classpath +++ b/.classpath @@ -24,8 +24,6 @@ - - @@ -75,11 +73,11 @@ + + - - @@ -123,5 +121,12 @@ + + + + + + + diff --git a/project.xml b/project.xml index 99a607b..733587c 100644 --- a/project.xml +++ b/project.xml @@ -753,8 +753,60 @@ poi-ooxml 3.16 - - + + + + + + + + + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + com.rabbitmq + amqp-client + 5.13.1 + + + + 5.3.27 + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + + diff --git a/src/main/java/PostTest.java b/src/main/java/PostTest.java index 9e2ff46..6ae3073 100644 --- a/src/main/java/PostTest.java +++ b/src/main/java/PostTest.java @@ -15,6 +15,7 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Base64; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -65,26 +66,31 @@ public class PostTest { // logger.info("date---"+date); // logger.info("month---"+month); // logger.info("year---"+year); - - // 获取当前日期 - LocalDate today = LocalDate.now(); - - // 获取当前是周几 - DayOfWeek dayOfWeek = today.getDayOfWeek(); - - System.out.println("今天是: " + today); - System.out.println("今天是周: " + dayOfWeek); - - // 检查是否为工作日(周一到周五) - if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) { - System.out.println("今天是工作日,执行任务..."); - // 这里放置需要在工作日执行的代码 - - } else { - System.out.println("今天是周末,不执行任务。"); - } - - +// +// // 获取当前日期 +// LocalDate today = LocalDate.now(); +// +// // 获取当前是周几 +// DayOfWeek dayOfWeek = today.getDayOfWeek(); +// +// System.out.println("今天是: " + today); +// System.out.println("今天是周: " + dayOfWeek); +// +// // 检查是否为工作日(周一到周五) +// if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) { +// System.out.println("今天是工作日,执行任务..."); +// // 这里放置需要在工作日执行的代码 +// +// } else { +// System.out.println("今天是周末,不执行任务。"); +// } +// + //# 假设这是你的JWT令牌 + String encodedStr = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJYR0FURUFNRUMiLCJpc3MiOiIgYW1lY3Rlc3QiLCJuYW1lIjoiY3VzdG9tYXBwIiwidCI6ImVkNzBhY2QwLXNvZmEtMjJlOS05NjBmLTQxYjIwMzNkZGUxOSIsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNzM4MzA5NDk2fQ.OU30Rh_3g564gfv0Qfho7CNSf-13UY1SLKgVep5Dvp0"; + //Base64编码"的Base64形式 + byte[] decodedBytes = Base64.getDecoder().decode(encodedStr); + String originalStr = new String(decodedBytes); + System.out.println("解码后: " + originalStr); // String ts="10-11-02"; // logger.info(ts.substring(6, 2)); diff --git a/src/main/java/adapterContext.xml b/src/main/java/adapterContext.xml index b1b0c98..6317034 100644 --- a/src/main/java/adapterContext.xml +++ b/src/main/java/adapterContext.xml @@ -36,7 +36,7 @@ - + diff --git a/src/main/java/com/dev/swms/client/GatewayTokenClient.java b/src/main/java/com/dev/swms/client/GatewayTokenClient.java new file mode 100644 index 0000000..0d274b6 --- /dev/null +++ b/src/main/java/com/dev/swms/client/GatewayTokenClient.java @@ -0,0 +1,379 @@ +package com.dev.swms.client; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.*; + +/** + * 完整的Token客户端 - 支持X-Authorization头 + */ +public class GatewayTokenClient { + + private String token; + private String baseUrl; + + // OAuth2配置参数 + private final String clientId = "AMEC_WMS"; + private final String clientSecret = "ed4fbb4c6f6c"; + private final String tenant = "603b299d29924b9d04147526"; + + // Gateway鉴权token(如果需要) + private String gatewayToken; + + public GatewayTokenClient(String baseUrl) { + this.baseUrl = baseUrl; + } + + /** + * 设置Gateway鉴权token + */ + public void setGatewayToken(String gatewayToken) { + this.gatewayToken = gatewayToken; + } + + /** + * 获取访问令牌 - OAuth2客户端凭证模式 + */ + public boolean getAccessToken() { + try { + String tokenUrl = baseUrl + "/oauth/token"; + + // 构建表单参数 + String formData = "grant_type=client_credentials" + + "&client_id=" + clientId + + "&client_secret=" + clientSecret + + "&tenant=" + tenant; + + // 发送请求 - 添加X-Authorization头 + String response = sendFormPostRequest(tokenUrl, formData, true); + + // 使用JSON解析工具提取token + if (response != null) { + String extractedToken = extractTokenFromResponse(response); + if (extractedToken != null) { + this.token = extractedToken; + System.out.println("Token获取成功"); + return true; + } else { + String error = extractErrorFromResponse(response); + System.out.println("Token获取失败: " + error); + return false; + } + } + return false; + + } catch (Exception e) { + System.err.println("获取token异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 发送表单POST请求 + * @param includeGatewayAuth 是否包含X-Authorization头 + */ + private String sendFormPostRequest(String urlStr, String formData, boolean includeGatewayAuth) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("Accept", "application/json"); + + // Basic认证头 (client_id:client_secret) + String auth = clientId + ":" + clientSecret; + String encodedAuth = base64Encode(auth); + connection.setRequestProperty("Authorization", "Basic " + encodedAuth); + + // 添加X-Authorization头(如果提供了gatewayToken且需要包含) + if (includeGatewayAuth && gatewayToken != null && !gatewayToken.isEmpty()) { + connection.setRequestProperty("X-Authorization", gatewayToken); + System.out.println("已添加X-Authorization头: " + gatewayToken); + } + + connection.setDoOutput(true); + connection.setConnectTimeout(10000); + connection.setReadTimeout(15000); + + // 发送表单数据 + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(formData); + osw.flush(); + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return null; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * 调用需要token的API + */ + public String callApi(String apiPath, String requestBody) { + return callApi(apiPath, requestBody, true); + } + + /** + * 调用需要token的API(可控制是否包含X-Authorization) + */ + public String callApi(String apiPath, String requestBody, boolean includeGatewayAuth) { + if (token == null) { + throw new IllegalStateException("请先调用getAccessToken方法获取token"); + } + + try { + String apiUrl = baseUrl + apiPath; + return sendJsonPostRequest(apiUrl, requestBody, includeGatewayAuth); + } catch (Exception e) { + System.err.println("调用API异常: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 发送JSON POST请求(带token认证和X-Authorization) + */ + private String sendJsonPostRequest(String urlStr, String jsonBody, boolean includeGatewayAuth) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("Authorization", "Bearer " + token); + connection.setRequestProperty("X-Tenant-ID", tenant); + + // 添加X-Authorization头 + if (includeGatewayAuth && gatewayToken != null && !gatewayToken.isEmpty()) { + connection.setRequestProperty("X-Authorization", gatewayToken); + System.out.println("已添加X-Authorization头: " + gatewayToken); + } + + connection.setDoOutput(true); + connection.setConnectTimeout(10000); + connection.setReadTimeout(15000); + + // 发送JSON数据 + if (jsonBody != null && !jsonBody.isEmpty()) { + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(jsonBody); + osw.flush(); + } + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("API调用HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return "{\"error\":\"No response body, status: " + status + "\"}"; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * 简单的Base64编码 + */ + private String base64Encode(String str) { + try { + // 使用sun.misc.BASE64Encoder(老JDK中有) + sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); + return encoder.encode(str.getBytes("UTF-8")); + } catch (Exception e) { + // 备用方案:手动实现简单的base64 + return manualBase64Encode(str); + } + } + + /** + * 手动Base64编码(备用方案) + */ + private String manualBase64Encode(String str) { + try { + byte[] bytes = str.getBytes("UTF-8"); + StringBuilder result = new StringBuilder(); + char[] base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); + + int i = 0; + while (i < bytes.length) { + int byte1 = bytes[i++] & 0xFF; + int byte2 = i < bytes.length ? bytes[i++] & 0xFF : 0; + int byte3 = i < bytes.length ? bytes[i++] & 0xFF : 0; + + int triple = (byte1 << 16) | (byte2 << 8) | byte3; + + result.append(base64Chars[(triple >> 18) & 0x3F]); + result.append(base64Chars[(triple >> 12) & 0x3F]); + result.append(i > bytes.length + 1 ? '=' : base64Chars[(triple >> 6) & 0x3F]); + result.append(i > bytes.length ? '=' : base64Chars[triple & 0x3F]); + } + return result.toString(); + } catch (Exception e) { + return str; // 如果编码失败,返回原字符串 + } + } + + /** + * 从JSON响应中提取token + */ + private String extractTokenFromResponse(String jsonResponse) { + if (jsonResponse == null) { + return null; + } + + // 简单模式匹配提取access_token + Pattern pattern = Pattern.compile("\"access_token\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher = pattern.matcher(jsonResponse); + + if (matcher.find()) { + return matcher.group(1); + } + + return null; + } + + /** + * 从JSON响应中提取错误信息 + */ + private String extractErrorFromResponse(String jsonResponse) { + if (jsonResponse == null) { + return "Empty response"; + } + + Pattern pattern = Pattern.compile("\"error\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher = pattern.matcher(jsonResponse); + + if (matcher.find()) { + return matcher.group(1); + } + + return jsonResponse; + } + + /** + * 手动构建简单JSON(替代Jackson) + */ + public String buildSimpleJson(Map params) { + StringBuilder json = new StringBuilder(); + json.append("{"); + boolean first = true; + for (Map.Entry entry : params.entrySet()) { + if (!first) { + json.append(","); + } + json.append("\"").append(entry.getKey()).append("\":"); + Object value = entry.getValue(); + if (value instanceof String) { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } else if (value instanceof Number) { + json.append(value); + } else if (value instanceof Boolean) { + json.append(value); + } else { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } + first = false; + } + json.append("}"); + return json.toString(); + } + + /** + * 转义JSON字符串中的特殊字符 + */ + private String escapeJsonString(String str) { + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\b", "\\b") + .replace("\f", "\\f") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } + + /** + * 获取当前token + */ + public String getToken() { + return token; + } + + /** + * 完整的示例使用方法 + */ + public static void main(String[] args) { + // 替换为实际的认证服务器地址 + GatewayTokenClient client = new GatewayTokenClient("http://your-auth-server"); + + // 设置Gateway鉴权token(根据实际情况设置) + client.setGatewayToken("your-gateway-token-here"); + + // 1. 获取token(会包含X-Authorization头) + if (client.getAccessToken()) { + System.out.println("成功获取token: " + client.getToken()); + + // 2. 构建请求数据 + Map requestData = new HashMap(); + requestData.put("skuCode", "SKU001"); + requestData.put("warehouseCode", "WH001"); + requestData.put("quantity", 100); + requestData.put("action", "query"); + + // 3. 构建JSON请求 + String jsonRequest = client.buildSimpleJson(requestData); + System.out.println("请求JSON: " + jsonRequest); + + // 4. 调用API(默认会包含X-Authorization头) + String response = client.callApi("/api/inventory/query", jsonRequest); + + System.out.println("API响应: " + response); + + // 5. 也可以调用不需要X-Authorization的API + // String response2 = client.callApi("/api/public/data", jsonRequest, false); + } else { + System.out.println("获取token失败"); + } + } +} diff --git a/src/main/java/com/dev/swms/client/JwtTokenGenerator.java b/src/main/java/com/dev/swms/client/JwtTokenGenerator.java new file mode 100644 index 0000000..2bc5852 --- /dev/null +++ b/src/main/java/com/dev/swms/client/JwtTokenGenerator.java @@ -0,0 +1,77 @@ +package com.dev.swms.client; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import javax.crypto.SecretKey; + +public class JwtTokenGenerator { + + /** + * 生成JWT Token + * + * @param secret 密钥字符串 + * @param iss 签发机构 + * @param name 用户名 + * @param t 参数t的值 + * @return JWT Token字符串 + */ + public static String generateToken(String secret, String iss, String name, String t) { + // 获取当前时间和过期时间(当前时间 + 10分钟) + Date now = new Date(); + Date expiration = new Date(now.getTime() + 10 * 60 * 1000); // 10分钟 + + // 创建payload claims + Map claims = new HashMap<>(); + claims.put("sub", "XGATEAMEC"); + claims.put("iss", iss); + claims.put("name", name); + claims.put("t", t); + claims.put("iat", now.getTime() / 1000); // JWT标准使用秒级时间戳 + claims.put("exp", expiration.getTime() / 1000); + + // 生成密钥 + SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); + + // 生成JWT Token + return Jwts.builder() + .setClaims(claims) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + } + + /** + * 生成JWT Token(使用自定义过期时间) + * + * @param secret 密钥字符串 + * @param iss 签发机构 + * @param name 用户名 + * @param t 参数t的值 + * @param expirationMinutes 过期时间(分钟) + * @return JWT Token字符串 + */ + public static String generateToken(String secret, String iss, String name, String t, int expirationMinutes) { + Date now = new Date(); + Date expiration = new Date(now.getTime() + expirationMinutes * 60 * 1000); + + Map claims = new HashMap<>(); + claims.put("sub", "XGATEAMEC"); + claims.put("iss", iss); + claims.put("name", name); + claims.put("admin", t); + claims.put("iat", now.getTime() / 1000); + claims.put("exp", expiration.getTime() / 1000); + + SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); + + return Jwts.builder() + .setClaims(claims) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + } +} diff --git a/src/main/java/com/dev/swms/client/SimpleGatewayClient.java b/src/main/java/com/dev/swms/client/SimpleGatewayClient.java new file mode 100644 index 0000000..3a4ae4a --- /dev/null +++ b/src/main/java/com/dev/swms/client/SimpleGatewayClient.java @@ -0,0 +1,154 @@ +package com.dev.swms.client; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * 简化版Gateway客户端 - 直接使用X-Authorization token + */ +public class SimpleGatewayClient { + + private String baseUrl; + private String gatewayToken; + + public SimpleGatewayClient(String baseUrl, String gatewayToken) { + this.baseUrl = baseUrl; + this.gatewayToken = gatewayToken; + } + + /** + * 调用Gateway保护的API + */ + public String callGatewayApi(String apiPath, String requestBody) { + try { + String apiUrl = baseUrl + apiPath; + return sendJsonPostRequest(apiUrl, requestBody); + } catch (Exception e) { + System.err.println("调用Gateway API异常: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 发送JSON POST请求(只使用X-Authorization) + */ + private String sendJsonPostRequest(String urlStr, String jsonBody) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + connection.setRequestProperty("Accept", "application/json"); + + // 只使用X-Authorization头进行Gateway鉴权 + if (gatewayToken != null && !gatewayToken.isEmpty()) { + connection.setRequestProperty("X-Authorization", gatewayToken); + System.out.println("已添加X-Authorization头: " + gatewayToken); + } + + connection.setDoOutput(true); + connection.setConnectTimeout(10000); + connection.setReadTimeout(15000); + + // 发送JSON数据 + if (jsonBody != null && !jsonBody.isEmpty()) { + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(jsonBody); + osw.flush(); + } + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("Gateway API调用HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return "{\"error\":\"No response body, status: " + status + "\"}"; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * 手动构建简单JSON + */ + public String buildSimpleJson(Map params) { + StringBuilder json = new StringBuilder(); + json.append("{"); + boolean first = true; + for (Map.Entry entry : params.entrySet()) { + if (!first) { + json.append(","); + } + json.append("\"").append(entry.getKey()).append("\":"); + Object value = entry.getValue(); + if (value instanceof String) { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } else if (value instanceof Number) { + json.append(value); + } else if (value instanceof Boolean) { + json.append(value); + } else { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } + first = false; + } + json.append("}"); + return json.toString(); + } + + /** + * 转义JSON字符串中的特殊字符 + */ + private String escapeJsonString(String str) { + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\b", "\\b") + .replace("\f", "\\f") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } + + /** + * 使用示例 + */ + public static void main(String[] args) { + // 创建Gateway客户端 + SimpleGatewayClient client = new SimpleGatewayClient( + "http://your-gateway-server", + "your-gateway-token-here" + ); + + // 构建请求数据 + Map requestData = new HashMap(); + requestData.put("action", "queryInventory"); + requestData.put("warehouse", "WH001"); + requestData.put("sku", "SKU12345"); + + // 调用API + String jsonRequest = client.buildSimpleJson(requestData); + String response = client.callGatewayApi("/api/wms/inventory", jsonRequest); + + System.out.println("Gateway API响应: " + response); + } +} diff --git a/src/main/java/com/dev/swms/client/SimpleTokenTest.java b/src/main/java/com/dev/swms/client/SimpleTokenTest.java new file mode 100644 index 0000000..9ce6865 --- /dev/null +++ b/src/main/java/com/dev/swms/client/SimpleTokenTest.java @@ -0,0 +1,156 @@ +package com.dev.swms.client; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * 简化的Token获取测试类 + */ +public class SimpleTokenTest { + + private final String TOKEN_URL = "https://apintodev.amecnsh.com/AMEC4/wms/oauth/token"; + + public static void main(String[] args) { + SimpleTokenTest test = new SimpleTokenTest(); + test.testGetToken(); + } + + public void testGetToken() { + try { + // 构建表单数据 + String formData = "grant_type=client_credentials" + + "&client_id=AMEC_WMS" + + "&client_secret=ed4fbb4c6f6c" + + "&tenant=603b299d29924b9d04147526"; + + // 生成简单的X-Authorization JWT(使用固定值) + String xAuthToken = generateSimpleJwt(); + + // 发送请求 + String response = sendPostRequest(TOKEN_URL, formData, xAuthToken); + + System.out.println("=== Token获取测试结果 ==="); + System.out.println("响应: " + response); + + // 解析token + if (response != null && response.contains("access_token")) { + int start = response.indexOf("access_token") + 15; + int end = response.indexOf("\"", start); + String token = response.substring(start, end); + System.out.println("提取的Token: " + token); + } + + } catch (Exception e) { + System.err.println("测试异常: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 生成简单的JWT(用于测试) + */ + private String generateSimpleJwt() { + try { + // 使用固定的header和payload进行测试 + String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"; + String payload = "{\"sub\":\"XGATEAMEC\",\"iss\":\"amectest\",\"name\":\"customapp\",\"t\":\"ed70acd0-sofa-22e9-960f-41b2033dde19\",\"iat\":1616269022,\"exp\":1767052800}"; + + sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); + String encodedHeader = encoder.encode(header.getBytes("UTF-8")) + .replace('+', '-').replace('/', '_').replace("=", ""); + String encodedPayload = encoder.encode(payload.getBytes("UTF-8")) + .replace('+', '-').replace('/', '_').replace("=", ""); + + // 简化签名 + String signature = "test_signature_for_demo"; + + return encodedHeader + "." + encodedPayload + "." + signature; + + } catch (Exception e) { + return "test.jwt.token"; + } + } + + /** + * 发送POST请求 + */ + private String sendPostRequest(String urlStr, String formData, String xAuthToken) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("X-Authorization", xAuthToken); + + connection.setDoOutput(true); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + + // SSL设置 + trustAllCertificates(); + + // 发送数据 + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(formData); + osw.flush(); + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return null; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * SSL证书信任设置 + */ + private void trustAllCertificates() { + try { + javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[] { + new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + } + }; + + javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + + javax.net.ssl.HostnameVerifier allHostsValid = new javax.net.ssl.HostnameVerifier() { + public boolean verify(String hostname, javax.net.ssl.SSLSession session) { + return true; + } + }; + javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + + } catch (Exception e) { + System.err.println("SSL设置异常: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/dev/swms/client/WmsTokenClient.java b/src/main/java/com/dev/swms/client/WmsTokenClient.java new file mode 100644 index 0000000..f356960 --- /dev/null +++ b/src/main/java/com/dev/swms/client/WmsTokenClient.java @@ -0,0 +1,603 @@ +package com.dev.swms.client; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.*; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * WMS-MES认证Token获取客户端 - 基于老框架实现 + */ +public class WmsTokenClient { + + // 接口配置 + private final String TOKEN_URL = "https://apintodev.amecnsh.com/AMEC4/wms/oauth/token"; + // OAuth2客户端凭证 + private final String CLIENT_ID = "AMEC_WMS"; + private final String CLIENT_SECRET = "ed4fbb4c6f6c"; + private final String TENANT = "603b299d29924b9d04147526"; + private final String GRANT_TYPE = "client_credentials"; + + // JWT配置(用于生成X-Authorization) + private final String JWT_SECRET = "c72a280d-3c49-49d7-b35f-28ccd2ae98eb"; // 需要替换为实际的secret + private final String JWT_ISS = "wms"; + private final String JWT_NAME = "wms"; + private final String JWT_T = ""; + + private String accessToken; // 存储获取到的访问token + private String xAuthToken;//存储获取的鉴定token + + public WmsTokenClient() { + // 默认构造函数 + } + + + /** + * 计算字符串的SHA256哈希值 + * + * @param input 输入字符串 + * @return SHA256哈希的十六进制字符串(小写) + * @throws NoSuchAlgorithmException 如果SHA256算法不可用 + */ + private String sha256(String input) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); + + // 转为十六进制字符串 + StringBuilder hexString = new StringBuilder(); + for (byte b : hash) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + + /** + * 生成JWT Token(用于测试) + * @throws UnsupportedEncodingException + */ + public String generateToken(String subject, String issuer, String name) throws UnsupportedEncodingException { + return Jwts.builder() + .setSubject(subject) + .setIssuer(issuer) + .claim("name", name) + .claim("admin", "true") + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时 + .signWith(SignatureAlgorithm.HS256, JWT_SECRET.getBytes("UTF-8")) + .compact(); + } + + + + /** + * 生成JWT Token用于X-Authorization头 + */ + private String generateJwtToken() { + try { + // 获取当前时间戳(秒) + long currentTime = System.currentTimeMillis() / 1000; + // 过期时间:当前时间 + 10分钟 + long expireTime = currentTime + (10 * 60); + + // 构建JWT Header + String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"; + String encodedHeader =base64UrlEncode(header.getBytes("UTF-8")); + + // 构建JWT Payload +// String payload = String.format( +// "{\"sub\":\"XGATEAMEC\",\"iss\":\"%s\",\"name\":\"%s\",\"t\":\"%s\",\"iat\":%d,\"exp\":%d}", +// JWT_ISS, JWT_NAME, JWT_T, currentTime, expireTime +// ); + String payload = String.format( + "{\"sub\":\"XGATEAMEC\",\"admin\":\"true\",\"iss\":\"%s\",\"name\":\"%s\",\"iat\":%d,\"exp\":%d}", + JWT_ISS, JWT_NAME, currentTime, expireTime + ); + String encodedPayload =base64UrlEncode(payload.getBytes("UTF-8")); + + // 构建签名(简化版本,实际应该使用真正的HMAC-SHA256) + String signingInput = encodedHeader + "." + encodedPayload; + //sha256(signingInput+JWT_SECRET); + String signature =hmacSha256(signingInput, JWT_SECRET); + + // 组合JWT + String jwtToken = signingInput + "." + signature; + System.out.println("生成的X-Authorization JWT: " + jwtToken); + + return jwtToken; + + } catch (Exception e) { + System.err.println("生成JWT Token异常: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + + + + /** + * Base64 URL安全编码 + */ + private String base64UrlEncode(byte[] data) { + try { + sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); + + String base64 = encoder.encode(data); + + // 转换为URL安全的Base64 + base64 = base64.replace('+', '-') + .replace('/', '_') + .replace("=", "") + .replaceAll("\\s", ""); + + return base64; + } catch (Exception e) { + return manualBase64UrlEncode(data); + } + } + + /** + * 手动Base64 URL安全编码 + */ + private String manualBase64UrlEncode(byte[] data) { + try { + String base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + StringBuilder result = new StringBuilder(); + + int i = 0; + while (i < data.length) { + int byte1 = data[i++] & 0xFF; + int byte2 = i < data.length ? data[i++] & 0xFF : 0; + int byte3 = i < data.length ? data[i++] & 0xFF : 0; + + int triple = (byte1 << 16) | (byte2 << 8) | byte3; + + result.append(base64Chars.charAt((triple >> 18) & 0x3F)); + result.append(base64Chars.charAt((triple >> 12) & 0x3F)); + result.append(i > data.length + 1 ? "" : base64Chars.charAt((triple >> 6) & 0x3F)); + result.append(i > data.length ? "" : base64Chars.charAt(triple & 0x3F)); + } + + // 转换为URL安全 + String base64 = result.toString(); + base64 = base64.replace('+', '-') + .replace('/', '_'); + + return base64; + } catch (Exception e) { + return ""; + } + } + + /** + * 简化的HMAC-SHA256(用于演示,生产环境需要真正的实现) + */ + private String simpleHmacSha256(String data, String secret) { + try { + // 简化处理:实际应该使用真正的HMAC-SHA256 + // 这里使用Base64编码模拟签名过程 + String signingInput = data + secret; + byte[] signatureBytes = signingInput.getBytes("UTF-8"); + + return base64UrlEncode(signatureBytes).substring(0, 43); + + } catch (Exception e) { + System.err.println("HMAC-SHA256签名异常: " + e.getMessage()); + return "simulated_signature_for_demo"; + } + } + + /** + * 真正的HMAC-SHA256实现 + */ + private String hmacSha256(String data, String secret) { + try { + javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA256"); + javax.crypto.spec.SecretKeySpec secretKey = + new javax.crypto.spec.SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"); + mac.init(secretKey); + byte[] hmacData = mac.doFinal(data.getBytes("UTF-8")); + return base64UrlEncode(hmacData); + } catch (Exception e) { + System.err.println("HMAC-SHA256签名异常: " + e.getMessage()); + return "error_signature"; + } + } + + + + /** + * 获取访问Token + */ + public boolean getAccessToken() { + try { + System.out.println("----------------getAccessToken111----------"); + + // 1. 生成X-Authorization JWT + xAuthToken = generateJwtToken(); + if (xAuthToken == null) { + System.err.println("X-Authorization JWT生成失败"); + return false; + } + + // 2. 构建表单数据 + String formData = "grant_type=" + GRANT_TYPE + + "&client_id=" + CLIENT_ID + + "&client_secret=" + CLIENT_SECRET + + "&tenant=" + TENANT; + System.out.println("----------------getAccessToken112----------"); + // 3. 发送POST请求 + String response = sendFormPostRequest(TOKEN_URL, formData, xAuthToken); + + // 4. 解析响应获取访问token + if (response != null) { + String extractedToken = extractAccessTokenFromResponse(response); + if (extractedToken != null) { + this.accessToken = extractedToken; + System.out.println("访问Token获取成功: " + accessToken); + + // 提取token有效期 + Long expiresIn = extractExpiresInFromResponse(response); + if (expiresIn != null) { + System.out.println("Token有效期: " + expiresIn + "秒"); + } + + return true; + } else { + String error = extractErrorFromResponse(response); + System.out.println("访问Token获取失败: " + error); + return false; + } + } + return false; + + } catch (Exception e) { + System.err.println("获取访问Token异常: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + + /** + * 发送表单POST请求 + */ + private String sendFormPostRequest(String urlStr, String formData, String xAuthToken) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("Accept", "application/json"); + + // 添加X-Authorization头 + if (xAuthToken != null && !xAuthToken.isEmpty()) { + connection.setRequestProperty("X-Authorization", xAuthToken); + System.out.println("已添加X-Authorization头"); + } + + connection.setDoOutput(true); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + + // 启用SSL(HTTPS) +// if (urlStr.startsWith("https")) { +// trustAllCertificates(); +// } + + // 发送表单数据 + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(formData); + osw.flush(); + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return "{\"error\":\"No response body, status: " + status + "\"}"; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + System.out.println("原始响应: " + response.toString()); + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * SSL证书信任设置(用于测试环境) + */ + private void trustAllCertificates() { + try { + // 信任所有SSL证书(仅测试环境使用) + javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[] { + new javax.net.ssl.X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } + }; + + javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + + // 信任所有主机名 + javax.net.ssl.HostnameVerifier allHostsValid = new javax.net.ssl.HostnameVerifier() { + public boolean verify(String hostname, javax.net.ssl.SSLSession session) { + return true; + } + }; + javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + + } catch (Exception e) { + System.err.println("SSL证书信任设置异常: " + e.getMessage()); + } + } + + /** + * 从响应中提取访问token + */ + private String extractAccessTokenFromResponse(String jsonResponse) { + if (jsonResponse == null) { + return null; + } + + // 尝试多种可能的token字段名称 + String[] tokenFields = {"access_token", "token", "accessToken"}; + + for (String field : tokenFields) { + Pattern pattern = Pattern.compile("\"" + field + "\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher = pattern.matcher(jsonResponse); + if (matcher.find()) { + return matcher.group(1); + } + } + + return null; + } + + /** + * 从响应中提取token有效期 + */ + private Long extractExpiresInFromResponse(String jsonResponse) { + if (jsonResponse == null) { + return null; + } + + Pattern pattern = Pattern.compile("\"expires_in\"\\s*:\\s*(\\d+)"); + Matcher matcher = pattern.matcher(jsonResponse); + if (matcher.find()) { + return Long.parseLong(matcher.group(1)); + } + + return null; + } + + /** + * 从响应中提取错误信息 + */ + private String extractErrorFromResponse(String jsonResponse) { + if (jsonResponse == null) { + return "Empty response"; + } + + // 尝试提取error字段 + Pattern pattern = Pattern.compile("\"error\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher = pattern.matcher(jsonResponse); + if (matcher.find()) { + return matcher.group(1); + } + + // 尝试提取error_description字段 + Pattern pattern2 = Pattern.compile("\"error_description\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher2 = pattern2.matcher(jsonResponse); + if (matcher2.find()) { + return matcher2.group(1); + } + + // 尝试提取message字段 + Pattern pattern3 = Pattern.compile("\"message\"\\s*:\\s*\"([^\"]+)\""); + Matcher matcher3 = pattern3.matcher(jsonResponse); + if (matcher3.find()) { + return matcher3.group(1); + } + + return jsonResponse; + } + + /** + * 获取当前访问token + */ + public String getAccessTokenValue() { + return accessToken; + } + + /** + * 使用访问token调用业务API + */ + public String callBusinessApi(String apiUrl, String requestBody) { + if (accessToken == null) { + throw new IllegalStateException("请先调用getAccessToken方法获取访问token"); + } + + try { + return sendJsonPostRequest(apiUrl, requestBody, accessToken,xAuthToken); + } catch (Exception e) { + System.err.println("调用业务API异常: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 发送JSON POST请求(使用访问token) + */ + private String sendJsonPostRequest(String urlStr, String jsonBody, String accessToken,String xAuthToken) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + try { + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + connection.setRequestProperty("Accept", "application/json"); + + // 使用访问token作为Authorization头 + if (accessToken != null && !accessToken.isEmpty()) { + connection.setRequestProperty("Authorization", "Bearer " + accessToken); + System.out.println("已添加Authorization头(Bearer Token)"); + } + // 添加X-Authorization头 + if (xAuthToken != null && !xAuthToken.isEmpty()) { + connection.setRequestProperty("X-Authorization", xAuthToken); + System.out.println("已添加X-Authorization头"); + } + connection.setDoOutput(true); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + + // 启用SSL(如果是HTTPS) +// if (urlStr.startsWith("https")) { +// trustAllCertificates(); +// } + + // 发送JSON数据 + if (jsonBody != null && !jsonBody.isEmpty()) { + try (OutputStream os = connection.getOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) { + osw.write(jsonBody); + osw.flush(); + } + } + + // 读取响应 + int status = connection.getResponseCode(); + System.out.println("业务API HTTP状态码: " + status); + + InputStream inputStream = status < 400 ? connection.getInputStream() : connection.getErrorStream(); + + if (inputStream == null) { + return "{\"error\":\"No response body, status: " + status + "\"}"; + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + + } finally { + connection.disconnect(); + } + } + + /** + * 手动构建简单JSON + */ + public String buildSimpleJson(Map params) { + StringBuilder json = new StringBuilder(); + json.append("{"); + boolean first = true; + for (Map.Entry entry : params.entrySet()) { + if (!first) { + json.append(","); + } + json.append("\"").append(entry.getKey()).append("\":"); + Object value = entry.getValue(); + if (value instanceof String) { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } else if (value instanceof Number) { + json.append(value); + } else if (value instanceof Boolean) { + json.append(value); + } else { + json.append("\"").append(escapeJsonString(value.toString())).append("\""); + } + first = false; + } + json.append("}"); + return json.toString(); + } + + /** + * 转义JSON字符串中的特殊字符 + */ + private String escapeJsonString(String str) { + return str.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\b", "\\b") + .replace("\f", "\\f") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } + + /** + * 完整的示例使用方法 + */ + public static void main(String[] args) { + // 创建Token客户端 + WmsTokenClient client = new WmsTokenClient(); + // 1. 获取访问Token + if (client.getAccessToken()) { + System.out.println("成功获取访问Token: " + client.getAccessTokenValue()); + + // 2. 构建业务请求数据(示例) + Map requestData = new HashMap(); + requestData.put("warehouseCode", "WH001"); + requestData.put("skuCode", "SKU12345"); + requestData.put("action", "queryInventory"); + requestData.put("timestamp", System.currentTimeMillis()); + + // 3. 构建JSON请求 + String jsonRequest = client.buildSimpleJson(requestData); + System.out.println("业务请求JSON: " + jsonRequest); + + // 4. 调用业务API(使用访问Token) + // 注意:需要替换为实际的业务API URL + String businessApiUrl = "https://apintodev.amecnsh.com/AMEC4/wms/api/business"; + String response = client.callBusinessApi(businessApiUrl, jsonRequest); + + System.out.println("业务API响应: " + response); + } else { + System.out.println("获取访问Token失败"); + } + } +} diff --git a/src/main/java/com/dev/swms/server/interfaces/ItemJobLauncher.java b/src/main/java/com/dev/swms/server/interfaces/ItemJobLauncher.java index 0cf06bc..f2331bb 100644 --- a/src/main/java/com/dev/swms/server/interfaces/ItemJobLauncher.java +++ b/src/main/java/com/dev/swms/server/interfaces/ItemJobLauncher.java @@ -235,7 +235,7 @@ public class ItemJobLauncher implements ApplicationListener { int e=0; switch (a) { case 1: - logger.info("1---------"); + logger.info(" --zidongfanku----1---------"); if (true) { List agvTasks = commonDao.findByQuery(" from AgvTask agvTask " + " where 1=1 " //agvTask.beIssue=true @@ -244,16 +244,16 @@ public class ItemJobLauncher implements ApplicationListener { // + " and substring(agvTask.targetArea,0,4) not in ('204','203') " // + " and substring(agvTask.targetArea,0,4) in ('201') " + " and substring(agvTask.targetArea,0,4) in ('203','204','205','206','207'," - + "'208','209','210','211','212','213') " + + "'208','209','210','211','212','213','214','215','201','202') " ); for (AgvTask agvTask : agvTasks) { long time = agvTask.getLeaveTime().getTime(); long time1= (new Date()).getTime(); - logger.info(time+"------1-----------"+time1); - if (time1-time>=35000) { + logger.info(time+"-----zidongfanku----1-----------"+time1); + if (time1-time>=30000) { agvTaskManager.wcsNextPT(agvTask.getRobotJobId(), agvTask.getContainerCode(), WcsCSDCode.getWcsCSDCode(agvTask.getTargetAreaCode())); - logger.info("1-----------"); + logger.info("--zidongfanku-1-----------"); } } } diff --git a/src/main/java/com/dev/swms/server/model/base/Item.java b/src/main/java/com/dev/swms/server/model/base/Item.java index be46ce7..dbb537e 100644 --- a/src/main/java/com/dev/swms/server/model/base/Item.java +++ b/src/main/java/com/dev/swms/server/model/base/Item.java @@ -27,10 +27,10 @@ public class Item extends Entity { private String unit; private String goodType;//产品分类 待测量数据 大小件 - private double length=0;//长-- - private double width=0;//宽 - private double height=0;//高 - private double weight=0;//规格重量 + private double length=0;//长--LENGTH + private double width=0;//宽WIDTH + private double height=0;//高LENGTH + private double weight=0;//规格重量WEIGHT private double volume=0;//体积 private int packNumber=0;//规格数量 /** diff --git a/src/main/java/com/dev/swms/server/model/receiving/ASNDetail.java b/src/main/java/com/dev/swms/server/model/receiving/ASNDetail.java index 159393b..5abf630 100644 --- a/src/main/java/com/dev/swms/server/model/receiving/ASNDetail.java +++ b/src/main/java/com/dev/swms/server/model/receiving/ASNDetail.java @@ -38,7 +38,7 @@ public class ASNDetail extends Entity { private double expectedQuantity; private boolean bequality=false;//是否质检 private String strBill2;//序列号 - private String strBill1;//PO行项目号 + private String strBill1;//PO行号\成品箱号 /** 商品属性 */ private LotInfo lotInfo; private String strBill3;//已入库质检标记 @@ -122,7 +122,7 @@ public class ASNDetail extends Entity { private String relatedBill5;//预入库操作人 private String strBill4;//-转作业-原特殊标记 private String strBill5;//转作业-原供应商代码 - private String strBill6;//SCC号 + private String strBill6;//SCC号 箱号 private String strBill7;//task凭证号(收货凭证号) private String strBill8;//凭证行号 private String strBill9;//发货LOC @@ -135,8 +135,36 @@ public class ASNDetail extends Entity { private String zxmx;//新物料标识(是否新料) private boolean beMarkWeight=false;//是否序列号 - + private double length=0;//长--LENGTH + private double width=0;//宽WIDTH + private double height=0;//高LENGTH + + + public double getLength() { + return length; + } + + public void setLength(double length) { + this.length = length; + } + + public double getWidth() { + return width; + } + + public void setWidth(double width) { + this.width = width; + } + + public double getHeight() { + return height; + } + + public void setHeight(double height) { + this.height = height; + } + public boolean isBeMarkWeight() { return beMarkWeight; } diff --git a/src/main/java/com/dev/swms/server/model/receiving/asnDetail.hbm.xml b/src/main/java/com/dev/swms/server/model/receiving/asnDetail.hbm.xml index 3853008..6454341 100644 --- a/src/main/java/com/dev/swms/server/model/receiving/asnDetail.hbm.xml +++ b/src/main/java/com/dev/swms/server/model/receiving/asnDetail.hbm.xml @@ -167,6 +167,9 @@ + + + diff --git a/src/main/java/com/dev/swms/server/model/shipping/AutomaticWaveDoc.java b/src/main/java/com/dev/swms/server/model/shipping/AutomaticWaveDoc.java index 325ec6e..abfb8f9 100644 --- a/src/main/java/com/dev/swms/server/model/shipping/AutomaticWaveDoc.java +++ b/src/main/java/com/dev/swms/server/model/shipping/AutomaticWaveDoc.java @@ -1,5 +1,7 @@ package com.dev.swms.server.model.shipping; +import java.util.Date; + import com.dev.energy.server.model.Entity; public class AutomaticWaveDoc extends Entity{ @@ -15,30 +17,194 @@ public class AutomaticWaveDoc extends Entity{ private int hour2=0;//小时 private int minute2=0;//分钟 private Boolean beEnabled2=false;//是否下发CRS - private int hour3=0;//小时 - private int minute3=0;//分钟 - private Boolean beEnabled3=false;//是否启用 - private int hour4=0;//小时 - private int minute4=0;//分钟 - private Boolean beEnabled4=false;//是否启用 - private int hour5=0;//小时 - private int minute5=0;//分钟 - private Boolean beEnabled5=false;//是否启用 - private int hour6=0;//小时 - private int minute6=0;//分钟 - private Boolean beEnabled6=false;//是否启用 - private int hour7=0;//小时 - private int minute7=0;//分钟 - private Boolean beEnabled7=false;//是否启用 - private int hour8=0;//小时 - private int minute8=0;//分钟 - private Boolean beEnabled8=false;//是否启用 - private int hour9=0;//小时 - private int minute9=0;//分钟 - private Boolean beEnabled9=false;//是否启用 - private int hour10=0;//小时 - private int minute10=0;//分钟 - private Boolean beEnabled10=false;//是否启用 + private int hour3=0;//波次小时 + private int minute3=0;//料箱工作站个数 + private int hour4=0;//最大拆分行数 + private int minute4=0;//货架工作站个数 + private int hour5=0;// + private int minute5=0;//堆垛工作站个数 + private int hour6=0;// + private int minute6=0;// + private int hour7=0;// + private int minute7=0;// + private int hour8=0;// + private int minute8=0;// + private int hour9=0;// + private int minute9=0;// + private Boolean beEnabled3=false;//地堆区是否发当天料 + private Boolean beEnabled4=false;//货架区工作站1-7 + private Boolean beEnabled5=false;// + private Boolean beEnabled6=false;// + private Boolean beEnabled7=false;// + private Boolean beEnabled8=false;// + private Boolean beEnabled9=false;// + private Boolean beEnabled10=false;// + private Boolean lx1=false;//料箱工作站1-15 + private Boolean lx2=false;// + private Boolean lx3=false;// + private Boolean lx4=false;// + private Boolean lx5=false;// + private Boolean lx6=false;// + private Boolean lx7=false;// + private Boolean lx8=false;// + private Boolean lx9=false;// + private Boolean lx10=false;// + private Boolean lx11=false;// + private Boolean lx12=false;// + private Boolean lx13=false;// + private Boolean lx14=false;// + private Boolean lx15=false;// + private Boolean lk1=false;//立库工作站1-5 + private Boolean lk2=false;// + private Boolean lk3=false;// + private Boolean lk4=false;// + private Boolean lk5=false;// + + private int hour10=0;// + private int minute10=0;// + + + /** 波次规则的开始时间 */ + private Date startDate; + + /** 波次规则的结束时间 */ + private Date endDate; + + + + + public Boolean getLx1() { + return lx1; + } + public void setLx1(Boolean lx1) { + this.lx1 = lx1; + } + public Boolean getLx2() { + return lx2; + } + public void setLx2(Boolean lx2) { + this.lx2 = lx2; + } + public Boolean getLx3() { + return lx3; + } + public void setLx3(Boolean lx3) { + this.lx3 = lx3; + } + public Boolean getLx4() { + return lx4; + } + public void setLx4(Boolean lx4) { + this.lx4 = lx4; + } + public Boolean getLx5() { + return lx5; + } + public void setLx5(Boolean lx5) { + this.lx5 = lx5; + } + public Boolean getLx6() { + return lx6; + } + public void setLx6(Boolean lx6) { + this.lx6 = lx6; + } + public Boolean getLx7() { + return lx7; + } + public void setLx7(Boolean lx7) { + this.lx7 = lx7; + } + public Boolean getLx8() { + return lx8; + } + public void setLx8(Boolean lx8) { + this.lx8 = lx8; + } + public Boolean getLx9() { + return lx9; + } + public void setLx9(Boolean lx9) { + this.lx9 = lx9; + } + public Boolean getLx10() { + return lx10; + } + public void setLx10(Boolean lx10) { + this.lx10 = lx10; + } + public Boolean getLx11() { + return lx11; + } + public void setLx11(Boolean lx11) { + this.lx11 = lx11; + } + public Boolean getLx12() { + return lx12; + } + public void setLx12(Boolean lx12) { + this.lx12 = lx12; + } + public Boolean getLx13() { + return lx13; + } + public void setLx13(Boolean lx13) { + this.lx13 = lx13; + } + public Boolean getLx14() { + return lx14; + } + public void setLx14(Boolean lx14) { + this.lx14 = lx14; + } + public Boolean getLx15() { + return lx15; + } + public void setLx15(Boolean lx15) { + this.lx15 = lx15; + } + public Boolean getLk1() { + return lk1; + } + public void setLk1(Boolean lk1) { + this.lk1 = lk1; + } + public Boolean getLk2() { + return lk2; + } + public void setLk2(Boolean lk2) { + this.lk2 = lk2; + } + public Boolean getLk3() { + return lk3; + } + public void setLk3(Boolean lk3) { + this.lk3 = lk3; + } + public Boolean getLk4() { + return lk4; + } + public void setLk4(Boolean lk4) { + this.lk4 = lk4; + } + public Boolean getLk5() { + return lk5; + } + public void setLk5(Boolean lk5) { + this.lk5 = lk5; + } + public Date getStartDate() { + return startDate; + } + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + public Date getEndDate() { + return endDate; + } + public void setEndDate(Date endDate) { + this.endDate = endDate; + } public int getHour1() { return hour1; } diff --git a/src/main/java/com/dev/swms/server/model/shipping/PickTicket.java b/src/main/java/com/dev/swms/server/model/shipping/PickTicket.java index fc91fce..333a316 100644 --- a/src/main/java/com/dev/swms/server/model/shipping/PickTicket.java +++ b/src/main/java/com/dev/swms/server/model/shipping/PickTicket.java @@ -68,9 +68,9 @@ public class PickTicket extends AbstractMoveDoc { private String workerName4;//需求人 - private String relatedBill1;//预留号 + private String relatedBill1;//预留号// /** */ - private String relatedBill2;//工单号 + private String relatedBill2;//工单号// /** */ private String relatedBill3;//头物料 diff --git a/src/main/java/com/dev/swms/server/model/shipping/PickTicketDetail.java b/src/main/java/com/dev/swms/server/model/shipping/PickTicketDetail.java index 73143f1..4fc1377 100644 --- a/src/main/java/com/dev/swms/server/model/shipping/PickTicketDetail.java +++ b/src/main/java/com/dev/swms/server/model/shipping/PickTicketDetail.java @@ -57,7 +57,7 @@ public class PickTicketDetail extends AbstractMoveDocDetail { private String description;//明细备注 /** 行号*/ - private String lineNumber; + private String lineNumber;//成品箱号 private WaveDocDetail waveDocDetail;//波次明细 @@ -88,8 +88,8 @@ public class PickTicketDetail extends AbstractMoveDocDetail { private String strBill7;//预留号 private String strBill8;//是否出WMS仓 private String strBill9;//接收工厂 - private String strBill10;//采购订单号 - private String strBill11;//外协供应商编号 + private String strBill10;//采购订单号 -成品新箱号 + private String strBill11;//外协供应商编号 -成品新料号 private String strBill12;//机台号 private String strBill13; //receiver private String strBill14; //SAP指定序列号值 diff --git a/src/main/java/com/dev/swms/server/model/shipping/automaticWaveDoc.hbm.xml b/src/main/java/com/dev/swms/server/model/shipping/automaticWaveDoc.hbm.xml index be9b4f7..83dca1a 100644 --- a/src/main/java/com/dev/swms/server/model/shipping/automaticWaveDoc.hbm.xml +++ b/src/main/java/com/dev/swms/server/model/shipping/automaticWaveDoc.hbm.xml @@ -40,6 +40,28 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/dev/swms/server/service/base/LocationManager.java b/src/main/java/com/dev/swms/server/service/base/LocationManager.java index 221fa31..0e29310 100644 --- a/src/main/java/com/dev/swms/server/service/base/LocationManager.java +++ b/src/main/java/com/dev/swms/server/service/base/LocationManager.java @@ -170,4 +170,6 @@ public interface LocationManager extends BaseManager { @Transactional void importReceivingInventory(File file); + @Transactional + void huoquMesToken(List ids); } diff --git a/src/main/java/com/dev/swms/server/service/base/pojo/DefaultLocationManager.java b/src/main/java/com/dev/swms/server/service/base/pojo/DefaultLocationManager.java index 12a5d01..af5ddde 100644 --- a/src/main/java/com/dev/swms/server/service/base/pojo/DefaultLocationManager.java +++ b/src/main/java/com/dev/swms/server/service/base/pojo/DefaultLocationManager.java @@ -4,9 +4,11 @@ import hhwms.MyThread; import java.io.File; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,6 +17,8 @@ import net.sf.json.JSONArray; import org.apache.commons.lang.StringUtils; import com.alibaba.fastjson.JSONObject; +import com.dev.swms.client.JwtTokenGenerator; +import com.dev.swms.client.WmsTokenClient; import com.dev.swms.client.ui.page.CustomEntity; import com.dev.swms.server.model.base.BillType; import com.dev.swms.server.model.base.GoodsShelves; @@ -1562,6 +1566,8 @@ public class DefaultLocationManager extends DefaultBaseManager implements String loc = sheet.getCell(3, i).getContents().trim();// LOC String qty = sheet.getCell(4, i).getContents().trim();// 数量 String NCR = sheet.getCell(5, i).getContents().trim();// NCR + String XN = sheet.getCell(6, i).getContents().trim();// 序列号 + String date = sheet.getCell(7, i).getContents().trim();// 入库日期 if(itemcode==null||lc==null||plan==null||loc==null||qty==null||NCR==null) { continue; } @@ -1579,6 +1585,10 @@ public class DefaultLocationManager extends DefaultBaseManager implements }else { throw new BusinessException("第"+(i+1)+"行料号"+itemcode+"不存在"); } + Date asndate=new Date(); + if(date!=null&&date.length()>0) { + asndate=DateUtil.formatStrToDateYMD02(date); + } LotInfo lotInfo=new LotInfo(); lotInfo.setPropC9(plan);//批次号 lotInfo.setPropC3("");//特殊标记 @@ -1604,6 +1614,10 @@ public class DefaultLocationManager extends DefaultBaseManager implements r.setReceivedQuantity(Integer.parseInt(qty)); r.setReceivedQuantityMU(r.getReceivedQuantity()); r.setStrBill1(NCR); + r.setReceiveDate(asndate); + if(XN!=null&&XN.length()>0) { + r.setBarCode(XN); + } commonDao.store(r); logger.info(i); } @@ -1616,4 +1630,35 @@ public class DefaultLocationManager extends DefaultBaseManager implements } } + public void huoquMesToken(List ids) { + + // 创建Token客户端 + WmsTokenClient client = new WmsTokenClient(); + + // 1. 获取访问Token + if (client.getAccessToken()) { + System.out.println("成功获取访问Token: " + client.getAccessTokenValue()); + + // 2. 构建业务请求数据(示例) + Map requestData = new HashMap(); + requestData.put("warehouseCode", "WH001"); + requestData.put("skuCode", "SKU12345"); + requestData.put("action", "queryInventory"); + requestData.put("timestamp", System.currentTimeMillis()); + + // 3. 构建JSON请求 + String jsonRequest = client.buildSimpleJson(requestData); + System.out.println("业务请求JSON: " + jsonRequest); + + // 4. 调用业务API(使用访问Token) + // 注意:需要替换为实际的业务API URL + String businessApiUrl = "https://apintodev.amecnsh.com/AMEC4/wms/api/business"; + String response = client.callBusinessApi(businessApiUrl, jsonRequest); + + System.out.println("业务API响应: " + response); + } else { + System.out.println("获取访问Token失败"); + } + + } } diff --git a/src/main/java/com/dev/swms/server/service/count/pojo/DefaultCountPlanManager.java b/src/main/java/com/dev/swms/server/service/count/pojo/DefaultCountPlanManager.java index ae1be55..6ba43c1 100644 --- a/src/main/java/com/dev/swms/server/service/count/pojo/DefaultCountPlanManager.java +++ b/src/main/java/com/dev/swms/server/service/count/pojo/DefaultCountPlanManager.java @@ -2327,6 +2327,8 @@ public class DefaultCountPlanManager extends DefaultBaseManager implements List cpts=commonDao.findByQuery("select c.id from CountRecord c where c.needCount=0 " + " and c.countPlan.id="+countRecord.getCountPlan().getId()); if(cpts.size()==0) { + cp.setFinishNo(cp.getCountQty()); + commonDao.store(cp); adjustment(countRecord.getCountPlan().getId(),userId); } diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/ApiURL.java b/src/main/java/com/dev/swms/server/service/interfaceLog/ApiURL.java index b5e743c..845aa13 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/ApiURL.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/ApiURL.java @@ -50,6 +50,22 @@ public class ApiURL { public static String returnOA = ""; // 测试地址 WMS——SAP 回传接口******http://happdev.amecnsh.com:8000/sap/zrest public static String doWmsReqSap = ""; + +// 测试地址 WMS——MES 回传接口****** + //入库反馈https://apintodev.amecnsh.com/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_ENTRY_FEEDBACK + //出库退回https://apintodev.amecnsh.com/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_RETURN_FEEDBACK + //移位更新库区https://apintodev.amecnsh.com/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_TRANSFER_UPDATE + //成品出库https://apintodev.amecnsh.com/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_PRODUCT_OUT + //更新料号https://apintodev.amecnsh.com/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_UPDATE_MATE_FEEDBACK + + public static String returnMESIN = "/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_ENTRY_FEEDBACK"; + public static String returnMESRETURN = "/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_RETURN_FEEDBACK"; + public static String returnMESTRANSFER = "/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_TRANSFER_UPDATE"; + public static String returnMESPRODUCT = "/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_PRODUCT_OUT"; + public static String returnMESUPDATE = "/AMEC4/wms/postAppApi?m=dev&apiCode=WMS_MES_UPDATE_MATE_FEEDBACK"; + +// 测试地址 WMS——MES 回传接口******https://apintodev.amecnsh.com/AMEC4/wms/oauth/token + public static String returnMesToken = "/AMEC4/wms/oauth/token"; // OA生产地址 // public static String returnOA = "https://10.1.112.7/api/zwbdt/e9/oa4sap/confirmRequest"; diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceReqManager.java b/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceReqManager.java index 365e370..bc66012 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceReqManager.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceReqManager.java @@ -29,7 +29,14 @@ public interface InterfaceReqManager extends BaseManager{ */ @Transactional String doWmsReqSap(String URL, String xmlInfo,String type); - + /** + * wms req MES + * @param URL 接口地址 + * @param xmlInfo 发送参数 + * @return + */ + @Transactional + String doWmsReqMes(String URL, String xmlInfo,String type); //WCS接口 boolean doWmsReqWcs(String URL, String xmlInfo,String taskcode); //OA接口 @@ -144,6 +151,13 @@ public interface InterfaceReqManager extends BaseManager{ */ @Transactional void returnoutAsn(List ids); + + /** + * wms入库回传MES关闭状态 + * @param ReceivedRecord ids + */ + @Transactional + void returnoutAsnMes(List ids); /** * WMS-SAP 发料回传 @@ -151,6 +165,22 @@ public interface InterfaceReqManager extends BaseManager{ */ @Transactional boolean wmsSapFaliaohuichuang(List ids); + + /** + * WMS-MES 发料回传 + * @param ids 拣货任务 id + */ + @Transactional + boolean wmsMesFaliao(List ids,String type); + /** + * WMS-MES 移位回传 + * @param ids 库存id + * type=4 + */ + @Transactional + boolean wmsMesInventory(List ids,String type); + + /** * WMS-SAP 跳过任务,发料回传 * @param ids 拣货任务 id diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceRespManager.java b/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceRespManager.java index 79ccdd0..ca222d6 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceRespManager.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/InterfaceRespManager.java @@ -39,10 +39,19 @@ public interface InterfaceRespManager extends BaseManager{ JSONObject storeCPUTPTCsap(DataInterfaceLog log,String data); //SAP-WMS:成品出库任务信息接口 JSONObject storeZPUTPTCsap(DataInterfaceLog log,String data); + //SAP-WMS:成品出库任务信息接口 + JSONObject storeZPUTPTCmes(DataInterfaceLog log,String data); + + //SAP-WMS:成品变更出库任务信息接口 + JSONObject storeZPUTUPDATEmes(DataInterfaceLog log,String data); + //SAP-WMS:其它移动类型(非采购)出库任务信息接口 JSONObject storeQPUTPTCsap(DataInterfaceLog log,String data); //SAP-WMS:成品收货入库任务接口 JSONObject storeASNZPUTASN(DataInterfaceLog log,String data); + //MES-WMS:成品收货入库任务接口 + JSONObject storeMESZPUTASN(DataInterfaceLog log,String data); + //SAP-WMS:采购收货入库任务接口 @Transactional JSONObject storeASNCPUTASN(DataInterfaceLog log,String data); diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceReqManager.java b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceReqManager.java index da16487..4ebbda9 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceReqManager.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceReqManager.java @@ -16,7 +16,9 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Base64; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import library.doLibrary; @@ -36,6 +38,7 @@ import com.dev.energy.server.exception.BusinessException; import com.dev.energy.server.model.EntityFactory; import com.dev.energy.server.model.exception.ExceptionLog; import com.dev.energy.server.service.pojo.DefaultBaseManager; +import com.dev.swms.client.WmsTokenClient; import com.dev.swms.server.model.base.BillType; import com.dev.swms.server.model.base.Item; import com.dev.swms.server.model.base.ItemKey; @@ -164,7 +167,122 @@ public class DefaultInterfaceReqManager extends DefaultBaseManager implements In } return str; } + + + @Override + public String doWmsReqMes(String URL, String xmlInfo,String type) { + boolean bool = false; + DataInterfaceLog interfaceLog = interfaceManager.storeDataInterfaceLog("WMS-MES", type, "WMS", "SAP", URL, + xmlInfo); + String str = ""; + InputStream instr = null; + java.io.ByteArrayOutputStream out = null; + String ResponseString = ""; + int i = 0; + + boolean flag = true; +// while (flag) { + logger.info("wms-MES发起的数据:" + xmlInfo); + try { + HttpClient httpClient = new HttpClient(); + // 设置超时时间 +// httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); +// httpClient.getHttpConnectionManager().getParams().setSoTimeout(5000); + PostMethod postMethod = new PostMethod(URL); + // 设置请求头 Content-Type + postMethod.setRequestHeader("Content-Type", "application/json"); + //X-Authorization + postMethod.setRequestHeader("Authorization", "Basic " + + Base64.getUrlEncoder().encodeToString(("AMECBGADMIN" + ":" + "Amec@BgAdmin@888").getBytes())); + RequestEntity requestEntity = new StringRequestEntity(xmlInfo, "application/json", "UTF-8"); + postMethod.setRequestEntity(requestEntity); + httpClient.executeMethod(postMethod);// 执行请求 +// httpClient.setTimeout(5000); + instr = postMethod.getResponseBodyAsStream();// 获取返回的流 + BufferedReader br = null; + StringBuffer buffer = new StringBuffer(); + // 将返回的输入流转换成字符串 + br = new BufferedReader(new InputStreamReader(instr, Charset.forName("UTF-8"))); + String temp; + while ((temp = br.readLine()) != null) { + buffer.append(temp); + } + logger.info(xmlInfo + "wms-sap响应报文:" + buffer); + str = buffer + ""; + if(str==null||str.equals("")) { + + }else { + bool = true; + } + + flag = false; + } catch (Exception e) { + /* + * i++; + * if (i>3) { + * flag=false; + * } + * try { + * Thread.sleep(180000); + * } catch (InterruptedException e1) { + * // TODO 自动生成的 catch 块 + * e1.printStackTrace(); + * } + * e.printStackTrace(); + */} +// } + // 接口回传日志 + interfaceManager.updateDataInterfaceLog(interfaceLog, "", str); + + try { + if (out != null) { + out.close(); + } + if (instr != null) { + instr.close(); + } + } catch (Exception ex) { + } + return str; + } + + + public String doWmsReqMes1(String URL, String xmlInfo,String type) { + + DataInterfaceLog interfaceLog = interfaceManager.storeDataInterfaceLog("WMS-MES", type, "WMS", "MES", URL, + xmlInfo); + // 创建Token客户端 + WmsTokenClient client = new WmsTokenClient(); + String response =""; + // 1. 获取访问Token + if (client.getAccessToken()) { + System.out.println("成功获取访问Token: " + client.getAccessTokenValue()); + + // 2. 构建业务请求数据(示例) + Map requestData = new HashMap(); + requestData.put("warehouseCode", "WH001"); + requestData.put("skuCode", "SKU12345"); + requestData.put("action", "queryInventory"); + requestData.put("timestamp", System.currentTimeMillis()); + + // 3. 构建JSON请求 + String jsonRequest = client.buildSimpleJson(requestData); + System.out.println("业务请求JSON: " + jsonRequest); + + // 4. 调用业务API(使用访问Token) + // 注意:需要替换为实际的业务API URL + String businessApiUrl = "https://apintodev.amecnsh.com/AMEC4/wms/api/business"; + response = client.callBusinessApi(URL, xmlInfo); + System.out.println("业务API响应: " + response); + } else { + System.out.println("获取访问Token失败"); + } + // 接口回传日志 + interfaceManager.updateDataInterfaceLog(interfaceLog, "", response); + return response; + } + @Override public JSONObject getJsonSapHead(String name) { JSONObject jsonobj1 = new JSONObject(); @@ -1034,7 +1152,7 @@ public class DefaultInterfaceReqManager extends DefaultBaseManager implements In @Override public boolean wmsSapFaliaohuichuang(List ids) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-HH-dd"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); JSONObject jsonobj = new JSONObject(); JSONObject jsonobj2 = new JSONObject(); @@ -1249,8 +1367,171 @@ public class DefaultInterfaceReqManager extends DefaultBaseManager implements In return sapStatus; } - - + //WMS回传mes + @Override + public boolean wmsMesFaliao(List ids,String type) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + JSONObject jsonobj = new JSONObject(); + JSONObject jsonobj2 = new JSONObject(); + JSONArray array = new JSONArray(); + PickTicket pickTicket=null; + boolean sapStatus=false; + // TODO 自动生成的方法存根 + for (Long id : ids) { + JSONObject jsonobj1 = new JSONObject(); + Task task = this.load(Task.class, id); + + ItemKey itemKey = this.load(ItemKey.class, task.getItemKey().getId()); + Item item = this.load(Item.class, itemKey.getItem().getId()); + PickTicketDetail ptd = this.load(PickTicketDetail.class, task.getPickTicketDetail().getId()); + if(pickTicket==null) { + pickTicket= this.load(PickTicket.class, ptd.getPickTicket().getId()); + } +// WarehouseArea warehouseArea = this.load(WarehouseArea.class, task.getWarehouseArea().getId()); + BillType billType = this.load(BillType.class, pickTicket.getBillType().getId()); + // WMS2SAP-成品发货出库反馈接口 + String str=task.getItemKey().getLotInfo().getPropC9(); + String str1=task.getItemKey().getLotInfo().getPropC2(); + if (type.equals("2")||type.equals("5")) { +// jsonobj.put("HEAD", getJsonSapHead("SD003")); + jsonobj2.put("TAALS", pickTicket.getCode() == null ? "" : pickTicket.getCode()); + jsonobj2.put("SERNR", pickTicket.getRelatedBill1() == null ? "" : pickTicket.getRelatedBill1()); + jsonobj2.put("MATNR1", item.getCode()); + jsonobj2.put("WERKS", str==null?"":str); +// jsonobj2.put("LGORT", str1==null?"":str1); + jsonobj2.put("CASENUMBER", ptd.getLineNumber() + ""); + jsonobj2.put("ZACGIQTY", task.getMovedQuantityMU() + ""); + jsonobj2.put("TASAT", type); + jsonobj2.put("TASPD", dateFormat.format(task.getOperateTime())); + } else if(type.equals("3")) { +// jsonobj.put("HEAD", getJsonSapHead("SD003")); + jsonobj2.put("TAALS", pickTicket.getCode() == null ? "" : pickTicket.getCode()); + jsonobj2.put("SERNR", pickTicket.getRelatedBill1() == null ? "" : pickTicket.getRelatedBill1()); + jsonobj2.put("MATNR1", item.getCode()); + jsonobj2.put("WERKS", str==null?"":str); +// jsonobj2.put("LGORT", str1==null?"":str1); + jsonobj2.put("CASENUMBER", ptd.getLineNumber() + ""); + jsonobj2.put("ZACGIQTY", task.getMovedQuantityMU() + ""); + jsonobj2.put("TASAT", type); + jsonobj2.put("NEWSERNR", pickTicket.getRelatedBill2() == null ? "" : pickTicket.getRelatedBill2()); + jsonobj2.put("NEWCASENUMBER", ptd.getStrBill10());//新箱号 + jsonobj2.put("NEWMATNR1", ptd.getStrBill11());//新料号 + jsonobj2.put("TASPD", dateFormat.format(task.getOperateTime())); + jsonobj2.put("TACTI", timeFormat.format(task.getOperateTime())); + + }else if(type.equals("4")) { + +// jsonobj.put("HEAD", getJsonSapHead("SD003")); + jsonobj2.put("TAALS", pickTicket.getCode() == null ? "" : pickTicket.getCode()); + jsonobj2.put("SERNR", pickTicket.getRelatedBill1() == null ? "" : pickTicket.getRelatedBill1()); + jsonobj2.put("MATNR1", item.getCode()); + jsonobj2.put("WERKS", str==null?"":str); + jsonobj2.put("MANUAL", "");//库区 + jsonobj2.put("CASENUMBER", ptd.getLineNumber() + ""); + jsonobj2.put("ZACGIQTY", task.getMovedQuantityMU() + ""); + jsonobj2.put("TASAT", type); + + jsonobj2.put("TASPD", dateFormat.format(task.getOperateTime())); + jsonobj2.put("TACTI", timeFormat.format(task.getOperateTime())); + } + array.add(jsonobj2); + } + jsonobj.put("requestBody", array); + if(pickTicket!=null&&pickTicket.getCode().indexOf("CP")==-1 + &&((pickTicket.getSourceId()!=null&&pickTicket.getSourceId().indexOf("OT")== -1) + || pickTicket.getSourceId()==null )) { + if(type.equals("2")) { + //退回出库 + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESRETURN, jsonobj.toString(),"MES数据"+pickTicket.getCode()); + }else if(type.equals("3")) { + //变更出库 + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESUPDATE, jsonobj.toString(),"MES数据"+pickTicket.getCode()); + }else if(type.equals("4")) { + //移库 + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESTRANSFER, jsonobj.toString(),"MES数据"+pickTicket.getCode()); + }else if(type.equals("5")) { + //成品出库 + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESPRODUCT, jsonobj.toString(),"MES数据"+pickTicket.getCode()); + } + + +// if(bs!=null&&!bs.equals("")&&OUTPUT(bs)) { +// sapStatus=true;//回传是否成功 +// }else { +// try { +// ExceptionLog log=EntityFactory.getEntity(ExceptionLog.class); +// log.setType("PICK"); +// log.setOperUserId(pickTicket.getId()); +// log.setOperDate(new Date()); +// log.setOperException(bs); +// log.setOperExceptionMess(jsonobj.toString()); +// log.setOperPageName("数据"); +// commonDao.store(log); +// }catch (Exception e) { +// +// } +// } + } + return sapStatus; + } + //WMS回传mes + @Override + public boolean wmsMesInventory(List ids,String type) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + JSONObject jsonobj = new JSONObject(); + JSONObject jsonobj2 = new JSONObject(); + JSONArray array = new JSONArray(); + boolean sapStatus=false; + // TODO 自动生成的方法存根 + for (Long id : ids) { + Inventory inv = this.load(Inventory.class, id); + Location loc=commonDao.load(Location.class, inv.getLocation().getId()); + ItemKey itemKey = this.load(ItemKey.class, inv.getItemKey().getId()); + Item item = this.load(Item.class, itemKey.getItem().getId()); + + WarehouseArea warehouseArea = this.load(WarehouseArea.class, loc.getZone().getId()); + // WMS2SAP-成品发货出库反馈接口 + String str=itemKey.getLotInfo().getPropC9(); + String str1=itemKey.getLotInfo().getPropC2(); + String itemCode=item.getCode(); + if(type.equals("4")) { + String[] fruits = itemCode.split("#"); + Date dt=new Date(); + String code2="MV"+dt.getTime(); +// jsonobj.put("HEAD", getJsonSapHead("SD003")); + jsonobj2.put("TAALS", code2); + int index = itemCode.lastIndexOf("#"); + itemCode.substring(0, index); + jsonobj2.put("SERNR", fruits[0]); + jsonobj2.put("MATNR1", itemCode); + jsonobj2.put("WERKS", str==null?"":str); + jsonobj2.put("MANUAL", warehouseArea.getName());//库区 + jsonobj2.put("CASENUMBER", fruits[1]); + jsonobj2.put("ZACGIQTY", inv.getQuantity()); + jsonobj2.put("TASAT", type); + jsonobj2.put("TASPD", dateFormat.format(dt)); + jsonobj2.put("TACTI", timeFormat.format(dt)); + } + array.add(jsonobj2); + } + jsonobj.put("requestBody", array); + if(type.equals("2")) { + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESRETURN, jsonobj.toString(),"MES数据"); + }else if(type.equals("3")) { + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESUPDATE, jsonobj.toString(),"MES数据"); + }else if(type.equals("4")) { + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESTRANSFER, jsonobj.toString(),"MES数据"); + }else if(type.equals("5")) { + String bs=doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESPRODUCT, jsonobj.toString(),"MES数据"); + } + + + + + return sapStatus; + } //返回截取 @@ -2518,5 +2799,62 @@ public class DefaultInterfaceReqManager extends DefaultBaseManager implements In return sapStatus; } - +public void returnoutAsnMes(List ids) { + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + JSONObject jsonobj = new JSONObject(); + String becode=""; + for (Long id : ids) { + ReceivedRecord receivedRecord = commonDao.load(ReceivedRecord.class, id); + ASNDetail asnDetail = commonDao.load(ASNDetail.class, receivedRecord.getAsnDetail().getId()); + ASN asn = commonDao.load(ASN.class, receivedRecord.getAsn().getId()); + WarehouseArea warehouseArea = commonDao.load(WarehouseArea.class, + receivedRecord.getWarehouseArea().getId()); + Item item = this.load(Item.class, asnDetail.getItem().getId()); + BillType billType = this.load(BillType.class, asn.getBillType().getId()); + JSONArray array = new JSONArray(); + JSONObject jsonobj2 = new JSONObject(); + becode=asn.getCode(); + if ((billType.getCode().equals("ZPUTASN"))) {// WMS2SAP-成品收货入库反馈接口 +// jsonobj.put("HEAD", getJsonSapHead("SD002")); + jsonobj2.put("TAALS", asn.getCode() + "");//任务号 + jsonobj2.put("SERNR", asn.getRelatedBill2() + "");//项目ID + jsonobj2.put("MATNR1", item.getCode() + "");//物料号 + jsonobj2.put("CASENUMBER", asnDetail.getStrBill1()+ "");//箱号 + jsonobj2.put("WERKS", asnDetail.getLotInfo().getPropC9() + "");//工厂 + jsonobj2.put("LGORT", asnDetail.getLotInfo().getPropC2() + "");//库存地 + jsonobj2.put("TAAGR", receivedRecord.getReceivedQuantity());//实际收货数量 + jsonobj2.put("MANUAL", warehouseArea.getName());//库区 + jsonobj2.put("TASBD", dateFormat.format(receivedRecord.getOccurTime()));//收货任务回传日期 + jsonobj2.put("TASBT", timeFormat.format(receivedRecord.getOccurTime()));//收货任务回传时间 + //成品收货状态0-未处理;1-处理中;2-处理完成 +// if(asn.getReceivedQuantity()>0&&asn.getReceivedQuantity()==asn.getPutawayQuantity()){ +// jsonobj2.put("TASAT", "2"); +// }else { +// jsonobj2.put("TASAT", "1"); +// } +// jsonobj2.put("MANUAL", ""); + } + array.add(jsonobj2); + jsonobj.put("requestBody", array); + logger.info(jsonobj); + if(asn.getCode().indexOf("RP")==-1&&(billType.getCode().equals("CPUTASN")||billType.getCode().equals("ZPUTASN")||billType.getCode().equals("QPUTASN")) + &&asn.getCode().indexOf("OT")==-1) { + if(getPropertiesParm("ldxt.bz").equals("1")) { + + String flag = doWmsReqMes1(getPropertiesParm("ldxt.MES")+ApiURL.returnMESIN, jsonobj.toString(),"入库"+billType.getCode()+becode); + + if (flag!=null) { +// + } + } + } + } + } + + + + + } \ No newline at end of file diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceRespManager.java b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceRespManager.java index 4240fcc..74b581d 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceRespManager.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultInterfaceRespManager.java @@ -1019,7 +1019,291 @@ public class DefaultInterfaceRespManager extends DefaultBaseManager implements I return json11; } - + //SAP-WMS:成品退回出库任务接口 + @Override + public JSONObject storeZPUTPTCmes(DataInterfaceLog log, String data) { + JSONObject json0 = new JSONObject(); + JSONArray resultInfo = new JSONArray(); + BillType billType=null; + List BillTypes = commonDao.findByQuery(" from BillType bt where bt.code=:code", + new String[] { "code"},new Object[] {"ZPUTPTC"}); + // TODO 自动生成的方法存根 + String msg=""; + JSONArray arrayItem=new JSONArray(); + JSONObject json = jsonDataPT(data); + JSONArray pickTickets=new JSONArray(); + try { + pickTickets=json.getJSONArray("header"); + }catch (Exception e) { + // TODO: handle exception + } + + + String billTypess="ZPUTPTC";//单据类型 + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + List billTypes=commonDao.findByQuery(" from BillType bt where bt.code='"+billTypess+"'");//单据类型查询 + for(int j=0;j Items = commonDao.findByQuery(" from Item item where item.code=:code", + new String[] { "code"},new Object[] {MATNR}); + if (Items.size()<=0) { + JSONObject objectItem=new JSONObject(); + objectItem.put("TAALS", RQORD); + objectItem.put("MATNR", MATNR); + objectItem.put("errorcode", "205"); + objectItem.put("errordescr", "料号不存在!"); + resultInfo.add(objectItem); + continue; + }else{ + item=Items.get(0); + } + + if(msg==null || msg.length()<=0){ + if (BillTypes.size()>0) { + billType=BillTypes.get(0); + }else{ + billType=this.load(BillType.class, 1020L); + } + + PickTicket pTicket=null; + List pTickets = commonDao.findByQuery(" from PickTicket pt where pt.code=:RQORD", + new String[] { "RQORD"},new Object[] {RQORD}); + if (pTickets.size()>0) { + pTicket=pTickets.get(0); + }else { + pTicket=EntityFactory.getEntity(PickTicket.class); + } + pTicket.setCode(RQORD); + pTicket.setBillType(billType); + pTicket.setRelatedBill1(relatedBill1); +// pTicket.setRelatedBill2(RECORDN); + + if(NEEDDATE!=null&&!NEEDDATE.equals("")) { + try { + + pTicket.setShipDate(sdf.parse(NEEDDATE)); + pTicket.setUpdateTime(sf.parse(TACDA+" "+TACTI)); + } catch (ParseException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + + }else { + pTicket.setOrderDate(new Date()); + } + + pTicket.setShipDate(new Date()); + pTicket.setWarehouse(warehouse); + Structure company=this.load(Structure.class, 1L); + pTicket.setCompany(company); + pTicket.setStatus(PickTicketStatus.OPEN); + if(BWART!=null&&BWART.length()>0) { + pTicket.setSourceType(BWART);//成品出库 + }else { + pTicket.setSourceType("ZPUTPTC");//成品出库 + } + pTicket.setOrderDate(pTicket.getOrderDate());//订单日期 +// pTicket.setCode(this.bussinessCodeManager.getCodeForYm("PT",5));//自动生成出库单号 + pTicket.setBillType(billTypes.get(0));//单据类型 + pTicket.setStatus(PickTicketStatus.OPEN);//状态 + pTicket.setOrderQuantity(1);//出库数量 + pTicket.setOrderDate(new Date());//创建日期 + commonDao.store(pTicket); + PickTicketDetail ptd =null; + List PickTicketDetails = commonDao.findByQuery(" from PickTicketDetail ptd where " + + " ptd.pickTicket.id=:id and ptd.item.id=:sourceId ", + new String[] { "id","sourceId"},new Object[] {pTicket.getId(),item.getId()}); + if (PickTicketDetails.size()>0) { + ptd=PickTicketDetails.get(0); + }else{ + ptd=EntityFactory.getEntity(PickTicketDetail.class); + } + ptd.setSourceId(RQORD); + ptd.setItem(item); + ptd.setOrderQuantity(1);//出库数量 + ptd.setLineNumber(strBill3); + ptd.setLocationName(LGORT); + ptd.setOrderQuantity(Double.parseDouble(QTY)); + ptd.setOrderQtyOfMasterUnit(ptd.getOrderQuantity()); + NewLotInfo newLotInfo=new NewLotInfo(); + newLotInfo.setPropC9(WERKS); + newLotInfo.setPropC2(LGORT); + ptd.setNewLotInfo(newLotInfo); + ptd.setPickTicket(pTicket); + commonDao.store(ptd); + pickTicketManager.refreshOrderQuantity(pTicket); + } + } + json0.accumulate("returnCode", "200"); + json0.accumulate("returnFlag", "1"); + json0.accumulate("returnDesc", "成功"); + json0.accumulate("resultInfo", resultInfo); + JSONObject json1 = new JSONObject(); + json1.put("return", json0); + JSONObject json11 = new JSONObject(); + json11.put("Response", json1); + interfaceManager.updateDataInterfaceLog(log, null,json11.toString()); + return json11; + } + //SAP-WMS:成品变更出库任务接口 + @Override + public JSONObject storeZPUTUPDATEmes(DataInterfaceLog log, String data) { + JSONObject json0 = new JSONObject(); + JSONArray resultInfo = new JSONArray(); + BillType billType=null; + List BillTypes = commonDao.findByQuery(" from BillType bt where bt.code=:code", + new String[] { "code"},new Object[] {"ZPUTMV"}); + // TODO 自动生成的方法存根 + String msg=""; + JSONArray arrayItem=new JSONArray(); + JSONObject json = jsonDataPT(data); + JSONArray pickTickets=json.getJSONArray("header"); + String billTypess="ZPUTMV";//单据类型 + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + List billTypes=commonDao.findByQuery(" from BillType bt where bt.code='"+billTypess+"'");//单据类型查询 + for(int j=0;j Items = commonDao.findByQuery(" from Item item where item.code=:code", + new String[] { "code"},new Object[] {MATNR}); + if (Items.size()<=0) { + JSONObject objectItem=new JSONObject(); + objectItem.put("TAALS", RQORD); + objectItem.put("MATNR", MATNR); + objectItem.put("errorcode", "205"); + objectItem.put("errordescr", "料号不存在!"); + resultInfo.add(objectItem); + continue; + }else{ + item=Items.get(0); + } + + if(msg==null || msg.length()<=0){ + if (BillTypes.size()>0) { + billType=BillTypes.get(0); + }else{ + billType=this.load(BillType.class, 1020L); + } + + PickTicket pTicket=null; + List pTickets = commonDao.findByQuery(" from PickTicket pt where pt.code=:RQORD", + new String[] { "RQORD"},new Object[] {RQORD}); + if (pTickets.size()>0) { + pTicket=pTickets.get(0); + }else { + pTicket=EntityFactory.getEntity(PickTicket.class); + } + pTicket.setCode(RQORD); + pTicket.setBillType(billType); + pTicket.setRelatedBill1(relatedBill1); + pTicket.setRelatedBill2(relatedBill2); + if(NEEDDATE!=null&&!NEEDDATE.equals("")) { + try { + pTicket.setShipDate(sdf.parse(NEEDDATE)); + pTicket.setUpdateTime(sf.parse(TACDA+" "+TACTI)); + } catch (ParseException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + + }else { + pTicket.setOrderDate(new Date()); + } + pTicket.setShipDate(new Date()); + pTicket.setWarehouse(warehouse); + Structure company=this.load(Structure.class, 1L); + pTicket.setCompany(company); + pTicket.setStatus(PickTicketStatus.OPEN); + if(BWART!=null&&BWART.length()>0) { + pTicket.setSourceType(BWART);//成品出库 + }else { + pTicket.setSourceType("ZPUTPTC");//成品出库 + } + pTicket.setOrderDate(pTicket.getOrderDate());//订单日期 +// pTicket.setCode(this.bussinessCodeManager.getCodeForYm("PT",5));//自动生成出库单号 + pTicket.setBillType(billTypes.get(0));//单据类型 + pTicket.setStatus(PickTicketStatus.OPEN);//状态 + pTicket.setOrderQuantity(1);//出库数量 + pTicket.setOrderDate(new Date());//创建日期 + commonDao.store(pTicket); + PickTicketDetail ptd =null; + List PickTicketDetails = commonDao.findByQuery(" from PickTicketDetail ptd where " + + " ptd.pickTicket.id=:id and ptd.item.id=:sourceId ", + new String[] { "id","sourceId"},new Object[] {pTicket.getId(),item.getId()}); + if (PickTicketDetails.size()>0) { + ptd=PickTicketDetails.get(0); + }else{ + ptd=EntityFactory.getEntity(PickTicketDetail.class); + } + ptd.setSourceId(RQORD); + ptd.setItem(item); + ptd.setOrderQuantity(1);//出库数量 + ptd.setLineNumber(strBill3); + ptd.setLocationName(LGORT); + ptd.setOrderQuantity(Double.parseDouble(QTY)); + ptd.setOrderQtyOfMasterUnit(ptd.getOrderQuantity()); + NewLotInfo newLotInfo=new NewLotInfo(); + newLotInfo.setPropC9(WERKS); + newLotInfo.setPropC2(LGORT); + ptd.setNewLotInfo(newLotInfo); + ptd.setPickTicket(pTicket); + ptd.setStrBill10(NEWCASENUMBER);//新箱号 + ptd.setStrBill11(NEWMATNR1);//新料号 + commonDao.store(ptd); + pickTicketManager.refreshOrderQuantity(pTicket); + } + } + json0.accumulate("returnCode", "200"); + json0.accumulate("returnFlag", "1"); + json0.accumulate("returnDesc", "成功"); + json0.accumulate("resultInfo", resultInfo); + JSONObject json1 = new JSONObject(); + json1.put("return", json0); + JSONObject json11 = new JSONObject(); + json11.put("Response", json1); + interfaceManager.updateDataInterfaceLog(log, null,json11.toString()); + return json11; + } + + @Override public JSONObject storeQPUTPTCsap(DataInterfaceLog log, String data) { JSONObject json0 = new JSONObject(); @@ -1343,7 +1627,145 @@ public class DefaultInterfaceRespManager extends DefaultBaseManager implements I interfaceManager.updateDataInterfaceLog(log, null,json11.toString()); return json11; } - + //mes成品入库 + public JSONObject storeMESZPUTASN(DataInterfaceLog log, String data) { + JSONObject json0 = new JSONObject(); + JSONArray resultInfo = new JSONArray(); + String returnCode="205"; + String returnDesc="0"; + String returnFlag=""; + JSONArray jsonArray = jsonData(data);//解析报文数据 + String billType="ZPUTASN"; + List billTypes=commonDao.findByQuery(" from BillType bt where bt.code='"+billType+"'");//单据类型查询 + //循环报文数据 + for(int j=0;j asns = commonDao.findByQuery(" from ASN asn where asn.code=:code ", + new String[] { "code"},new Object[] {PO}); + ASN asndb=EntityFactory.getEntity(ASN.class); + if (asns.size()>0) {//查询收货表是否有数据 + asndb=asns.get(0);//如果有数据就显示查询到的数据 + }else {//如果没有数据 上面获取的数据就放到 asndb里面去 + asndb.setCode(PO); + asndb.setOrderDate(orderDate); + asndb.setStatus(ASNStatus.OPEN); + } + asndb.setUserName("HANDABAP"); + asndb.setCompany(commonDao.load(Structure.class, 1L));//默认客户 + asndb.setCode(PO);//接口任务号 + asndb.setRelatedBill1(strBill7);//自动生成收货凭证号 + asndb.setRelatedBill2(SERNR);//项目号 + asndb.setWarehouse(this.load(Warehouse.class, 1L));//默认仓库 + asndb.setOrderDate(asndb.getOrderDate());//收货日期 + asndb.setStatus(ASNStatus.OPEN);//状态 + asndb.setBillType(billTypes.get(0));//单据类型 + asndb.setOrderDate(orderDate); + asndb.setSourceType(sourceType);//移位类型 +// asndb.setExpectedQuantity(1);//订单数量 + asndb.setChejian(productLine);//产品线 + commonDao.store(asndb); + ASNDetail asnDetail=EntityFactory.getEntity(ASNDetail.class); + List asnDetails = commonDao.findByQuery(" from ASNDetail ad where ad.item.code=:itemCode and ad.asn.id=:id", + new String[] { "itemCode","id"},new Object[] {itemCode,asndb.getId()}); + if (asnDetails.size()>0) { + asnDetail=asnDetails.get(0); + } + asnDetail.setExpectedQuantity(1); + asnDetail.setSourceId(PO); + Item item=null; + List items=this.commonDao.findByQuery("from Item it where it.code='"+itemCode+"' "); + if (items.size()>0) { + item=items.get(0); + }else{ + item=EntityFactory.getEntity(Item.class); + item.setCode(itemCode); + item.setName(itemCode); + item.setSpecs(""); + item.setShipRules(""); + item.setUnit(meins); + item.setGoodType(""); +// item.setWeight(weight); +// item.setLength(length); +// item.setWidth(width); +// item.setHeight(height); + item.setFeeType("MES"); +// List warehouseAreas=this.commonDao.findByQuery("from WarehouseArea wa where wa.id="+1763l+""); +// if (warehouseAreas.size()>0) { +// item.setWarehouseArea(warehouseAreas.get(0)); +// } + commonDao.store(item); + } + LotInfo lotInfo=new LotInfo(); + lotInfo.setPropC2(propC2); + lotInfo.setPropC9(propC9); + asnDetail.setLotInfo(lotInfo); + asnDetail.setCreateDate(new Date()); +// asnDetail.setSourceId(new Date().getTime()+""); + asnDetail.setItem(item);//物料描述(货品)(物料料号) +// asnDetail.setStrBill3(zfggr);// + asnDetail.setStrBill1(casenumber);//箱号 +// asnDetail.setStrBill6(); + asnDetail.setStrBill7(strBill7); +// asnDetail.setStrBill8(strBill1); +// asnDetail.setRelatedBill2(Recordn); +// asnDetail.setRelatedBill3(Returned); + asnDetail.setAsn(asndb);//把收货单(收货表数据)存到收货明细中去 + asnDetail.setWeight(weight);//重量 + asnDetail.setLength(length); + asnDetail.setWidth(width); + asnDetail.setHeight(height); + commonDao.store(asnDetail); + asnManager.addASNDetail(asndb.getId(),asnDetail); + returnCode="200"; + returnFlag="1"; + returnDesc="成功"; + } + + json0.accumulate("returnCode", returnCode); + json0.accumulate("returnFlag", returnFlag); + json0.accumulate("returnDesc", returnDesc); + json0.accumulate("resultInfo", resultInfo); + + JSONObject json1 = new JSONObject(); + json1.put("return", json0); + JSONObject json11 = new JSONObject(); + json11.put("Response", json1); + interfaceManager.updateDataInterfaceLog(log, null,json11.toString()); + return json11; + } //OA下发:无PO、无料号的收货 @Override public JSONObject storeOAPUTASNoa(DataInterfaceLog log, String data) { diff --git a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultQueryAppManager.java b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultQueryAppManager.java index ca3adb2..72974ca 100644 --- a/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultQueryAppManager.java +++ b/src/main/java/com/dev/swms/server/service/interfaceLog/pojo/DefaultQueryAppManager.java @@ -3134,8 +3134,14 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA // } String belcos="否"; if(ik.getLotInfo()!=null&&ik.getLotInfo().getPropC2()!=null - &&ik.getLotInfo().getPropC2().equals("SL19")) { - belcos="是"; + ) { + String lco=ik.getLotInfo().getPropC2(); + List list=commonDao.findByQuery("select pl.id from PlantLocation as pl " + + "where pl.code='"+lco+"' and pl.beRegister=1 "); + if(list.size()>0) { + belcos="是"; + } + } String beMarkWeight=""; if(ik.isBeMarkWeight()){ @@ -10002,7 +10008,7 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA try { if (workerId > 0) { if (wId > 0) { - + String hql="select p.id,z.LEVELS,p.CODE," + " STUFF((SELECT ','+CONVERT(nvarchar(10),a.id) FROM TASK a\r\n" + " left join PICK_TICKET_DETAIL pt1 on pt1.id=a.PICK_TICKET_DETAIL_ID\r\n" + @@ -10024,7 +10030,8 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA " left join zone z on z.id=loc.ZONE_ID \r\n" + " left join LOCATION lc on lc.ID=t.DST_LOC_ID \r\n" + " where t.INVENTORY_STATUS='合单完成' and t.PLAN_QUANTITY_MU>0 " - + " and t.LEAVE_TIME is null and lc.zone_id<>1787 and t.MOVED_QUANTITY_MU>0\r\n" ; + + " and t.LEAVE_TIME is null and lc.zone_id<>1787 " + + "and t.MOVED_QUANTITY_MU>0\r\n" ; if(billcode!=null&&!billcode.equals("")) { if(billcode.equals("3")) { @@ -10050,6 +10057,84 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA } hql+= " group by p.id,p.CODE,z.LEVELS " + " order by max(p.equated_Quantity) desc,max(t.operator_Date),p.CODE,p.id,z.LEVELS "; + + + /** + String hql=" WITH TaskData AS (\r\n" + + " SELECT \r\n" + + " t.id AS task_id,\r\n" + + " p.id AS pick_ticket_id,\r\n" + + " p.CODE,\r\n" + + " z.LEVELS,\r\n" + + " p.equated_Quantity,\r\n" + + " t.BILLCODE,\r\n" + + " t.WORKER2_ID,\r\n" + + " t.operator_Date,\r\n" + + " lc.code AS lc_code\r\n" + + " FROM TASK t \r\n" + + " INNER JOIN PICK_TICKET_DETAIL pt ON pt.id = t.PICK_TICKET_DETAIL_ID \r\n" + + " INNER JOIN PICK_TICKET p ON p.id = pt.PICK_TICKET_ID \r\n" + + " INNER JOIN LOCATION loc ON loc.ID = t.SRC_LOC_ID\r\n" + + " INNER JOIN ZONE z ON z.id = loc.ZONE_ID \r\n" + + " INNER JOIN LOCATION lc ON lc.ID = t.DST_LOC_ID \r\n" + + " WHERE t.INVENTORY_STATUS = '合单完成' \r\n" + + " AND t.PLAN_QUANTITY_MU > 0 \r\n" + + " AND t.MOVED_QUANTITY_MU > 0\r\n" + + " AND t.LEAVE_TIME IS NULL \r\n" + + " AND lc.zone_id <> 1787\r\n" ; + + if(billcode!=null&&!billcode.equals("")) { + if(billcode.equals("3")) { + hql+=" and z.LEVELS=3 "; + }else if(billcode.equals("7")){ + hql+=" and z.LEVELS=7 "; + } + }else { + hql+=" and z.LEVELS in(3,7) "; + } + if(p_code!=null&&!p_code.equals("")) { + String str []= p_code.split("/"); + if(str.length>2) { + p_code=str[1]; + } + String[] stringArray= p_code.split("-"); + if(stringArray.length>0) { + p_code=stringArray[0].toString(); + } + hql+=" and p.CODE='"+p_code+"'"; + } + + hql=hql+"), " + + "AggregatedTasks AS ( \r\n" + + " SELECT \r\n" + + " pick_ticket_id,\r\n" + + " CODE,\r\n" + + " LEVELS,\r\n" + + " STRING_AGG(CONVERT(nvarchar(10), task_id), ',') AS tids,\r\n" + + " MAX(equated_Quantity) AS soi,\r\n" + + " COUNT(DISTINCT BILLCODE) AS BILLCODE,\r\n" + + " MAX(CASE WHEN WORKER2_ID IS NULL THEN 1 ELSE 0 END) AS wor,\r\n" + + " MAX(lc_code) AS lc_code,\r\n" + + " MAX(operator_Date) AS last_operator_date\r\n" + + " FROM TaskData\r\n" + + " GROUP BY pick_ticket_id, CODE, LEVELS\r\n" + + ")\r\n" + + "SELECT \r\n" + + " pick_ticket_id AS id,\r\n" + + " LEVELS,\r\n" + + " CODE,\r\n" + + " tids,\r\n" + + " soi,\r\n" + + " BILLCODE,\r\n" + + " wor,\r\n" + + " lc_code,\r\n" + + " DATEDIFF(minute, last_operator_date, GETDATE()) AS hsh\r\n" + + " FROM AggregatedTasks\r\n" + + " ORDER BY soi DESC, last_operator_date, CODE, pick_ticket_id, LEVELS"; + System.out.println(hql); + */ + + Query query = session.createSQLQuery(hql.toString()); List list= (List)query.list(); if (list.size() > 0) { @@ -10236,8 +10321,9 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA "left join LOCATION loc1 on loc1.ID=a.SRC_LOC_ID\r\n" + "left join zone z1 on z1.id=loc1.ZONE_ID\r\n" + "left join LOCATION lc1 on lc1.ID=a.DST_LOC_ID\r\n" + - "where a.INVENTORY_STATUS='合单完成' and lc1.ZONE_ID<>1787 and " + - " a.PLAN_QUANTITY_MU>0 and a.MOVED_QUANTITY_MU>0 and a.LEAVE_TIME is not null \r\n" + + "where a.INVENTORY_STATUS='合单完成' and lc1.ZONE_ID<>1787 " + + " and a.WORKER3_ID="+workerId+ + " and a.PLAN_QUANTITY_MU>0 and a.MOVED_QUANTITY_MU>0 and a.LEAVE_TIME is not null \r\n" + " and p.id=p1.id and z.LEVELS=z1.LEVELS for xml Path('')),1,1,'') as tids," + "max(p.equated_Quantity) soi,\r\n" + " max(p.code) p_code ,z.LEVELS ,count(distinct(t.BILLCODE))," @@ -10248,9 +10334,10 @@ public class DefaultQueryAppManager extends DefaultBaseManager implements QueryA "left join LOCATION loc on loc.ID=t.SRC_LOC_ID " + "left join LOCATION lc on lc.ID=t.DST_LOC_ID " + "left join zone z on z.id=loc.ZONE_ID\r\n" + - " where t.INVENTORY_STATUS='合单完成' and t.PLAN_QUANTITY_MU>0 and t.MOVED_QUANTITY_MU>0\r\n" + - " and t.LEAVE_TIME is not null and lc.ZONE_ID<>1787 " + - " and t.WORKER3_ID="+workerId; + " where t.INVENTORY_STATUS='合单完成' and t.PLAN_QUANTITY_MU>0 " + + "and t.MOVED_QUANTITY_MU>0 \r\n" + " and t.WORKER3_ID="+workerId + + " and t.LEAVE_TIME is not null and lc.ZONE_ID<>1787 " ; + if(billcode!=null&&billcode.length()>0) { String str []= billcode.split("/"); if(str.length>2) { diff --git a/src/main/java/com/dev/swms/server/service/inventory/pojo/DefaultInventoryManager.java b/src/main/java/com/dev/swms/server/service/inventory/pojo/DefaultInventoryManager.java index c986e2e..5c3cae3 100644 --- a/src/main/java/com/dev/swms/server/service/inventory/pojo/DefaultInventoryManager.java +++ b/src/main/java/com/dev/swms/server/service/inventory/pojo/DefaultInventoryManager.java @@ -3198,7 +3198,8 @@ public class DefaultInventoryManager extends DefaultBaseManager implements Inven String description) { Inventory inv=this.load(Inventory.class, inventoryId); this.addInventoryLog(InventoryLogType.INVENTORY_ADJUST, -1, inv.getSOI(), inv.getLocation(), null, inv.getItemKey(), - inv.getStorageDate(), inv.getSOI(), inv.getQuantity(), null, inv.getStatus(), inv.getId(), "调整库存"+description, null,0, + inv.getStorageDate(), inv.getSOI(), inv.getQuantity(), null, inv.getStatus(), inv.getId(), + "调整库存,备注:"+description+" ,调整数量:"+packQty+"", null,0, inv.getBarCode(),null,null,null); inv.setQueuedQuantity(packQty1);//占用数量 diff --git a/src/main/java/com/dev/swms/server/service/receiving/pojo/DefaultASNManager.java b/src/main/java/com/dev/swms/server/service/receiving/pojo/DefaultASNManager.java index 998bb8d..8d34a3a 100644 --- a/src/main/java/com/dev/swms/server/service/receiving/pojo/DefaultASNManager.java +++ b/src/main/java/com/dev/swms/server/service/receiving/pojo/DefaultASNManager.java @@ -213,7 +213,7 @@ public void addASNDetail(Long id,ASNDetail asnDetail) { ASN asn=this.load(ASN.class, id); if(asnDetail.isNew()){ asnDetail.setSourceId(asnDetail.getSourceId()); - Integer lineNo=getlineNo(asn); +// Integer lineNo=getlineNo(asn); /*if(lineNo==0){ asnDetail.setLineNo(1); }else{ @@ -309,7 +309,8 @@ public void addASNDetail(Long id,ASNDetail asnDetail) { ASN a = commonDao.load(ASN.class, id); List objs = commonDao.findByQuery( - "select COALESCE(sum(o.weight),0),COALESCE(sum(o.volume),0),COALESCE(sum(o.expectedQuantity),0),COALESCE(sum(o.receivedQuantity),0),count(*) from ASNDetail o where o.asn.id=:id ", + "select COALESCE(sum(o.weight),0),COALESCE(sum(o.volume),0),COALESCE(sum(o.expectedQuantity),0)," + + "COALESCE(sum(o.receivedQuantity),0),count(*) from ASNDetail o where o.asn.id=:id ", new String[] { "id" }, new Object[] { id }); if (objs.size() > 0) { Object[] obj = objs.get(0); @@ -4467,7 +4468,7 @@ public void addASNDetail(Long id,ASNDetail asnDetail) { throw new BusinessException("请维护收货月台!"); } // if(asnDetail.getExpectedQuantity()>asnDetail.getReceivedQuantity()){ - asnDetail.setStrBill2(propC3); + asnDetail.setStrBill2(propC3);//序列号 asnDetail.setDock(dock); boolean xhh=updateBeMarkWeight(asnDetail); diff --git a/src/main/java/com/dev/swms/server/service/shipping/PickTicketManager.java b/src/main/java/com/dev/swms/server/service/shipping/PickTicketManager.java index 7e1a472..5417ae2 100644 --- a/src/main/java/com/dev/swms/server/service/shipping/PickTicketManager.java +++ b/src/main/java/com/dev/swms/server/service/shipping/PickTicketManager.java @@ -852,5 +852,8 @@ public interface PickTicketManager extends BaseManager { String printLocationCodePick(String code, Long workerId,Long wid); JSONObject checkCountRecordItem(String crIds ,String propD2,String barCodes,String propC1,String countQuantity,long userId,long warehouseId,CommonDao commonDao); + //WMS回传MES + @Transactional + void wmsMesFaliaohuichuang(List taskids); } diff --git a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultPickTicketManager.java b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultPickTicketManager.java index 1533b14..9a06b51 100644 --- a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultPickTicketManager.java +++ b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultPickTicketManager.java @@ -13,6 +13,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -22,6 +23,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.Map.Entry; +import java.util.Objects; import java.util.stream.Collectors; import jxl.Sheet; @@ -224,6 +226,10 @@ public class DefaultPickTicketManager extends DefaultBaseManager implements Pick pickTicket.setUserTracking1(); pickTicket.setUpdateTime(new Date()); pickTicket.setCollectNo(pickTicket.getCode()); + if(pickTicket.getBillType().getCode().equals("ZPUTPTC")) { + String str=DateUtil.formatDateYMD02ToStr(pickTicket.getUpdateTime()); + pickTicket.setRelatedBill1(str+pickTicket.getUpdateTime().getTime()); + } this.commonDao.store(pickTicket); } else { PickTicket pt = this.load(PickTicket.class, pickTicket.getId()); @@ -4464,7 +4470,6 @@ public class DefaultPickTicketManager extends DefaultBaseManager implements Pick if(qty>=pickQty) { r.setShippedQuantity(r.getShippedQuantity()+pickQty); r.setPickDate(new Date()); - commonDao.store(r); pickQty=0; }else { @@ -10842,5 +10847,394 @@ public class DefaultPickTicketManager extends DefaultBaseManager implements Pick } + //以下代码为Deepseek + /** + * 交单确认方法 - 优化版 + */ + public String presentationConfirmFour(String zone, String invIds, long locId, long userId, long warehouseId) { + // 1. 参数校验 + String validationResult = validateParameters(zone, invIds, locId); + if (validationResult != null) { + return validationResult; + } + + // 2. 执行业务逻辑 + return executeBusinessLogic(zone, invIds, locId, userId); + } + + /** + * 参数校验 + */ + private String validateParameters(String zone, String invIds, long locId) { + if (zone == null || zone.trim().isEmpty()) { + return "zone参数错误或为null!"; + } + if (invIds == null || invIds.trim().isEmpty()) { + return "invIds参数错误或为null!"; + } + if (locId <= 0) { + return "请扫描库位码!"; + } + return null; + } + + /** + * 执行业务逻辑 + */ + private String executeBusinessLogic(String zone, String invIds, long locId, long userId) { + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + + Session session = null; + try { + session = ((HibernateDaoSupport) this.commonDao).getSessionFactory().openSession(); + + Location dstLoc = commonDao.load(Location.class, locId); + + // 检查是否在交单区 + if (!isInPresentationZone(dstLoc)) { + return "非交单区操作!"; + } + + // 处理交单逻辑 + PresentationResult result = processPresentation(session, invIds, dstLoc, userId); + + if (result.hasFailures()) { + failureMsg.append(result.getFailureMessage()); + } + if (result.hasSuccesses()) { + successMsg.append(result.getSuccessMessage()); + } + + } catch (BusinessException e) { + failureMsg.append(e.getMessage()); + } catch (Exception e) { + failureMsg.append("系统异常: ").append(e.getMessage()); + logger.error("交单确认异常", e); + } finally { + if (session != null) { + session.close(); + } + } + + return failureMsg.length() > 0 ? failureMsg.toString() : successMsg.toString(); + } + + /** + * 处理交单逻辑 + */ + private PresentationResult processPresentation(Session session, String invIds, + Location dstLoc, long userId) { + PresentationResult result = new PresentationResult(); + + try { + // 1. 验证容器是否完成合单 + validateContainerCompletion(session, invIds); + + // 2. 查询所有任务 + List tasks = queryTasksByIds(invIds); + if (tasks.isEmpty()) { + throw new BusinessException("未找到对应的任务"); + } + + // 3. 验证任务状态和权限 + validateTasks(tasks, dstLoc); + + // 4. 按容器分组处理任务 + Map> containerTasksMap = groupTasksByContainer(tasks); + List noContainerTasks = getTasksWithoutContainer(tasks); + + Worker worker = commonDao.load(Worker.class, userId); + Set pickTicketIds = extractPickTicketIds(tasks); + List pickTicketList = new ArrayList<>(pickTicketIds); + // 5. 处理有容器的任务 + processContainerTasks(session, containerTasksMap, dstLoc, worker, result); + + // 6. 处理无容器的任务 + processNonContainerTasks(session, noContainerTasks, dstLoc, worker, result); + + // 7. 刷新工单状态 +// refreshPickHandOrder(pickTicketIds); + refPickHandOrder(pickTicketList); + } catch (BusinessException e) { + result.addFailure(e.getMessage()); + } + + return result; + } + + /** + * 验证容器完成状态 + */ + private void validateContainerCompletion(Session session, String invIds) { + String cleanInvIds = invIds.replace(" ", ""); + String sql = "SELECT s.LP FROM task t " + + "LEFT JOIN LOCATION lc ON lc.id = t.SRC_LOC_ID " + + "LEFT JOIN ZONE z ON z.id = lc.ZONE_ID " + + "LEFT JOIN STOCK s ON s.id = t.DST_LP " + + "WHERE t.strBill5 IS NULL AND z.LEVELS IN (3,7) " + + "AND t.id IN (" + cleanInvIds + ") " + + "GROUP BY s.LP"; + + List unfinishedContainers = session.createSQLQuery(sql).list(); + + if (!unfinishedContainers.isEmpty()) { + throw new BusinessException("容器" + unfinishedContainers + "未做合单任务"); + } + } + + /** + * 查询任务列表 + */ + private List queryTasksByIds(String invIds) { + String cleanInvIds = invIds.replace(" ", ""); + String hql = "FROM Task t WHERE t.id IN (" + cleanInvIds + ")"; + return commonDao.findByQuery(hql); + } + + /** + * 验证任务状态和权限 + */ + private void validateTasks(List tasks, Location dstLoc) { + boolean hasUncompletedTasks = checkTaskCompletionStatus(tasks); + if (hasUncompletedTasks) { + throw new BusinessException("该地标上任务未合单完成"); + } + + for (Task task : tasks) { + validateTaskPermissions(task, dstLoc); + } + } + + /** + * 检查任务完成状态 + */ + private boolean checkTaskCompletionStatus(List tasks) { + String taskIds = tasks.stream() + .map(t -> t.getId().toString()) + .collect(Collectors.joining(",")); + + String hql = "SELECT t.id FROM Task t WHERE t.id IN (" + taskIds + ") " + + "AND t.inventoryStatus = '合单完成'"; + + List completedTasks = commonDao.findByQuery(hql); + return completedTasks.size() < tasks.size(); + } + + /** + * 验证任务权限 + */ + private void validateTaskPermissions(Task task, Location dstLoc) { + PickTicketDetail ptd = commonDao.load(PickTicketDetail.class, + task.getPickTicketDetail().getId()); + + // 检查加急交接点权限 + if (ptd.getSOI() != null && + ("U".equals(ptd.getSOI()) || "X".equals(ptd.getSOI())) && + !dstLoc.isBeUrgent()) { + throw new BusinessException("该地位不是加急交接点"); + } + + // 检查加急交单位置限制 + Location stloc = commonDao.load(Location.class, task.getDstLoc().getId()); + if (dstLoc.isBeUrgent() && stloc.getZone().getId() == 1785L && + (stloc.getCode().startsWith("2") || stloc.getCode().startsWith("1"))) { + throw new BusinessException("加急交单位不能放货架"); + } + } + + /** + * 按容器分组任务 + */ + private Map> groupTasksByContainer(List tasks) { + Map> containerMap = new HashMap<>(); + + for (Task task : tasks) { + if (task.getDstLP() != null) { + String containerId = task.getDstLP().getId().toString(); + containerMap.computeIfAbsent(containerId, k -> new ArrayList<>()) + .add(task.getId()); + } + } + + return containerMap; + } + + /** + * 获取无容器任务 + */ + private List getTasksWithoutContainer(List tasks) { + return tasks.stream() + .filter(t -> t.getDstLP() == null && + (t.getPositionStatus() == null || "0".equals(t.getPositionStatus()))) + .map(Task::getId) + .collect(Collectors.toList()); + } + + /** + * 提取工单ID + */ + private Set extractPickTicketIds(List tasks) { + return tasks.stream() + .map(t -> t.getPickTicketDetail().getPickTicket().getId()) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + /** + * 处理有容器任务 + */ + private void processContainerTasks(Session session, Map> containerTasksMap, + Location dstLoc, Worker worker, PresentationResult result) { + for (Map.Entry> entry : containerTasksMap.entrySet()) { + String containerId = entry.getKey(); + List taskIds = entry.getValue(); + + try { + // 检查容器是否有其他任务 + checkOtherTasksInContainer(session, containerId, taskIds); + + // 执行位置回传 + processPositionCallback(session, taskIds, dstLoc, worker, result, "X"); + + } catch (BusinessException e) { + result.addFailure("容器" + containerId + "处理失败: " + e.getMessage()); + } + } + } + + /** + * 检查容器其他任务 + */ + private void checkOtherTasksInContainer(Session session, String containerId, + List currentTaskIds) { + String currentIds = currentTaskIds.stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + + String sql = "SELECT s.LP FROM Task t " + + "LEFT JOIN LOCATION lc ON lc.id = t.DST_LOC_ID " + + "LEFT JOIN ZONE z ON z.id = lc.ZONE_ID " + + "LEFT JOIN STOCK s ON s.id = t.DST_LP " + + "WHERE t.inventory_Status IN ('已出库','已合单','合单完成') " + + "AND t.plan_Quantity > 0 AND z.id <> 1787 " + + "AND s.id = " + containerId + " AND t.id NOT IN (" + currentIds + ")"; + + List otherTasks = session.createSQLQuery(sql).list(); + if (!otherTasks.isEmpty()) { + throw new BusinessException(otherTasks.get(0) + "容器有其它任务"); + } + } + + /** + * 处理无容器任务 + */ + private void processNonContainerTasks(Session session, List taskIds, + Location dstLoc, Worker worker, PresentationResult result) { + for (Long taskId : taskIds) { + try { + List singleTaskList = Collections.singletonList(taskId); + processPositionCallback(session, singleTaskList, dstLoc, worker, result, "X"); + } catch (Exception e) { + result.addFailure("任务" + taskId + "处理失败: " + e.getMessage()); + } + } + } + + /** + * 处理位置回传 + */ + private void processPositionCallback(Session session, List taskIds, + Location dstLoc, Worker worker, + PresentationResult result, String completionFlag) { + try { + String fromAddress = getTaskSourceAddress(taskIds.get(0)); + + JSONObject callbackResult = wmsSapWeizhihuichuang(taskIds, fromAddress, + dstLoc.getCode(), completionFlag); + + String processResult = WmsSapposition(callbackResult, taskIds, dstLoc, worker); + + if ("true".equals(callbackResult.get("ZCODE"))) { + result.addSuccess(processResult); + } else { + result.addFailure(processResult); + } + + } catch (Exception e) { + // 重试一次 + try { + JSONObject callbackResult = wmsSapWeizhihuichuang(taskIds, + getTaskSourceAddress(taskIds.get(0)), + dstLoc.getCode(), completionFlag); + String processResult = WmsSapposition(callbackResult, taskIds, dstLoc, worker); + + if ("true".equals(callbackResult.get("ZCODE"))) { + result.addSuccess(processResult); + } else { + result.addFailure(processResult); + } + } catch (Exception retryException) { + result.addFailure("任务处理失败: " + retryException.getMessage()); + } + } + } + + /** + * 获取任务源地址 + */ + private String getTaskSourceAddress(Long taskId) { + Task task = commonDao.load(Task.class, taskId); + Location sourceLoc = commonDao.load(Location.class, task.getDstLoc().getId()); + return sourceLoc.getCode(); + } + + /** + * 检查是否在交单区 + */ + private boolean isInPresentationZone(Location location) { + return location.getZone() != null && location.getZone().getId() == 1787L; + } + + /** + * 结果封装类 + */ + private static class PresentationResult { + private final StringBuilder successes = new StringBuilder(); + private final StringBuilder failures = new StringBuilder(); + + public void addSuccess(String message) { + if (successes.length() > 0) successes.append("; "); + successes.append(message); + } + + public void addFailure(String message) { + if (failures.length() > 0) failures.append("; "); + failures.append(message); + } + + public boolean hasSuccesses() { + return successes.length() > 0; + } + + public boolean hasFailures() { + return failures.length() > 0; + } + + public String getSuccessMessage() { + return successes.toString(); + } + + public String getFailureMessage() { + return failures.toString(); + } + } + + public void wmsMesFaliaohuichuang(List taskids) { + interfaceReqManager.wmsMesFaliao(taskids, "2"); + } + + + } \ No newline at end of file diff --git a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultWaveDocManager.java b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultWaveDocManager.java index aedbd66..5225870 100644 --- a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultWaveDocManager.java +++ b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultWaveDocManager.java @@ -4257,23 +4257,23 @@ public class DefaultWaveDocManager extends DefaultBaseManager implements if(tasklist.size()<=300) { // 格式化时间 SimpleDateFormat yms = new SimpleDateFormat("yyyy-MM-dd"); - Date date1=new Date(); - Date date2= new Date(); - try { - date1 = yms.parse("2025-01-01"); - date2=yms.parse("2025-12-31"); - } catch (ParseException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } + Date date1=aw.getStartDate(); + Date date2=aw.getEndDate(); - Integer lxqQty=10; - Integer longtiem=2; - Integer hjqQty=2; - Integer lkqQty=1; - Integer taskqty=30; +// try { +// date1 = yms.parse("2025-01-01"); +// date2=yms.parse("2025-12-31"); +// } catch (ParseException e) { +// // TODO 自动生成的 catch 块 +// e.printStackTrace(); +// } + Integer longtiem=aw.getHour3();//2; + Integer lxqQty=aw.getMinute3();//10;料箱工作站 + Integer hjqQty=aw.getMinute4();//2; + Integer lkqQty=aw.getMinute5();//1; + Integer taskqty=aw.getHour4();//30; //创建波次 - hotWaveDoc( date1, date2 , lxqQty, longtiem, hjqQty, lkqQty,true,null + hotWaveDoc( date1, date2 , longtiem, lxqQty, hjqQty, lkqQty,true,null ,true,true,true,true,true,true,true,true,true, taskqty,false); String wahql="select id from WaveDoc w where w.status='OPEN' " + " and w.userName='自动' order by id desc "; @@ -4282,19 +4282,20 @@ public class DefaultWaveDocManager extends DefaultBaseManager implements List wids= commonDao.findByQuery(wahql); if(wids.size()>0) { long waveDocId=wids.get(0); - boolean lx1=false;boolean lx2=true; - boolean lx3=true;boolean lx4=true; - boolean lx5=true;boolean lx6=true; - boolean lx7=true;boolean lx8=true; - boolean lx9=true;boolean lx10=true; - boolean lx11=true; - boolean lx12=true;boolean lx13=false; - boolean lx14=false;boolean lx15=false; - boolean hj1=false;boolean hj2=false; - boolean hj3=true; boolean hj4=true; - boolean hj5=false;boolean hj6=false;boolean hj7=false; - boolean lk1=false;boolean lk2=true;boolean lk3=false; - boolean lk4=false;boolean lk5=false; + boolean lx1=aw.getLx1();boolean lx2=aw.getLx2(); + boolean lx3=aw.getLx3();boolean lx4=aw.getLk4(); + boolean lx5=aw.getLx5();boolean lx6=aw.getLx6(); + boolean lx7=aw.getLx7();boolean lx8=aw.getLx8(); + boolean lx9=aw.getLx9();boolean lx10=aw.getLx10(); + boolean lx11=aw.getLx11(); + boolean lx12=aw.getLx12();boolean lx13=aw.getLx13(); + boolean lx14=aw.getLx14();boolean lx15=aw.getLx15(); + boolean hj1=aw.getBeEnabled4();boolean hj2=aw.getBeEnabled5(); + boolean hj3=aw.getBeEnabled6(); boolean hj4=aw.getBeEnabled7(); + boolean hj5=aw.getBeEnabled8();boolean hj6=aw.getBeEnabled9(); + boolean hj7=aw.getBeEnabled10(); + boolean lk1=aw.getLk1();boolean lk2=aw.getLk2();boolean lk3=aw.getLk3(); + boolean lk4=aw.getLk4();boolean lk5=aw.getLk5(); logger.info("------自动创建波次4---------------------"); //是否下发CRS if(aw.getBeEnabled2()) { diff --git a/src/main/java/com/dev/swms/server/utils/CustomSQLServerDialect.java b/src/main/java/com/dev/swms/server/utils/CustomSQLServerDialect.java new file mode 100644 index 0000000..5e86491 --- /dev/null +++ b/src/main/java/com/dev/swms/server/utils/CustomSQLServerDialect.java @@ -0,0 +1,18 @@ +package com.dev.swms.server.utils; +import org.hibernate.dialect.SQLServerDialect; +import java.sql.Types; + +public class CustomSQLServerDialect extends SQLServerDialect { + public CustomSQLServerDialect() { + super(); + // 注册 JDBC 类型 -16 (NVARCHAR(max), 长文本) 映射到 String 类型 + registerHibernateType(Types.LONGNVARCHAR, "string"); // JDBC类型-16 + registerHibernateType(Types.NVARCHAR, "string"); // JDBC类型-9 + registerHibernateType(Types.NCHAR, "string"); // JDBC类型-15 + // 如果还有其他类型问题,可以一并注册 + // registerHibernateType(Types.NCLOB, "clob"); + + + + } +} diff --git a/src/main/java/com/dev/swms/server/utils/DateUtil.java b/src/main/java/com/dev/swms/server/utils/DateUtil.java index 12eed77..654e00c 100644 --- a/src/main/java/com/dev/swms/server/utils/DateUtil.java +++ b/src/main/java/com/dev/swms/server/utils/DateUtil.java @@ -202,6 +202,15 @@ public class DateUtil { } + public static Date formatStrToDateYMD02(String str){ + try{ + return ymd_1.parse(str); + } catch(Exception e){ + log.debug("DateUtil.formatDateYMDToStr():" + e.getMessage()); + return null; + } + + } /** * 传入格式为日期的字符, * 格式为:yyyy-MM-dd HH:mm:ss 的日期字符串形式返回 diff --git a/src/main/java/com/dev/swms/server/web/servlet/ASNReceiveServlet.java b/src/main/java/com/dev/swms/server/web/servlet/ASNReceiveServlet.java index 0df5fe6..8767080 100644 --- a/src/main/java/com/dev/swms/server/web/servlet/ASNReceiveServlet.java +++ b/src/main/java/com/dev/swms/server/web/servlet/ASNReceiveServlet.java @@ -830,7 +830,7 @@ public class ASNReceiveServlet extends HttpServlet { String locCode =json.has("locCode")?json.getString("locCode"):""; resultJson=app.scancCpLoc(locCode, workerId, wId); }else if("cpGrounde".equals(methodType)){ - //上架 + //成品上架 long rrId = json.has("rrId")?Long.parseLong(json.getString("rrId").equals("")?"0":json.getString("rrId")):0; long locationId = json.has("locationId")?Long.parseLong(json.getString("locationId").equals("")?"0":json.getString("locationId")):0; resultJson=cpGrounde(rrId, locationId, workerId); diff --git a/src/main/java/com/dev/swms/server/web/servlet/zwSapServlet.java b/src/main/java/com/dev/swms/server/web/servlet/zwSapServlet.java index 5e2ce41..e24bc57 100644 --- a/src/main/java/com/dev/swms/server/web/servlet/zwSapServlet.java +++ b/src/main/java/com/dev/swms/server/web/servlet/zwSapServlet.java @@ -108,9 +108,12 @@ public class zwSapServlet extends HttpServlet { }else if ("ADJPROFIT".equals(method)) {//SAP-WMS:盘盈、盘亏数量调整信息接口 resultJson=apps.storeADJPROFITsap(log,data); }else if ("ZPUTASN".equals(method)) {//SAP-WMS:成品收货入库任务接口 - resultJson=apps.storeASNZPUTASN(log,data); - }else if ("ZPUTPTC".equals(method) ) {//SAP-WMS:成品发货出库任务接口 - resultJson=apps.storeZPUTPTCsap(log,data); +// resultJson=apps.storeASNZPUTASN(log,data); + resultJson=apps.storeMESZPUTASN(log,data); + }else if ("ZPUTPTC".equals(method) ) {//SAP-WMS:成品退回出库任务接口 + resultJson=apps.storeZPUTPTCmes(log,data); + }else if ("ZPUTUPDATE".equals(method) ) {//SAP-WMS:成品变更出库任务接口 + resultJson=apps.storeZPUTUPDATEmes(log,data); }else if ("GPUTPTC".equals(method)) {//SAP-WMS:工单任务下发 接口 resultJson=apps.storeGPUTPTCsap(log,data); }else if ("PUTSKUKC".equals(method)) {//SAP-WMS:物料基础数据接口 diff --git a/src/test/yao/2025.sql b/src/test/yao/2025.sql index f2f7c8b..18b5a0b 100644 --- a/src/test/yao/2025.sql +++ b/src/test/yao/2025.sql @@ -619,6 +619,282 @@ GO ALTER TABLE [dbo].[Automatic_Wave_Doc] SET (LOCK_ESCALATION = TABLE) +----2025-10-15 + + ALTER TABLE ASN_DETAIL add length float NULL; + GO + ALTER TABLE ASN_DETAIL add width float NULL; + GO + ALTER TABLE ASN_DETAIL add height float NULL; + GO + UPDATE ASN_DETAIL SET length=0 WHERE length IS NULL; + go + UPDATE ASN_DETAIL SET width=0 WHERE width IS NULL; + go + UPDATE ASN_DETAIL SET height=0 WHERE height IS NULL; + go + + ALTER TABLE Automatic_Wave_Doc add START_DATE datetime NULL; + GO + ALTER TABLE Automatic_Wave_Doc add END_DATE datetime NULL; + GO + +ALTER TABLE Automatic_Wave_Doc add be_lx1 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx2 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx3 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx4 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx5 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx6 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx7 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx8 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx9 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx10 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx11 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx12 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx13 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx14 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lx15 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lk1 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lk2 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lk3 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lk4 tinyint NULL; + GO +ALTER TABLE Automatic_Wave_Doc add be_lk5 tinyint NULL; + GO +update Automatic_Wave_Doc set be_lx1=0 where be_lx1 is null; + GO +update Automatic_Wave_Doc set be_lx2=0 where be_lx2 is null; + GO +update Automatic_Wave_Doc set be_lx3=0 where be_lx3 is null; + GO +update Automatic_Wave_Doc set be_lx4=0 where be_lx4 is null; + GO +update Automatic_Wave_Doc set be_lx5=0 where be_lx5 is null; + GO +update Automatic_Wave_Doc set be_lx6=0 where be_lx6 is null; + GO +update Automatic_Wave_Doc set be_lx7=0 where be_lx7 is null; + GO +update Automatic_Wave_Doc set be_lx8=0 where be_lx8 is null; + GO +update Automatic_Wave_Doc set be_lx9=0 where be_lx9 is null; + GO +update Automatic_Wave_Doc set be_lx10=0 where be_lx10 is null; + GO +update Automatic_Wave_Doc set be_lx11=0 where be_lx11 is null; + GO +update Automatic_Wave_Doc set be_lx12=0 where be_lx12 is null; + GO +update Automatic_Wave_Doc set be_lx13=0 where be_lx13 is null; + GO +update Automatic_Wave_Doc set be_lx14=0 where be_lx14 is null; + GO +update Automatic_Wave_Doc set be_lx15=0 where be_lx15 is null; + GO +update Automatic_Wave_Doc set be_lx1=0 where be_lx1 is null; + GO +update Automatic_Wave_Doc set be_lk1=0 where be_lk1 is null; + GO +update Automatic_Wave_Doc set be_lk2=0 where be_lk2 is null; + GO +update Automatic_Wave_Doc set be_lk3=0 where be_lk3 is null; + GO +update Automatic_Wave_Doc set be_lk4=0 where be_lk4 is null; + GO +update Automatic_Wave_Doc set be_lk5=0 where be_lk5 is null; +GO + + +---------------------原库存视图 +select +max(inv.id) as id, +max(loc.code) as locCode, +item.id as item_id, +max(item.code) as itemCode, +max(item.name) as itemName, +max(inv.BAR_CODE) as barCode, +max(inv.STATUS) as status, +max(inv.LOCATION_ID) as LOCATION_ID, +max(inv.ITEM_KEY_ID) as ITEM_KEY_ID, +sum(inv.QUANTITY) as quantity, +sum(inv.QUEUED_QUANTITY) as queuedQuantity, +max(ik.PROP_C1) as propC1, +max(ik.PROP_C2) as propC2, +max(ik.PROP_C3) as propC3, +max(ik.PROP_C4) as propC4, +max(ik.PROP_C5) as propC5, +max(ik.PROP_C6) as propC6, +max(ik.PROP_C7) as propC7, +max(ik.PROP_C8) as propC8, +max(ik.PROP_C9) as propC9, +max(ik.PROP_LC1) as PROP_LC1, +max(ik.PROP_LC2) as PROP_LC2, +max(ik.PROP_LC3) as PROP_LC3, +max(ik.PROP_LC4) as PROP_LC4, +max(ik.PROP_LC5) as PROP_LC5, +max(inv.SOI) as soi, +max(ik.PROP_D1) as propD1, +max(ik.PROP_D2) as propD2, +max(ik.PROP_D3) as propD3, +max(z.name) as kqName, +max(z.ID) as ZONE_ID, + +case + when max(inv.coun_Plan) is null then 0 + else 1 +end as lock, +case + when max(z.id) in(1766,1763,1765) +then max(ls1.name) else max(ls.name) end as LSname, +max(item.Be_SAP_Item) Be_SAP_Item, +max(item.VOLUME) VOLUME, +max(item.BE_WEIGHT) BE_WEIGHT, +max(item.SHIP_RULES) SHIP_RULES, +max(item.FEE_TYPE) FEE_TYPE, +max(item.SINGLE_ITEM) SINGLE_ITEM, +max(item.BE_MARK_WEIGHT) BE_MARK_WEIGHT, +max(item.UNIT) UNIT, +max(item.STR_EXTEND1) STR_EXTEND1, +max(item.STR_EXTEND2) STR_EXTEND2, +max(item.STR_EXTEND3) STR_EXTEND3, +max(item.STR_EXTEND4) STR_EXTEND4, +ISNULL(stock1.agvFlag, 0) agvFlag, +loc.id locId, +max(lts.NAME) as lts_name, +item.ISBOM validity, +CONVERT(varchar(100), min(inv.STORAGE_DATE), 20) as storageDate, + max(inv.moveStatus) moveStatus, +inv.statuss, +max(z1.NAME) as z1_name, +max(inv.description) as invDes, +MAX(stock1.WEIGHT) as WEIGHT + +from INVENTORY inv +left join ZONE kq on kq.id=inv.warehouse_Area_ID +left join LOCATION loc on loc.id=inv.LOCATION_ID +left join LOCATIONS lts on lts.id=loc.LOCATIONS_ID +left join STOCK stock1 on stock1.id=loc.stock +left join LOCATION_STORAGE ls1 on ls1.ID=stock1.locationStorage_ID +left join ZONE z on z.ID =loc.ZONE_ID +left join ITEM_KEY ik on ik.id=inv.ITEM_KEY_ID +left join ITEM item on item.id=ik.ITEM_ID +left join STOCK stock on stock.ID=inv.LP +left join LOCATION_STORAGE ls on ls.ID=stock.locationStorage_ID +left join ZONE z1 on z1.id=item.default_Warehouse_Area_ID +where 1=1 +and inv.QUANTITY>0 +group by item.id,loc.id,ik.PROP_C1,ik.PROP_C2,ik.PROP_C3, +ik.PROP_C5,ik.PROP_C9,ik.PROP_D2,inv.STATUS, +item.isBOM,inv.statuss,stock1.agvFlag + + +----------------新视图 +WITH InventoryAgg AS ( + SELECT + ITEM_KEY_ID, + LOCATION_ID, + MAX(id) as max_id, + MAX(BAR_CODE) as barCode, + MAX(STATUS) as status, + SUM(QUANTITY) as quantity, + SUM(QUEUED_QUANTITY) as queuedQuantity, + MAX(SOI) as soi, + MAX(coun_Plan) as coun_Plan, + MAX(moveStatus) as moveStatus, + MAX(statuss) as inv_statuss, + MAX(description) as description, + MIN(STORAGE_DATE) as storageDate, + MAX(warehouse_Area_ID) as warehouse_Area_ID, + MAX(LP) as LP + FROM INVENTORY + WHERE QUANTITY > 0 + GROUP BY ITEM_KEY_ID, LOCATION_ID,status,statuss +) +SELECT + inv.max_id as id, + loc.code as locCode, + item.id as item_id, + item.code as itemCode, + item.name as itemName, + inv.barCode, + inv.status, + inv.LOCATION_ID, + inv.ITEM_KEY_ID, + inv.quantity, + inv.queuedQuantity, + ik.PROP_C1 as propC1, + ik.PROP_C2 as propC2, + ik.PROP_C3 as propC3, + ik.PROP_C4 as propC4, + ik.PROP_C5 as propC5, + ik.PROP_C6 as propC6, + ik.PROP_C7 as propC7, + ik.PROP_C8 as propC8, + ik.PROP_C9 as propC9, + ik.PROP_LC1 as PROP_LC1, + ik.PROP_LC2 as PROP_LC2, + ik.PROP_LC3 as PROP_LC3, + ik.PROP_LC4 as PROP_LC4, + ik.PROP_LC5 as PROP_LC5, + inv.soi, + ik.PROP_D1 as propD1, + ik.PROP_D2 as propD2, + ik.PROP_D3 as propD3, + z.name as kqName, + z.ID as ZONE_ID, + CASE WHEN inv.coun_Plan IS NULL THEN 0 ELSE 1 END as lock, + CASE WHEN z.id IN (1766,1763,1765) THEN ls1.name ELSE ls.name END as LSname, + item.Be_SAP_Item, + item.VOLUME, + item.BE_WEIGHT, + item.SHIP_RULES, + item.FEE_TYPE, + item.SINGLE_ITEM, + item.BE_MARK_WEIGHT, + item.UNIT, + item.STR_EXTEND1, + item.STR_EXTEND2, + item.STR_EXTEND3, + item.STR_EXTEND4, + ISNULL(stock1.agvFlag, 0) as agvFlag, + loc.id as locId, + lts.NAME as lts_name, + item.ISBOM as validity, + CONVERT(varchar(100), inv.storageDate, 20) as storageDate, + inv.moveStatus, + inv.inv_statuss as statuss, + z1.NAME as z1_name, + inv.description as invDes, + stock1.WEIGHT as WEIGHT +FROM InventoryAgg inv +INNER JOIN ITEM_KEY ik ON ik.id = inv.ITEM_KEY_ID +INNER JOIN ITEM item ON item.id = ik.ITEM_ID +INNER JOIN LOCATION loc ON loc.id = inv.LOCATION_ID +LEFT JOIN ZONE kq ON kq.id = inv.warehouse_Area_ID +LEFT JOIN LOCATIONS lts ON lts.id = loc.LOCATIONS_ID +LEFT JOIN STOCK stock1 ON stock1.id = loc.stock +LEFT JOIN LOCATION_STORAGE ls1 ON ls1.ID = stock1.locationStorage_ID +LEFT JOIN ZONE z ON z.ID = loc.ZONE_ID +LEFT JOIN STOCK stock ON stock.ID = inv.LP +LEFT JOIN LOCATION_STORAGE ls ON ls.ID = stock.locationStorage_ID +LEFT JOIN ZONE z1 ON z1.id = item.default_Warehouse_Area_ID; - \ No newline at end of file diff --git a/src/webapp/WEB-INF/classes/config/origen/base/editAutomaticWaveDocPage.xml b/src/webapp/WEB-INF/classes/config/origen/base/editAutomaticWaveDocPage.xml index a83c81a..ced986e 100644 --- a/src/webapp/WEB-INF/classes/config/origen/base/editAutomaticWaveDocPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/base/editAutomaticWaveDocPage.xml @@ -2,93 +2,103 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + span="2" readOnly="false" required="false" reserve="false" forceOverride="true" inVisible="false" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/base/editTaskMESPage.xml b/src/webapp/WEB-INF/classes/config/origen/base/editTaskMESPage.xml new file mode 100644 index 0000000..f1f18e9 --- /dev/null +++ b/src/webapp/WEB-INF/classes/config/origen/base/editTaskMESPage.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/base/editTaskMesMvInventoryPage.xml b/src/webapp/WEB-INF/classes/config/origen/base/editTaskMesMvInventoryPage.xml new file mode 100644 index 0000000..521bf79 --- /dev/null +++ b/src/webapp/WEB-INF/classes/config/origen/base/editTaskMesMvInventoryPage.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/base/maintainAutomaticWaveDocPage.xml b/src/webapp/WEB-INF/classes/config/origen/base/maintainAutomaticWaveDocPage.xml index 97c1a03..808599a 100644 --- a/src/webapp/WEB-INF/classes/config/origen/base/maintainAutomaticWaveDocPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/base/maintainAutomaticWaveDocPage.xml @@ -15,8 +15,42 @@ aw.hour1, aw.minute1, aw.beEnabled1, - aw.beEnabled2 - + aw.beEnabled2, + aw.startDate, + aw.endDate, + aw.hour3, + aw.minute3, + aw.hour4, + aw.minute4, + aw.minute5, + aw.beEnabled3, + aw.lx1, + aw.lx2, + aw.lx3, + aw.lx4, + aw.lx5, + aw.lx6, + aw.lx7, + aw.lx8, + aw.lx9, + aw.lx10, + aw.lx11, + aw.lx12, + aw.lx13, + aw.lx14, + aw.lx15, + aw.beEnabled4, + aw.beEnabled5, + aw.beEnabled6, + aw.beEnabled7, + aw.beEnabled8, + aw.beEnabled9, + aw.beEnabled10, + aw.lk1, + aw.lk2, + aw.lk3, + aw.lk4, + aw.lk5 FROM AutomaticWaveDoc aw where 1=1 /~shixiao.warehouseArea.id: and warehouseArea.id = {shixiao.warehouseArea.id} ~/ @@ -38,69 +72,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/base/maintainDockPage.xml b/src/webapp/WEB-INF/classes/config/origen/base/maintainDockPage.xml index 7d5dacd..801f998 100644 --- a/src/webapp/WEB-INF/classes/config/origen/base/maintainDockPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/base/maintainDockPage.xml @@ -109,6 +109,22 @@ where 1=1and zone.warehouse = #{SESSION_WAREHOUSE}]]> editEnabled="true" /> + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/inventory/maintainInventoryLogPage.xml b/src/webapp/WEB-INF/classes/config/origen/inventory/maintainInventoryLogPage.xml index ccac04b..c595d4b 100644 --- a/src/webapp/WEB-INF/classes/config/origen/inventory/maintainInventoryLogPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/inventory/maintainInventoryLogPage.xml @@ -161,8 +161,8 @@ /~LOC: AND inventoryLog.itemKey.lotInfo.propC2 LIKE {LOC}~/ /~operator: AND inventoryLog.operator LIKE {operator}~/ /~wname: AND inventoryLog.operator = {wname}~/ - /~beginDate: AND inventoryLog.occurTime >= {beginDate} ~/ - /~endDate: AND inventoryLog.occurTime <= {endDate} ~/ + /~beginDate: AND CONVERT(varchar(100), inventoryLog.occurTime, 23) >= {beginDate} ~/ + /~endDate: AND CONVERT(varchar(100), inventoryLog.occurTime, 23) <= {endDate} ~/ ORDER BY inventoryLog.id DESC]]> 0 and inventory.beSAPItem=true + and inventory.quantity>0 and inventory.lts_name in('存货','不良品','数据虚拟库') and inventory.status not in('待上架','已出库','已合单','合单完成') /~location.code: AND inventory.locCode like {location.code}~/ @@ -164,7 +164,7 @@ /~beginDate: and CONVERT(varchar(100), inventory.storageDate, 23) >= {beginDate} ~/ /~endDate: or CONVERT(varchar(100), inventory.storageDate, 23)>= {beginDate} and CONVERT(varchar(100), inventory.storageDate, 23)<= {endDate} ~/ ) - order by inventory.locCode,inventory.id,inventory.propC1 + order by inventory.locCode,inventory.id ]]> @@ -276,6 +276,8 @@ editEnabled="true" /> + + diff --git a/src/webapp/WEB-INF/classes/config/origen/putaway/viewPickTicketPage.xml b/src/webapp/WEB-INF/classes/config/origen/putaway/viewPickTicketPage.xml index dea9b2e..27a07ce 100644 --- a/src/webapp/WEB-INF/classes/config/origen/putaway/viewPickTicketPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/putaway/viewPickTicketPage.xml @@ -96,7 +96,7 @@ - + @@ -104,9 +104,15 @@ - + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/receiving/maintainReceivedRecordPage.xml b/src/webapp/WEB-INF/classes/config/origen/receiving/maintainReceivedRecordPage.xml index 34d0e48..0ccacf3 100644 --- a/src/webapp/WEB-INF/classes/config/origen/receiving/maintainReceivedRecordPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/receiving/maintainReceivedRecordPage.xml @@ -276,6 +276,22 @@ editEnabled="true" /> + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/editAgvIssueTaskPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/editAgvIssueTaskPage.xml index bc5bafd..eb811ce 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/editAgvIssueTaskPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/editAgvIssueTaskPage.xml @@ -10,18 +10,18 @@ - - - + + + - - - + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/editCPPickTicketDetailPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/editCPPickTicketDetailPage.xml index 4bb270f..f86bfe3 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/editCPPickTicketDetailPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/editCPPickTicketDetailPage.xml @@ -35,7 +35,7 @@ readOnly="false" required="false" reserve="false" forceOverride="false" inVisible="false" trimSpace="true" isPrecision="true" /> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/editbkcbPage2.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/editbkcbPage2.xml index 05160be..3a5abaf 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/editbkcbPage2.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/editbkcbPage2.xml @@ -47,18 +47,18 @@ - - - + + + - - - + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/editbkfpPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/editbkfpPage.xml index 8028021..ac9d9f7 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/editbkfpPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/editbkfpPage.xml @@ -47,18 +47,18 @@ - - - + + + - - - + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainCPpickTicketPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainCPpickTicketPage.xml index fc7d19b..0046444 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainCPpickTicketPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainCPpickTicketPage.xml @@ -55,7 +55,7 @@ pickTicket.driverName from PickTicket pickTicket where 1=1 - and pickTicket.billType.code='ZPUTPTC' + and pickTicket.billType.code in('ZPUTPTC','ZPUTMV','ZPUTRETURN') and ( pickTicket.status not in('CLOSE') or ( /~ordersAll: {ordersAll} = true~/ )) /~pickTicket.code: AND (pickTicket.code) like ({pickTicket.code}) ~/ /~pickTicket.relatedBill1: AND (pickTicket.relatedBill1) like ({pickTicket.relatedBill1}) ~/ @@ -179,7 +179,19 @@ editEnabled="true" /> - + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainPickTicketPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainPickTicketPage.xml index 6a56fe5..1cbed82 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainPickTicketPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainPickTicketPage.xml @@ -68,7 +68,8 @@ left join pickTicket.waveDoc left join pickTicket.billType where 1=1 - and (pickTicket.billType.name like '%其它出库%' or pickTicket.billType.code in( 'QPUTPTC','YINVENTORY','CPUTPTC')) + and (pickTicket.billType.name like '%其它出库%' or pickTicket.billType.code + in( 'QPUTPTC','YINVENTORY','CPUTPTC','ZPUTMV','ZPUTPTC')) and ( pickTicket.status not in('CLOSE','JIAODAN') or (pickTicket.billType.name like '%移位单%' and pickTicket.billType.code='YINVENTORY' and pickTicket.type is null) or ( /~ordersAll: {ordersAll} = true~/ )) and ( (pickTicket.sourceType <>'411' and pickTicket.status not in('CLOSE','JIAODAN') or (pickTicket.sourceType ='411' and pickTicket.status not in('PICK_ALL','CLOSE','JIAODAN'))) @@ -246,6 +247,21 @@ editEnabled="true" /> + + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainTaskPage.xml b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainTaskPage.xml index c114485..95e9dcc 100644 --- a/src/webapp/WEB-INF/classes/config/origen/shipping/maintainTaskPage.xml +++ b/src/webapp/WEB-INF/classes/config/origen/shipping/maintainTaskPage.xml @@ -517,6 +517,20 @@ editEnabled="true" /> + + + + + + + + + + + + diff --git a/src/webapp/WEB-INF/classes/hibernate.properties b/src/webapp/WEB-INF/classes/hibernate.properties index 6ad9270..56f5684 100644 --- a/src/webapp/WEB-INF/classes/hibernate.properties +++ b/src/webapp/WEB-INF/classes/hibernate.properties @@ -17,7 +17,8 @@ # (only applied with "dataSourceContext-hibernate.xml") #hibernate.dialect=com.dev.swms.server.utils.ZJCMySQLDialect -hibernate.dialect=com.dev.swms.server.utils.MSSQLDialect +#hibernate.dialect=com.dev.swms.server.utils.MSSQLDialect +hibernate.dialect=com.dev.swms.server.utils.CustomSQLServerDialect #hibernate.dialect=org.hibernate.dialect.OracleDialect #hibernate.dialect=org.hibernate.dialect.Oracle9Dialect @@ -47,4 +48,5 @@ ldxt.SAP=http://happdev.amecnsh.com:8000/sap/zrest ldxt.7WCS=http://gmowcs.amecnsh.com:9000 ldxt.3WCS=http://10.1.112.5 ldxt.RCS=http://10.1.96.110 -ldxt.OA=http://10.1.112.6:8080/api/zwbdt/e9/oa4sap/confirmRequest \ No newline at end of file +ldxt.OA=http://10.1.112.6:8080/api/zwbdt/e9/oa4sap/confirmRequest +ldxt.MES=https://apintodev.amecnsh.com \ No newline at end of file