Quellcode durchsuchen

跟单费报表数据调整

lipf vor 1 Woche
Ursprung
Commit
ca88a9c0fd

+ 5 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowCompanyFeeVO.java

@@ -15,6 +15,11 @@ public class FollowCompanyFeeVO {
 
     private String companyId;
 
+    /** 分支保险公司ID partner_company_id */
+    private String partnerCompanyId;
+
+    private String partnerCompanySimplyName;
+
     private String year;
 
     private String month;
@@ -25,9 +30,6 @@ public class FollowCompanyFeeVO {
     @Schema(description = "对接人手机号")
     private String contactPersonPhone;
 
-    /** 分支保险公司ID partner_company_id */
-    private String partnerCompanyId;
-
     /** 已开票总金额 SUM(invoiced) */
     private BigDecimal totalInvoiced;
 

+ 6 - 0
platform/src/main/java/com/jzg/controller/EsmInsCompanyController.java

@@ -69,6 +69,12 @@ public class EsmInsCompanyController extends BaseController {
     private String bucketName;
 
 
+    @GetMapping("queryParentCompanyMap")
+    @Operation(summary = "通过保险公司id查询下级id及本级id")
+    public Map<String, EsmInsCompany> queryParentCompanyMap(){
+        return esmInsCompanyService.queryParentCompanyMap();
+    }
+
     @PostMapping("leftList")
     @Operation(summary = "获取顶级保险公司列表")
     public HttpResult<List<EsmInsCompanyResVo>> leftList(@RequestBody EsmInsCompanyReq req) {

+ 6 - 0
platform/src/main/java/com/jzg/service/EsmInsCompanyService.java

@@ -29,6 +29,12 @@ public interface EsmInsCompanyService extends IService<EsmInsCompany> {
 //     */
 //    EsmInsCompany isOpen(String companyId);
 
+    /**
+     * 根据保司机构查询父级或父级的父级的保险公司
+     * @author lipf
+     * @date 2026/9/2 16:00
+     */
+    Map<String, EsmInsCompany> queryParentCompanyMap();
 
     List<EsmInsCompanyVo> findTree(EsmInsCompanyReq req);
 

+ 73 - 0
platform/src/main/java/com/jzg/service/impl/EsmInsCompanyServiceImpl.java

@@ -61,6 +61,79 @@ public class EsmInsCompanyServiceImpl extends ServiceImpl<EsmInsCompanyMapper, E
     @Autowired
     EsmInsCompanyTenantSortMapper esmInsCompanyTenantSortMapper;
 
+
+    /**
+     * 根据保司机构查询父级或父级的父级的保险公司
+     *      构建 Map<Key: 任意层级ID, Value: 一级保司实体>
+     *
+     * @author lipf
+     * @date 2026/9/2 16:00
+     */
+    @Override
+    public Map<String, EsmInsCompany> queryParentCompanyMap() {
+        // 1. 一次性从数据库获取所有保司数据
+        // 注意:如果数据量极大(>10万),需考虑分页或只查特定状态的数据
+        List<EsmInsCompany> allCompanies = baseMapper.selectList(null);
+
+        if (allCompanies == null || allCompanies.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        // 2. 在内存中构建 ID -> 对象的索引 Map (用于快速查找父级)
+        Map<String, EsmInsCompany> idMap = allCompanies.stream()
+                .collect(Collectors.toMap(EsmInsCompany::getId, c -> c, (k1, k2) -> k1));
+
+        // 3. 准备结果 Map
+        Map<String, EsmInsCompany> resultMap = new HashMap<>(allCompanies.size());
+
+        // 4. 遍历所有节点,计算其归属的一级保司
+        for (EsmInsCompany company : allCompanies) {
+            EsmInsCompany root = findRootInMemory(company, idMap);
+            if (root != null) {
+                // Key: 当前节点ID (可能是1/2/3级), Value: 一级保司对象
+                resultMap.put(company.getId(), root);
+            }
+        }
+
+        return resultMap;
+    }
+
+    /**
+     * 在内存中向上递归/循环查找根节点
+     * @param current 当前节点
+     * @param allDataMap 全量数据索引
+     */
+    private EsmInsCompany findRootInMemory(EsmInsCompany current, Map<String, EsmInsCompany> allDataMap) {
+        EsmInsCompany cursor = current;
+
+        // 安全计数器,防止数据出现死循环(如 A->B->A)
+        int maxDepth = 10;
+        int count = 0;
+
+        while (cursor != null && count < maxDepth) {
+            String pid = cursor.getParentId();
+
+            // 终止条件:parentId 为空 或 为 0,说明当前就是一级保司
+            if (pid == null || "0".equals(pid)) {
+                return cursor;
+            }
+
+            // 通过内存 Map 直接获取父对象,无需查库
+            EsmInsCompany parent = allDataMap.get(pid);
+
+            // 如果找不到父级(可能是脏数据),则当前节点视为顶层或跳过
+            if (parent == null) {
+                // 业务决策:是返回当前节点,还是返回 null?
+                // 这里假设如果父级丢了,当前节点就当作顶级处理,或者根据需求返回 null
+                return cursor;
+            }
+
+            cursor = parent;
+            count++;
+        }
+        return cursor;
+    }
+
     @Override
     public List<EsmInsCompanyVo> findTree(EsmInsCompanyReq req) {
         log.info("查询保险公司信息:req=[{}]", JSONUtil.toJsonStr(req));

+ 5 - 0
tenant/organization/src/main/java/com/jzg/organization/client/EsmInsCompanyClient.java

@@ -5,6 +5,7 @@ import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.system.vo.SysSystemBusPermsVo;
 import com.jzg.commons.request.RequestSingleParam;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,6 +16,10 @@ import java.util.Map;
 public interface EsmInsCompanyClient {
 
 
+    @GetMapping("/esmInsCompany/queryParentCompanyMap")
+    @Operation(summary = "通过保险公司id查询下级id及本级id")
+    public Map<String, EsmInsCompany> queryParentCompanyMap();
+
     /**
      * 获取所有保险公司的全路径名称
      * Key: 公司ID

+ 23 - 4
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -886,9 +886,26 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
         // 处理公司ID,递归收集子公司ID
         fillCompanyChildIds(vo, companyMap);
-
+        Map<String, EsmInsCompany> stringEsmInsCompanyMap = esmInsCompanyClient.queryParentCompanyMap();
         // 2. 查询跟单主数据并聚合
         List<FollowCompanyFeeVO> originalFollowList = insFeeFollowOrderMapper.selectFollowCompanySettlementReport(vo);
+        log.info("跟单费查询。 vo=[{}],originalFollowList.size=[{}]", JSONUtil.toJsonStr(vo), CollUtil.size(originalFollowList));
+        // 根据保险机构匹配保险公司
+        List<FollowCompanyFeeVO> list = originalFollowList.stream().peek(action -> {
+            String partnerCompanyId = action.getPartnerCompanyId();
+            EsmInsCompany esmInsCompany1 = companyMap.get(partnerCompanyId);
+            if(esmInsCompany1 != null){
+                action.setPartnerCompanySimplyName(esmInsCompany1.getName());
+            }
+            EsmInsCompany esmInsCompany = stringEsmInsCompanyMap.get(partnerCompanyId);
+            if(esmInsCompany != null){
+                action.setCompanyId(esmInsCompany.getId());
+                action.setCompanyName(esmInsCompany.getName());
+            }
+        }).toList();
+
+        originalFollowList =new ArrayList<>(list);
+
         if (CollUtil.isNotEmpty(originalFollowList)) {
             List<FollowCompanyFeeVO> followAggVoList = aggregateFollowData(originalFollowList, companyMap);
             resultList.addAll(followAggVoList);
@@ -956,8 +973,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                         BeanUtils.copyProperties(item, incomeDto);
                         incomeDto.setInvoiceType(InvoiceTypeEnum.FEE_2.getCode());
                         return incomeDto;
-                    })
-                    .collect(Collectors.toList());
+                    }).toList();
             incomeDtoList.addAll(copyList);
         }
 
@@ -1124,12 +1140,15 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             String invoiceType = splitArr[3];
             List<FollowCompanyFeeVO> voList = entry.getValue();
 
+            FollowCompanyFeeVO followCompanyFeeVO = voList.get(0);
             FollowCompanyFeeVO vo = new FollowCompanyFeeVO();
             vo.setPartnerCompanyId(partnerCompanyId);
+            vo.setCompanyName(followCompanyFeeVO.getCompanyName());
+            vo.setCompanyId(followCompanyFeeVO.getCompanyId());
+            vo.setPartnerCompanySimplyName(followCompanyFeeVO.getPartnerCompanySimplyName());
             vo.setYear(year);
             vo.setMonth(month);
             vo.setInvoiceType(invoiceType);
-            vo.setCompanyName(getCompanyName(partnerCompanyId, companyMap));
 
             // 汇总当前分组所有followId、settlementId
             List<String> followIds = voList.stream().map(FollowCompanyFeeVO::getFollowId).distinct().toList();