feat: pool support admin

This commit is contained in:
song-cc-rock
2025-03-17 11:02:03 +08:00
committed by Craftsman
parent ee77da096d
commit dc5a5231e2
10 changed files with 37 additions and 29 deletions

View File

@@ -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<String> ownerIds = JSON.parseArray(pool.getOwnerId(), String.class);
List<String> ownerUserIds = extUserMapper.getUserIdsByScope(ownerIds, pool.getOrganizationId());

View File

@@ -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());
}

View File

@@ -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;
}

View File

@@ -13,8 +13,4 @@ public class PoolCustomerBatchRequest {
@NotNull
@Schema(description = "批量ID集合")
private List<String> batchIds;
@NotBlank
@Schema(description = "公海ID", requiredMode = Schema.RequiredMode.REQUIRED)
private String poolId;
}

View File

@@ -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<String> ownerIds = JSON.parseArray(pool.getOwnerId(), String.class);
List<String> ownerUserIds = extUserMapper.getUserIdsByScope(ownerIds, pool.getOrganizationId());
if (!ownerUserIds.contains(accessUserId)) {

View File

@@ -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<CustomerPoolPickRule> pickRuleWrapper = new LambdaQueryWrapper<>();
pickRuleWrapper.eq(CustomerPoolPickRule::getPoolId, request.getPoolId());

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}