更新wcs的http请求方式,改为ObjectMapper解析响应体

This commit is contained in:
李宇奇 2025-09-24 16:58:16 +08:00
parent 7f00983377
commit d3204454c3
21 changed files with 88 additions and 187 deletions

5
.gitignore vendored
View File

@ -4,3 +4,8 @@
.vscode/
wms_log/
CLAUDE.md
db/
202504-Wms-MengYang-tp/wms_serve_mengyang/db/
202504-Wms-MengYang-box/wms_serve_mengyang/db/
202504-Wms-MengYang-tp/wms_serve_mengyang/api-tests/*
202504-Wms-MengYang-tp/wms_serve_mengyang/.idea/*.xml

View File

@ -1,5 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Environment-dependent path to Maven home directory
/mavenHomeManager.xml

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/202504-Wms-MengYang-tp.iml" filepath="$PROJECT_DIR$/.idea/202504-Wms-MengYang-tp.iml" />
</modules>
</component>
</project>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -28,3 +28,5 @@ replay_pid*
/.idea/inspectionProfiles/Project_Default.xml
/.idea/CoolRequestHistoryPersistent.xml
/.idea/CoolRequestCookiePersistent.xml
/api-tests/
/.idea/*.xml

View File

@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CommonStatePersistent">
<option name="searchCache" value="Vechile" />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CoolRequestCommonStatePersistent">
<option name="searchCache" value="AppOrderOutMapper" />
</component>
</project>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CoolRequestSetting">
<option name="serializePaths">
<list>
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\7c1a962f042d4f39b139d3fa3814b950" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\1533f53c94f94a11b32886557fca8ae3" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\b58340d70f2c4a8ead0063b7abf17401" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\a8a3e33b622d4c76ad6e138b22cedd52" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\36230e8b7000400d9b1ce9d56a1e958a" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\d2f1d91bb470445ba7d88bd226bee66c" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\9ea88944115741ce945d9c7dfb3edc77" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\1dfa81d3654f47dea274be3dc3842ccc" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\d068f586e6c241ceb7de72bf709e93e0" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\0650414680d94ac1b9bffe39717f507a" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\e3b8f17f63ff4458b2583e2ae7a362fb" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\a08c71b0c63742ac94bf6cc1c54c94e6" />
<option value="C:\Users\btoba\.config\.cool-request\request\serialize\430bf2f962364c2db55e340b7d0d8de3" />
</list>
</option>
<option name="projectCachePath" value="project-b7ef1676-f3ff-4c1d-950c-a8cb1bbc2462" />
</component>
</project>

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="dev_wms_serve" />
</profile>
</annotationProcessing>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="dev_wms_serve" options="-parameters" />
</option>
</component>
</project>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java/com/wms_main/service/quartz_job/serviceImpl/JobServiceImpl.java" charset="UTF-8" />
</component>
</project>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://maven.aliyun.com/repository/public" />
</remote-repository>
</component>
</project>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" />
</project>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@ -7,8 +7,8 @@ POST {{baseUrl}}/mywms/orderIn
Content-Type: application/json
{
"taskId": "testOrderId1",
"vehicleNo": "1001"
"taskId": "testId12",
"vehicleNo": "1012"
}
### 2. 出库订单接口
@ -51,7 +51,7 @@ POST {{baseUrl}}/mywms/cancelOrderIn
Content-Type: application/json
{
"vehicleNo": "1005"
"vehicleNo": "1012"
}
### 8. AGVDone
@ -59,7 +59,7 @@ POST {{baseUrl}}/mywms/agvDone
Content-Type: application/json
{
"taskId": "testOrderId1"
"taskId": "testId12"
}
### 测试数据说明

View File

@ -6,7 +6,8 @@ import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.hutool.core.date.DateTime;
/**
* 立库查询是否可上料响应
@ -17,7 +18,7 @@ public class WcsCanFeedResponse {
@JsonProperty("responseTime")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private LocalDateTime responseTime;
private DateTime responseTime;
@JsonProperty("allowAction")
boolean allowAction;

View File

@ -1,6 +1,11 @@
package com.wms_main.service.api.serviceImpl;
import com.wms_main.app.AppCommon;
import java.util.Objects;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums;
import com.wms_main.constant.enums.wms.AppConfigKeyEnums;
import com.wms_main.model.bo.wcs.WcsPickTask;
import com.wms_main.model.bo.wcs.WcsStackerTask;
@ -28,6 +33,7 @@ import org.springframework.stereotype.Service;
public class WcsApiServiceImpl implements IWcsApiService {
private final HttpClient httpClient;// http客户端
private final AppCommon appCommon;// 应用共通
private final ObjectMapper objectMapper;
/**
* 发送堆垛机任务
@ -38,8 +44,7 @@ public class WcsApiServiceImpl implements IWcsApiService {
@Override
public WcsApiResponse<WcsStackerTask> sendWcsStackerTask(WcsStackerTaskRequest request) {
// 设置http请求
HttpRequest httpRequest = HttpRequest
.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_STACKER_TASK_URL.getKey()), request);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_STACKER_TASK_URL.getKey()), request);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
WcsApiResponse<WcsStackerTask> response = new WcsApiResponse<>();
@ -59,8 +64,7 @@ public class WcsApiServiceImpl implements IWcsApiService {
@Override
public WcsApiResponse<WcsPickTask> sendPickTask(WcsPickTaskRequest request) {
// 设置http请求
HttpRequest httpRequest = HttpRequest
.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_PICK_TASK_URL.getKey()), request);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_PICK_TASK_URL.getKey()), request);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
WcsApiResponse<WcsPickTask> response = new WcsApiResponse<>();
@ -79,8 +83,7 @@ public class WcsApiServiceImpl implements IWcsApiService {
@Override
public BaseWcsApiResponse releaseBox(WcsReleaseBoxRequest request) {
// 设置http请求
HttpRequest httpRequest = HttpRequest
.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_RELEASE_BOX_URL.getKey()), request);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_RELEASE_BOX_URL.getKey()), request);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
return httpResponse.getData(BaseWcsApiResponse.class);
@ -97,8 +100,7 @@ public class WcsApiServiceImpl implements IWcsApiService {
@Override
public WcsApiResponse<WcsPickTask> cancelPickTask(WcsPickTaskRequest request) {
// 设置http请求
HttpRequest httpRequest = HttpRequest
.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_CANCEL_PICK_TASK_URL.getKey()), request);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_CANCEL_PICK_TASK_URL.getKey()), request);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
WcsApiResponse<WcsPickTask> response = new WcsApiResponse<>();
@ -116,15 +118,54 @@ public class WcsApiServiceImpl implements IWcsApiService {
*/
@Override
public WcsApiResponse<WcsCanFeedResponse> queryStandStatus(WcsQueryStandStatusRequest request) {
HttpRequest httpRequest = HttpRequest.postInstanceOf(
appCommon.getConfigByKey(AppConfigKeyEnums.WCS_QUERY_STAND_STATUS_URL.getKey()), request);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_QUERY_STAND_STATUS_URL.getKey()), request);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
WcsApiResponse<WcsCanFeedResponse> response = new WcsApiResponse<>();
response = httpResponse.getData(response.getClass().asSubclass(WcsApiResponse.class));
return response;
// 1. 检查HTTP请求是否成功
if (httpResponse == null) {
return WcsApiResponse.error("请求WCS接口失败未获得任何响应信息。", null);
}
if (!httpResponse.isSuccess()) {
log.error("请求WCS站台状态接口失败状态码{},响应体:{}", httpResponse.getResponseCode(), httpResponse.getResponseMessage());
return WcsApiResponse.error("WCS系统请求失败: " + httpResponse.getResponseMessage(), null);
}
try {
// 2. 第一步先反序列化为原始类型忽略泛型
WcsApiResponse<Object> rawResponse = httpResponse.getData(WcsApiResponse.class);
// 3. 检查WCS业务逻辑是否成功
if (rawResponse == null) {
return WcsApiResponse.error("WCS响应体解析为空", null);
}
if (!Objects.equals(WcsApiResponseCodeEnums.SUCCESS.getCode(), rawResponse.getCode())) {
// WCS业务逻辑失败
log.error("WCS系统返回业务逻辑错误{}", rawResponse.getMessage());
return WcsApiResponse.error(rawResponse.getMessage(), null);
}
// 4. 第二步手动转换data字段
Object rawData = rawResponse.getData();
WcsCanFeedResponse canFeedResponse = null;
if (rawData != null) {
// 使用FastJSON转换
canFeedResponse = objectMapper.convertValue(rawData, WcsCanFeedResponse.class);
}
// 5. 构建最终响应
WcsApiResponse<WcsCanFeedResponse> finalResponse = new WcsApiResponse<>();
finalResponse.setCode(rawResponse.getCode());
finalResponse.setMessage(rawResponse.getMessage());
finalResponse.setData(canFeedResponse);
return finalResponse;
} catch (Exception e) {
log.error("解析WCS响应时发生异常", e);
return WcsApiResponse.error("解析WCS响应失败: " + e.getMessage(), null);
}
return WcsApiResponse.error("请求未获得响应信息。", null);
// WcsCanFeedResponse wcsCanFeedResponse = new WcsCanFeedResponse();
// wcsCanFeedResponse.setResponseTime(LocalDateTime.now());
// wcsCanFeedResponse.setMsg("success");
@ -134,8 +175,7 @@ public class WcsApiServiceImpl implements IWcsApiService {
@Override
public BaseWcsApiResponse agvDone() {
HttpRequest httpRequest = HttpRequest.postInstanceOf(
appCommon.getConfigByKey(AppConfigKeyEnums.WCS_AGV_DONE.getKey()), null);
HttpRequest httpRequest = HttpRequest.postInstanceOf(appCommon.getConfigByKey(AppConfigKeyEnums.WCS_AGV_DONE.getKey()), null);
HttpResponse httpResponse = httpClient.httpPost(httpRequest);
if (httpResponse != null && httpResponse.isSuccess()) {
BaseWcsApiResponse response = new BaseWcsApiResponse();

View File

@ -1,4 +1,4 @@
package com.wms_main.service.business.serviceImpl;
package com.wms_main.service.business.serviceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -350,6 +350,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
}
return result;
}
/**
* 列排序权重以列数中点为中心86列 => 中点在43/44之间
* 先靠近中点的列优先等距时优先左侧43再右侧44

View File

@ -5,13 +5,13 @@ spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 本地
url: jdbc:mysql://localhost:3306/wms_mengyang_tp?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: root
password: root
# 服务器
# url: jdbc:mysql://localhost:3306/wms_mengyang_tp?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
# username: user
# password: user
# username: root
# password: root
# 服务器
url: jdbc:mysql://localhost:3306/wms_mengyang_tp?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: user
password: user
profiles:
active: online