refactor: customer business field option

This commit is contained in:
AgAngle
2025-03-18 14:07:40 +08:00
parent ec7947c43e
commit a137914645
6 changed files with 125 additions and 32 deletions

View File

@@ -30,6 +30,10 @@ public enum BusinessModuleField {
* 联系人客户id
*/
CUSTOMER_CONTACT_CUSTOMER("contactCustomer", "customerId"),
/**
* 联系人责任人
*/
CUSTOMER_CONTACT_OWNER("contactOwner", "owner", Set.of("rules")),
/**
* 联系人名称
*/

View File

@@ -1,31 +1,30 @@
package io.cordys.crm.customer.controller;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.cordys.common.constants.FormKey;
import io.cordys.common.constants.PermissionConstants;
import io.cordys.common.dto.DeptDataPermissionDTO;
import io.cordys.common.pager.PagerWithOption;
import io.cordys.common.service.DataScopeService;
import io.cordys.context.OrganizationContext;
import io.cordys.crm.customer.domain.CustomerContact;
import io.cordys.crm.customer.dto.request.CustomerContactAddRequest;
import io.cordys.crm.customer.dto.request.CustomerContactDisableRequest;
import io.cordys.crm.customer.dto.request.CustomerContactPageRequest;
import io.cordys.crm.customer.dto.request.CustomerContactUpdateRequest;
import io.cordys.crm.customer.dto.response.CustomerContactGetResponse;
import io.cordys.crm.customer.dto.response.CustomerContactListResponse;
import io.cordys.crm.customer.service.CustomerContactService;
import io.cordys.crm.system.dto.response.ModuleFormConfigDTO;
import io.cordys.crm.system.service.ModuleFormCacheService;
import io.cordys.security.SessionUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import io.cordys.common.constants.PermissionConstants;
import io.cordys.context.OrganizationContext;
import io.cordys.common.pager.Pager;
import io.cordys.security.SessionUtils;
import io.cordys.crm.customer.domain.CustomerContact;
import io.cordys.crm.customer.dto.request.*;
import io.cordys.crm.customer.dto.response.*;
import io.cordys.crm.customer.service.CustomerContactService;
import io.cordys.common.pager.PageUtils;
import java.util.List;
/**
@@ -55,12 +54,10 @@ public class CustomerContactController {
@PostMapping("/page")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ)
@Operation(summary = "联系人列表")
public Pager<List<CustomerContactListResponse>> list(@Validated @RequestBody CustomerContactPageRequest request) {
public PagerWithOption<List<CustomerContactListResponse>> list(@Validated @RequestBody CustomerContactPageRequest request) {
DeptDataPermissionDTO deptDataPermission =
dataScopeService.getDeptDataPermission(SessionUtils.getUserId(), OrganizationContext.getOrganizationId());
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize());
return PageUtils.setPageInfo(page, customerContactService.list(request, OrganizationContext.getOrganizationId(), deptDataPermission));
return customerContactService.list(request, OrganizationContext.getOrganizationId(), deptDataPermission);
}
@GetMapping("/list/{customerId}")

View File

@@ -1,10 +1,16 @@
package io.cordys.crm.customer.service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.cordys.common.constants.BusinessModuleField;
import io.cordys.common.constants.FormKey;
import io.cordys.common.domain.BaseModuleFieldValue;
import io.cordys.common.dto.DeptDataPermissionDTO;
import io.cordys.common.dto.OptionDTO;
import io.cordys.common.dto.UserDeptDTO;
import io.cordys.common.exception.GenericException;
import io.cordys.common.pager.PageUtils;
import io.cordys.common.pager.PagerWithOption;
import io.cordys.common.service.BaseService;
import io.cordys.common.uid.IDGenerator;
import io.cordys.common.util.BeanUtils;
@@ -20,6 +26,9 @@ import io.cordys.crm.customer.dto.response.CustomerContactGetResponse;
import io.cordys.crm.customer.dto.response.CustomerContactListResponse;
import io.cordys.crm.customer.mapper.ExtCustomerContactMapper;
import io.cordys.crm.customer.mapper.ExtCustomerMapper;
import io.cordys.crm.system.dto.response.ModuleFormConfigDTO;
import io.cordys.crm.system.service.ModuleFormCacheService;
import io.cordys.crm.system.service.ModuleFormService;
import io.cordys.mybatis.BaseMapper;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
@@ -35,7 +44,6 @@ import java.util.stream.Collectors;
import static io.cordys.crm.customer.constants.CustomerResultCode.CUSTOMER_CONTACT_EXIST;
/**
*
* @author jianxing
* @date 2025-02-24 11:06:10
*/
@@ -56,10 +64,26 @@ public class CustomerContactService {
private CustomerContactFieldService customerContactFieldService;
@Resource
private CustomerCollaborationService customerCollaborationService;
@Resource
private ModuleFormCacheService moduleFormCacheService;
@Resource
private ModuleFormService moduleFormService;
public List<CustomerContactListResponse> list(CustomerContactPageRequest request, String orgId, DeptDataPermissionDTO deptDataPermission) {
public PagerWithOption<List<CustomerContactListResponse>> list(CustomerContactPageRequest request, String orgId, DeptDataPermissionDTO deptDataPermission) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize());
List<CustomerContactListResponse> list = extCustomerContactMapper.list(request, orgId, deptDataPermission);
return buildListData(list, orgId);
list = buildListData(list, orgId);
ModuleFormConfigDTO customerFormConfig = moduleFormCacheService.getBusinessFormConfig(FormKey.CONTACT.getKey(), orgId);
// 获取所有模块字段的值
List<BaseModuleFieldValue> moduleFieldValues = moduleFormService.getBaseModuleFieldValues(list, CustomerContactListResponse::getModuleFields);
// 获取选项值对应的 option
Map<String, List<OptionDTO>> optionMap = moduleFormService.getOptionMap(customerFormConfig, moduleFieldValues);
// 补充负责人选项
moduleFormService.putBusinessFieldOption(list, customerFormConfig.getFields(), BusinessModuleField.CUSTOMER_CONTACT_OWNER,
CustomerContactListResponse::getOwner, CustomerContactListResponse::getOwnerName, optionMap);
return PageUtils.setPageInfoWithOption(page, list, optionMap);
}
private List<CustomerContactListResponse> buildListData(List<CustomerContactListResponse> list, String orgId) {

View File

@@ -2,6 +2,7 @@ package io.cordys.crm.customer.service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.cordys.common.constants.BusinessModuleField;
import io.cordys.common.constants.FormKey;
import io.cordys.common.domain.BaseModuleFieldValue;
import io.cordys.common.dto.DeptDataPermissionDTO;
@@ -31,7 +32,6 @@ import io.cordys.mybatis.BaseMapper;
import io.cordys.mybatis.lambda.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -68,23 +68,27 @@ public class CustomerService {
private BaseMapper<CustomerPoolRecycleRule> customerPoolRecycleRuleMapper;
@Resource
private ModuleFormCacheService moduleFormCacheService;
@Resource
private ModuleFormService moduleFormService;
@Resource
private ModuleFormService moduleFormService;
@Resource
private CustomerRelationService customerRelationService;
public PagerWithOption<List<CustomerListResponse>> list(CustomerPageRequest request, String userId, String orgId,
DeptDataPermissionDTO deptDataPermission) {
DeptDataPermissionDTO deptDataPermission) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize());
List<CustomerListResponse> list = extCustomerMapper.list(request, orgId, userId, deptDataPermission);
List<CustomerListResponse> buildList = buildListData(list, orgId);
// 处理自定义字段选项数据
List<BaseModuleFieldValue> allDataFields = buildList.stream().map(CustomerListResponse::getModuleFields)
.filter(CollectionUtils::isNotEmpty)
.flatMap(List::stream)
.collect(Collectors.toList());
ModuleFormConfigDTO customerFormConfig = moduleFormCacheService.getBusinessFormConfig(FormKey.CUSTOMER.getKey(), orgId);
Map<String, List<OptionDTO>> optionMap = moduleFormService.getOptionMap(customerFormConfig, allDataFields);
// 获取所有模块字段的值
List<BaseModuleFieldValue> moduleFieldValues = moduleFormService.getBaseModuleFieldValues(list, CustomerListResponse::getModuleFields);
// 获取选项值对应的 option
Map<String, List<OptionDTO>> optionMap = moduleFormService.getOptionMap(customerFormConfig, moduleFieldValues);
// 补充负责人选项
moduleFormService.putBusinessFieldOption(buildList, customerFormConfig.getFields(), BusinessModuleField.CUSTOMER_OWNER,
CustomerListResponse::getOwner, CustomerListResponse::getOwnerName, optionMap);
return PageUtils.setPageInfoWithOption(page, buildList, optionMap);
}
@@ -280,8 +284,9 @@ public class CustomerService {
/**
* 批量移入公海
* @param ids id集合
* @param orgId 组织ID
*
* @param ids id集合
* @param orgId 组织ID
* @param currentUser 当前用户
*/
public void batchToPool(List<String> ids, String currentUser, String orgId) {

View File

@@ -1,5 +1,6 @@
package io.cordys.crm.system.service;
import io.cordys.common.constants.BusinessModuleField;
import io.cordys.common.constants.FormKey;
import io.cordys.common.constants.InternalUser;
import io.cordys.common.domain.BaseModuleFieldValue;
@@ -8,6 +9,8 @@ import io.cordys.common.exception.GenericException;
import io.cordys.common.uid.IDGenerator;
import io.cordys.common.util.JSON;
import io.cordys.common.util.Translator;
import io.cordys.crm.customer.dto.response.CustomerContactListResponse;
import io.cordys.crm.customer.dto.response.CustomerListResponse;
import io.cordys.crm.system.constants.FieldSourceType;
import io.cordys.crm.system.constants.FieldType;
import io.cordys.crm.system.domain.ModuleField;
@@ -37,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@@ -350,4 +354,49 @@ public class ModuleFormService {
typeSourceMap.put(FieldSourceType.PRODUCT.name(), "product");
return typeSourceMap;
}
/**
* 将业务字段选项放入optionMap
* @param list 列表数据
* @param fields 字段集合
* @param businessModuleField 业务字段
* @param getOptionIdFunc 获取选项ID函数
* @param getOptionNameFunc 获取选项名称函数
* @param optionMap 选项Map
* @param <T>
*/
public <T> void putBusinessFieldOption(List<T> list,
List<BaseField> fields,
BusinessModuleField businessModuleField,
Function<T, String> getOptionIdFunc,
Function<T, String> getOptionNameFunc,
Map<String, List<OptionDTO>> optionMap) {
List<OptionDTO> businessFieldOptions = list.stream()
.map(item -> {
OptionDTO optionDTO = new OptionDTO();
optionDTO.setId(getOptionIdFunc.apply(item));
optionDTO.setName(getOptionNameFunc.apply(item));
return optionDTO;
})
.distinct()
.toList();
String businessFieldId = fields
.stream()
.filter(item -> StringUtils.equals(item.getBusinessKey(), businessModuleField.getBusinessKey()))
.findFirst()
.get()
.getId();
optionMap.put(businessFieldId, businessFieldOptions);
}
public <T> List<BaseModuleFieldValue> getBaseModuleFieldValues(List<T> list, Function<T, List<BaseModuleFieldValue>> getModuleFieldFunc) {
// 处理自定义字段选项数据
return list.stream()
.map(getModuleFieldFunc::apply)
.filter(org.apache.commons.collections.CollectionUtils::isNotEmpty)
.flatMap(List::stream)
.collect(Collectors.toList());
}
}

View File

@@ -637,6 +637,20 @@
"rules": [
{"key": "required"}
]
},
{
"name": "负责人",
"internalKey": "contactOwner",
"type": "MEMBER",
"multiple": false,
"hasCurrentUser": false,
"showLabel": true,
"readable": true,
"editable": true,
"fieldWidth": 0.5,
"rules": [
{"key": "required"}
]
}
],
"record": [