feat: customer contact list

This commit is contained in:
AgAngle
2025-03-18 10:08:09 +08:00
committed by Craftsman
parent 47f83b9600
commit 7a4ccedfd6
13 changed files with 169 additions and 27 deletions

View File

@@ -6,9 +6,9 @@ package io.cordys.crm.customer.constants;
*/
public enum CustomerCollaborationType {
/**
* 共享
* 只读
*/
SHARE,
READ_ONLY,
/**
* 协作
*/

View File

@@ -3,11 +3,14 @@ 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.dto.DeptDataPermissionDTO;
import io.cordys.common.service.DataScopeService;
import io.cordys.crm.system.dto.response.ModuleFormConfigDTO;
import io.cordys.crm.system.service.ModuleFormCacheService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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.*;
@@ -38,9 +41,12 @@ public class CustomerContactController {
private CustomerContactService customerContactService;
@Resource
private ModuleFormCacheService moduleFormCacheService;
@Resource
private DataScopeService dataScopeService;
@GetMapping("/module/form")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_READ,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ}, logical = Logical.OR)
@Operation(summary = "获取表单配置")
public ModuleFormConfigDTO getModuleFormConfig() {
return moduleFormCacheService.getBusinessFormConfig(FormKey.CONTACT.getKey(), OrganizationContext.getOrganizationId());
@@ -48,49 +54,68 @@ public class CustomerContactController {
@PostMapping("/page")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ)
@Operation(summary = "客户联系人列表")
@Operation(summary = "联系人列表")
public Pager<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()));
return PageUtils.setPageInfo(page, customerContactService.list(request, OrganizationContext.getOrganizationId(), deptDataPermission));
}
@GetMapping("/list/{customerId}")
@Operation(summary = "客户下的联系人列表")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_READ)
public List<CustomerContactListResponse> list(@Validated @PathVariable String customerId) {
DeptDataPermissionDTO deptDataPermission =
dataScopeService.getDeptDataPermission(SessionUtils.getUserId(), OrganizationContext.getOrganizationId());
return customerContactService.listByCustomerId(customerId, SessionUtils.getUserId(),
OrganizationContext.getOrganizationId(), deptDataPermission);
}
@GetMapping("/get/{id}")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_READ,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ}, logical = Logical.OR)
@Operation(summary = "客户联系人详情")
public CustomerContactGetResponse get(@PathVariable String id){
return customerContactService.get(id, OrganizationContext.getOrganizationId());
}
@PostMapping("/add")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_ADD)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_ADD,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_ADD}, logical = Logical.OR)
@Operation(summary = "添加客户联系人")
public CustomerContact add(@Validated @RequestBody CustomerContactAddRequest request) {
return customerContactService.add(request, SessionUtils.getUserId(), OrganizationContext.getOrganizationId());
}
@PostMapping("/update")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE}, logical = Logical.OR)
@Operation(summary = "更新客户联系人")
public CustomerContact update(@Validated @RequestBody CustomerContactUpdateRequest request) {
return customerContactService.update(request, SessionUtils.getUserId());
}
@GetMapping("/enable/{id}")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE}, logical = Logical.OR)
@Operation(summary = "启用联系人")
public void enable(@PathVariable String id){
customerContactService.enable(id);
}
@PostMapping("/disable/{id}")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE}, logical = Logical.OR)
@Operation(summary = "禁用联系人")
public void disable(@PathVariable String id, @RequestBody CustomerContactDisableRequest request){
customerContactService.disable(id, request);
}
@GetMapping("/delete/{id}")
@RequiresPermissions(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_DELETE)
@RequiresPermissions(value = {PermissionConstants.CUSTOMER_MANAGEMENT_DELETE,
PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_DELETE}, logical = Logical.OR)
@Operation(summary = "删除客户联系人")
public void delete(@PathVariable String id) {
customerContactService.delete(id);

View File

@@ -22,6 +22,6 @@ public class CustomerCollaboration extends BaseModel {
@Schema(description = "客户id")
private String customerId;
@Schema(description = "协作类型(共享/协作)")
@Schema(description = "协作类型(只读/协作)")
private String collaborationType;
}

View File

@@ -28,7 +28,7 @@ public class CustomerCollaborationAddRequest {
private String userId;
@NotNull
@Schema(description = "协作类型(共享 SHARE / 协作 COLLABORATION)", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "协作类型(只读 READ_ONLY / 协作 COLLABORATION)", requiredMode = Schema.RequiredMode.REQUIRED)
@EnumValue(enumClass = CustomerCollaborationType.class)
private String collaborationType;
}

View File

@@ -21,7 +21,7 @@ public class CustomerCollaborationUpdateRequest {
private String id;
@NotNull
@Schema(description = "协作类型(共享 SHARE / 协作 COLLABORATION)", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "协作类型(只读 READ_ONLY / 协作 COLLABORATION)", requiredMode = Schema.RequiredMode.REQUIRED)
@EnumValue(enumClass = CustomerCollaborationType.class)
private String collaborationType;
}

View File

@@ -1,5 +1,6 @@
package io.cordys.crm.customer.mapper;
import io.cordys.common.dto.DeptDataPermissionDTO;
import io.cordys.common.dto.OptionDTO;
import io.cordys.crm.customer.dto.request.*;
import io.cordys.crm.customer.dto.response.*;
@@ -15,11 +16,15 @@ import java.util.List;
*/
public interface ExtCustomerContactMapper {
List<CustomerContactListResponse> list(@Param("request") CustomerContactPageRequest request, @Param("orgId") String orgId);
List<CustomerContactListResponse> list(@Param("request") CustomerContactPageRequest request, @Param("orgId") String orgId,
@Param("dataPermission") DeptDataPermissionDTO dataPermission);
boolean checkAddExist(@Param("customerContact") CustomerContact customerContact);
boolean checkUpdateExist(@Param("customerContact") CustomerContact CustomerContact);
List<OptionDTO> selectContactOptionByIds(List<String> contactIds);
List<CustomerContactListResponse> listByCustomerId(@Param("customerId") String customerId, @Param("userId") String userId,
@Param("dataPermission") DeptDataPermissionDTO dataPermission);
}

View File

@@ -7,6 +7,8 @@
select cc.id, cc.customer_id, cc.name, cc.create_time, cc.update_time, cc.create_user, cc.update_user,
cc.enable, cc.owner, cc.disable_reason, cc.phone
from customer_contact cc
<include refid="fieldConditionJoin">
<property name="conditions" value="request.filters"/>
<property name="tablePrefix" value="filter"/>
@@ -19,13 +21,24 @@
<property name="sort" value="request.sort"/>
</include>
from customer_contact cc
<if test="dataPermission != null and dataPermission.deptIds.size() > 0">
left join sys_organization_user sou on cc.owner = sou.user_id
and sou.dept_id in
<foreach collection="dataPermission.deptIds" item="deptId" open="(" close=")" separator=",">
#{deptId}
</foreach>
</if>
where cc.organization_id = #{orgId}
<if test="request.keyword != null and request.keyword != ''">
and cc.name like concat('%', #{request.keyword},'%')
</if>
<if test="dataPermission != null and dataPermission.self">
and c.owner = #{userId}
</if>
<include refid="filters">
<property name="filters" value="request.filters"/>
</include>
@@ -161,4 +174,25 @@
#{id}
</foreach>
</select>
<select id="listByCustomerId" resultType="io.cordys.crm.customer.dto.response.CustomerContactListResponse">
select cc.id, cc.customer_id, cc.name, cc.create_time, cc.update_time, cc.create_user, cc.update_user,
cc.enable, cc.owner, cc.disable_reason, cc.phone
from customer_contact cc
<if test="dataPermission != null and dataPermission.deptIds.size() > 0">
left join sys_organization_user sou on cc.owner = sou.user_id
and sou.dept_id in
<foreach collection="dataPermission.deptIds" item="deptId" open="(" close=")" separator=",">
#{deptId}
</foreach>
</if>
where cc.customer_id = #{customerId}
<if test="dataPermission != null and dataPermission.self">
and c.owner = #{userId}
</if>
</select>
</mapper>

View File

@@ -107,7 +107,7 @@
</sql>
<sql id="fieldSortJoin">
<if test="${sort} != null and ${sort}.name != 'name' and ${sort}.name != 'owner'">
<if test="${sort} != null and ${sort}.valid() and ${sort}.name != 'name' and ${sort}.name != 'owner'">
<bind name="sortName" value="${sort}.name"/>
left join customer_field sort_table
on c.id = sort_table.resource_id and sort_table.field_id = #{sortName}

View File

@@ -36,6 +36,13 @@ public class CustomerCollaborationService {
return buildListData(orgId, collaborations);
}
public List<CustomerCollaboration> selectByCustomerIdAndUserId(String customerId, String userId) {
CustomerCollaboration example = new CustomerCollaboration();
example.setCustomerId(customerId);
example.setUserId(userId);
return customerCollaborationMapper.select(example);
}
private List<CustomerCollaborationListResponse> buildListData(String orgId, List<CustomerCollaboration> collaborations) {
if (CollectionUtils.isEmpty(collaborations)) {
return List.of();

View File

@@ -1,12 +1,16 @@
package io.cordys.crm.customer.service;
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.service.BaseService;
import io.cordys.common.uid.IDGenerator;
import io.cordys.common.util.BeanUtils;
import io.cordys.crm.customer.constants.CustomerCollaborationType;
import io.cordys.crm.customer.domain.Customer;
import io.cordys.crm.customer.domain.CustomerCollaboration;
import io.cordys.crm.customer.domain.CustomerContact;
import io.cordys.crm.customer.dto.request.CustomerContactAddRequest;
import io.cordys.crm.customer.dto.request.CustomerContactDisableRequest;
@@ -25,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static io.cordys.crm.customer.constants.CustomerResultCode.CUSTOMER_CONTACT_EXIST;
@@ -44,12 +49,16 @@ public class CustomerContactService {
@Resource
private ExtCustomerContactMapper extCustomerContactMapper;
@Resource
private BaseMapper<Customer> customerMapper;
@Resource
private BaseService baseService;
@Resource
private CustomerContactFieldService customerContactFieldService;
@Resource
private CustomerCollaborationService customerCollaborationService;
public List<CustomerContactListResponse> list(CustomerContactPageRequest request, String orgId) {
List<CustomerContactListResponse> list = extCustomerContactMapper.list(request, orgId);
public List<CustomerContactListResponse> list(CustomerContactPageRequest request, String orgId, DeptDataPermissionDTO deptDataPermission) {
List<CustomerContactListResponse> list = extCustomerContactMapper.list(request, orgId, deptDataPermission);
return buildListData(list, orgId);
}
@@ -184,4 +193,39 @@ public class CustomerContactService {
customerContact.setDisableReason(request.getReason());
customerContactMapper.updateById(customerContact);
}
public List<CustomerContactListResponse> listByCustomerId(String customerId, String userId, String orgId, DeptDataPermissionDTO deptDataPermission) {
// 根据数据权限查询联系人
List<CustomerContactListResponse> list = extCustomerContactMapper.listByCustomerId(customerId, userId, deptDataPermission);
// 查询协作人信息
List<CustomerCollaboration> collaborations = customerCollaborationService.selectByCustomerIdAndUserId(customerId, userId);
if (CollectionUtils.isNotEmpty(collaborations)) {
// 获取协作人相关的联系人
String collaborationType = collaborations.getFirst().getCollaborationType();
List<CustomerContact> collaborationContacts;
if (StringUtils.equals(collaborationType, CustomerCollaborationType.READ_ONLY.name())) {
// 只读,查询客户责任人的联系人
Customer customer = customerMapper.selectByPrimaryKey(customerId);
CustomerContact example = new CustomerContact();
example.setCustomerId(customerId);
example.setOwner(customer.getOwner());
collaborationContacts = customerContactMapper.select(example);
} else {
// 协作,查询当前用户的联系人
CustomerContact example = new CustomerContact();
example.setCustomerId(customerId);
example.setOwner(userId);
collaborationContacts = customerContactMapper.select(example);
}
Set<String> userIds = list.stream()
.map(CustomerContactListResponse::getOwner)
.collect(Collectors.toSet());
collaborationContacts.stream()
.filter(contact -> !userIds.contains(contact.getOwner())) // 去重
.map(contact -> BeanUtils.copyBean(new CustomerContactListResponse(), contact))
.forEach(list::add);
}
return buildListData(list, orgId);
}
}

View File

@@ -193,7 +193,7 @@ CREATE TABLE customer_collaboration
`update_user` VARCHAR(32) NOT NULL COMMENT '更新人',
`user_id` VARCHAR(32) NOT NULL COMMENT '协作人id',
`customer_id` VARCHAR(32) NOT NULL COMMENT '客户id',
`collaboration_type` VARCHAR(50) NOT NULL COMMENT '协作类型(共享/协作)',
`collaboration_type` VARCHAR(50) NOT NULL COMMENT '协作类型(只读/协作)',
PRIMARY KEY (id)
) COMMENT = '客户协作人'
ENGINE = InnoDB

View File

@@ -75,7 +75,7 @@ class CustomerCollaborationControllerTests extends BaseTest {
// 请求成功
CustomerCollaborationUpdateRequest request = new CustomerCollaborationUpdateRequest();
request.setId(addCustomerCollaboration.getId());
request.setCollaborationType(CustomerCollaborationType.SHARE.name());
request.setCollaborationType(CustomerCollaborationType.READ_ONLY.name());
this.requestPostWithOk(DEFAULT_UPDATE, request);
// 校验请求成功数据

View File

@@ -30,6 +30,7 @@ import java.util.List;
class CustomerContactControllerTests extends BaseTest {
private static final String BASE_PATH = "/customer/contact/";
protected static final String MODULE_FORM = "module/form";
protected static final String LIST = "list/{0}";
protected static final String DISABLE = "disable/{0}";
protected static final String ENABLE = "enable/{0}";
@@ -91,7 +92,8 @@ class CustomerContactControllerTests extends BaseTest {
assertErrorCode(this.requestPost(DEFAULT_ADD, request), CustomerResultCode.CUSTOMER_CONTACT_EXIST);
// 校验权限
requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_ADD, DEFAULT_ADD, request);
requestPostPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_ADD, PermissionConstants.CUSTOMER_MANAGEMENT_ADD),
DEFAULT_ADD, request);
}
@Test
@@ -114,7 +116,8 @@ class CustomerContactControllerTests extends BaseTest {
this.requestPostWithOk(DEFAULT_UPDATE, emptyRequest);
// 校验权限
requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, DEFAULT_UPDATE, request);
requestPostPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE),
DEFAULT_UPDATE, request);
}
@Test
@@ -135,7 +138,7 @@ class CustomerContactControllerTests extends BaseTest {
Assertions.assertNotNull(getResponse.getDepartmentName());
// 校验权限
requestGetPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ, DEFAULT_GET, addCustomerContact.getId());
requestGetPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ, PermissionConstants.CUSTOMER_MANAGEMENT_READ), DEFAULT_GET, addCustomerContact.getId());
}
@Test
@@ -164,6 +167,27 @@ class CustomerContactControllerTests extends BaseTest {
requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_READ, DEFAULT_PAGE, request);
}
@Test
@Order(4)
void testList() throws Exception {
MvcResult mvcResult = this.requestGetWithOkAndReturn(LIST, "customerId");
List<CustomerContactListResponse> customerContactList = getResultDataArray(mvcResult, CustomerContactListResponse.class);
customerContactList.forEach(customerContactListResponse -> {
CustomerContact customerContact = customerContactMapper.selectByPrimaryKey(customerContactListResponse.getId());
CustomerContact result = BeanUtils.copyBean(new CustomerContact(), customerContactListResponse);
result.setOrganizationId(customerContact.getOrganizationId());
Assertions.assertEquals(customerContact, result);
Assertions.assertNotNull(customerContactListResponse.getUpdateUserName());
Assertions.assertNotNull(customerContactListResponse.getDepartmentName());
Assertions.assertNotNull(customerContactListResponse.getOwnerName());
Assertions.assertNotNull(customerContactListResponse.getDepartmentId());
Assertions.assertNotNull(customerContactListResponse.getDepartmentName());
});
// 校验权限
requestGetPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_READ, LIST, "customerId");
}
@Test
@Order(5)
void testDisable() throws Exception {
@@ -182,7 +206,8 @@ class CustomerContactControllerTests extends BaseTest {
this.requestPostWithOk(DISABLE, request, addCustomerContact.getId());
// 校验权限
requestPostPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, DISABLE, request, addCustomerContact.getId());
requestPostPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE),
DISABLE, request, addCustomerContact.getId());
}
@Test
@@ -196,7 +221,8 @@ class CustomerContactControllerTests extends BaseTest {
Assertions.assertTrue(customerContact.getEnable());
// 校验权限
requestGetPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, ENABLE, addCustomerContact.getId());
requestGetPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_UPDATE, PermissionConstants.CUSTOMER_MANAGEMENT_UPDATE),
ENABLE, addCustomerContact.getId());
}
@Test
@@ -206,6 +232,7 @@ class CustomerContactControllerTests extends BaseTest {
CustomerContact customerContact = customerContactMapper.selectByPrimaryKey(addCustomerContact.getId());
Assertions.assertNull(customerContact);
// 校验权限
requestGetPermissionTest(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_DELETE, DEFAULT_DELETE, addCustomerContact.getId());
requestGetPermissionsTest(List.of(PermissionConstants.CUSTOMER_MANAGEMENT_CONTACT_DELETE, PermissionConstants.CUSTOMER_MANAGEMENT_DELETE),
DEFAULT_DELETE, addCustomerContact.getId());
}
}