diff --git a/backend/crm/src/main/java/io/cordys/common/constants/BusinessModuleField.java b/backend/crm/src/main/java/io/cordys/common/constants/BusinessModuleField.java index bf930fc46..d43bc401f 100644 --- a/backend/crm/src/main/java/io/cordys/common/constants/BusinessModuleField.java +++ b/backend/crm/src/main/java/io/cordys/common/constants/BusinessModuleField.java @@ -30,6 +30,10 @@ public enum BusinessModuleField { * 联系人客户id */ CUSTOMER_CONTACT_CUSTOMER("contactCustomer", "customerId"), + /** + * 联系人责任人 + */ + CUSTOMER_CONTACT_OWNER("contactOwner", "owner", Set.of("rules")), /** * 联系人名称 */ diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/controller/CustomerContactController.java b/backend/crm/src/main/java/io/cordys/crm/customer/controller/CustomerContactController.java index 5b8b0fbda..8a5a57b71 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/controller/CustomerContactController.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/controller/CustomerContactController.java @@ -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(@Validated @RequestBody CustomerContactPageRequest request) { + public PagerWithOption> list(@Validated @RequestBody CustomerContactPageRequest request) { DeptDataPermissionDTO deptDataPermission = dataScopeService.getDeptDataPermission(SessionUtils.getUserId(), OrganizationContext.getOrganizationId()); - - Page 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}") diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerContactService.java b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerContactService.java index cf4032586..19cd60886 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerContactService.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerContactService.java @@ -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 list(CustomerContactPageRequest request, String orgId, DeptDataPermissionDTO deptDataPermission) { + public PagerWithOption> list(CustomerContactPageRequest request, String orgId, DeptDataPermissionDTO deptDataPermission) { + Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize()); List list = extCustomerContactMapper.list(request, orgId, deptDataPermission); - return buildListData(list, orgId); + list = buildListData(list, orgId); + + ModuleFormConfigDTO customerFormConfig = moduleFormCacheService.getBusinessFormConfig(FormKey.CONTACT.getKey(), orgId); + // 获取所有模块字段的值 + List moduleFieldValues = moduleFormService.getBaseModuleFieldValues(list, CustomerContactListResponse::getModuleFields); + // 获取选项值对应的 option + Map> 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 buildListData(List list, String orgId) { diff --git a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerService.java b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerService.java index c05671da9..ffc51b601 100644 --- a/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerService.java +++ b/backend/crm/src/main/java/io/cordys/crm/customer/service/CustomerService.java @@ -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 customerPoolRecycleRuleMapper; @Resource private ModuleFormCacheService moduleFormCacheService; - @Resource - private ModuleFormService moduleFormService; + @Resource + private ModuleFormService moduleFormService; @Resource private CustomerRelationService customerRelationService; public PagerWithOption> list(CustomerPageRequest request, String userId, String orgId, - DeptDataPermissionDTO deptDataPermission) { + DeptDataPermissionDTO deptDataPermission) { Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize()); List list = extCustomerMapper.list(request, orgId, userId, deptDataPermission); List buildList = buildListData(list, orgId); + // 处理自定义字段选项数据 - List allDataFields = buildList.stream().map(CustomerListResponse::getModuleFields) - .filter(CollectionUtils::isNotEmpty) - .flatMap(List::stream) - .collect(Collectors.toList()); ModuleFormConfigDTO customerFormConfig = moduleFormCacheService.getBusinessFormConfig(FormKey.CUSTOMER.getKey(), orgId); - Map> optionMap = moduleFormService.getOptionMap(customerFormConfig, allDataFields); + // 获取所有模块字段的值 + List moduleFieldValues = moduleFormService.getBaseModuleFieldValues(list, CustomerListResponse::getModuleFields); + // 获取选项值对应的 option + Map> 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 ids, String currentUser, String orgId) { diff --git a/backend/crm/src/main/java/io/cordys/crm/system/service/ModuleFormService.java b/backend/crm/src/main/java/io/cordys/crm/system/service/ModuleFormService.java index df708e064..27f1fc637 100644 --- a/backend/crm/src/main/java/io/cordys/crm/system/service/ModuleFormService.java +++ b/backend/crm/src/main/java/io/cordys/crm/system/service/ModuleFormService.java @@ -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 + */ + public void putBusinessFieldOption(List list, + List fields, + BusinessModuleField businessModuleField, + Function getOptionIdFunc, + Function getOptionNameFunc, + Map> optionMap) { + List 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 List getBaseModuleFieldValues(List list, Function> getModuleFieldFunc) { + // 处理自定义字段选项数据 + return list.stream() + .map(getModuleFieldFunc::apply) + .filter(org.apache.commons.collections.CollectionUtils::isNotEmpty) + .flatMap(List::stream) + .collect(Collectors.toList()); + } } diff --git a/backend/crm/src/main/resources/form/field.json b/backend/crm/src/main/resources/form/field.json index 3afb5d544..c2c8ca166 100644 --- a/backend/crm/src/main/resources/form/field.json +++ b/backend/crm/src/main/resources/form/field.json @@ -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": [