mirror of
https://github.com/1Panel-dev/CordysCRM.git
synced 2026-05-14 19:32:10 +08:00
refactor: customer business field option
This commit is contained in:
@@ -30,6 +30,10 @@ public enum BusinessModuleField {
|
||||
* 联系人客户id
|
||||
*/
|
||||
CUSTOMER_CONTACT_CUSTOMER("contactCustomer", "customerId"),
|
||||
/**
|
||||
* 联系人责任人
|
||||
*/
|
||||
CUSTOMER_CONTACT_OWNER("contactOwner", "owner", Set.of("rules")),
|
||||
/**
|
||||
* 联系人名称
|
||||
*/
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": [
|
||||
|
||||
Reference in New Issue
Block a user