From dc5a5231e29ea5f559f93a97bde151fc886e0f6e Mon Sep 17 00:00:00 2001 From: song-cc-rock Date: Mon, 17 Mar 2025 11:02:03 +0800 Subject: [PATCH] feat: pool support admin --- .../io/cordys/crm/clue/service/CluePoolService.java | 5 +++++ .../customer/controller/PoolCustomerController.java | 2 +- .../dto/request/PoolCustomerBatchPickRequest.java | 13 +++++++++++++ .../dto/request/PoolCustomerBatchRequest.java | 4 ---- .../crm/customer/service/CustomerPoolService.java | 10 ++++++---- .../crm/customer/service/PoolCustomerService.java | 4 ++-- backend/crm/src/main/resources/form/field.json | 6 +++--- .../clue/controller/CluePoolControllerTests.java | 6 ------ .../controller/CustomerPoolControllerTests.java | 12 ++++++------ .../controller/PoolCustomerControllerTests.java | 4 +--- 10 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchPickRequest.java diff --git a/backend/crm/src/main/java/io/cordys/crm/clue/service/CluePoolService.java b/backend/crm/src/main/java/io/cordys/crm/clue/service/CluePoolService.java index 50f41f782..f440589ca 100644 --- a/backend/crm/src/main/java/io/cordys/crm/clue/service/CluePoolService.java +++ b/backend/crm/src/main/java/io/cordys/crm/clue/service/CluePoolService.java @@ -1,5 +1,6 @@ package io.cordys.crm.clue.service; +import io.cordys.common.constants.InternalUser; import io.cordys.common.dto.BasePageRequest; import io.cordys.common.exception.GenericException; import io.cordys.common.uid.IDGenerator; @@ -30,6 +31,7 @@ import io.cordys.mybatis.lambda.LambdaQueryWrapper; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -329,6 +331,9 @@ public class CluePoolService { * @param accessUserId 访问用户ID */ private void checkPoolOwner(CluePool pool, String accessUserId) { + if (StringUtils.equals(accessUserId, InternalUser.ADMIN.getValue())) { + return; + } List ownerIds = JSON.parseArray(pool.getOwnerId(), String.class); List ownerUserIds = extUserMapper.getUserIdsByScope(ownerIds, pool.getOrganizationId()); diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/controller/PoolCustomerController.java b/backend/crm/src/main/java/io/cordys/crm/customer/controller/PoolCustomerController.java index 7f6a7e738..c883084d5 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/controller/PoolCustomerController.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/controller/PoolCustomerController.java @@ -69,7 +69,7 @@ public class PoolCustomerController { @PostMapping("/batch-pick") @Operation(summary = "批量领取客户") @RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_PICK}) - public void batchPick(@Validated @RequestBody PoolCustomerBatchRequest request) { + public void batchPick(@Validated @RequestBody PoolCustomerBatchPickRequest request) { poolCustomerService.batchPick(request, SessionUtils.getUserId(), OrganizationContext.getOrganizationId()); } diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchPickRequest.java b/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchPickRequest.java new file mode 100644 index 000000000..1a411fc64 --- /dev/null +++ b/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchPickRequest.java @@ -0,0 +1,13 @@ +package io.cordys.crm.customer.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class PoolCustomerBatchPickRequest extends PoolCustomerBatchRequest{ + + @NotBlank + @Schema(description = "公海ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String poolId; +} diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchRequest.java b/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchRequest.java index f76932513..e87f03cb8 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchRequest.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/dto/request/PoolCustomerBatchRequest.java @@ -13,8 +13,4 @@ public class PoolCustomerBatchRequest { @NotNull @Schema(description = "批量ID集合") private List batchIds; - - @NotBlank - @Schema(description = "公海ID", requiredMode = Schema.RequiredMode.REQUIRED) - private String poolId; } diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerPoolService.java b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerPoolService.java index 8fd9033a1..83bd93541 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerPoolService.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerPoolService.java @@ -1,5 +1,6 @@ package io.cordys.crm.customer.service; +import io.cordys.common.constants.InternalUser; import io.cordys.common.dto.BasePageRequest; import io.cordys.common.exception.GenericException; import io.cordys.common.uid.IDGenerator; @@ -29,13 +30,11 @@ import io.cordys.mybatis.lambda.LambdaQueryWrapper; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -266,6 +265,9 @@ public class CustomerPoolService { * @param accessUserId 访问用户ID */ private void checkPoolOwner(CustomerPool pool, String accessUserId) { + if (StringUtils.equals(accessUserId, InternalUser.ADMIN.getValue())) { + return; + } List ownerIds = JSON.parseArray(pool.getOwnerId(), String.class); List ownerUserIds = extUserMapper.getUserIdsByScope(ownerIds, pool.getOrganizationId()); if (!ownerUserIds.contains(accessUserId)) { diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/service/PoolCustomerService.java b/backend/crm/src/main/java/io/cordys/crm/customer/service/PoolCustomerService.java index aada17426..b99787f1c 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/service/PoolCustomerService.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/service/PoolCustomerService.java @@ -8,7 +8,7 @@ import io.cordys.crm.customer.domain.Customer; import io.cordys.crm.customer.domain.CustomerPool; import io.cordys.crm.customer.domain.CustomerPoolPickRule; import io.cordys.crm.customer.dto.request.PoolCustomerBatchAssignRequest; -import io.cordys.crm.customer.dto.request.PoolCustomerBatchRequest; +import io.cordys.crm.customer.dto.request.PoolCustomerBatchPickRequest; import io.cordys.crm.customer.dto.request.PoolCustomerPickRequest; import io.cordys.crm.customer.mapper.ExtCustomerCapacityMapper; import io.cordys.crm.system.mapper.ExtUserMapper; @@ -106,7 +106,7 @@ public class PoolCustomerService { * @param currentUser 当前用户ID * @param currentOrgId 当前组织ID */ - public void batchPick(PoolCustomerBatchRequest request, String currentUser, String currentOrgId) { + public void batchPick(PoolCustomerBatchPickRequest request, String currentUser, String currentOrgId) { validateCapacity(request.getBatchIds().size(), currentUser, currentOrgId); LambdaQueryWrapper pickRuleWrapper = new LambdaQueryWrapper<>(); pickRuleWrapper.eq(CustomerPoolPickRule::getPoolId, request.getPoolId()); diff --git a/backend/crm/src/main/resources/form/field.json b/backend/crm/src/main/resources/form/field.json index a507f370d..3afb5d544 100644 --- a/backend/crm/src/main/resources/form/field.json +++ b/backend/crm/src/main/resources/form/field.json @@ -393,7 +393,7 @@ "readable": true, "editable": true, "fieldWidth": 0.5, - "datetype": "date", + "dateType": "date", "rules": [ {"key": "required"} ] @@ -736,7 +736,7 @@ "name": "跟进时间", "internalKey": "recordTime", "type": "DATE_TIME", - "datetype": "date", + "dateType": "date", "showLabel": true, "readable": true, "editable": true, @@ -867,7 +867,7 @@ "name": "预计开始时间", "internalKey": "planStartTime", "type": "DATE_TIME", - "datetype": "date", + "dateType": "date", "showLabel": true, "readable": true, "editable": true, diff --git a/backend/crm/src/test/java/io/cordys/crm/clue/controller/CluePoolControllerTests.java b/backend/crm/src/test/java/io/cordys/crm/clue/controller/CluePoolControllerTests.java index 91944a4ac..8f37f06fb 100644 --- a/backend/crm/src/test/java/io/cordys/crm/clue/controller/CluePoolControllerTests.java +++ b/backend/crm/src/test/java/io/cordys/crm/clue/controller/CluePoolControllerTests.java @@ -94,12 +94,6 @@ public class CluePoolControllerTests extends BaseTest { request.setPickRule(pickRule); CluePoolRecycleRuleDTO recycleRule = CluePoolRecycleRuleDTO.builder().expireNotice(true).noticeDays(10).build(); request.setRecycleRule(recycleRule); - MvcResult mvcResult = this.requestPost("/clue-pool/update", request).andExpect(status().is5xxServerError()).andReturn(); - assert mvcResult.getResponse().getContentAsString().contains(Translator.get("clue_pool_access_fail")); - // update owner id by sql - cluePool.setOwnerId(JSON.toJSONString(List.of("admin"))); - cluePoolMapper.updateById(cluePool); - request.setOwnerIds(List.of("admin")); this.requestPostWithOk("/clue-pool/update", request); } diff --git a/backend/crm/src/test/java/io/cordys/crm/customer/controller/CustomerPoolControllerTests.java b/backend/crm/src/test/java/io/cordys/crm/customer/controller/CustomerPoolControllerTests.java index 0e211d108..1d60a592f 100644 --- a/backend/crm/src/test/java/io/cordys/crm/customer/controller/CustomerPoolControllerTests.java +++ b/backend/crm/src/test/java/io/cordys/crm/customer/controller/CustomerPoolControllerTests.java @@ -16,13 +16,19 @@ import io.cordys.crm.customer.dto.request.CustomerPoolAddRequest; import io.cordys.crm.customer.dto.request.CustomerPoolUpdateRequest; import io.cordys.crm.system.dto.RuleConditionDTO; import io.cordys.mybatis.BaseMapper; +import io.cordys.security.SessionUtils; import jakarta.annotation.Resource; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import java.util.List; @@ -95,12 +101,6 @@ public class CustomerPoolControllerTests extends BaseTest { CustomerPoolRecycleRuleDTO recycleRule = CustomerPoolRecycleRuleDTO.builder() .expireNotice(true).noticeDays(10).build(); request.setRecycleRule(recycleRule); - MvcResult mvcResult = this.requestPost("/customer-pool/update", request).andExpect(status().is5xxServerError()).andReturn(); - assert mvcResult.getResponse().getContentAsString().contains(Translator.get("customer_pool_access_fail")); - // update owner id by sql - customerPool.setOwnerId(JSON.toJSONString(List.of("admin"))); - customerPoolMapper.updateById(customerPool); - request.setOwnerIds(List.of("admin")); this.requestPostWithOk("/customer-pool/update", request); } diff --git a/backend/crm/src/test/java/io/cordys/crm/customer/controller/PoolCustomerControllerTests.java b/backend/crm/src/test/java/io/cordys/crm/customer/controller/PoolCustomerControllerTests.java index f28fb5921..457dcbd3b 100644 --- a/backend/crm/src/test/java/io/cordys/crm/customer/controller/PoolCustomerControllerTests.java +++ b/backend/crm/src/test/java/io/cordys/crm/customer/controller/PoolCustomerControllerTests.java @@ -133,7 +133,7 @@ public class PoolCustomerControllerTests extends BaseTest { rule.setPickNumber(1); customerPoolPickRuleMapper.insert(rule); customerCapacityMapper.deleteByLambda(new LambdaQueryWrapper<>()); - PoolCustomerBatchRequest request = new PoolCustomerBatchRequest(); + PoolCustomerBatchPickRequest request = new PoolCustomerBatchPickRequest(); request.setBatchIds(List.of(testDataId)); request.setPoolId("test-pool-id"); MvcResult mvcResult = this.requestPost(BATCH_PICK, request).andExpect(status().is5xxServerError()).andReturn(); @@ -153,7 +153,6 @@ public class PoolCustomerControllerTests extends BaseTest { PoolCustomerBatchAssignRequest request = new PoolCustomerBatchAssignRequest(); request.setBatchIds(List.of("aaa")); request.setAssignUserId("cc"); - request.setPoolId("test-pool-id"); MvcResult mvcResult = this.requestPost(BATCH_ASSIGN, request).andExpect(status().is5xxServerError()).andReturn(); assert mvcResult.getResponse().getContentAsString().contains(Translator.get("customer.not.exist")); requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_ASSIGN, BATCH_ASSIGN, request); @@ -164,7 +163,6 @@ public class PoolCustomerControllerTests extends BaseTest { void batchDeleteSuccess() throws Exception { PoolCustomerBatchRequest request = new PoolCustomerBatchRequest(); request.setBatchIds(List.of(testDataId)); - request.setPoolId("test-pool-id"); this.requestPostWithOk(BATCH_DELETE, request); requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_DELETE, BATCH_DELETE, request); }