|
|
@@ -0,0 +1,243 @@
|
|
|
+package org.dromara.customer.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.customer.domain.CustomerSalesInfo;
|
|
|
+import org.dromara.customer.domain.IndustryCategory;
|
|
|
+import org.dromara.customer.domain.vo.CustomerInfoVo;
|
|
|
+import org.dromara.customer.domain.vo.CustomerSalesInfoVo;
|
|
|
+import org.dromara.customer.domain.vo.IndustryCategoryVo;
|
|
|
+import org.dromara.customer.mapper.CustomerInfoMapper;
|
|
|
+import org.dromara.customer.mapper.CustomerSalesInfoMapper;
|
|
|
+import org.dromara.customer.mapper.IndustryCategoryMapper;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.dromara.customer.domain.bo.GroupCustomerBo;
|
|
|
+import org.dromara.customer.domain.vo.GroupCustomerVo;
|
|
|
+import org.dromara.customer.domain.GroupCustomer;
|
|
|
+import org.dromara.customer.mapper.GroupCustomerMapper;
|
|
|
+import org.dromara.customer.service.IGroupCustomerService;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 集团客户关系Service业务层处理
|
|
|
+ *
|
|
|
+ * @author LionLi
|
|
|
+ * @date 2025-12-17
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class GroupCustomerServiceImpl extends ServiceImpl<GroupCustomerMapper, GroupCustomer> implements IGroupCustomerService {
|
|
|
+
|
|
|
+ private final GroupCustomerMapper baseMapper;
|
|
|
+
|
|
|
+ private final CustomerInfoMapper customerInfoMapper;
|
|
|
+
|
|
|
+ private final CustomerSalesInfoMapper customerSalesInfoMapper;
|
|
|
+
|
|
|
+ private final IndustryCategoryMapper industryCategoryMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询集团客户关系
|
|
|
+ *
|
|
|
+ * @param id 主键
|
|
|
+ * @return 集团客户关系
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public GroupCustomerVo queryById(Long id) {
|
|
|
+ return baseMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询集团客户关系列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 集团客户关系分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<GroupCustomerVo> queryPageList(GroupCustomerBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<GroupCustomer> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<GroupCustomerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ List<GroupCustomerVo> records = result.getRecords();
|
|
|
+ if (CollUtil.isNotEmpty(records)) {
|
|
|
+ // 1. 收集所有客户ID(普通、顶级、集团)
|
|
|
+ Set<Long> allCustomerIds = records.stream()
|
|
|
+ .flatMap(vo -> Stream.of(
|
|
|
+ vo.getCustomerId(),
|
|
|
+ vo.getTopCustomerId(),
|
|
|
+ vo.getGroupCustomerId()
|
|
|
+ ))
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 2. 用 customerInfoMapper 查询所有客户基本信息
|
|
|
+ List<CustomerInfoVo> customerInfoList = customerInfoMapper.selectVoByIds(allCustomerIds);
|
|
|
+ Map<Long, CustomerInfoVo> customerInfoMap = customerInfoList.stream()
|
|
|
+ .collect(Collectors.toMap(CustomerInfoVo::getId, Function.identity()));
|
|
|
+
|
|
|
+ // 3. 回填所有客户名称和编号
|
|
|
+ records.forEach(vo -> {
|
|
|
+ // 当前客户
|
|
|
+ CustomerInfoVo customer = customerInfoMap.get(vo.getCustomerId());
|
|
|
+ if (customer != null) {
|
|
|
+ vo.setCustomerName(customer.getCustomerName());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上级客户
|
|
|
+ CustomerInfoVo topCustomer = customerInfoMap.get(vo.getTopCustomerId());
|
|
|
+ if (topCustomer != null) {
|
|
|
+ vo.setTopCustomerName(topCustomer.getCustomerName());
|
|
|
+ vo.setTopCustomerNo(topCustomer.getCustomerNo()); // ✅ 来源统一
|
|
|
+ }
|
|
|
+
|
|
|
+ // 集团客户
|
|
|
+ CustomerInfoVo groupCustomer = customerInfoMap.get(vo.getGroupCustomerId());
|
|
|
+ if (groupCustomer != null) {
|
|
|
+ vo.setGroupCustomerName(groupCustomer.getCustomerName());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 4. 提取顶级客户ID(用于销售信息)
|
|
|
+ Set<Long> topCustomerIds = records.stream()
|
|
|
+ .map(GroupCustomerVo::getTopCustomerId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 5. 查询销售信息
|
|
|
+ List<CustomerSalesInfoVo> salesInfoList = customerSalesInfoMapper.selectVoList(new LambdaQueryWrapper<CustomerSalesInfo>().in(CustomerSalesInfo::getCustomerId, topCustomerIds));
|
|
|
+ Map<Long, CustomerSalesInfoVo> salesInfoMap = salesInfoList.stream()
|
|
|
+ .collect(Collectors.toMap(CustomerSalesInfoVo::getCustomerId, Function.identity()));
|
|
|
+
|
|
|
+ // 6. 查询行业分类
|
|
|
+ Set<Long> industryCategoryIds = customerInfoList.stream()
|
|
|
+ .map(CustomerInfoVo::getIndustryCategoryId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ final Map<Long, IndustryCategoryVo> categoryMap =
|
|
|
+ industryCategoryIds.isEmpty()
|
|
|
+ ? Collections.emptyMap()
|
|
|
+ : industryCategoryMapper.selectVoByIds(industryCategoryIds)
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(IndustryCategoryVo::getId, Function.identity()));
|
|
|
+
|
|
|
+ // 7. 回填销售信息 + 行业分类
|
|
|
+ records.forEach(vo -> {
|
|
|
+ Long topCustomerId = vo.getTopCustomerId();
|
|
|
+
|
|
|
+ // 销售信息
|
|
|
+ CustomerSalesInfoVo salesInfo = salesInfoMap.get(topCustomerId);
|
|
|
+ if (salesInfo != null) {
|
|
|
+ vo.setAccountPeriod(salesInfo.getAccountPeriod());
|
|
|
+ vo.setCreditAmount(salesInfo.getCreditAmount());
|
|
|
+ vo.setRemainingQuota(salesInfo.getRemainingQuota());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 行业分类:从 customerInfoMap 获取 category ID,再查 name
|
|
|
+ CustomerInfoVo topCustomer = customerInfoMap.get(topCustomerId);
|
|
|
+ if (topCustomer != null && topCustomer.getIndustryCategoryId() != null) {
|
|
|
+ IndustryCategoryVo category = categoryMap.get(topCustomer.getIndustryCategoryId());
|
|
|
+ if (category != null) {
|
|
|
+ vo.setIndustryCategory(category.getIndustryCategoryName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ private <T, R> R safeGet(Map<Long, T> map, Long id, Function<T, R> mapper) {
|
|
|
+ T value = map.get(id);
|
|
|
+ return value != null ? mapper.apply(value) : null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询符合条件的集团客户关系列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @return 集团客户关系列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<GroupCustomerVo> queryList(GroupCustomerBo bo) {
|
|
|
+ LambdaQueryWrapper<GroupCustomer> lqw = buildQueryWrapper(bo);
|
|
|
+ return baseMapper.selectVoList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<GroupCustomer> buildQueryWrapper(GroupCustomerBo bo) {
|
|
|
+ Map<String, Object> params = bo.getParams();
|
|
|
+ LambdaQueryWrapper<GroupCustomer> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.orderByAsc(GroupCustomer::getId);
|
|
|
+ lqw.eq(bo.getGroupCustomerId() != null, GroupCustomer::getGroupCustomerId, bo.getGroupCustomerId());
|
|
|
+ lqw.eq(bo.getCustomerId() != null, GroupCustomer::getCustomerId, bo.getCustomerId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getCustomerLevel()), GroupCustomer::getCustomerLevel, bo.getCustomerLevel());
|
|
|
+ lqw.eq(bo.getTopCustomerId() != null, GroupCustomer::getTopCustomerId, bo.getTopCustomerId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), GroupCustomer::getPlatformCode, bo.getPlatformCode());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增集团客户关系
|
|
|
+ *
|
|
|
+ * @param bo 集团客户关系
|
|
|
+ * @return 是否新增成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean insertByBo(GroupCustomerBo bo) {
|
|
|
+ GroupCustomer add = MapstructUtils.convert(bo, GroupCustomer.class);
|
|
|
+ validEntityBeforeSave(add);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ if (flag) {
|
|
|
+ bo.setId(add.getId());
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改集团客户关系
|
|
|
+ *
|
|
|
+ * @param bo 集团客户关系
|
|
|
+ * @return 是否修改成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateByBo(GroupCustomerBo bo) {
|
|
|
+ GroupCustomer update = MapstructUtils.convert(bo, GroupCustomer.class);
|
|
|
+ validEntityBeforeSave(update);
|
|
|
+ return baseMapper.updateById(update) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(GroupCustomer entity) {
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验并批量删除集团客户关系信息
|
|
|
+ *
|
|
|
+ * @param ids 待删除的主键集合
|
|
|
+ * @param isValid 是否进行有效性校验
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if (isValid) {
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+}
|