src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -5,6 +5,7 @@ import com.ruoyi.basic.dto.CustomerDto; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.basic.vo.CustomerVo; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; @@ -35,7 +36,7 @@ */ @GetMapping("/list") public R list(Page<CustomerDto> page, CustomerDto customer) { IPage<CustomerDto> customerDtoIPage = customerService.selectCustomerList(page, customer); IPage<CustomerVo> customerDtoIPage = customerService.selectCustomerList(page, customer); return R.ok(customerDtoIPage); } @@ -140,4 +141,14 @@ customerService.recycleCustomer(customer); return AjaxResult.success(); } } /** * å ±äº«å®¢æ· */ @Log(title = "å®¢æ·æ¡£æ¡", businessType = BusinessType.OTHER) @PostMapping("/together") public AjaxResult together(@RequestBody CustomerDto customer) { customerService.together(customer); return AjaxResult.success(); } } src/main/java/com/ruoyi/basic/dto/CustomerDto.java
@@ -24,4 +24,9 @@ private String usageUserName; private String togetherUserNames; } /** * å ±äº«ç¨æ·IDå表 */ private List<Long> userIds; } src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.CustomerDto; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.vo.CustomerVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -67,5 +68,5 @@ */ int deleteCustomerByIds(Long[] ids); IPage<CustomerDto> listPage(Page<CustomerDto> page, @Param("c") CustomerDto customer); } IPage<CustomerVo> listPage(Page<CustomerDto> page, @Param("c") CustomerDto customer, @Param("loginUserId") Long loginUserId); } src/main/java/com/ruoyi/basic/mapper/CustomerUserMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.ruoyi.basic.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.basic.pojo.CustomerUser; import org.apache.ibatis.annotations.Mapper; /** * 客æ·å ±äº«Mapperæ¥å£ * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @date 2026-04-29 */ @Mapper public interface CustomerUserMapper extends BaseMapper<CustomerUser> { } src/main/java/com/ruoyi/basic/pojo/CustomerUser.java
@@ -7,7 +7,7 @@ import java.io.Serializable; import java.time.LocalDateTime; @TableName(value = "customer") @TableName(value = "customer_user") @Data public class CustomerUser implements Serializable { private static final long serialVersionUID = 1L; src/main/java/com/ruoyi/basic/service/CustomerUserService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.basic.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.basic.pojo.CustomerUser; /** * 客æ·å ±äº«Serviceæ¥å£ * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @date 2026-04-29 */ public interface CustomerUserService extends IService<CustomerUser> { } src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.basic.dto.CustomerDto; import com.ruoyi.basic.dto.CustomerPrivatePoolDto; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.vo.CustomerVo; import com.ruoyi.framework.web.domain.AjaxResult; @@ -80,9 +79,16 @@ AjaxResult importData(MultipartFile file); IPage<CustomerDto> selectCustomerList(Page<CustomerDto> page, CustomerDto customer); IPage<CustomerVo> selectCustomerList(Page<CustomerDto> page, CustomerDto customer); void assignCustomer(CustomerDto customer); void recycleCustomer(CustomerDto customer); } /** * å ±äº«å®¢æ·ç»å ¶ä»ç¨æ· * * @param customerDto 客æ·DTOï¼å å«å®¢æ·IDåå ±äº«ç¨æ·IDåè¡¨ï¼ */ void together(CustomerDto customerDto); } src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -11,12 +11,11 @@ import com.ruoyi.basic.dto.CustomerFollowUpDto; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.CustomerPrivatePoolMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerFollowUp; import com.ruoyi.basic.pojo.CustomerFollowUpFile; import com.ruoyi.basic.pojo.CustomerPrivatePool; import com.ruoyi.basic.pojo.*; import com.ruoyi.basic.service.CustomerFollowUpFileService; import com.ruoyi.basic.service.CustomerFollowUpService; import com.ruoyi.basic.service.CustomerReturnVisitService; import com.ruoyi.basic.service.CustomerUserService; import com.ruoyi.basic.service.ICustomerService; import com.ruoyi.basic.vo.CustomerVo; import com.ruoyi.common.utils.SecurityUtils; @@ -58,6 +57,8 @@ private final CustomerFollowUpService customerFollowUpService; private final CustomerReturnVisitService customerReturnVisitService; private CustomerUserService customerUserService; /** * æ¥è¯¢å®¢æ·æ¡£æ¡ @@ -115,16 +116,18 @@ * @return å®¢æ·æ¡£æ¡ */ @Override public IPage<CustomerDto> selectCustomerList(Page<CustomerDto> page, CustomerDto customer) { IPage<CustomerDto> customerPage = customerMapper.listPage(page, customer); public IPage<CustomerVo> selectCustomerList(Page<CustomerDto> page, CustomerDto customer) { LoginUser loginUser = SecurityUtils.getLoginUser(); Long loginUserId = loginUser.getUserId(); IPage<CustomerVo> customerPage = customerMapper.listPage(page, customer, loginUserId); List<CustomerDto> records = customerPage.getRecords(); List<CustomerVo> records = customerPage.getRecords(); if (CollectionUtils.isEmpty(records)) { return customerPage; } List<Long> customerIds = records.stream() .map(CustomerDto::getId) .map(CustomerVo::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -142,6 +145,16 @@ c.setFollowUpTime(Date.from( followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant() )); } // 转æ¢å ±äº«ç¨æ·IDå符串为List<Long> String userIdsStr = c.getUserIdsStr(); if (StringUtils.isNotEmpty(userIdsStr)) { List<Long> userIds = Arrays.stream(userIdsStr.split(",")) .map(String::trim) .map(Long::parseLong) .collect(Collectors.toList()); c.setUserIds(userIds); } }); } @@ -285,16 +298,63 @@ // åæ¶ç§æµ·å®¢æ·å°å ¬æµ· @Override @Transactional(rollbackFor = Exception.class) public void recycleCustomer(CustomerDto customerDto) { Customer customer = customerMapper.selectById(customerDto.getId()); if (customer.getType() == 1 && customer.getIsAssigned() == 1) { // å ¬æµ·ä¸å·²åé customer.setIsAssigned(0); customer.setUsageStatus(0L); customer.setUsageUser(null); customer.setUsageUser(0L); customerMapper.updateById(customer); // å é¤è¯¥å®¢æ·çææå ±äº«å ³ç³» customerUserService.remove( new QueryWrapper<CustomerUser>().lambda() .eq(CustomerUser::getCustomerId, customerDto.getId()) ); } } // 客æ·å ±äº« @Override public void together(CustomerDto customerDto) { // æ¥è¯¢ç°æçå ±äº«è®°å½ List<CustomerUser> existingUsers = customerUserService.list( new QueryWrapper<CustomerUser>().lambda().eq(CustomerUser::getCustomerId, customerDto.getId()) ); // è·åå·²åå¨çç¨æ·IDå表 List<Long> existingUserIds = existingUsers.stream() .map(CustomerUser::getUserId) .collect(Collectors.toList()); // è¿æ»¤æå·²åå¨çç¨æ·ï¼åªä¿çæ°ç¨æ· List<Long> newUserIds = customerDto.getUserIds().stream() .filter(userId -> !existingUserIds.contains(userId)) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(newUserIds)) { return; } // è·åå½åç§æ·ID LoginUser loginUser = SecurityUtils.getLoginUser(); Long tenantId = loginUser.getTenantId(); // æ¹éä¿åæ°çå ±äº«è®°å½ List<CustomerUser> customerUsers = newUserIds.stream() .map(userId -> { CustomerUser customerUser = new CustomerUser(); customerUser.setCustomerId(customerDto.getId()); customerUser.setUserId(userId); customerUser.setTenantId(tenantId); return customerUser; }) .collect(Collectors.toList()); customerUserService.saveBatch(customerUsers); } /** * ä¸å线å½å转驼峰å½å */ src/main/java/com/ruoyi/basic/service/impl/CustomerUserServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.basic.service.impl; import com.ruoyi.basic.mapper.CustomerUserMapper; import com.ruoyi.basic.pojo.CustomerUser; import com.ruoyi.basic.service.CustomerUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * 客æ·å ±äº«Serviceå®ç°ç±» * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @date 2026-04-29 */ @Service @Transactional(rollbackFor = Exception.class) public class CustomerUserServiceImpl extends ServiceImpl<CustomerUserMapper, CustomerUser> implements CustomerUserService { } src/main/java/com/ruoyi/basic/vo/CustomerVo.java
@@ -11,4 +11,18 @@ public class CustomerVo extends Customer { @ApiModelProperty(value = "è·è¿è®°å½") private List<CustomerFollowUpDto> followUpList; private String usageUserName; private String togetherUserNames; /** * å ±äº«ç¨æ·IDå表 */ private List<Long> userIds; /** * å ±äº«ç¨æ·IDå符串ï¼SQLæ¥è¯¢è¿åï¼ç¨äºè½¬æ¢ä¸ºListï¼ */ private String userIdsStr; } src/main/resources/mapper/basic/CustomerMapper.xml
@@ -6,7 +6,7 @@ <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.Customer"> <id column="id" property="id" /> </resultMap> <select id="listPage" resultType="com.ruoyi.basic.dto.CustomerDto"> <select id="listPage" resultType="com.ruoyi.basic.vo.CustomerVo"> select c.*, u.user_name usage_user_name, @@ -16,7 +16,13 @@ left join sys_user u2 on cu.user_id = u2.user_id where cu.customer_id = c.id and cu.user_id != c.usage_user ) as together_user_names ) as together_user_names, ( select group_concat(cu.user_id separator ',') from customer_user cu where cu.customer_id = c.id and cu.user_id != c.usage_user ) as user_ids_str from customer c left join sys_user u on c.usage_user = u.user_id <where> @@ -26,14 +32,25 @@ <if test="c.customerType != null and c.customerType != ''"> and customer_type = #{c.customerType} </if> <!-- ç§æµ·æ¥è¯¢ï¼type = 0ï¼ç§æµ·å®¢æ·ï¼æè type = 1ï¼å ¬æµ·å®¢æ·ï¼ä¸å·²è¢«åé --> <if test="c.type != null and c.type == 0"> and type = #{c.type} or (type = 1 and is_assigned = 1) </if> <!-- å ¬æµ·æ¥è¯¢ï¼type = 1ï¼å ¬æµ·å®¢æ·ï¼--> <if test="c.type != null and c.type == 1"> and type = #{c.type} </if> <!-- ç§æµ·æ¥è¯¢ï¼type = 0ï¼ç§æµ·å®¢æ·ï¼æè type = 1ï¼å ¬æµ·å®¢æ·ï¼ä¸å·²è¢«åé ï¼å¹¶ä¸æ¯èªå·±é¢ç¨ãèªå·±å建æè å ±äº«ç»èªå·±çå®¢æ· --> <if test="c.type != null and c.type == 0"> and ( (type = #{c.type} or (type = 1 and is_assigned = 1)) and ( c.usage_user = #{loginUserId} or c.create_user = #{loginUserId} or exists ( select 1 from customer_user cu where cu.customer_id = c.id and cu.user_id = #{loginUserId} ) ) ) </if> </where> </select>