Просмотр исходного кода

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260622'

jiakai 2 месяцев назад
Родитель
Сommit
2d107a93a1

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

@@ -107,6 +107,9 @@ public class ReceivableQueryVo extends PageRequest {
     @Schema(description = "结算状态")
     private String settlementStatus;
 
+    @Schema(description = "开票和结算状态")
+    private String invoiceSettlementStatus;
+
     @Schema(description = "增加类型")
     private String addType;
 

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/report/dto/FeeAuditSummaryVo.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.report.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 费用审核汇总统计结果VO:按保险公司分组统计各审核状态数量及平均审核时长
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "费用审核汇总统计结果VO")
+public class FeeAuditSummaryVo {
+
+    @Schema(description = "保险公司ID")
+    private String companyId;
+
+    @Schema(description = "保险公司名称")
+    private String companyName;
+
+    @Schema(description = "待审核条数")
+    private Long pendingReviewNum;
+
+    @Schema(description = "已审核条数")
+    private Long approvedNum;
+
+    @Schema(description = "审核不通过条数")
+    private Long rejectedNum;
+
+    @Schema(description = "疑问订单条数")
+    private Long problemOrderNum;
+
+    @Schema(description = "平均审核时长(秒)")
+    private Long avgAuditDuration;
+}

+ 26 - 0
commons/src/main/java/com/jzg/commons/entity/report/vo/FeeAuditSummaryParam.java

@@ -0,0 +1,26 @@
+package com.jzg.commons.entity.report.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+
+/**
+ * 费用审核汇总统计请求参数
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Schema(description = "费用审核汇总统计请求参数")
+public class FeeAuditSummaryParam extends PageRequest {
+
+    @Schema(description = "审核开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate auditTimeStart;
+
+    @Schema(description = "审核结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate auditTimeEnd;
+}

+ 26 - 5
consoleStatistics/src/main/java/com/jzg/console/controller/ReportFinanceDataManageController.java

@@ -3,6 +3,8 @@ package com.jzg.console.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.report.dto.FeeAuditSummaryVo;
+import com.jzg.commons.entity.report.vo.FeeAuditSummaryParam;
 import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
 import com.jzg.console.service.*;
 import io.swagger.v3.oas.annotations.Operation;
@@ -45,6 +47,10 @@ public class ReportFinanceDataManageController extends BaseController {
     @Autowired
     private ReportPersonCheckDataService reportPersonCheckDataService;
 
+    //费用审核汇总统计
+    @Autowired
+    private ReportFeeAuditSummaryService reportFeeAuditSummaryService;
+
 
 
     /**
@@ -154,8 +160,8 @@ public class ReportFinanceDataManageController extends BaseController {
     @PostMapping(value = "/receivableDataDetailPageList")
     public HttpResult<?> receivableDataDetailPageList(@RequestBody ReportSearchCommonVo reportSearchCommonVo) {
         try{
-            List<?> list = reportReceivableDataService.getDetailListByParams(reportSearchCommonVo);
-            return HttpResult.ok(list);
+            IPage<?> pageList = reportReceivableDataService.getPageDetailListByParams(reportSearchCommonVo);
+            return HttpResult.ok(pageList);
         }catch (Exception e){
             return HttpResult.error(e.getMessage());
         }
@@ -187,8 +193,8 @@ public class ReportFinanceDataManageController extends BaseController {
     @PostMapping(value = "/meetDataPageList")
     public HttpResult<?> meetDataPageList(@RequestBody ReportSearchCommonVo reportSearchCommonVo) {
         try{
-            List<?> list = reportMeetDataService.getListByParams(reportSearchCommonVo);
-            return HttpResult.ok(list);
+            IPage<?> pageList = reportMeetDataService.getPageListByParams(reportSearchCommonVo);
+            return HttpResult.ok(pageList);
         }catch (Exception e){
             return HttpResult.error(e.getMessage());
         }
@@ -213,7 +219,7 @@ public class ReportFinanceDataManageController extends BaseController {
      *  @version
      *  @author: hxl
      *  @Date: 2025/9/22 17:11
-     *  @Description:  业务数据-对接人-明细查询
+     *  @Description:  财务数据-应付-明细查询
      */
     @Operation(summary = "财务数据-应付-明细查询", description = "财务数据-应付-明细查询")
     @PostMapping(value = "/meetDataDetailPageList")
