| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.date.LocalDateTimeUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import com.ruoyi.basic.pojo.Customer; |
| | | import com.ruoyi.basic.pojo.CustomerFollowUp; |
| | | import com.ruoyi.basic.pojo.CustomerFollowUpFile; |
| | | import com.ruoyi.basic.service.CustomerFollowUpFileService; |
| | | import com.ruoyi.basic.service.CustomerFollowUpService; |
| | | import com.ruoyi.basic.service.CustomerReturnVisitService; |
| | | import com.ruoyi.basic.service.ICustomerService; |
| | | import com.ruoyi.basic.pojo.CustomerRegions; |
| | | import com.ruoyi.basic.service.*; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import lombok.AllArgsConstructor; |
| | |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.ZoneId; |
| | | import java.util.*; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | |
| | | private CustomerFollowUpFileService customerFollowUpFileService; |
| | | |
| | | private CustomerReturnVisitService customerReturnVisitService; |
| | | |
| | | private final ICustomerRegionsService customerRegionsService; |
| | | |
| | | /** |
| | | * 查询客户档案 |
| | |
| | | BeanUtils.copyProperties(customer, dto); |
| | | |
| | | // 查询跟进记录 |
| | | List<CustomerFollowUp> followUpList = customerFollowUpService.list( |
| | | new LambdaQueryWrapper<CustomerFollowUp>() |
| | | .eq(CustomerFollowUp::getCustomerId, id) |
| | | .orderByDesc(CustomerFollowUp::getFollowUpTime) |
| | | ); |
| | | |
| | | if (!CollectionUtils.isEmpty(followUpList)) { |
| | | List<CustomerFollowUpDto> followUpDtoList = followUpList.stream().map(followUp -> { |
| | | CustomerFollowUpDto followUpDto = new CustomerFollowUpDto(); |
| | | BeanUtils.copyProperties(followUp, followUpDto); |
| | | |
| | | // 查询附件 |
| | | List<CustomerFollowUpFile> fileList = customerFollowUpFileService.list( |
| | | new LambdaQueryWrapper<CustomerFollowUpFile>() |
| | | .eq(CustomerFollowUpFile::getFollowUpId, followUp.getId()) |
| | | ); |
| | | followUpDto.setFileList(fileList); |
| | | |
| | | return followUpDto; |
| | | }).collect(Collectors.toList()); |
| | | |
| | | dto.setFollowUpList(followUpDtoList); |
| | | // List<CustomerFollowUp> followUpList = customerFollowUpService.list( |
| | | // new LambdaQueryWrapper<CustomerFollowUp>() |
| | | // .eq(CustomerFollowUp::getCustomerId, id) |
| | | // .orderByDesc(CustomerFollowUp::getFollowUpTime) |
| | | // ); |
| | | // |
| | | // if (!CollectionUtils.isEmpty(followUpList)) { |
| | | // List<CustomerFollowUpDto> followUpDtoList = followUpList.stream().map(followUp -> { |
| | | // CustomerFollowUpDto followUpDto = new CustomerFollowUpDto(); |
| | | // BeanUtils.copyProperties(followUp, followUpDto); |
| | | // |
| | | // // 查询附件 |
| | | // List<CustomerFollowUpFile> fileList = customerFollowUpFileService.list( |
| | | // new LambdaQueryWrapper<CustomerFollowUpFile>() |
| | | // .eq(CustomerFollowUpFile::getFollowUpId, followUp.getId()) |
| | | // ); |
| | | // followUpDto.setFileList(fileList); |
| | | // |
| | | // return followUpDto; |
| | | // }).collect(Collectors.toList()); |
| | | // |
| | | // dto.setFollowUpList(followUpDtoList); |
| | | // } |
| | | // 地区名称 |
| | | CustomerRegions customerRegions = customerRegionsService.getById(customer.getRegionsId()); |
| | | if (customerRegions != null) { |
| | | dto.setRegionsName(customerRegions.getRegionsName()); |
| | | } |
| | | |
| | | return dto; |
| | | } |
| | | |
| | | /** |
| | | * 查询客户档案列表 |
| | | * |
| | | * @param customer 客户档案 |
| | | * @return 客户档案 |
| | | * @param page 分页对象 |
| | | * @param customer 客户查询条件 |
| | | * @return 客户档案分页列表 |
| | | */ |
| | | @Override |
| | | public IPage<Customer> selectCustomerList(Page<Customer> page, Customer customer) { |
| | | // 1. 处理空值场景(参数校验) |
| | | if (page == null) { |
| | | page = Page.of(1, 10); // 默认第1页,每页10条数据 |
| | | } |
| | | if (customer == null) { |
| | | customer = new Customer(); // 避免空对象导致的NPE |
| | | } |
| | | public IPage<CustomerDto> selectCustomerList(Page<Customer> page, Customer customer) { |
| | | if (page == null) page = Page.of(1, 10); |
| | | if (customer == null) customer = new Customer(); |
| | | |
| | | // 2. 构建查询条件(增强空值安全) |
| | | LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>(); |
| | | String customerName = customer.getCustomerName(); |
| | | String customerType = customer.getCustomerType(); |
| | | Long regionsId = customer.getRegionsId(); |
| | | |
| | | if (StringUtils.isNotBlank(customerName)) { |
| | | queryWrapper.like(Customer::getCustomerName, customerName); |
| | | } |
| | | if (StringUtils.isNotBlank(customerType)) { |
| | | queryWrapper.like(Customer::getCustomerType, customerType); |
| | | queryWrapper.eq(Customer::getCustomerType, customerType); |
| | | } |
| | | |
| | | // 3. 执行分页查询(保留分页元数据) |
| | | if (regionsId != null) { |
| | | // 调用 regionsService 获取当前地区及其所有后代的 ID 集合 |
| | | List<Long> allRegionsIds = customerRegionsService.regionsChildrenIds(regionsId); |
| | | if (!CollectionUtils.isEmpty(allRegionsIds)) { |
| | | queryWrapper.in(Customer::getRegionsId, allRegionsIds); |
| | | } else { |
| | | queryWrapper.eq(Customer::getRegionsId, regionsId); |
| | | } |
| | | } |
| | | |
| | | IPage<Customer> customerPage = customerMapper.selectPage(page, queryWrapper); |
| | | |
| | | // 4. 数据处理(增强空值安全 & 代码可读性) |
| | | List<Customer> processedList = customerPage.getRecords().stream() |
| | | .filter(Objects::nonNull) // 过滤空对象(避免后续操作NPE) |
| | | .peek(c -> { |
| | | // 安全获取字段,避免null值拼接 |
| | | List<CustomerDto> dtoList = customerPage.getRecords().stream() |
| | | .filter(Objects::nonNull) |
| | | .map(c -> { |
| | | CustomerDto dto = new CustomerDto(); |
| | | BeanUtils.copyProperties(c, dto); |
| | | |
| | | // 地址电话拼接 |
| | | String address = StringUtils.defaultString(c.getCompanyAddress(), ""); |
| | | String phone = StringUtils.defaultString(c.getCompanyPhone(), ""); |
| | | c.setAddressPhone(address + "(" + phone + ")"); |
| | | dto.setAddressPhone(address + "(" + phone + ")"); |
| | | |
| | | // 填充地区名称 |
| | | if (c.getRegionsId() != null) { |
| | | CustomerRegions regions = customerRegionsService.getById(c.getRegionsId()); |
| | | if (regions != null) { |
| | | dto.setRegionsName(regions.getRegionsName()); |
| | | } |
| | | } |
| | | |
| | | // 查询最新的跟进记录 |
| | | CustomerFollowUp followUp = customerFollowUpService.getOne( |
| | | new LambdaQueryWrapper<CustomerFollowUp>() |
| | | .eq(CustomerFollowUp::getCustomerId, c.getId()) |
| | | .orderByDesc(CustomerFollowUp::getFollowUpTime) |
| | | .last("LIMIT 1") |
| | | ); |
| | | |
| | | if (followUp != null) { |
| | | c.setFollowUpLevel(followUp.getFollowUpLevel()); |
| | | c.setFollowUpTime( |
| | | Date.from( |
| | | followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant() |
| | | ) |
| | | ); |
| | | } |
| | | // CustomerFollowUp followUp = customerFollowUpService.getOne( |
| | | // new LambdaQueryWrapper<CustomerFollowUp>() |
| | | // .eq(CustomerFollowUp::getCustomerId, c.getId()) |
| | | // .orderByDesc(CustomerFollowUp::getFollowUpTime) |
| | | // .last("LIMIT 1") |
| | | // ); |
| | | // |
| | | // if (followUp != null) { |
| | | // dto.setFollowUpLevel(followUp.getFollowUpLevel()); |
| | | // dto.setFollowUpTime(Date.from(followUp.getFollowUpTime().atZone(ZoneId.systemDefault()).toInstant())); |
| | | // } |
| | | return dto; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 5. 更新分页结果中的数据(保持分页信息完整) |
| | | IPage<Customer> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal()); |
| | | resultPage.setRecords(processedList); |
| | | IPage<CustomerDto> resultPage = new Page<>(customerPage.getCurrent(), customerPage.getSize(), customerPage.getTotal()); |
| | | resultPage.setRecords(dtoList); |
| | | |
| | | return customerPage; // 返回包含分页信息的IPage对象 |
| | | return resultPage; |
| | | } |
| | | |
| | | /** |
| | |
| | | entry -> underlineToCamel(entry.getKey()), |
| | | Map.Entry::getValue)) |
| | | ).collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override |
| | | public List<String> regionsList() { |
| | | return this.baseMapper.selectObjs(new QueryWrapper<Customer>() |
| | | .select("DISTINCT regions") |
| | | .isNotNull("regions") |
| | | .ne("regions", "") |
| | | ).stream() |
| | | .map(Object::toString) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |