Jelajahi Sumber

Merge branch 'master' into wrq_dev

wangrq 3 minggu lalu
induk
melakukan
daf3b323c8
21 mengubah file dengan 302 tambahan dan 80 penghapusan
  1. 5 0
      commons/src/main/java/com/jzg/commons/entity/finance/dto/InsPlyIncomeDto.java
  2. 1 0
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java
  3. 6 19
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateFollow.java
  4. 48 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java
  5. 39 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java
  6. 7 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  7. 3 1
      commons/src/main/java/com/jzg/commons/util/OrderComponents.java
  8. 4 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java
  9. 21 10
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java
  10. 4 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  11. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  12. 3 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  13. 3 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/component/ZmCrawlerRequestComponent.java
  14. 9 10
      tenant/organization/src/main/java/com/jzg/organization/client/InsFeeOrdersClient.java
  15. 2 2
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  16. 5 5
      tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PrivateListener.java
  17. 1 2
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  18. 108 18
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  19. 4 4
      tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java
  20. 3 3
      tenant/organization/src/main/java/com/jzg/organization/service/importincome/ImportIncomeService.java
  21. 17 2
      tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/InsPlyIncomeDto.java

@@ -324,4 +324,9 @@ public class InsPlyIncomeDto extends BaseModel {
     @Schema(description = "地区归属")
     private String companyNameSimple;
 
+    @TableField(exist = false)
+    @Schema(description = "禁用标志:1-已对账(禁用),0-未对账(可用)")
+    @ExcelIgnore
+    private String disableFlag;
+
 }

+ 1 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java