@@ -340,4 +346,19 @@ public class ReportFinanceDataManageController extends BaseController {
         }
     }
 
+    /**
+     * 费用审核汇总统计:按保险公司分组统计待审核、已审核、审核不通过、疑问订单数量及平均审核时长
+     * @author: jk
+     */
+    @Operation(summary = "费用审核-汇总统计列表", description = "费用审核-汇总统计列表")
+    @PostMapping(value = "/feeAuditSummaryPageList")
+    public HttpResult<IPage<FeeAuditSummaryVo>> feeAuditSummaryPageList(@RequestBody FeeAuditSummaryParam param) {
+        try {
+            IPage<FeeAuditSummaryVo> pageList = reportFeeAuditSummaryService.getFeeAuditSummaryPage(param);
+            return HttpResult.ok(pageList);
+        } catch (Exception e) {
+            return HttpResult.error(e.getMessage());
+        }
+    }
+
 }

+ 18 - 0
consoleStatistics/src/main/java/com/jzg/console/mapper/ReportFeeAuditSummaryMapper.java

@@ -0,0 +1,18 @@
+package com.jzg.console.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.FeeAuditSummaryVo;
+import com.jzg.commons.entity.report.vo.FeeAuditSummaryParam;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 费用审核汇总统计 Mapper
+ */
+public interface ReportFeeAuditSummaryMapper {
+
+    /**
+     * 按保险公司分组统计费用审核汇总数据
+     */
+    IPage<FeeAuditSummaryVo> getFeeAuditSummaryPage(Page<FeeAuditSummaryVo> page, @Param("param") FeeAuditSummaryParam param);
+}

+ 16 - 0
consoleStatistics/src/main/java/com/jzg/console/service/ReportFeeAuditSummaryService.java

@@ -0,0 +1,16 @@
+package com.jzg.console.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.entity.report.dto.FeeAuditSummaryVo;
+import com.jzg.commons.entity.report.vo.FeeAuditSummaryParam;
+
+/**
+ * 费用审核汇总统计 Service
+ */
+public interface ReportFeeAuditSummaryService {
+
+    /**
+     * 按保险公司分组统计费用审核汇总(逻辑分页)
+     */
+    IPage<FeeAuditSummaryVo> getFeeAuditSummaryPage(FeeAuditSummaryParam param);
+}

+ 28 - 0
consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportFeeAuditSummaryServiceImpl.java

@@ -0,0 +1,28 @@
+package com.jzg.console.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.entity.report.dto.FeeAuditSummaryVo;
+import com.jzg.commons.entity.report.vo.FeeAuditSummaryParam;
+import com.jzg.console.mapper.ReportFeeAuditSummaryMapper;
+import com.jzg.console.service.ReportFeeAuditSummaryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 费用审核汇总统计 Service 实现
+ */
+@Service
+public class ReportFeeAuditSummaryServiceImpl implements ReportFeeAuditSummaryService {
+
+    @Autowired
+    private ReportFeeAuditSummaryMapper reportFeeAuditSummaryMapper;
+
+    @Override
+    public IPage<FeeAuditSummaryVo> getFeeAuditSummaryPage(FeeAuditSummaryParam param) {
+        // 创建分页对象
+        Page<FeeAuditSummaryVo> page = new Page<>(param.getPages(), param.getSize());
+        // 执行分组统计查询(逻辑分页:先查出全部再在内存中分页)
+        return reportFeeAuditSummaryMapper.getFeeAuditSummaryPage(page, param);
+    }
+}

