Jelajahi Sumber

修改bug:
私有应收-手续费-结算报表,报表已开票金额不对

jiakai 3 bulan lalu
induk
melakukan
6070da4a0e

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsFeeFollowOrder.java

@@ -30,6 +30,9 @@ public class InsFeeFollowOrder extends BaseModel {
     @Schema(description = "分支保险公司ID")
     private String partnerCompanyId;
 
+    @Schema(description = "开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险")
+    private String invoiceType;
+
     @Schema(description = "应收金额")
     private BigDecimal receivablePremium;
 

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowInvoicePageListVo.java

@@ -15,6 +15,9 @@ import java.util.List;
 @Schema(description = "保费跟踪订单返回视图")
 public class FollowInvoicePageListVo implements Serializable {
 
+    // 区分类型,2:车险跟单,4:非车险跟单
+    private String invoiceType;
+
     // 逻辑判断符: "and" 或 "or"
     private String logicJudge;
 

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordQueryVo.java

@@ -3,6 +3,8 @@ package com.jzg.commons.entity.finance.vo;
 import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 开票记录查询vo
  */
@@ -24,6 +26,11 @@ public class InvoiceRecordQueryVo extends PageRequest {
      */
     private String invoiceType;
 
+    /**
+     * 开票类型
+     */
+    private List<String> invoiceTypes;
+
     /**
      * 开票方
      */

+ 40 - 13
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -3609,6 +3609,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             order.setReconciliationAmount(item.getReconciliationAmount());
             order.setFalselyIncreasedDifference(item.getFalselyIncreasedDifference());
             order.setFalselyIncreasedReason(item.getFalselyIncreasedReason());
+            order.setInvoiceType(vo.getInvoiceType());
 
             orderList.add(order);
 
@@ -3793,7 +3794,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 .collect(Collectors.groupingBy(InsPlyIncomeDto::getPartnerCompanyId));
 
         // 查询该年份下已开票的数据,并聚合为 [合作方ID_月份 -> 已开票金额] 的映射
-        Map<String, BigDecimal> invoicedMap = buildInvoicedMap(startYear, endYear);
+        Map<String, BigDecimal> invoicedMap = buildInvoicedMap(startYear, endYear, followInvoicePageListVo.getInvoiceType());
 
         // 遍历分组数据,组装最终的返回结果
         List<InsFeeFollowOrderVo> result = new ArrayList<>();
@@ -3806,8 +3807,14 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 continue;
             }
 
+            Map<Integer, BigDecimal> monthReceivableMap = new HashMap<>();
+            // 2为车险,4为非车险
             // 计算该合作方每月的应收保费
-            Map<Integer, BigDecimal> monthReceivableMap = calculateMonthlyReceivable(list);
+            if ("2".equals(followInvoicePageListVo.getInvoiceType())){
+                monthReceivableMap = calculateMonthlyReceivable(list);
+            }else if ("4".equals(followInvoicePageListVo.getInvoiceType())){
+                monthReceivableMap = jyCalculateMonthlyReceivable(list);
+            }
 
             // 遍历12个月份,组装VO对象
             InsPlyIncomeDto firstItem = list.get(0);
@@ -3829,20 +3836,19 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     /**
      * 构建已开票金额映射表
      * <p>
-     * 该方法用于查询指定年份范围内的跟单订单数据,并按"合作方ID_月份"维度聚合计算已开票金额,包括以下处理逻辑:
-     * 1. 根据起始年份和结束年份查询跟单订单列表
-     * 2. 按"合作方ID_月份"进行分组
-     * 3. 对每组数据进行归约计算,累加已开票金额
-     * 4. 返回合作方和月份到已开票总额的映射关系
+     * 根据指定的年份范围和发票类型,查询保险费用跟踪订单数据,
+     * 并按合作伙伴公司和月份分组统计已开票金额总和。
      * </p>
      *
-     * @param startYear 起始年份,用于指定查询范围的开始年份
-     * @param endYear 结束年份,用于指定查询范围的结束年份
-     * @return Map<String, BigDecimal> 返回已开票金额映射表,key为"合作方ID_月份"格式(如"COMP001_5"),value为该合作方在该月份的已开票金额总和
+     * @param startYear 起始年份
+     * @param endYear 结束年份
+     * @param invoiceType 发票类型
+     * @return Map<String, BigDecimal> 键格式为"合作伙伴公司ID_月份",值为该时间段内的已开票金额总和
      */
-    private Map<String, BigDecimal> buildInvoicedMap(Integer startYear, Integer endYear) {
+    private Map<String, BigDecimal> buildInvoicedMap(Integer startYear, Integer endYear, String invoiceType) {
         QueryWrapper<InsFeeFollowOrder> queryWrapper = new QueryWrapper<>();
         queryWrapper.between("year", startYear, endYear);
+        queryWrapper.eq("invoice_type", invoiceType);
         List<InsFeeFollowOrder> invoicedList = insFeeFollowOrderMapper.selectList(queryWrapper);
 
         return invoicedList.stream().collect(Collectors.groupingBy(
@@ -3889,6 +3895,27 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 ));
     }
 
+    /**
+     * 非车险跟单
+     * @param list
+     * @return
+     */
+    private Map<Integer, BigDecimal> jyCalculateMonthlyReceivable(List<InsPlyIncomeDto> list) {
+        return list.stream()
+                .filter(item -> item.getSigningTime() != null) // 防御性编程:过滤掉签约时间为空的数据
+                .collect(Collectors.groupingBy(
+                        item -> item.getSigningTime().getMonthValue(),
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                item -> {
+                                    // 优化点:将字符串转换为BigDecimal,避免在循环中频繁new对象
+                                    return BigDecimalUtil.valueOf(item.getJyOtherCostsPremiums());
+                                },
+                                BigDecimal::add
+                        )
+                ));
+    }
+
     /**
      * 组装单个月的发票跟进VO对象
      * <p>
@@ -4160,9 +4187,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         }
         invoiceRecordQueryVo.setSystemCode(baseController.getSystemCode());
         Page<InvoiceRecordResult> invoiceRecordList = null;
-        if ("2".equals(invoiceRecordQueryVo.getInvoiceType())){
+        if (invoiceRecordQueryVo.getInvoiceTypes().contains("2") || invoiceRecordQueryVo.getInvoiceTypes().contains("4")){
             invoiceRecordList = baseMapper.getFollowInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
-        }else if ("1".equals(invoiceRecordQueryVo.getInvoiceType())){
+        }else if(invoiceRecordQueryVo.getInvoiceTypes().contains("1") || invoiceRecordQueryVo.getInvoiceTypes().contains("3")){
             invoiceRecordList = baseMapper.getInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
         }
         List<InvoiceRecordResult> records = invoiceRecordList.getRecords();

+ 12 - 0
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -1491,6 +1491,12 @@
             <if test="invoiceRecordQueryVo.invoiceType != null and invoiceRecordQueryVo.invoiceType != ''">
                 AND ipii.invoice_type = #{invoiceRecordQueryVo.invoiceType}
             </if>
+            <if test="invoiceRecordQueryVo.invoiceTypes != null and invoiceRecordQueryVo.invoiceTypes != ''">
+                AND ipii.invoice_type IN
+                <foreach collection="invoiceRecordQueryVo.invoiceTypes" item="invoiceType" open="(" separator="," close=")">
+                    #{invoiceType}
+                </foreach>
+            </if>
             <if test="invoiceRecordQueryVo.invoiceParty != null and invoiceRecordQueryVo.invoiceParty != ''">
                 AND ipii.invoice_party = #{invoiceRecordQueryVo.invoiceParty}
             </if>
@@ -1561,6 +1567,12 @@
             <if test="invoiceRecordQueryVo.companyId != null and invoiceRecordQueryVo.companyId != ''">
                 AND ipii.company_id = #{invoiceRecordQueryVo.companyId}
             </if>
+            <if test="invoiceRecordQueryVo.invoiceTypes != null and invoiceRecordQueryVo.invoiceTypes != ''">
+                AND ipii.invoice_type IN
+                <foreach collection="invoiceRecordQueryVo.invoiceTypes" item="invoiceType" open="(" separator="," close=")">
+                    #{invoiceType}
+                </foreach>
+            </if>
             <if test="invoiceRecordQueryVo.invoiceParty != null and invoiceRecordQueryVo.invoiceParty != ''">
                 AND ipii.invoice_party = #{invoiceRecordQueryVo.invoiceParty}
             </if>