diff --git a/pom.xml b/pom.xml
index 513848ff..f82a93ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
zt-module-infra
zt-module-report
-
+
@@ -274,6 +274,12 @@
chenbowen
+
+ qsj
+
+ qsj
+
+
diff --git a/zt-dependencies/pom.xml b/zt-dependencies/pom.xml
index 45be54c4..97d04c85 100644
--- a/zt-dependencies/pom.xml
+++ b/zt-dependencies/pom.xml
@@ -62,6 +62,7 @@
8.0.2.RELEASE
1.1.4
5.2.0
+ 4.12.0
7.0.1
diff --git a/zt-framework/zt-spring-boot-starter-excel/pom.xml b/zt-framework/zt-spring-boot-starter-excel/pom.xml
index e0686e56..21a80db5 100644
--- a/zt-framework/zt-spring-boot-starter-excel/pom.xml
+++ b/zt-framework/zt-spring-boot-starter-excel/pom.xml
@@ -66,7 +66,7 @@
com.zt.plat
zt-spring-boot-starter-biz-ip
- true
+
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java
index f2084ebd..82df7f69 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java
@@ -17,10 +17,9 @@ import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
+import okio.Buffer;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import javax.crypto.Cipher;
@@ -128,9 +127,8 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
String operatorUserId = resolveOperatorUserId(reqVO.getOperatorUserId());
IWorkSession session = ensureSession(appId, clientKeyPair, operatorUserId, Boolean.TRUE.equals(reqVO.getForceRefreshToken()));
- MultiValueMap formData = buildCreateForm(reqVO);
- appendFormExtras(formData, reqVO.getFormExtras());
- String responseBody = executeFormRequest(properties.getPaths().getCreateWorkflow(), appId, session, formData);
+ Map payload = buildCreatePayload(reqVO);
+ String responseBody = executeJsonRequest(properties.getPaths().getCreateWorkflow(), null, appId, session, payload);
return buildOperationResponse(responseBody);
}
@@ -145,9 +143,8 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
}
IWorkSession session = ensureSession(appId, clientKeyPair, operatorUserId, Boolean.TRUE.equals(reqVO.getForceRefreshToken()));
- MultiValueMap formData = buildVoidForm(reqVO);
- appendFormExtras(formData, reqVO.getFormExtras());
- String responseBody = executeFormRequest(properties.getPaths().getVoidWorkflow(), appId, session, formData);
+ Map payload = buildVoidPayload(reqVO);
+ String responseBody = executeJsonRequest(properties.getPaths().getVoidWorkflow(), null, appId, session, payload);
return buildOperationResponse(responseBody);
}
@@ -327,24 +324,6 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
return executeRequest(request, IWORK_REMOTE_REQUEST_FAILED);
}
- private String executeFormRequest(String path,
- String appId,
- IWorkSession session,
- MultiValueMap formData) {
- FormBody.Builder builder = new FormBody.Builder();
- formData.forEach((key, values) -> {
- if (values != null) {
- values.forEach(value -> builder.add(key, value));
- }
- });
- Request request = new Request.Builder()
- .url(resolveUrl(path))
- .headers(authHeaders(appId, session).build())
- .post(builder.build())
- .build();
- return executeRequest(request, IWORK_REMOTE_REQUEST_FAILED);
- }
-
private Headers.Builder authHeaders(String appId, IWorkSession session) {
return new Headers.Builder()
.set(properties.getHeaders().getAppId(), appId)
@@ -361,18 +340,19 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
return payload;
}
- private MultiValueMap buildCreateForm(IWorkWorkflowCreateReqVO reqVO) {
- MultiValueMap formData = new LinkedMultiValueMap<>();
- formData.add("requestName", reqVO.getRequestName());
- formData.add("workflowId", String.valueOf(resolveWorkflowId(reqVO.getWorkflowId())));
- formData.add("mainData", toJsonString(convertFormFields(reqVO.getMainFields())));
+ private Map buildCreatePayload(IWorkWorkflowCreateReqVO reqVO) {
+ Map payload = new LinkedHashMap<>();
+ payload.put("requestName", reqVO.getRequestName());
+ payload.put("workflowId", resolveWorkflowId(reqVO.getWorkflowId()));
+ payload.put("mainData", convertFormFields(reqVO.getMainFields()));
if (reqVO.getDetailTables() != null && !reqVO.getDetailTables().isEmpty()) {
- formData.add("detailData", toJsonString(convertDetailTables(reqVO.getDetailTables())));
+ payload.put("detailData", convertDetailTables(reqVO.getDetailTables()));
}
if (reqVO.getOtherParams() != null && !reqVO.getOtherParams().isEmpty()) {
- formData.add("otherParams", toJsonString(reqVO.getOtherParams()));
+ payload.put("otherParams", reqVO.getOtherParams());
}
- return formData;
+ appendPayloadExtras(payload, reqVO.getFormExtras());
+ return payload;
}
private long resolveWorkflowId(Long requestWorkflowId) {
@@ -385,29 +365,26 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
throw ServiceExceptionUtil.exception(IWORK_WORKFLOW_ID_MISSING);
}
- private MultiValueMap buildVoidForm(IWorkWorkflowVoidReqVO reqVO) {
- MultiValueMap formData = new LinkedMultiValueMap<>();
- formData.add("requestId", reqVO.getRequestId());
+ private Map buildVoidPayload(IWorkWorkflowVoidReqVO reqVO) {
+ Map payload = new LinkedHashMap<>();
+ payload.put("requestId", reqVO.getRequestId());
if (StringUtils.hasText(reqVO.getReason())) {
- formData.add("remark", reqVO.getReason());
+ payload.put("remark", reqVO.getReason());
}
if (reqVO.getExtraParams() != null && !reqVO.getExtraParams().isEmpty()) {
- reqVO.getExtraParams().forEach((key, value) -> {
- if (value != null) {
- formData.add(key, String.valueOf(value));
- }
- });
+ payload.putAll(reqVO.getExtraParams());
}
- return formData;
+ appendPayloadExtras(payload, reqVO.getFormExtras());
+ return payload;
}
- private void appendFormExtras(MultiValueMap formData, Map extras) {
+ private void appendPayloadExtras(Map payload, Map extras) {
if (extras == null || extras.isEmpty()) {
return;
}
extras.forEach((key, value) -> {
if (StringUtils.hasText(key) && value != null) {
- formData.add(key, value);
+ payload.put(key, value);
}
});
}
@@ -632,6 +609,7 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
}
private String executeRequest(Request request, ErrorCode errorCode) {
+ logCurlCommand(request);
try (Response response = okHttpClient().newCall(request).execute()) {
String responseBody = response.body() != null ? response.body().string() : null;
if (!response.isSuccessful()) {
@@ -645,6 +623,49 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService {
}
}
+ private void logCurlCommand(Request request) {
+ if (request == null || !log.isInfoEnabled()) {
+ return;
+ }
+ try {
+ StringBuilder curl = new StringBuilder("curl");
+ curl.append(" -X ").append(request.method());
+ curl.append(" '").append(request.url()).append("'");
+
+ Headers headers = request.headers();
+ for (int i = 0; i < headers.size(); i++) {
+ curl.append(" -H '")
+ .append(escapeSingleQuotes(headers.name(i)))
+ .append(": ")
+ .append(escapeSingleQuotes(headers.value(i)))
+ .append("'");
+ }
+
+ RequestBody body = request.body();
+ if (body != null) {
+ Buffer buffer = new Buffer();
+ body.writeTo(buffer);
+ String bodyString = buffer.readUtf8();
+ if (StringUtils.hasText(bodyString)) {
+ curl.append(" --data '")
+ .append(escapeSingleQuotes(bodyString))
+ .append("'");
+ }
+ }
+
+ log.info("[iWork] -> {}", curl);
+ } catch (Exception ex) {
+ log.warn("[iWork] failed to build curl log for {}: {}", request.url(), ex.getMessage());
+ }
+ }
+
+ private String escapeSingleQuotes(String value) {
+ if (value == null) {
+ return "";
+ }
+ return value.replace("'", "'\"'\"'");
+ }
+
private record RegistrationState(String secret, String spk, ClientKeyPair clientKeyPair) {
}
diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkOrgRestServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkOrgRestServiceImpl.java
index c4d29cb1..dfd962e2 100644
--- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkOrgRestServiceImpl.java
+++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkOrgRestServiceImpl.java
@@ -15,11 +15,11 @@ import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkUser
import com.zt.plat.module.system.framework.integration.iwork.config.IWorkProperties;
import com.zt.plat.module.system.service.integration.iwork.IWorkOrgRestService;
import lombok.extern.slf4j.Slf4j;
-import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
+import okio.Buffer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
@@ -46,6 +46,7 @@ public class IWorkOrgRestServiceImpl implements IWorkOrgRestService {
private static final TypeReference