iwork 人员组织同步相关

This commit is contained in:
chenbowen
2025-11-25 15:48:47 +08:00
parent e212ba4d2f
commit d4d80ce86a
21 changed files with 2444 additions and 155 deletions

View File

@@ -1,9 +1,11 @@
package com.zt.plat.module.system.service.integration.iwork.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOrgQueryReqVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOrgRespVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrSubcompanyPageRespVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkHrSyncRespVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOrgSyncReqVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkSubcompanyQueryReqVO;
import com.zt.plat.module.system.framework.integration.iwork.config.IWorkProperties;
import com.zt.plat.module.system.service.integration.iwork.IWorkOrgRestService;
import okhttp3.mockwebserver.MockResponse;
@@ -20,7 +22,6 @@ import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -32,6 +33,7 @@ class IWorkOrgRestServiceImplTest {
private IWorkOrgRestService service;
private IWorkProperties properties;
private Clock fixedClock;
private ObjectMapper objectMapper;
@BeforeEach
void setUp() throws Exception {
@@ -40,7 +42,8 @@ class IWorkOrgRestServiceImplTest {
properties = buildProperties();
fixedClock = Clock.fixed(Instant.ofEpochMilli(1_672_531_200_000L), ZoneOffset.UTC);
service = new IWorkOrgRestServiceImpl(properties, new ObjectMapper(), fixedClock);
objectMapper = new ObjectMapper();
service = new IWorkOrgRestServiceImpl(properties, objectMapper, fixedClock);
}
@AfterEach
@@ -50,41 +53,46 @@ class IWorkOrgRestServiceImplTest {
@Test
void shouldListSubcompanies() throws Exception {
mockWebServer.enqueue(jsonResponse("{\"code\":\"1\",\"data\":{\"page\":1}}"));
mockWebServer.enqueue(jsonResponse("{\"code\":\"1\",\"data\":{\"totalSize\":1,\"totalPage\":1,\"pageSize\":10,\"pageNumber\":1,\"dataList\":[{\"subcompanyid1\":4,\"subcompanyname\":\"总部\"}]}}"));
IWorkOrgQueryReqVO reqVO = new IWorkOrgQueryReqVO();
IWorkSubcompanyQueryReqVO reqVO = new IWorkSubcompanyQueryReqVO();
reqVO.setParams(Map.of("curpage", 1));
IWorkOrgRespVO respVO = service.listSubcompanies(reqVO);
IWorkHrSubcompanyPageRespVO respVO = service.listSubcompanies(reqVO);
assertThat(respVO.isSuccess()).isTrue();
assertThat(respVO.getPayload()).containsEntry("page", 1);
assertThat(respVO.getTotalSize()).isEqualTo(1);
assertThat(respVO.getDataList()).hasSize(1);
assertThat(respVO.getDataList().get(0).getSubcompanyname()).isEqualTo("总部");
RecordedRequest request = mockWebServer.takeRequest();
assertThat(request.getPath()).isEqualTo(properties.getOrg().getPaths().getSubcompanyPage());
String decoded = URLDecoder.decode(request.getBody().readUtf8(), StandardCharsets.UTF_8);
assertThat(decoded).contains("params={\"curpage\":1}");
String tokenJson = extractField(decoded, "token");
assertThat(tokenJson).isNotBlank();
assertThat(tokenJson).contains("\"ts\":\"1672531200000\"");
String expectedKey = DigestUtils.md5DigestAsHex("test-seed1672531200000".getBytes(StandardCharsets.UTF_8)).toUpperCase();
assertThat(tokenJson).contains("\"key\":\"" + expectedKey + "\"");
JsonNode bodyNode = objectMapper.readTree(decoded);
assertThat(bodyNode.path("params").path("curpage").asInt()).isEqualTo(1);
JsonNode tokenNode = bodyNode.path("token");
assertThat(tokenNode.path("ts").asText()).isEqualTo("1672531200000");
String expectedKey = DigestUtils.md5DigestAsHex("test-seed1672531200000".getBytes(StandardCharsets.UTF_8)).toUpperCase();
assertThat(tokenNode.path("key").asText()).isEqualTo(expectedKey);
}
@Test
void shouldSyncDepartments() throws Exception {
mockWebServer.enqueue(jsonResponse("{\"code\":\"1\",\"result\":{}}"));
mockWebServer.enqueue(jsonResponse("{\"code\":\"1\",\"result\":[{\"@action\":\"add\",\"code\":\"demo\",\"result\":\"success\"}]}"));
IWorkOrgSyncReqVO reqVO = new IWorkOrgSyncReqVO();
reqVO.setData(List.of(Map.of("@action", "add", "code", "demo")));
IWorkOrgRespVO respVO = service.syncDepartments(reqVO);
IWorkHrSyncRespVO respVO = service.syncDepartments(reqVO);
assertThat(respVO.isSuccess()).isTrue();
assertThat(respVO.getPayload()).containsKey("result");
assertThat(respVO.getResult()).hasSize(1);
assertThat(respVO.getResult().get(0).getCode()).isEqualTo("demo");
RecordedRequest request = mockWebServer.takeRequest();
assertThat(request.getPath()).isEqualTo(properties.getOrg().getPaths().getSyncDepartment());
String decoded = URLDecoder.decode(request.getBody().readUtf8(), StandardCharsets.UTF_8);
assertThat(decoded).contains("data=[{\"@action\":\"add\",\"code\":\"demo\"}]");
JsonNode bodyNode = objectMapper.readTree(decoded);
assertThat(bodyNode.path("data").isArray()).isTrue();
assertThat(bodyNode.path("data").get(0).path("code").asText()).isEqualTo("demo");
}
private MockResponse jsonResponse(String body) {
@@ -93,14 +101,6 @@ class IWorkOrgRestServiceImplTest {
.setBody(body);
}
private String extractField(String decoded, String key) {
return Arrays.stream(decoded.split("&"))
.filter(part -> part.startsWith(key + "="))
.map(part -> part.substring(key.length() + 1))
.findFirst()
.orElse("");
}
private IWorkProperties buildProperties() {
IWorkProperties properties = new IWorkProperties();
properties.setBaseUrl(mockWebServer.url("/").toString());