Browse Source

接口开发

ht 3 days ago
parent
commit
2237a82dfb

+ 9 - 6
README.md

@@ -186,10 +186,13 @@ Content-Type: application/json
 ```json
 {
   "dept_Id": "123456,234567",
-  "type": 0
+  "type": 0,
+  "userIds": ["user-1", "user-2"]
 }
 ```
 
+`userIds` 为可选的用户 ID 列表。未传或传入空数组时不影响部门成员查询结果;传入非空列表时,列表中的用户 ID 会按传入顺序追加在部门成员列表之后,并与部门成员及列表内其他 ID 一并去重。
+
 `dept_Id` 支持单个部门 ID,或多个以英文逗号分隔的部门 ID;返回结果为各部门查询范围内人员的去重合集。
 
 `type` 取值:
@@ -302,7 +305,7 @@ Content-Type: application/json
 | `axmt140` | `CustomerReleaseFormPushHandler` | 客户放行审批 | `FORM-3BA9FE18494F4FDD85FE6ABF7DE741BAE30C` | `TPROC--6TG66381N8G8Y7L9GBEEY7QVXTUY2LBBGZ7TMU` |
 | `cint301` | `MiscReceiptIssueFormPushHandler` | 杂收杂发审批 | `FORM-4B08ADABCDAA45788C043729A855E03ED76G` | `TPROC--MQD66371C1N84FPSJZO4W79IN4BW2AE7I08TM0` |
 | `asft800` | `Asft800FormPushHandler` | 包装工单变更审批流程 | `FORM-40D6FBBBF4A94864A2AF9535AAC7924CRBH2` | `TPROC--U2I66F719HF854X6PIGK5A2AP9VC2LODB7YSM1` |
-| `ampt100` | `Ampt100FormPushHandler` | 供应商导入流程 | `FORM-9EE14CA14D8D4AEE8102944E669E6B0CFUKS` | `TPROC--75G66PD15YG82766OFSWD8BS4ZJ33YPRFOZSM2` |
+| `apmt100` | `Apmt100FormPushHandler` | 供应商导入流程 | `FORM-9EE14CA14D8D4AEE8102944E669E6B0CFUKS` | `TPROC--75G66PD15YG82766OFSWD8BS4ZJ33YPRFOZSM2` |
 
 ### 5.2 `mainData` 规则
 
@@ -337,7 +340,7 @@ Content-Type: application/json
 | `axmt140` | 优先 `detailData1`,缺失时回退到 `detailData` |
 | `cint301` | `detailData1` |
 | `asft800` | `detailData1` |
-| `ampt100` | 无明细,传入空对象 `{}` |
+| `apmt100` | 无明细,传入空对象 `{}` |
 
 明细对象中可以直接传入宜搭 `fieldId`。服务端会保留包含 `Field_` 的字段值,用于补充默认字段映射。
 
@@ -407,13 +410,13 @@ Content-Type: application/json
 
 `tjr` 是员工工号,服务端会从员工花名册解析对应钉钉用户作为发起人;未传时,处理器使用 `mainData.ooagud004` 作为钉钉用户 ID。`bm` 为钉钉部门 ID,`sfka902` 支持 `yyyy-MM-dd` 或 `yyyy/MM/dd` 格式。
 
-### 5.6 `ampt100` 供应商导入流程
+### 5.6 `apmt100` 供应商导入流程
 