@@ -44,6 +44,7 @@ public class InsPlyIncomeInvoiceSettlement extends BaseModel {
     private String systemCode;
 
     @Schema(description = "对接人")
+    @TableField(exist = false)
     private String contactPerson;
 
     public InsPlyIncomeInvoiceSettlement(){

+ 6 - 19
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4Private.java → commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateFollow.java

@@ -9,14 +9,15 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
+ * 私有跟单费
  * @author tz
  * @description 应收查询VO
- * @createDate 2024-06-26 10:49:31
+ * @date 2024-06-26 10:49:31
  */
 @EqualsAndHashCode
 @Data
 @Schema(description = "财务应收表")
-public class ExcelContent4Private implements Serializable {
+public class ExcelContent4PrivateFollow implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 6263862008363938379L;
@@ -37,30 +38,16 @@ public class ExcelContent4Private implements Serializable {
     @ExcelProperty(value = "非车险保单号", index = 3)
     private String jyPolicyNo;
 
-    @Schema(description = "交强险手续费比例")
-    @ExcelProperty(value = "交强险手续费比例(%)", index = 4)
-    private String jqSuperviseCostsProportion;
-
     @Schema(description = "交强险跟单费比例")
-    @ExcelProperty(value = "交强险跟单费比例(%)", index = 5)
+    @ExcelProperty(value = "交强险跟单费比例(%)", index = 4)
     private String jqOtherCostsProportion;
 
-
-    @Schema(description = "商业险手续费比例")
-    @ExcelProperty(value = "商业险手续费比例(%)", index = 6)
-    private String sySuperviseCostsProportion;
-
     @Schema(description = "商业险跟单费比例")
-    @ExcelProperty(value = "商业险跟单费比例(%)", index = 7)
+    @ExcelProperty(value = "商业险跟单费比例(%)", index = 5)
     private String syOtherCostsProportion;
 
-
-    @Schema(description = "非车险手续费比例")
-    @ExcelProperty(value = "非车险手续费比例(%)", index = 8)
-    private String jySuperviseCostsProportion;
-
     @Schema(description = "非车险跟单费比例")
-    @ExcelProperty(value = "非车险跟单费比例(%)", index = 9)
+    @ExcelProperty(value = "非车险跟单费比例(%)", index = 6)
     private String jyOtherCostsProportion;
 
 }

+ 48 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseCar.java

@@ -0,0 +1,48 @@
+package com.jzg.commons.entity.finance.vo.importimcome;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 私有手续费
+ *
+ * @author tz
+ * @description 应收查询VO
+ * @date 2024-06-26 10:49:31
+ */
+@EqualsAndHashCode
+@Data
+@Schema(description = "财务应收表")
+public class ExcelContent4PrivateSuperviseCar implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6263862008363938379L;
+
+    @Schema(description = "车牌号")
+    @ExcelProperty(value = "车牌号", index = 0)
+    private String licenseNo;
+
+    @Schema(description = "交强险保单号")
+    @ExcelProperty(value = "交强险保单号", index = 1)
+    private String jqPolicyNo;
+
+    @Schema(description = "商业险保单号")
+    @ExcelProperty(value = "商业险保单号", index = 2)
+    private String syPolicyNo;
+
+    @Schema(description = "交强险手续费比例")
+    @ExcelProperty(value = "交强险手续费比例(%)", index = 3)
+    private String jqSuperviseCostsProportion;
+
+
+    @Schema(description = "商业险手续费比例")
+    @ExcelProperty(value = "商业险手续费比例(%)", index = 4)
+    private String sySuperviseCostsProportion;
+
+
+}

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/importimcome/ExcelContent4PrivateSuperviseNoCar.java

@@ -0,0 +1,39 @@
+package com.jzg.commons.entity.finance.vo.importimcome;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 私有手续费
+ *
+ * @author tz
+ * @description 应收查询VO
+ * @date 2024-06-26 10:49:31
+ */
+@EqualsAndHashCode
+@Data
+@Schema(description = "财务应收表")
+public class ExcelContent4PrivateSuperviseNoCar implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6263862008363938379L;
+
+    @Schema(description = "车牌号")
+    @ExcelProperty(value = "车牌号", index = 0)
+    private String licenseNo;
+
+    @Schema(description = "非车险保单号")
+    @ExcelProperty(value = "非车险保单号", index = 1)
+    private String jyPolicyNo;
+
+
+    @Schema(description = "非车险手续费比例")
+    @ExcelProperty(value = "非车险手续费比例(%)", index = 2)
+    private String jySuperviseCostsProportion;
+
+}

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -297,6 +297,13 @@ public class QuoteEchoVo extends QuoteVo {
     @Schema(description = "权益可用范围")
     private String clientType;
 
+    @Schema(description = "是否是疑问订单")
+    private boolean isProblem;
+    @Schema(description = "疑问订单原因")
+    private String problemReason;
+    @Schema(description = "设为疑问订单的时间")
+    private LocalDateTime problemTime;
+
     @Schema(description = "权益信息")
     private InsOrderRightsInfoVo insOrderRightsInfoVo;
 

+ 3 - 1
commons/src/main/java/com/jzg/commons/util/OrderComponents.java

@@ -78,7 +78,9 @@ public class OrderComponents {
         nameMap.put("insCompanyVo[0].id","保司ID");
         nameMap.put("order.companyName","保司名称");
         nameMap.put("order.insuranceCompanyCode","保司ID");
-
+        nameMap.put("isProblem","是否是疑问订单");
+        nameMap.put("problemReason","疑问订单原因");
+        nameMap.put("problemTime","设为疑问订单的时间");
         return nameMap;
     }
 

+ 4 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/service/Impl/GuoRenApiRequestImpl.java

@@ -350,8 +350,10 @@ public class GuoRenApiRequestImpl implements GuoRenApiRequest {
 
         //查询投保单信息
         InsOrdersPolicy insOrdersPolicy = orderBase.getInsOrdersPolicy();
-        insOrdersPolicy.setJqApplyNo(guoRenApiOrder.getJqApplyNo());
-        insOrdersPolicy.setSyApplyNo(guoRenApiOrder.getSyApplyNo());
+        if (guoRenApiOrder != null) {
+            insOrdersPolicy.setJqApplyNo(guoRenApiOrder.getJqApplyNo());
+            insOrdersPolicy.setSyApplyNo(guoRenApiOrder.getSyApplyNo());
+        }
 
         InsOrders insOrders = orderBase.getInsOrders();
         String url = getApiUrl(orderBase.getOrder().getInsuranceCompanyId());

+ 21 - 10
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java

@@ -86,6 +86,9 @@ public class OrderOperationLogAspect {
         Object result = null;
         // 创建 JSONConfig 并设置日期格式, 会把LocalDate 和LocalDateTime 都转换为 包含时分秒的格式(后续有了更好的办法再优化)
         JSONConfig jsonConfig = JSONConfig.create().setDateFormat("yyyy-MM-dd HH:mm:ss");
+        QuoteEchoVo detailVoOld;
+        QuoteEchoVo detailVoNew;
+        Map<String, List<String>> diffMap;
         switch (log.optType().getCode()){
             // 创建订单
             case 0:
@@ -169,18 +172,21 @@ public class OrderOperationLogAspect {
             case 15:
                 logger.info("费用调整log.orderSpEl()=[{}]",log.orderSpEl());
                 PtlAgreementCostRatioVo vo = parser.parseExpression(log.orderSpEl()).getValue(context, PtlAgreementCostRatioVo.class);
-                QuoteEchoVo detailVoOld = insFeeAuditService.auditInfo(vo.getOrderNo());
+                detailVoOld = insFeeAuditService.auditInfo(vo.getOrderNo());
                 result = joinPoint.proceed();
-                QuoteEchoVo detailVoNew = insFeeAuditService.auditInfo(vo.getOrderNo());
-                Map<String, List<String>> diffMap = JsonDiffUtil.compareJson(JSONUtil.toJsonStr(detailVoOld,jsonConfig), JSONUtil.toJsonStr(detailVoNew,jsonConfig), new HashSet<>());
+                detailVoNew = insFeeAuditService.auditInfo(vo.getOrderNo());
+                diffMap = JsonDiffUtil.compareJson(JSONUtil.toJsonStr(detailVoOld,jsonConfig), JSONUtil.toJsonStr(detailVoNew,jsonConfig), new HashSet<>());
                 this.saveCostInfo(result,log, vo,diffMap);
                 break;
             // 设为疑问订单
             case 17:
                 logger.info("设置为疑问订单.log.orderSpEl()=[{}]",log.orderSpEl());
                 QuestionOrder questionOrder = parser.parseExpression(log.orderSpEl()).getValue(context, QuestionOrder.class);
+                detailVoOld = insFeeAuditService.auditInfo(questionOrder.getOrderNo());
                 result = joinPoint.proceed();
-                this.updateToQuestionOrder(result,log, questionOrder);
+                detailVoNew = insFeeAuditService.auditInfo(questionOrder.getOrderNo());
+                diffMap = JsonDiffUtil.compareJson(JSONUtil.toJsonStr(detailVoOld,jsonConfig), JSONUtil.toJsonStr(detailVoNew,jsonConfig), new HashSet<>());
+                this.updateToQuestionOrder(result,log, questionOrder,diffMap);
                 break;
         }
         return result;
@@ -192,14 +198,14 @@ public class OrderOperationLogAspect {
      * @author lipf
      * @date 2026/7/16 16:35
      */
-    private void updateToQuestionOrder(Object result, OrderOperationLog log, QuestionOrder questionOrder) {
+    private void updateToQuestionOrder(Object result, OrderOperationLog log, QuestionOrder questionOrder,Map<String, List<String>> diffMap) {
         logger.info("设置为疑问订单。questionOrder=[{}]", JSONUtil.toJsonStr(questionOrder));
         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(questionOrder));
+        //track.setChangeAfter(JSONUtil.toJsonStr(questionOrder));
         track.setResult(JSONUtil.toJsonStr(result));
         InsOrders insOrders = orderService.getById(questionOrder.getOrderNo());
         if(insOrders != null){
@@ -212,6 +218,7 @@ public class OrderOperationLogAspect {
         }
         track.setStatus(1);
         track.setOrderNo(questionOrder.getOrderNo());
+        this.fillBeforeAndAfter(diffMap, track);
         traceService.save(track);
 
     }
@@ -276,6 +283,13 @@ public class OrderOperationLogAspect {
             track.setResult("要进行费用调整的订单不存在");
         }
         track.setStatus(1);
+        this.fillBeforeAndAfter(diffMap, track);
+        track.setOrderNo(orderNo);
+        track.setResult(JSONUtil.toJsonStr(result));
+        traceService.save(track);
+    }
+
+    private void fillBeforeAndAfter(Map<String, List<String>> diffMap, InsOrdersTrack track) {
         if(CollUtil.isNotEmpty(diffMap)){
             List<String> oldItems = new ArrayList<>();
             List<String> newItems = new ArrayList<>();
@@ -292,11 +306,8 @@ public class OrderOperationLogAspect {
             track.setChangeBefore(String.join("\n", oldItems));
             track.setChangeAfter(String.join("\n", newItems));
         }
-
-        track.setOrderNo(orderNo);
-        track.setResult(JSONUtil.toJsonStr(result));
-        traceService.save(track);
     }
+
     /**
      * 订单审核(通过/驳回)
      *

+ 4 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -968,11 +968,13 @@ public class UnifyOrderManager {
         orderStatusVo.setInsOrdersAccidentalDriving(insOrdersAccidentalDriving);
         OrderStatusResultVo orderStatusResultVo = orderStatusService.queryOrderState(orderStatusVo);
         log.info("订单状态orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo));
-
+        if (orderStatusResultVo == null) {
+            return HttpResult.ok("订单状态已更新");
+        }
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
         // 保存支付链接
-        insOrders.setPayLink(!TextUtils.isEmpty(orderStatusResultVo.getPaymentLink()) ? orderStatusResultVo.getPaymentLink() : insOrders.getPayLink());
+        insOrders.setPayLink((orderStatusResultVo != null && !TextUtils.isEmpty(orderStatusResultVo.getPaymentLink())) ? orderStatusResultVo.getPaymentLink() : insOrders.getPayLink());
         insOrdersQrcodeService.updateQrCode(insOrders);
         //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
         // 承保(客户)、出单(业务员)

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -290,6 +290,15 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         log.debug("查看订单审核详情:orderNo=[{}], detailVo=[{}]",orderNo, JSONUtil.toJsonStr(detailVo));
         InsFeeAudit audit = this.getById(orderNo);
         detailVo.setAuditStatus(audit.getAuditStatus());
+        if(audit.getIsProblem() != null){
+            if(1 ==audit.getIsProblem()){
+                detailVo.setProblem(true);
+            }else if(0 ==audit.getIsProblem()){
+                detailVo.setProblem(false);
+            }
+        }
+        detailVo.setProblemTime(audit.getProblemTime());
+        detailVo.setProblemReason(audit.getProblemReason());
         return detailVo;
     }
 

+ 3 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -1212,6 +1212,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     @Override
     public void orderAfterUpdateOrderStatus(String orderNo, OrderStatusResultVo orderStatusResultVo) {
+        if (orderStatusResultVo == null) {
+            return;
+        }
         // 检测主订单是否存在
         String systemCode = baseController.getSystemCode();
         InsOrders insOrders = insOrdersMapper.selectOne(new LambdaQueryWrapper<InsOrders>().eq(InsOrders::getId, orderNo));

+ 3 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/component/ZmCrawlerRequestComponent.java

@@ -160,6 +160,9 @@ public class ZmCrawlerRequestComponent {
             map.expire(Duration.ofMinutes(CacheConstant.ZHONGMEI_AUTHORIZATION_TIME));
             return authorizationMap.get(AUTHORIZATION);
         }
+        if (authenticateResponse.getHead().getReturnCode().equals("-1") && authenticateResponse.getHead().getReturnMessage().contains("登录失败,用户名或者密码错误")) {
+            throw new SystemException(authenticateResponse.getHead().getReturnMessage());
+        }
         loginsNumber = loginsNumber - 1;
         if (loginsNumber <= 0) {
             throw new SystemException(authenticateResponse.getHead().getReturnMessage());

+ 9 - 10
tenant/organization/src/main/java/com/jzg/organization/client/InsFeeOrdersClient.java

@@ -3,6 +3,7 @@ package com.jzg.organization.client;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -29,14 +30,12 @@ public interface InsFeeOrdersClient {
     @PostMapping("/supplementOrder/updateOrdersBatch")
     @Operation(summary = "车险报价批量修改联系人等信息")
     HttpResult<String> updateOrdersBatch(@RequestBody BatchModifyVo batchModifyVo);
-//
-//    /**
-//     * 查询指定订单的应收总额
-//     *
-//     * @param orderNos 订单编号
-//     * @author lipf
-//     * @date 2026/6/4 10:17
-//     */
-//    @PostMapping("/insFeeOrder/queryAllTotalReceivablePremiumByOrderNo")
-//    BigDecimal queryAllTotalReceivablePremiumByOrderNo(@RequestBody List<String> orderNos);
+
+    /**
+     * 费用调整并计算保存(根据完整比例配置重新计算ins_fee_orders的所有比例和金额)
+     * @param ptlAgreementCostRatioVo 协议成本比例配置(百分比形式)
+     * @return 更新后的费用订单
+     */
+    @PostMapping("/supplementOrder/adjustmentCostAndSave")
+    HttpResult<InsFeeOrders> adjustmentCostAndSave(@RequestBody PtlAgreementCostRatioVo ptlAgreementCostRatioVo);
 }

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

@@ -150,7 +150,7 @@ public class ReceivableController {
     /**
      * 导入应收的模板
      *
-     * @param paramVO  10 表示私有协议 20 表示平台协议
+     * @param paramVO  20 表示平台协议  11表示车险手续费 12 表示非车险手续费 13 表示车险跟单费 14 表示非车险跟单费
      * @author lipf
      * @date 2026/8/3 10:23
      */
@@ -203,7 +203,7 @@ public class ReceivableController {
         Page<InsPlyIncome> data = ok.getData();
         
         // 设置disableFlag:根据签单时间的年月、companyId、partnerCompanyId查询是否存在对账数据
-        if (data != null && data.getRecords() != null && !data.getRecords().isEmpty()) {
+        if (data != null && data.getRecords() != null && CollUtil.isNotEmpty(data.getRecords())) {
             receivableService.setDisableFlagForOtherReceivable(data.getRecords(), systemCode);
         }
         

+ 5 - 5
tenant/organization/src/main/java/com/jzg/organization/excel/listener/InvoiceReceivbleExcel4PrivateListener.java

@@ -2,18 +2,18 @@ package com.jzg.organization.excel.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Private;
+import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
 import lombok.Getter;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @Getter
-public class InvoiceReceivbleExcel4PrivateListener extends AnalysisEventListener<ExcelContent4Private> {
-    private final List<ExcelContent4Private> dataList = new ArrayList<>();
+public class InvoiceReceivbleExcel4PrivateListener extends AnalysisEventListener<ExcelContent4PrivateSuperviseNoCar> {
+    private final List<ExcelContent4PrivateSuperviseNoCar> dataList = new ArrayList<>();
 
     @Override
-    public void invoke(ExcelContent4Private data, AnalysisContext context) {
+    public void invoke(ExcelContent4PrivateSuperviseNoCar data, AnalysisContext context) {
         dataList.add(data);
     }
 
@@ -22,7 +22,7 @@ public class InvoiceReceivbleExcel4PrivateListener extends AnalysisEventListener
         System.out.println("Total rows: " + dataList.size());
     }
 
-    public List<ExcelContent4Private> getDataList() {
+    public List<ExcelContent4PrivateSuperviseNoCar> getDataList() {
         return dataList;
     }
 }

+ 1 - 2
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -431,7 +431,7 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     /**
      * 导入应收的模板
      *
-     * @param type  10 表示私有协议 20 表示平台协议
+     * @param type  20 表示平台协议  11表示车险手续费 12 表示非车险手续费 13 表示车险跟单费 14 表示非车险跟单费
      * @author lipf
      * @date 2026/8/3 10:23
      */
@@ -538,7 +538,6 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     /**
      * 为私有协议跟单费列表设置disableFlag
      * 根据签单时间的年月、companyId、partnerCompanyId查询ins_fee_follow_order表,有数据则disableFlag为1
-     * 如果没有数据再根据年月、partnerCompanyId查询ins_fee_follow_order_reconciliation表,有数据则disableFlag为1
      * 否则disableFlag为0
      * @param records 应收数据列表
      * @param systemCode 租户代码

+ 108 - 18
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateTime;
@@ -29,7 +30,10 @@ import com.jzg.commons.entity.finance.po.*;
 import com.jzg.commons.entity.finance.vo.*;
 import com.jzg.commons.entity.finance.vo.importimcome.*;
 import com.jzg.commons.entity.orders.po.InsOrderAdjust;
-import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.vo.AgreementVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
@@ -41,7 +45,10 @@ import com.jzg.organization.client.EsmInsCompanyClient;
 import com.jzg.organization.client.InsFeeOrdersClient;
 import com.jzg.organization.client.InsOrdersClient;
 import com.jzg.organization.entity.dto.CalRes;
-import com.jzg.organization.excel.listener.*;
+import com.jzg.organization.excel.listener.JyExcelListener;
+import com.jzg.organization.excel.listener.OtherExcelListener;
+import com.jzg.organization.excel.listener.ReceivbleExcelListener;
+import com.jzg.organization.excel.listener.SuperviseExcelListener;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.ReceivableService;
 import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
@@ -873,12 +880,31 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             }
         }
 
-        // 4. 根据筛选条件过滤收入数据(发票、结算时间/状态过滤)
-        List<InsPlyIncomeDto> filterIncomeList = filterIncomeByInvoiceAndSettleCondition(incomeDtoList, settlementReportQueryVo);
-        if (CollUtil.isEmpty(filterIncomeList)) {
+        List<InsPlyIncome> insPlyIncomes = BeanUtil.copyToList(incomeDtoList, InsPlyIncome.class);
+        // 设置disableFlag:根据签单时间的年月、companyId、partnerCompanyId查询是否存在对账数据
+        if (CollUtil.isNotEmpty(incomeDtoList)) {
+            String systemCode = baseController.getSystemCode();
+            setDisableFlagForOtherReceivable(insPlyIncomes, systemCode);
+        }
+
+        // 根据结算状态过滤数据
+        String status = settlementReportQueryVo.getStatus();
+        String invoiceStartTime = settlementReportQueryVo.getInvoiceStartTime();
+        String invoiceEndTime = settlementReportQueryVo.getInvoiceEndTime();
+        String settleStartTime = settlementReportQueryVo.getSettlementStartTime();
+        String settleEndTime = settlementReportQueryVo.getSettlementEndTime();
+        if (StrUtil.isNotBlank(invoiceStartTime) || StrUtil.isNotBlank(invoiceEndTime)
+                || StrUtil.isNotBlank(settleStartTime) || StrUtil.isNotBlank(settleEndTime)
+                || (StrUtil.equals("0", status) || StrUtil.equals("1", status))) {
             return resultList;
         }
 
+        // 如果status = 0或1,则直接返回空的filterIncomeList,如果status = 2,则查询所有ins_ply_follow_invoice_link表,过滤掉disableFlag为1 的,保留为0 的数据
+        List<InsPlyIncomeDto> filterIncomeList = insPlyIncomes.stream()
+                .filter(income -> "0".equals(income.getDisableFlag()))
+                .map(income -> BeanUtil.copyProperties(income, InsPlyIncomeDto.class))
+                .collect(Collectors.toList());
+
         // 5. 将其他费用收入合并进结果集合
         mergeOtherCostIncomeToResult(filterIncomeList, resultList, companyMap);
 
@@ -1349,7 +1375,6 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     /**
      * 为私有协议跟单费列表设置disableFlag
      * 根据签单时间的年月、companyId、partnerCompanyId查询ins_fee_follow_order表,有数据则disableFlag为1
-     * 如果没有数据再根据年月、partnerCompanyId查询ins_fee_follow_order_reconciliation表,有数据则disableFlag为1
      * 否则disableFlag为0
      * @param records 应收数据列表
      * @param systemCode 租户代码
@@ -2453,7 +2478,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     /**
      * 导出应收开票模板
      *
-     * @param type  10 表示私有协议 20 表示平台协议
+     * @param type  20 表示平台协议  11表示车险手续费 12 表示非车险手续费 13 表示车险跟单费 14 表示非车险跟单费
      * @return String 导出时的提示信息
      * @author lipf
      * @date 2026/8/3 10:23
@@ -2463,10 +2488,34 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         log.info("导出模板: type=[{}]",type);
         // List<InvoiceReceivableExportExcelVo4Private> emptyList = ListUtil.empty();
 
-        if("10".equals(type)){
+        if("11".equals(type)){
+            // 调用动态导出
+            return exportBaseService.upLoadFile(
+                    ExcelContent4PrivateSuperviseCar.class,
+                    ListUtil.empty(),
+                    "应收开票-导出模板(私有车险手续费)-" + Instant.now()
+            );
+        }
+        if("12".equals(type)){
+            // 调用动态导出
+            return exportBaseService.upLoadFile(
+                    ExcelContent4PrivateSuperviseNoCar.class,
+                    ListUtil.empty(),
+                    "应收开票-导出模板(私有非车险手续费)-" + Instant.now()
+            );
+        }
+        if("13".equals(type)){
+            // 调用动态导出
+            return exportBaseService.upLoadFile(
+                    ExcelContent4PrivateFollow.class,
+                    ListUtil.empty(),
+                    "应收开票-导出模板(私有)-" + Instant.now()
+            );
+        }
+        if("14".equals(type)){
             // 调用动态导出
             return exportBaseService.upLoadFile(
-                    ExcelContent4Private.class,
+                    ExcelContent4PrivateFollow.class,
                     ListUtil.empty(),
                     "应收开票-导出模板(私有)-" + Instant.now()
             );
@@ -2519,7 +2568,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         String userName = baseController.getUserName();
         log.info("用户[{}]导入私有应设有文件",userName);
 
-        List<ExcelContent4Private> excelContents = importIncomeService.parseImportExcel4Private(file);
+        List<ExcelContent4PrivateSuperviseNoCar> excelContents = importIncomeService.parseImportExcel4Private(file);
         if (CollUtil.isEmpty(excelContents)){
             throw new SystemException("数据不能为空,导入失败");
         }
@@ -3858,6 +3907,27 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         List<InsPlyIncome> updateList = new ArrayList<>();
         batchModifyVo.divide100();
 
+        // ===================== 新增:updateAgreementId不为空时,根据新协议的withTax重新计算税率因子 =====================
+        String updateAgreementId = batchModifyVo.getUpdateAgreementId();
+        // 提前声明 agreementVo,供后面的保司信息修改逻辑复用
+        AgreementVo agreementVo = null;
+        if (StrUtil.isNotBlank(updateAgreementId)) {
+            agreementVo = ptlAgreementMapper.queryById(updateAgreementId);
+            if (null == agreementVo) {
+                throw new ServiceException("未找到对应协议,请检查协议配置");
+            }
+
+            // 根据新协议的withTax重新计算税率因子,覆盖taxRateMap
+            // withTax=0(不含税)→ 税率=1.06;withTax=1(含税)→ 税率=1
+            String withTaxStr = agreementVo.getWithTax();
+            BigDecimal newTaxRate = ("0".equals(withTaxStr)) ? new BigDecimal("1.06") : BigDecimal.ONE;
+            for (String orderNo : orderNos) {
+                taxRateMap.put(orderNo, newTaxRate);
+            }
+            log.info("切换协议后,根据新协议withTax=[{}]重新设置税率因子=[{}]", withTaxStr, newTaxRate);
+        }
+        // ==============================================================================================================
+
         for (InsPlyIncome income : incomeList) {
             BigDecimal taxRate = taxRateMap.getOrDefault(income.getOrderNo(), BigDecimal.ONE);
             InsPlyIncome updateIncome = new InsPlyIncome();
@@ -3867,7 +3937,20 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             updateIncome.setJyPremium(income.getJyPremium());
             // 因为 实体对象的settlementStatus设置了初始默认值0, 为了避免已经结算的数据被调整未未结算, 这里将settlementStatus设置为null 2026-6-24 14:33:47
             updateIncome.setSettlementStatus(null);
-            // 根据income的order_no查询inss_fee_order
+
+            // updateAgreementId不为空时,从ins_ply_income(income)查询比例覆盖batchModifyVo,用于后续calRatio和calPremium计算
+            // ins_ply_income中的比例是字符串形式的小数值(如"0.20000"),转为BigDecimal后与batchModifyVo.divide100()后的格式一致
+            if (StrUtil.isNotBlank(updateAgreementId)) {
+                batchModifyVo.setJqSuperviseCostsProportion(StrUtil.isNotBlank(income.getJqSuperviseCostsProportion()) ? new BigDecimal(income.getJqSuperviseCostsProportion()) : BigDecimal.ZERO);
+                batchModifyVo.setJqOtherCostsProportion(StrUtil.isNotBlank(income.getJqOtherCostsProportion()) ? new BigDecimal(income.getJqOtherCostsProportion()) : BigDecimal.ZERO);
+                batchModifyVo.setSySuperviseCostsProportion(StrUtil.isNotBlank(income.getSySuperviseCostsProportion()) ? new BigDecimal(income.getSySuperviseCostsProportion()) : BigDecimal.ZERO);
+                batchModifyVo.setSyOtherCostsProportion(StrUtil.isNotBlank(income.getSyOtherCostsProportion()) ? new BigDecimal(income.getSyOtherCostsProportion()) : BigDecimal.ZERO);
+                batchModifyVo.setJySuperviseCostsProportion(StrUtil.isNotBlank(income.getJySuperviseCostsProportion()) ? new BigDecimal(income.getJySuperviseCostsProportion()) : BigDecimal.ZERO);
+                batchModifyVo.setJyOtherCostsProportion(StrUtil.isNotBlank(income.getJyOtherCostsProportion()) ? new BigDecimal(income.getJyOtherCostsProportion()) : BigDecimal.ZERO);
+                log.info("切换协议后,从ins_ply_income查询比例覆盖batchModifyVo。orderNo=[{}], batchModifyVo=[{}]", income.getOrderNo(), JSONUtil.toJsonStr(batchModifyVo));
+            }
+
+            // 根据income的order_no查询ins_fee_order(后续adjustmentCostAndSave需要从ins_fee_orders取完整比例)
             List<InsFeeOrders> insFeeOrderByOrderNo = insFeeOrdersClient.getInsFeeOrderByOrderNo(income.getOrderNo());
             if (CollUtil.isNotEmpty(insFeeOrderByOrderNo)){
                 InsFeeOrders insFeeOrders = CollUtil.getFirst(insFeeOrderByOrderNo);
@@ -3933,13 +4016,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
         // 如果updateAgreementId不为空,则执行保司信息修改逻辑
         // 涉及表:ins_ply_income(未对账的才改)、ins_orders、ins_order_adjust
-        String updateAgreementId = batchModifyVo.getUpdateAgreementId();
-        if (StrUtil.isNotBlank(updateAgreementId)) {
-            // 根据协议查询公司和子公司
-            AgreementVo agreementVo = ptlAgreementMapper.queryById(updateAgreementId);
-            if (null == agreementVo){
-                throw new ServiceException("未找到对应协议,请检查协议配置");
-            }
+        if (StrUtil.isNotBlank(updateAgreementId) && agreementVo != null) {
 
             // 获取新的保司ID(companyIds第一个元素)和合作保险公司ID(companyIds第二个元素,若不存在则使用保司ID)
             String newCompanyId = agreementVo.getCompanyId();
@@ -4006,6 +4083,19 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             UpdateCompanyBatchVo updateCompanyBatchVo = UpdateCompanyBatchVo.builder().batchModifyVo(batchModifyVo).agreementVo(agreementVo).build();
             HttpResult<String> updateCompanyRes = insOrdersClient.updateCompanyBatch(updateCompanyBatchVo);
             log.info("修改ins_orders和ins_order_adjust保司信息的结果:updateCompanyRes=[{}]", JSONUtil.toJsonStr(updateCompanyRes));
+
+            // 3. 从ins_fee_orders查询比例数据,调用adjustmentCostAndSave完整更新ins_fee_orders的所有比例和对应金额
+            // 此时ins_orders和ins_fee_orders的agreement_id已更新为新协议,calcCosts内部会查询到新协议的withTax
+            for (String orderNo : orderNos) {
+                List<InsFeeOrders> feeOrdersList = insFeeOrdersClient.getInsFeeOrderByOrderNo(orderNo);
+                if (CollUtil.isNotEmpty(feeOrdersList)) {
+                    InsFeeOrders feeOrders = CollUtil.getFirst(feeOrdersList);
+                    // 使用PtlAgreementCostRatioVo的构造函数,从ins_fee_orders提取所有比例(转为百分比形式)
+                    PtlAgreementCostRatioVo ratioVo = new PtlAgreementCostRatioVo(feeOrders);
+                    HttpResult<InsFeeOrders> adjustResult = insFeeOrdersClient.adjustmentCostAndSave(ratioVo);
+                    log.info("根据ins_fee_orders比例完整更新ins_fee_orders。orderNo=[{}], result=[{}]", orderNo, JSONUtil.toJsonStr(adjustResult));
+                }
+            }
         }
 
         return true;

+ 4 - 4
tenant/organization/src/main/java/com/jzg/organization/service/impl/importincome/ImportIncomeServiceImpl.java

@@ -9,7 +9,7 @@ import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Private;
+import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
 import com.jzg.commons.entity.finance.vo.importimcome.ImportUpdateExcelResultVo;
 import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Platform;
 import com.jzg.commons.entity.finance.vo.importimcome.ImportContentExt;
@@ -119,7 +119,7 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
      * @date 2026/8/4 9:22
      */
     @Override
-    public List<ImportContentExt> fillExcelContent4Private(List<ExcelContent4Private> excelContents) {
+    public List<ImportContentExt> fillExcelContent4Private(List<ExcelContent4PrivateSuperviseNoCar> excelContents) {
         log.info("为私有订单填充数据:excelContents.size=[{}]", CollUtil.size(excelContents));
         return List.of();
     }
@@ -292,10 +292,10 @@ public class ImportIncomeServiceImpl implements ImportIncomeService {
      * @author lipf
      * @date 2026/8/4 9:07
      */
-    public List<ExcelContent4Private> parseImportExcel4Private(MultipartFile file) {
+    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4Private(MultipartFile file) {
         InvoiceReceivbleExcel4PrivateListener listener = new InvoiceReceivbleExcel4PrivateListener();
         try (InputStream inputStream = file.getInputStream()) {
-            EasyExcel.read(inputStream, ExcelContent4Private.class, listener)
+            EasyExcel.read(inputStream, ExcelContent4PrivateSuperviseNoCar.class, listener)
                     .sheet()
                     .doRead();
             return listener.getDataList();

+ 3 - 3
tenant/organization/src/main/java/com/jzg/organization/service/importincome/ImportIncomeService.java

@@ -1,7 +1,7 @@
 package com.jzg.organization.service.importincome;
 
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
-import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Private;
+import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4PrivateSuperviseNoCar;
 import com.jzg.commons.entity.finance.vo.importimcome.ImportUpdateExcelResultVo;
 import com.jzg.commons.entity.finance.vo.importimcome.ExcelContent4Platform;
 import com.jzg.commons.entity.finance.vo.importimcome.ImportContentExt;
@@ -27,7 +27,7 @@ public interface ImportIncomeService {
      * @author lipf
      * @date 2026/8/4 9:22
      */
-    public List<ImportContentExt> fillExcelContent4Private(List<ExcelContent4Private> excelContents);
+    public List<ImportContentExt> fillExcelContent4Private(List<ExcelContent4PrivateSuperviseNoCar> excelContents);
 
     /**
      * 批量处理数据
@@ -60,7 +60,7 @@ public interface ImportIncomeService {
      * @author lipf
      * @date 2026/8/4 9:07
      */
-    public List<ExcelContent4Private> parseImportExcel4Private(MultipartFile file);
+    public List<ExcelContent4PrivateSuperviseNoCar> parseImportExcel4Private(MultipartFile file);
 
     /**
      * 解析并读取Excel中的内容

+ 17 - 2
tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml

@@ -82,8 +82,23 @@
                 AND ffo.create_time BETWEEN #{query.startTime} AND #{query.endTime}
             </if>
             -- 发票状态筛选
-            <if test="query.status != null">
-                AND inv.status = #{query.status}
+            <if test="query.status != null and query.status != ''">
+                <!-- 当状态为1时,查询已开票的数据 -->
+                <if test="query.status != 2">
+                    AND ffo.id in (
+                    select link.follow_id from ins_ply_follow_invoice_link link
+                    LEFT JOIN ins_ply_income_invoice ipii ON link.invoice_id = ipii.id AND ipii.is_delete = 0
+                    where ipii.status = #{query.status} and link.is_delete = 0
+                    )
+                </if>
+                <!-- 当状态为2时,查询未开票的数据 -->
+                <if test="query.status == 2">
+                    AND NOT EXISTS (
+                    SELECT 1 FROM ins_ply_follow_invoice_link link
+                    LEFT JOIN ins_ply_income_invoice inv ON link.invoice_id = inv.id AND inv.is_delete = 0
+                    WHERE link.follow_id = ffo.id AND link.is_delete = 0
+                    )
+                </if>
             </if>
             -- 开票时间范围
             <if test="query.invoiceStartTime != null and query.invoiceStartTime != '' and query.invoiceEndTime != null and query.invoiceEndTime != ''">