+ 35 - 0
consoleStatistics/src/main/resources/mapper/ReportFeeAuditSummaryMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.console.mapper.ReportFeeAuditSummaryMapper">
+
+    <!-- 按保险公司分组统计费用审核汇总数据 -->
+    <select id="getFeeAuditSummaryPage" resultType="com.jzg.commons.entity.report.dto.FeeAuditSummaryVo">
+        SELECT
+            io.company_id AS companyId,
+            io.company_name AS companyName,
+            -- 待审核:audit_status = 0 AND is_problem = 0
+            COUNT(CASE WHEN ifa.audit_status = 0 AND (ifa.is_problem IS NULL OR ifa.is_problem = 0) THEN 1 END) AS pendingReviewNum,
+            -- 已审核:audit_status = 1 AND (is_problem IS NULL OR is_problem = 0)
+            COUNT(CASE WHEN ifa.audit_status = 1 AND (ifa.is_problem IS NULL OR ifa.is_problem = 0) THEN 1 END) AS approvedNum,
+            -- 审核不通过:audit_status = 2 AND (is_problem IS NULL OR is_problem = 0)
+            COUNT(CASE WHEN ifa.audit_status = 2 AND (ifa.is_problem IS NULL OR ifa.is_problem = 0) THEN 1 END) AS rejectedNum,
+            -- 疑问订单:is_problem = 1
+            COUNT(CASE WHEN ifa.is_problem = 1 THEN 1 END) AS problemOrderNum,
+            -- 平均审核时长(秒):audit_time - receive_time
+            COALESCE(ROUND(AVG(TIMESTAMPDIFF(SECOND, ifa.receive_time, ifa.audit_time)), 0), 0) AS avgAuditDuration
+        FROM ins_fee_audit ifa
+        LEFT JOIN ins_orders io ON ifa.order_no = io.id AND io.is_delete = 0
+        <where>
+            ifa.is_delete = 0
+            <if test="param.auditTimeStart != null">
+                AND (ifa.audit_time &gt;= #{param.auditTimeStart} OR ifa.audit_time IS NULL)
+            </if>
+            <if test="param.auditTimeEnd != null">
+                AND (ifa.audit_time &lt;= #{param.auditTimeEnd} OR ifa.audit_time IS NULL)
+            </if>
+        </where>
+        GROUP BY io.company_id, io.company_name
+        ORDER BY approvedNum DESC, pendingReviewNum DESC
+    </select>
+
+</mapper>

+ 34 - 17
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java

@@ -1,10 +1,12 @@
 package com.jzg.quotation.summary.aop;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson2.JSON;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.VerifyAdjustParam;
+import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
@@ -12,6 +14,7 @@ import com.jzg.commons.entity.orders.po.InsOrdersTrack;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.vo.AdjustAllRefundVo;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import com.jzg.quotation.commons.constant.SpElMapping;
 import com.jzg.quotation.commons.utils.SpElFieldExtractor;
 import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
@@ -157,16 +160,16 @@ public class OrderOperationLogAspect {
             // 费用调整
             case 15:
                 logger.info("费用调整log.orderSpEl()=[{}]",log.orderSpEl());
+                PtlAgreementCostRatioVo vo = parser.parseExpression(log.orderSpEl()).getValue(context, PtlAgreementCostRatioVo.class);
                 result = joinPoint.proceed();
-                String orderNo01 = "001";
-                this.saveCostInfo(orderNo01,result,log);
+                this.saveCostInfo(result,log, vo);
                 break;
             // 批量修改比例
             case 16:
                 logger.info("批量修改比例.log.orderSpEl()=[{}]",log.orderSpEl());
+                BatchModifyVo batchModifyVo = parser.parseExpression(log.orderSpEl()).getValue(context, BatchModifyVo.class);
                 result = joinPoint.proceed();
-                String orderNo02 = "002";
-                this.batchModify(orderNo02,result,log);
+                this.batchModify(result,log, batchModifyVo);
                 break;
         }
         return result;
@@ -178,14 +181,25 @@ public class OrderOperationLogAspect {
      * @author lipf
      * @date 2026/7/8 15:29
      */
-    private void batchModify(String orderNo, Object result, OrderOperationLog log) {
-        InsOrdersTrack track = new InsOrdersTrack();
-        track.setModule("应收订单");
-        track.setSubModule("");
-        track.setOptType(16);
-        track.setOrderNo(orderNo);
-        track.setResult(JSONUtil.toJsonStr(result));
-        traceService.save(track);
+    private void batchModify(Object result, OrderOperationLog log, BatchModifyVo vo) {
+        List<String> orderNos = vo.getOrderNos();
+        if(CollUtil.isEmpty(orderNos)){
+            logger.info("批量修改没有传入订单号");
+            return;
+        }
+        for (String orderNo : orderNos) {
+            InsOrdersTrack track = new InsOrdersTrack();
+            track.setModule(log.module());
+            track.setSubModule(log.subModule());
+            track.setOptType(log.optType().getCode());
+            track.setOptContent(log.description());
+            track.setChangeAfter(JSONUtil.toJsonStr(vo));
+            track.setResult(JSONUtil.toJsonStr(result));
+            track.setOrderNo(orderNo);
+            traceService.save(track);
+
+        }
+
     }
 
     /**
@@ -193,12 +207,15 @@ public class OrderOperationLogAspect {
      * @author lipf
      * @date 2026/7/8 15:28
      */
-    private void saveCostInfo(String orderNo, Object result, OrderOperationLog log) {
+    private void saveCostInfo(Object result, OrderOperationLog log, PtlAgreementCostRatioVo vo) {
         InsOrdersTrack track = new InsOrdersTrack();
-        track.setModule("订单审核");
-        track.setSubModule("我的审核");
-        track.setOptType(15);
-        track.setOrderNo(orderNo);
+        track.setModule(log.module());
+        track.setSubModule(log.subModule());
+        track.setOptType(log.optType().getCode());
+        track.setOptContent(log.description());
+        track.setResult(JSONUtil.toJsonStr(result));
+        track.setChangeAfter(JSONUtil.toJsonStr(vo));
+        track.setOrderNo(vo.getOrderNo());
         track.setResult(JSONUtil.toJsonStr(result));
         traceService.save(track);
     }

+ 23 - 16
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -363,21 +363,21 @@ public class QuoteVerificationAspect {
                 insFeeOrders,
                 InsFeeOrders::setJqReceivablePremium, InsFeeOrders::setJqPayablePremium,
                 InsFeeOrders::setJqCommissionPremium, InsFeeOrders::setJqFollowPremium, InsFeeOrders::setJqAdditionalPremium,
-                InsFeeOrders::setJqKeepPointRatio,InsFeeOrders::setJqKeepPointPremium);
+                InsFeeOrders::setJqKeepPointRatio,InsFeeOrders::setJqKeepPointPremium, isrecordByLeader);
 
         processInsuranceType(
                 insOrdersCosts.getSyPremium(), syCostType, syEntranceFeeRatio, syFollowRatio, taxFactor,
                 insFeeOrders,
                 InsFeeOrders::setSyReceivablePremium, InsFeeOrders::setSyPayablePremium,
                 InsFeeOrders::setSyCommissionPremium, InsFeeOrders::setSyFollowPremium, InsFeeOrders::setSyAdditionalPremium,
-                InsFeeOrders::setSyKeepPointRatio,InsFeeOrders::setSyKeepPointPremium);
+                InsFeeOrders::setSyKeepPointRatio,InsFeeOrders::setSyKeepPointPremium, isrecordByLeader);
 
         processInsuranceType(
                 insOrdersCosts.getJyPremium(), jyCostType, jyEntranceFeeRatio, jyFollowRatio, taxFactor,
                 insFeeOrders,
                 InsFeeOrders::setJyReceivablePremium, InsFeeOrders::setJyPayablePremium,
                 InsFeeOrders::setJyCommissionPremium, InsFeeOrders::setJyFollowPremium, InsFeeOrders::setJyAdditionalPremium,
-                InsFeeOrders::setJyKeepPointRatio,InsFeeOrders::setJyKeepPointPremium);
+                InsFeeOrders::setJyKeepPointRatio,InsFeeOrders::setJyKeepPointPremium, isrecordByLeader);
 
         // 7. 计算分销费用  返回分销的差值
         BigDecimal distributionDiff = calculateDistributionFee(insOrdersCosts,insFeeOrders, insOrders);
@@ -429,19 +429,20 @@ public class QuoteVerificationAspect {
     /**
      * 处理单个险种的费用计算(核心复用方法)
      *
-     * @param premium         险种保费
-     * @param costType        险种费用类型配置
-     * @param commissionRatio 手续费比例
-     * @param followRatio     跟单费比例
-     * @param taxFactor       税率因子(平台协议为1,私有协议为1/1.06)
-     * @param insFeeOrders    费用订单对象
-     * @param setReceivable   应收金额setter
-     * @param setPayable      应付金额setter
-     * @param setCommission   手续费setter
-     * @param setFollow       跟单费setter
-     * @param setAdditional   加投费setter
-     * @param keepPointRate 留点比例
+     * @param premium          险种保费
+     * @param costType         险种费用类型配置
+     * @param commissionRatio  手续费比例
+     * @param followRatio      跟单费比例
+     * @param taxFactor        税率因子(平台协议为1,私有协议为1/1.06)
+     * @param insFeeOrders     费用订单对象
+     * @param setReceivable    应收金额setter
+     * @param setPayable       应付金额setter
+     * @param setCommission    手续费setter
+     * @param setFollow        跟单费setter
+     * @param setAdditional    加投费setter
+     * @param keepPointRate    留点比例
      * @param keepPointPremium 留点费用
+     * @param isrecordByLeader 是否是代课录单
      */
     private void processInsuranceType(
             BigDecimal premium,
@@ -456,7 +457,8 @@ public class QuoteVerificationAspect {
             BiConsumer<InsFeeOrders, BigDecimal> setFollow,
             BiConsumer<InsFeeOrders, BigDecimal> setAdditional,
             BiConsumer<InsFeeOrders, BigDecimal> keepPointRate,
-            BiConsumer<InsFeeOrders, BigDecimal> keepPointPremium) {
+            BiConsumer<InsFeeOrders, BigDecimal> keepPointPremium,
+            boolean isrecordByLeader) {
         // 若险种配置为空,默认应收应付为0
         if (costType == null) {
             setReceivable.accept(insFeeOrders, BigDecimal.ZERO);
@@ -472,6 +474,11 @@ public class QuoteVerificationAspect {
         BigDecimal addThrowPercent = convertPercent(costType.getAddThrow());
         BigDecimal exportPercent = convertPercent(costType.getExport());
 
+        if(isrecordByLeader){
+            // 如果是代客录单,出口比例减去一个百分比,也就是 0.01 2026年7月11日09:30:09
+            exportPercent = BigDecimalUtil.subtract(exportPercent, new BigDecimal("0.01"));
+        }
+
         // 去税保费金额
         BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
 

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java

@@ -189,7 +189,7 @@ public class InsFeeAuditController {
             subModule = "我的审核",
             optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_15,
             description = "费用调整",
-            orderSpEl = "#quoteVo",
+            orderSpEl = "#param",
             feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
     )
     @PostMapping("/saveCostInfo")

+ 3 - 3
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -545,11 +545,11 @@ public class ReceivableController {
      * @date 2026/5/27 20:25
      */
     @OrderOperationLog(
-            module = "私有协议应收",
+            module = "私有/平台协议应收",
             subModule = "订单审核",
             optType = QuoteNumberConstant.QuoteOptType.OPT_TYPE_16,
-            description = "费用调整",
-            orderSpEl = "#quoteVo",
+            description = "批量修改",
+            orderSpEl = "#batchModifyVo",
             feedbackSpEl = "#ret.code + ' - ' + #ret.msg+ ' - ' + #ret.data"
     )
     @PostMapping("batchModify")

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

@@ -332,6 +332,13 @@
             left join sys_user su on su.id = suji.user_id and su.is_delete = 0
             where sujis.type_attr =#{receivableQueryVo.typeAttr})
         </if>
+        <if test="receivableQueryVo.invoiceSettlementStatus != null and receivableQueryVo.invoiceSettlementStatus != ''">
+            AND ipi.id  in (
+            select ipil.income_id  from ins_ply_income_invoice_link ipil
+            LEFT JOIN ins_ply_income_invoice ipii ON ipil.invoice_id = ipii.id AND ipii.is_delete = 0
+            where ipii.status = #{receivableQueryVo.invoiceSettlementStatus} and ipil.is_delete = 0
+            )
+        </if>
         <if test = "receivableQueryVo.agreementType != null and receivableQueryVo.agreementType != ''">
             AND ipi.agreement_type = #{receivableQueryVo.agreementType}
         </if>