-调用 `POST /api/erp/yida/push` 时传入 `type: "ampt100"`。该流程无明细,`detailData` 必须为 `{}`;客户文档中的 `apmt100` 为旧标识,不作为路由值
+调用 `POST /api/erp/yida/push` 时传入 `type: "apmt100"`。该流程无明细,`detailData` 必须为 `{}`。
 
 ```json
 {
-  "type": "ampt100",
+  "type": "apmt100",
   "bm": "123456789",
   "gs": "ML",
   "tjr": "EMP0001",

+ 5 - 2
src/main/java/com/malk/minglei/controller/YidaProcessController.java

@@ -24,8 +24,10 @@ import javax.validation.constraints.Min;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 宜搭流程发起、单据查询和部门成员查询接口。
@@ -106,11 +108,12 @@ public class YidaProcessController {
      */
     @PostMapping("/minglei/departments/users")
     public ResponseEntity<DepartmentUserIdsResponse> listDepartmentUserIds(@Valid @RequestBody DepartmentUserQueryRequest request) {
-        List<String> userIds = new ArrayList<String>(mingleiDocumentService.listDepartmentUserIds(request.getDepartmentIds(), request.getType()));
+        Set<String> userIds = new LinkedHashSet<String>(
+                mingleiDocumentService.listDepartmentUserIds(request.getDepartmentIds(), request.getType()));
         if (request.getUserIds() != null && !request.getUserIds().isEmpty()) {
             userIds.addAll(request.getUserIds());
         }
-        return ResponseEntity.ok(DepartmentUserIdsResponse.success(userIds));
+        return ResponseEntity.ok(DepartmentUserIdsResponse.success(new ArrayList<String>(userIds)));
     }
 
     /**

+ 6 - 6
src/main/java/com/malk/minglei/service/impl/yida/Ampt100FormPushHandler.java

@@ -21,11 +21,11 @@ import java.util.List;
 import java.util.Map;
 
 @Service
-public class Ampt100FormPushHandler implements YidaFormPushHandler {
+public class Apmt100FormPushHandler implements YidaFormPushHandler {
 
-    public static final String TYPE = "ampt100";
+    public static final String TYPE = "apmt100";
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(Ampt100FormPushHandler.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(Apmt100FormPushHandler.class);
     private static final String FORM_NAME = "\u4f9b\u5e94\u5546\u5bfc\u5165\u6d41\u7a0b";
     private static final String FORM_UUID = "FORM-9EE14CA14D8D4AEE8102944E669E6B0CFUKS";
     private static final String PROCESS_CODE = "TPROC--75G66PD15YG82766OFSWD8BS4ZJ33YPRFOZSM2";
@@ -56,7 +56,7 @@ public class Ampt100FormPushHandler implements YidaFormPushHandler {
     private final DDConf dingTalkConfiguration;
     private final YidaApplicationsProperties applications;
 
-    public Ampt100FormPushHandler(YidaProcessOpenApiClient yidaProcessOpenApiClient,
+    public Apmt100FormPushHandler(YidaProcessOpenApiClient yidaProcessOpenApiClient,
                                   DDConf dingTalkConfiguration,
                                   YidaApplicationsProperties applications) {
         this.yidaProcessOpenApiClient = yidaProcessOpenApiClient;
@@ -74,9 +74,9 @@ public class Ampt100FormPushHandler implements YidaFormPushHandler {
         validateConfiguration();
 
         Map<String, Object> mainData = toMainDataMap(request.getMainData());
-        String operatorUserId = requireText(request.getOriginatorUserId(), "ampt100 requires mainData.tjr");
+        String operatorUserId = requireText(request.getOriginatorUserId(), "apmt100 requires mainData.tjr");
         String title = requireText(toText(firstNonBlank(mainData.get("lcbh"), mainData.get("docno"))),
-                "ampt100 requires mainData.lcbh or mainData.docno");
+                "apmt100 requires mainData.lcbh or mainData.docno");
         Map<String, Object> formData = toYidaFormData(mainData, operatorUserId, title);
 
         Map<String, Object> body = new LinkedHashMap<String, Object>();

+ 1 - 1
src/main/java/com/malk/minglei/service/impl/yida/ErpYidaPushServiceImpl.java

@@ -108,7 +108,7 @@ public class ErpYidaPushServiceImpl implements ErpYidaPushService {
         if (!(detailData instanceof Map)) {
             throw new IllegalArgumentException("ERP Yida push detailData must be an object containing detailData array");
         }
-        if (normalizeType(Ampt100FormPushHandler.TYPE).equals(normalizeType(request.getType()))
+        if (normalizeType(Apmt100FormPushHandler.TYPE).equals(normalizeType(request.getType()))
                 && ((Map<?, ?>) detailData).isEmpty()) {
             return;
         }

+ 3 - 3
src/test/java/com/malk/minglei/controller/YidaProcessControllerTest.java

@@ -65,19 +65,19 @@ class YidaProcessControllerTest {
     }
 
     @Test
-    void listDepartmentUserIdsAppendsSpecifiedUsersAfterDepartmentUsers() {
+    void listDepartmentUserIdsAppendsOnlyDistinctSpecifiedUsersAfterDepartmentUsers() {
         MingleiDocumentService mingleiDocumentService = mock(MingleiDocumentService.class);
         given(mingleiDocumentService.listDepartmentUserIds(Arrays.asList(10L), 0))
                 .willReturn(Arrays.asList("department-user-1", "department-user-2"));
         DepartmentUserQueryRequest request = new DepartmentUserQueryRequest();
         request.setDepartmentId("10");
         request.setType(Integer.valueOf(0));
-        request.setUserIds(Arrays.asList("specified-user-1", "department-user-1"));
+        request.setUserIds(Arrays.asList("specified-user-1", "department-user-1", "specified-user-1"));
 
         ResponseEntity<DepartmentUserIdsResponse> response = new YidaProcessController(
                 mock(YidaProcessService.class), mingleiDocumentService).listDepartmentUserIds(request);
 
-        assertEquals(Arrays.asList("department-user-1", "department-user-2", "specified-user-1", "department-user-1"),
+        assertEquals(Arrays.asList("department-user-1", "department-user-2", "specified-user-1"),
                 response.getBody().getResult());
     }
 }

+ 4 - 4
src/test/java/com/malk/minglei/service/impl/yida/Ampt100FormPushHandlerTest.java

@@ -19,7 +19,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-class Ampt100FormPushHandlerTest {
+class Apmt100FormPushHandlerTest {
 
     @Test
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -60,14 +60,14 @@ class Ampt100FormPushHandlerTest {
         mainData.setExtraField("lxfs", "13800000000");
 
         ErpYidaPushRequest request = new ErpYidaPushRequest();
-        request.setType(Ampt100FormPushHandler.TYPE);
+        request.setType(Apmt100FormPushHandler.TYPE);
         request.setMainData(mainData);
         request.setDetailData(Collections.emptyMap());
         request.setOriginatorUserId("dingtalk-user-001");
 
-        Ampt100FormPushHandler handler = new Ampt100FormPushHandler(yidaClient, ddConf, applications);
+        Apmt100FormPushHandler handler = new Apmt100FormPushHandler(yidaClient, ddConf, applications);
 
-        assertEquals(Collections.singletonList("ampt100"), handler.getTypes());
+        assertEquals(Collections.singletonList("apmt100"), handler.getTypes());
         assertEquals("process-instance-1", handler.push(request));
 
         ArgumentCaptor<Map> bodyCaptor = ArgumentCaptor.forClass(Map.class);

+ 2 - 2
src/test/java/com/malk/minglei/service/impl/yida/ErpYidaPushServiceImplTest.java

@@ -203,11 +203,11 @@ class ErpYidaPushServiceImplTest {
         YidaProcessService yidaProcessService = mock(YidaProcessService.class);
         EmployeeRosterService employeeRosterService = mock(EmployeeRosterService.class);
         YidaFormPushHandler formPushHandler = mock(YidaFormPushHandler.class);
-        when(formPushHandler.getTypes()).thenReturn(Collections.singletonList(Ampt100FormPushHandler.TYPE));
+        when(formPushHandler.getTypes()).thenReturn(Collections.singletonList(Apmt100FormPushHandler.TYPE));
         when(employeeRosterService.findByEmployeeNo("user-001")).thenReturn(employee("dingtalk-user-001"));
 
         ErpYidaPushRequest request = new ErpYidaPushRequest();
-        request.setType(Ampt100FormPushHandler.TYPE);
+        request.setType(Apmt100FormPushHandler.TYPE);
         ErpYidaPushMainData mainData = new ErpYidaPushMainData();
         mainData.setTjr("user-001");
         request.setMainData(mainData);