Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

lixiaolong 1 сар өмнө
parent
commit
8bb23a0e10
22 өөрчлөгдсөн 602 нэмэгдсэн , 137 устгасан
  1. 4 0
      commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java
  2. 6 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowInvoiceVo.java
  3. 5 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java
  4. 2 0
      commons/src/main/java/com/jzg/commons/entity/vo/InsFeeOrdersVo.java
  5. 3 3
      commons/src/main/java/com/jzg/commons/entity/vo/UserAccountStatisVo.java
  6. 123 0
      commons/src/main/java/com/jzg/commons/util/JsonDiffUtil.java
  7. 51 0
      commons/src/main/java/com/jzg/commons/util/OrderComponts.java
  8. 11 2
      gateway/src/main/resources/logback-spring.xml
  9. 12 2
      partner/src/main/resources/logback-spring.xml
  10. 11 2
      platform/src/main/resources/logback-spring.xml
  11. 34 14
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java
  12. 1 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsFeeAuditController.java
  13. 11 2
      tenant/insurance/quotation-summary/src/main/resources/logback-spring.xml
  14. 6 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  15. 84 39
      tenant/organization/src/main/java/com/jzg/organization/aop/OrderOperationLogAspect.java
  16. 11 1
      tenant/organization/src/main/java/com/jzg/organization/client/InsOrdersClient.java
  17. 7 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  18. 7 0
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  19. 195 66
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  20. 4 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java
  21. 13 2
      tenant/organization/src/main/resources/logback-spring.xml
  22. 1 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java

@@ -70,5 +70,9 @@ public class InsOrdersParam extends PageRequest {
     @Schema(description = "被保人手机号")
     private String insuredMobile;
 
+    @Schema(description = "订单类型 1 车险录入 2 待客录单 3 外部订单")
+    private String entryStatus;
 
+    @Schema(description = "录单人")
+    private String createBy;
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowInvoiceVo.java

@@ -1,11 +1,13 @@
 package com.jzg.commons.entity.finance.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Data
@@ -21,6 +23,10 @@ public class FollowInvoiceVo implements Serializable {
     @Schema(description = "开票类型")
     private String invoiceType;
 
+    @Schema(description = "开票时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime invoiceTime;
+
     @Schema(description = "开票方")
     @ExcelProperty(value = "开票方")
     private String invoiceParty;

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java

@@ -45,6 +45,11 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private String invoiceParty;
 
+    /**
+     * 开票时间
+     */
+    private String invoiceTime;
+
     /**
      * 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
      */

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/vo/InsFeeOrdersVo.java

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.vo;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.util.BigDecimalUtil;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -35,6 +36,7 @@ public class InsFeeOrdersVo {
     private String userId;
 
     @Schema(description = "签单时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime signTime;
 
     @Schema(description = "交强险保费")

+ 3 - 3
commons/src/main/java/com/jzg/commons/entity/vo/UserAccountStatisVo.java

@@ -13,13 +13,13 @@ public class UserAccountStatisVo {
     private Integer salespersonCount;
 
     @Schema(description = "应付总计")
-    private Double payableSum;
+    private BigDecimal payableSum;
 
     @Schema(description = "已付总计")
-    private Double paidSum;
+    private BigDecimal paidSum;
 
     @Schema(description = "未付总计")
-    private Double notPaidSum;
+    private BigDecimal notPaidSum;
 
     @Schema(description = "支付中金额总计")
     private BigDecimal payingAmountSum;

+ 123 - 0
commons/src/main/java/com/jzg/commons/util/JsonDiffUtil.java

@@ -0,0 +1,123 @@
+package com.jzg.commons.util;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.*;
+
+public class JsonDiffUtil {
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
+    /**
+     * 比较两个JSON字符串的差异。
+     *
+     * @param jsonStr1 第一个JSON字符串
+     * @param jsonStr2 第二个JSON字符串
+     * @param ignoreFieldSet 需要忽略的字段名列表(支持嵌套字段,如 "data.order.createTime")
+     * @return 一个Map,键为差异字段的路径,值为一个包含两个值的列表 [值1, 值2]
+     */
+    public static Map<String, List<String>> compareJson(String jsonStr1, String jsonStr2, Set<String> ignoreFieldSet) {
+        Map<String, List<String>> differences = new LinkedHashMap<>(); // 使用LinkedHashMap保持插入顺序
+        //Set<String> ignoreFieldSet = new HashSet<>(Arrays.asList(ignoreFields));
+
+        try {
+            JsonNode node1 = objectMapper.readTree(jsonStr1);
+            JsonNode node2 = objectMapper.readTree(jsonStr2);
+            compareNodes(node1, node2, "", differences, ignoreFieldSet);
+        } catch (IOException e) {
+            differences.put("解析错误", Arrays.asList("JSON格式无效", e.getMessage()));
+        }
+
+        return differences;
+    }
+
+    /**
+     * 递归比较两个JsonNode节点
+     */
+    private static void compareNodes(JsonNode node1, JsonNode node2, String currentPath, Map<String, List<String>> differences, Set<String> ignoreFields) {
+        // 1. 检查当前路径是否需要被忽略
+        if (ignoreFields.contains(currentPath)) {
+            return;
+        }
+
+        // 2. 处理节点类型不同的情况
+        if (node1.getNodeType() != node2.getNodeType()) {
+            differences.put(currentPath, Arrays.asList(node1.toString(), node2.toString()));
+            return;
+        }
+
+        // 3. 根据节点类型进行比较
+        switch (node1.getNodeType()) {
+            case OBJECT:
+                compareObjects(node1, node2, currentPath, differences, ignoreFields);
+                break;
+            case ARRAY:
+                compareArrays(node1, node2, currentPath, differences, ignoreFields);
+                break;
+            default:
+                // 对于值节点(文本、数字、布尔、null)
+                if (!node1.equals(node2)) {
+                    // 【增强逻辑】:如果前后两个节点都是空(null 或 空字符串),则视为一致,直接过滤掉
+                    if (isEmptyNode(node1) && isEmptyNode(node2)) {
+                        return;
+                    }
+                    differences.put(currentPath, Arrays.asList(node1.asText(), node2.asText()));
+                }
+                break;
+        }
+    }
+
+    /**
+     * 比较两个JSON对象
+     */
+    private static void compareObjects(JsonNode node1, JsonNode node2, String currentPath,
+                                       Map<String, List<String>> differences, Set<String> ignoreFields) {
+        Set<String> allFieldNames = new HashSet<>();
+        node1.fieldNames().forEachRemaining(allFieldNames::add);
+        node2.fieldNames().forEachRemaining(allFieldNames::add);
+
+        for (String fieldName : allFieldNames) {
+            // 构建当前字段的完整路径,例如 "data.order.orderNo"
+            String fieldPath = currentPath.isEmpty() ? fieldName : currentPath + "." + fieldName;
+
+            if (!node1.has(fieldName)) {
+                differences.put(fieldPath, Arrays.asList("字段不存在", node2.get(fieldName).toString()));
+            } else if (!node2.has(fieldName)) {
+                differences.put(fieldPath, Arrays.asList(node1.get(fieldName).toString(), "字段不存在"));
+            } else {
+                compareNodes(node1.get(fieldName), node2.get(fieldName), fieldPath, differences, ignoreFields);
+            }
+        }
+    }
+
+    /**
+     * 比较两个JSON数组
+     * 注意:此方法按索引顺序比较。如果数组元素顺序可能不同但内容相同,需要更复杂的逻辑。
+     */
+    private static void compareArrays(JsonNode node1, JsonNode node2, String currentPath, Map<String, List<String>> differences, Set<String> ignoreFields) {
+        if (node1.size() != node2.size()) {
+            differences.put(currentPath, Arrays.asList("数组长度: " + node1.size(), "数组长度: " + node2.size()));
+        }
+
+        int minSize = Math.min(node1.size(), node2.size());
+        for (int i = 0; i < minSize; i++) {
+            String elementPath = currentPath + "[" + i + "]";
+            compareNodes(node1.get(i), node2.get(i), elementPath, differences, ignoreFields);
+        }
+    }
+
+    /**
+     * 【新增辅助方法】判断一个JsonNode是否为空
+     * 满足以下任一条件即视为空:
+     * 1. 节点为 null 或 NullNode
+     * 2. 节点是文本类型且内容为空字符串 ""
+     */
+    private static boolean isEmptyNode(JsonNode node) {
+        if (node == null || node.isNull()) {
+            return true;
+        }
+        return node.isTextual() && node.asText().isEmpty();
+    }
+}

+ 51 - 0
commons/src/main/java/com/jzg/commons/util/OrderComponts.java

@@ -0,0 +1,51 @@
+package com.jzg.commons.util;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class OrderComponts {
+
+    public static Map<String, String> fillKeyNameMap(){
+
+        Map<String,String> nameMap = new HashMap<>();
+        nameMap.put("costRatio.jqExportRatio","交强出口比例");
+        nameMap.put("costRatio.jqFollowRatio","交强跟单比例");
+        nameMap.put("costRatio.jqInletRatio","交强入口比例");
+        nameMap.put("costRatio.jqKeepPointRatio","交强留点比例");
+
+        nameMap.put("costRatio.syExportRatio","商业出口比例");
+        nameMap.put("costRatio.syFollowRatio","商业跟单比例");
+        nameMap.put("costRatio.syInletRatio","商业入口比例");
+        nameMap.put("costRatio.syKeepPointRatio","商业留点比例");
+
+        nameMap.put("costRatio.jyExportRatio","驾意出口比例");
+        nameMap.put("costRatio.jyFollowRatio","驾意跟单比例");
+        nameMap.put("costRatio.jyInletRatio","驾意入口比例");
+        nameMap.put("costRatio.jyKeepPointRatio","驾意留点比例");
+
+        nameMap.put("insFeeOrders.jqExportPremium","交强出口费用");
+        nameMap.put("insFeeOrders.jqReceivablePremium","交强应收费用");
+        nameMap.put("insFeeOrders.jqKeepPointPremium","交强留点费用");
+        nameMap.put("insFeeOrders.jqFollowPremium","交强跟单费用");
+        nameMap.put("insFeeOrders.jqPayablePremium","交强应付费用");
+
+        nameMap.put("insFeeOrders.syExportPremium","商业出口费用");
+        nameMap.put("insFeeOrders.syReceivablePremium","商业应收费用");
+        nameMap.put("insFeeOrders.syKeepPointPremium","商业留点费用");
+        nameMap.put("insFeeOrders.syFollowPremium","商业跟单费用");
+        nameMap.put("insFeeOrders.syPayablePremium","商业应付费用");
+
+        nameMap.put("insFeeOrders.jyExportPremium","驾意出口费用");
+        nameMap.put("insFeeOrders.jyReceivablePremium","驾意应收费用");
+        nameMap.put("insFeeOrders.jyKeepPointPremium","驾意留点费用");
+        nameMap.put("insFeeOrders.jyFollowPremium","驾意跟单费用");
+        nameMap.put("insFeeOrders.jyPayablePremium","驾意应付费用");
+
+        nameMap.put("insFeeOrders.totalReceivablePremium","总应收费用");
+        nameMap.put("insFeeOrders.totalPayablePremium","总应付费用");
+        nameMap.put("insFeeOrders.totalExportPremium","总出口费用");
+        return nameMap;
+    }
+
+}

+ 11 - 2
gateway/src/main/resources/logback-spring.xml

@@ -7,8 +7,17 @@
     </appender>
 
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
-        <graylogHost>192.168.1.250</graylogHost>
-<!--        <graylogHost>172.24.144.227</graylogHost>-->
+        <springProfile name="prod">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="test">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="dev">
+            <graylogHost>192.168.1.250</graylogHost>
+        </springProfile>
         <graylogPort>12201</graylogPort>
         <includeMdcData>true</includeMdcData>
         <extractStackTrace>true</extractStackTrace>

+ 12 - 2
partner/src/main/resources/logback-spring.xml

@@ -7,11 +7,21 @@
     </appender>
 
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
-        <graylogHost>192.168.1.250</graylogHost>
-<!--        <graylogHost>172.24.144.227</graylogHost>-->
+        <springProfile name="prod">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="test">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="dev">
+            <graylogHost>192.168.1.250</graylogHost>
+        </springProfile>
         <graylogPort>12201</graylogPort>
         <includeMdcData>true</includeMdcData>
         <extractStackTrace>true</extractStackTrace>
+        140430201005140048
     </appender>
 
     <root level="INFO">

+ 11 - 2
platform/src/main/resources/logback-spring.xml

@@ -7,8 +7,17 @@
     </appender>
 
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
-        <graylogHost>192.168.1.250</graylogHost>
-<!--        <graylogHost>172.24.144.227</graylogHost>-->
+        <springProfile name="prod">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="test">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="dev">
+            <graylogHost>192.168.1.250</graylogHost>
+        </springProfile>
         <graylogPort>12201</graylogPort>
         <includeMdcData>true</includeMdcData>
         <extractStackTrace>true</extractStackTrace>

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

@@ -16,14 +16,13 @@ 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.commons.entity.vo.QuestionOrder;
+import com.jzg.commons.util.JsonDiffUtil;
+import com.jzg.commons.util.OrderComponts;
 import com.jzg.quotation.commons.constant.SpElMapping;
 import com.jzg.quotation.commons.utils.SpElFieldExtractor;
 import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
 import com.jzg.quotation.summary.constants.QuoteNumberConstant;
-import com.jzg.quotation.summary.service.InsOrderAdjustService;
-import com.jzg.quotation.summary.service.InsOrdersCarInfoService;
-import com.jzg.quotation.summary.service.InsOrdersService;
-import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import com.jzg.quotation.summary.service.*;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
@@ -38,9 +37,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @Aspect
 @Component
@@ -60,10 +57,17 @@ public class OrderOperationLogAspect {
 
     @Autowired
     private SpElFieldExtractor fieldExtractor;
-
+    @Autowired
+    private InsFeeAuditService insFeeAuditService;
     @Autowired
     private InsOrderAdjustService insOrderAdjustService;
 
+    /**
+     * 批量修改比例
+     *
+     * @author lipf
+     * @date 2026/7/8 15:29
+     */
     @Around("@annotation(log)")
     public Object handleLog(ProceedingJoinPoint joinPoint, OrderOperationLog log) throws Throwable {
         // 获取方法信息和参数
@@ -162,8 +166,11 @@ 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());
                 result = joinPoint.proceed();
-                this.saveCostInfo(result,log, vo);
+                QuoteEchoVo detailVoNew = insFeeAuditService.auditInfo(vo.getOrderNo());
+                Map<String, List<String>> diffMap = JsonDiffUtil.compareJson(JSONUtil.toJsonStr(detailVoOld), JSONUtil.toJsonStr(detailVoNew), new HashSet<>());
+                this.saveCostInfo(result,log, vo,diffMap);
                 break;
             // 批量修改比例
             case 16:
@@ -255,7 +262,7 @@ public class OrderOperationLogAspect {
      * @author lipf
      * @date 2026/7/8 15:28
      */
-    private void saveCostInfo(Object result, OrderOperationLog log, PtlAgreementCostRatioVo vo) {
+    private void saveCostInfo(Object result, OrderOperationLog log, PtlAgreementCostRatioVo vo,Map<String, List<String>> diffMap) {
         InsOrdersTrack track = new InsOrdersTrack();
         String orderNo = vo.getOrderNo();
         track.setModule(log.module());
@@ -273,14 +280,27 @@ public class OrderOperationLogAspect {
             track.setResult("要进行费用调整的订单不存在");
         }
         track.setStatus(1);
-        track.setChangeBefore("");
-        track.setChangeAfter("费用调整完成");
+        if(CollUtil.isNotEmpty(diffMap)){
+            List<String> oldItems = new ArrayList<>();
+            List<String> newItems = new ArrayList<>();
+            Map<String,String> keyMap = OrderComponts.fillKeyNameMap();
+            diffMap.forEach((path, values) ->{
+                        System.out.println("路径: " + path + " -> 值1: " + values.get(0) + " | 值2: " + values.get(1));
+                        oldItems.add(keyMap.getOrDefault(path,path)  + ": " + values.get(0));
+                        newItems.add(keyMap.getOrDefault(path,path) + ": " + values.get(1));
+                    }
+            );
+            logger.info("oldItem=[{}]", JSONUtil.toJsonStr(oldItems));
+            logger.info("newItem=[{}]", JSONUtil.toJsonStr(newItems));
+
+            track.setChangeBefore(String.join("\r\n", oldItems));
+            track.setChangeAfter(String.join("\r\n", newItems));
+        }
+
         track.setOrderNo(orderNo);
         track.setResult(JSONUtil.toJsonStr(result));
         traceService.save(track);
     }
-
-
     /**
      * 订单审核(通过/驳回)
      *

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

@@ -40,7 +40,6 @@ public class InsFeeAuditController {
 
     /**
      * 订单列表分页
-     *
      * 支持查询租户下的所有数据,或者租户下,指定业务员领取后的数据。
      * @return HttpResult<Page<FeeAuditVo>>
      */
@@ -70,7 +69,7 @@ public class InsFeeAuditController {
      */
     @GetMapping("/auditInfo")
     @Operation(summary = "订单审核详情")
-    public HttpResult<QuoteEchoVo> auditInfo(String orderNo){
+    public HttpResult<QuoteEchoVo> auditInfo(@RequestParam("orderNo") String orderNo){
         QuoteEchoVo detailVo = insFeeAuditService.auditInfo(orderNo);
         return HttpResult.ok(detailVo);
     }

+ 11 - 2
tenant/insurance/quotation-summary/src/main/resources/logback-spring.xml

@@ -11,8 +11,17 @@
     <logger name="com.mongodb" level="WARN"/>
 
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
-        <graylogHost>192.168.1.250</graylogHost>
-<!--        <graylogHost>172.24.144.227</graylogHost>-->
+        <springProfile name="prod">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="test">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="dev">
+            <graylogHost>192.168.1.250</graylogHost>
+        </springProfile>
         <graylogPort>12201</graylogPort>
         <includeMdcData>true</includeMdcData>
         <extractStackTrace>true</extractStackTrace>

+ 6 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -582,6 +582,9 @@
         ) ioa1 ON o.id = ioa1.order_no
         <where>
             and o.is_delete = 0 and o.parent_id != 0
+            <if test="insOrdersParam.createBy != null and insOrdersParam.createBy != ''">
+                AND o.create_by = #{insOrdersParam.createBy}
+            </if>
             <if test="insOrdersParam.systemCode != null and insOrdersParam.systemCode != ''">
                 AND o.system_code = #{insOrdersParam.systemCode}
             </if>
@@ -600,6 +603,9 @@
             <if test="insOrdersParam.isTemporarily != null">
                 AND o.is_temporarily = #{insOrdersParam.isTemporarily}
             </if>
+            <if test="insOrdersParam.entryStatus != null and insOrdersParam.entryStatus != ''">
+                AND o.entry_status = #{insOrdersParam.entryStatus}
+            </if>
             <if test="insOrdersParam.companyName != null and insOrdersParam.companyName != ''">
                 AND o.company_name = #{insOrdersParam.companyName}
             </if>

+ 84 - 39
tenant/organization/src/main/java/com/jzg/organization/aop/OrderOperationLogAspect.java

@@ -2,12 +2,16 @@ package com.jzg.organization.aop;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
+import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.finance.vo.BatchModifyVo;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersTrack;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import com.jzg.commons.entity.vo.QuestionOrder;
+import com.jzg.commons.util.JsonDiffUtil;
+import com.jzg.commons.util.OrderComponts;
 import com.jzg.organization.client.InsOrdersClient;
 import com.jzg.quotation.summary.aop.aspect.OrderOperationLog;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -24,7 +28,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
+import java.util.*;
 
 @Aspect
 @Component
@@ -38,6 +42,12 @@ public class OrderOperationLogAspect {
 
 
 
+    /**
+     * 这个方法不能删除,是通过spring aop 来调用的
+     *
+     * @author lipf
+     * @date 2026/7/22 15:11
+     */
     @Around("@annotation(log)")
     public Object handleLog(ProceedingJoinPoint joinPoint, OrderOperationLog log) throws Throwable {
         // 获取方法信息和参数
@@ -55,18 +65,34 @@ public class OrderOperationLogAspect {
         Object result = null;
         switch (log.optType().getCode()){
             // 费用调整
-            case 15:
-                logger.info("费用调整log.orderSpEl()=[{}]",log.orderSpEl());
-                PtlAgreementCostRatioVo vo = parser.parseExpression(log.orderSpEl()).getValue(context, PtlAgreementCostRatioVo.class);
-                result = joinPoint.proceed();
-                this.saveCostInfo(result,log, vo);
-                break;
+//            case 15:
+//                logger.info("费用调整log.orderSpEl()=[{}]",log.orderSpEl());
+//                PtlAgreementCostRatioVo vo = parser.parseExpression(log.orderSpEl()).getValue(context, PtlAgreementCostRatioVo.class);
+//                result = joinPoint.proceed();
+//                this.saveCostInfo(result,log, vo);
+//                break;
             // 批量修改比例
             case 16:
                 logger.info("批量修改比例.log.orderSpEl()=[{}]",log.orderSpEl());
                 BatchModifyVo batchModifyVo = parser.parseExpression(log.orderSpEl()).getValue(context, BatchModifyVo.class);
+                List<String> orderNos = batchModifyVo.getOrderNos();
+                if(CollUtil.isEmpty(orderNos)){
+                    throw new RuntimeException("缺少orderNos参数");
+                }
+                Map<String,QuoteEchoVo> oldOrders = new HashMap<>();
+                for (String orderNo : orderNos) {
+                    HttpResult<QuoteEchoVo> quoteEchoVoHttpResult = insOrdersClient.auditInfo(orderNo);
+                    oldOrders.put(orderNo,quoteEchoVoHttpResult.getData());
+                }
                 result = joinPoint.proceed();
-                this.batchModify(result,log, batchModifyVo);
+
+                Map<String,QuoteEchoVo> newOrders = new HashMap<>();
+                for (String orderNo : orderNos) {
+                    HttpResult<QuoteEchoVo> quoteEchoVoHttpResult = insOrdersClient.auditInfo(orderNo);
+                    newOrders.put(orderNo,quoteEchoVoHttpResult.getData());
+                }
+
+                this.batchModify(result,log, batchModifyVo,oldOrders, newOrders);
                 break;
             // 设为疑问订单
             case 17:
@@ -114,7 +140,7 @@ public class OrderOperationLogAspect {
      * @author lipf
      * @date 2026/7/8 15:29
      */
-    private void batchModify(Object result, OrderOperationLog log, BatchModifyVo vo) {
+    private void batchModify(Object result, OrderOperationLog log, BatchModifyVo vo,Map<String,QuoteEchoVo> oldOrders, Map<String,QuoteEchoVo> newOrders) {
         List<String> orderNos = vo.getOrderNos();
         if(CollUtil.isEmpty(orderNos)){
             logger.info("批量修改没有传入订单号");
@@ -126,7 +152,26 @@ public class OrderOperationLogAspect {
             track.setSubModule(log.subModule());
             track.setOptType(log.optType().getCode());
             track.setOptContent(log.description());
-            track.setChangeAfter(JSONUtil.toJsonStr(vo));
+            QuoteEchoVo detailVoOld = oldOrders.get(orderNo);
+            QuoteEchoVo detailVoNew = newOrders.get(orderNo);
+            Map<String, List<String>> diffMap = JsonDiffUtil.compareJson(JSONUtil.toJsonStr(detailVoOld), JSONUtil.toJsonStr(detailVoNew), new HashSet<>());
+
+            if(CollUtil.isNotEmpty(diffMap)){
+                List<String> oldItems = new ArrayList<>();
+                List<String> newItems = new ArrayList<>();
+                Map<String,String> keyMap = OrderComponts.fillKeyNameMap();
+                diffMap.forEach((path, values) ->{
+                            System.out.println("路径: " + path + " -> 值1: " + values.get(0) + " | 值2: " + values.get(1));
+                            oldItems.add(keyMap.getOrDefault(path,path)  + ": " + values.get(0));
+                            newItems.add(keyMap.getOrDefault(path,path) + ": " + values.get(1));
+                        }
+                );
+                logger.info("oldItem=[{}]", JSONUtil.toJsonStr(oldItems));
+                logger.info("newItem=[{}]", JSONUtil.toJsonStr(newItems));
+
+                track.setChangeBefore(String.join("\r\n", oldItems));
+                track.setChangeAfter(String.join("\r\n", newItems));
+            }
             track.setResult(JSONUtil.toJsonStr(result));
             InsOrders insOrders = insOrdersClient.getById(orderNo);
             if(insOrders != null){
@@ -144,34 +189,34 @@ public class OrderOperationLogAspect {
 
     }
 
-    /**
-     * 保存费用信息
-     * @author lipf
-     * @date 2026/7/8 15:28
-     */
-    private void saveCostInfo(Object result, OrderOperationLog log, PtlAgreementCostRatioVo vo) {
-        InsOrdersTrack track = new InsOrdersTrack();
-        String orderNo = vo.getOrderNo();
-        track.setModule(log.module());
-        track.setSubModule(log.subModule());
-        track.setOptType(log.optType().getCode());
-        track.setOptContent(log.description());
-        track.setResult(JSONUtil.toJsonStr(vo));
-        InsOrders insOrders = insOrdersClient.getById(orderNo);
-        if(insOrders != null){
-            InsOrdersCarInfo carInfo = insOrdersClient.getByOrderId(insOrders.getId());
-            track.setLicenseNo(carInfo.getLicenseNo());
-            track.setCompanyId(insOrders.getCompanyId());
-            // track.setResult(result.getMsg());
-        }else{
-            track.setResult("要进行费用调整的订单不存在");
-        }
-        track.setStatus(1);
-        track.setChangeBefore("");
-        track.setChangeAfter("费用调整完成");
-        track.setOrderNo(orderNo);
-        track.setResult(JSONUtil.toJsonStr(result));
-        insOrdersClient.save(track);
-    }
+//    /**
+//     * 保存费用信息
+//     * @author lipf
+//     * @date 2026/7/8 15:28
+//     */
+//    private void saveCostInfo(Object result, OrderOperationLog log, PtlAgreementCostRatioVo vo) {
+//        InsOrdersTrack track = new InsOrdersTrack();
+//        String orderNo = vo.getOrderNo();
+//        track.setModule(log.module());
+//        track.setSubModule(log.subModule());
+//        track.setOptType(log.optType().getCode());
+//        track.setOptContent(log.description());
+//        track.setResult(JSONUtil.toJsonStr(vo));
+//        InsOrders insOrders = insOrdersClient.getById(orderNo);
+//        if(insOrders != null){
+//            InsOrdersCarInfo carInfo = insOrdersClient.getByOrderId(insOrders.getId());
+//            track.setLicenseNo(carInfo.getLicenseNo());
+//            track.setCompanyId(insOrders.getCompanyId());
+//            // track.setResult(result.getMsg());
+//        }else{
+//            track.setResult("要进行费用调整的订单不存在");
+//        }
+//        track.setStatus(1);
+//        track.setChangeBefore("");
+//        track.setChangeAfter("费用调整完成");
+//        track.setOrderNo(orderNo);
+//        track.setResult(JSONUtil.toJsonStr(result));
+//        insOrdersClient.save(track);
+//    }
 
    }

+ 11 - 1
tenant/organization/src/main/java/com/jzg/organization/client/InsOrdersClient.java

@@ -4,7 +4,9 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersTrack;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
@@ -46,7 +48,7 @@ public interface InsOrdersClient {
     /**
      * 保存订单轨迹信息
      *
-     * @param track
+     * @param track 轨迹信息
      * @author lipf
      * @date 2026/7/18 16:58
      */
@@ -62,4 +64,12 @@ public interface InsOrdersClient {
      */
     @GetMapping("/supplementOrder/getByOrderId")
     InsOrdersCarInfo getByOrderId(@RequestParam("orderNo") String orderNo);
+
+    /**
+     * 订单审核详情
+     * @return HttpResult<QuoteEchoVo>
+     */
+    @GetMapping("/feeAudit/auditInfo")
+    @Operation(summary = "订单审核详情")
+    HttpResult<QuoteEchoVo> auditInfo(@RequestParam("orderNo")  String orderNo);
 }

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

@@ -153,6 +153,13 @@ public class ReceivableController {
         return HttpResult.ok(importExcelResultVo);
     }
 
+    @PostMapping("/importPlatformReceivableInvoice")
+    @Operation(summary = "导入平台应收开票数据")
+    public HttpResult<ImportUpdateExcelResultVo> importPlatformReceivableInvoice(@RequestParam("file") MultipartFile file){
+        ImportUpdateExcelResultVo importExcelResultVo = receivableService.importPlatformReceivableInvoice(file);
+        return HttpResult.ok(importExcelResultVo);
+    }
+
     /**
      *
      * @author lipf

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -429,6 +429,13 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      */
     ImportUpdateExcelResultVo importAccountsReceivableInvoice(MultipartFile file);
 
+    /**
+     * 导入应收开票数据
+     * @param file
+     * @return
+     */
+    ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file);
+
     /**
      * 删除结算记录
      *

+ 195 - 66
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -2304,7 +2304,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                     .eq(PtlAgreement::getId, data.getAgreementId()));
 
             // 数据库不存在 → 直接失败
-            if (Objects.isNull(ptlAgreement) || !ptlAgreement.getAgreementType().toString().equals(vo.getAgreementType())) {
+            if (Objects.isNull(ptlAgreement) || !"2".equals(ptlAgreement.getAgreementType().toString())) {
                 failedNumber++;
                 vo.setErrorMessage("协议编码在协议中不存在");
                 failedExcel.add(vo);
@@ -2312,72 +2312,27 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             }
 
             // 查询数据库中是否已存在该保单号
-            InsPlyIncome existIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
-                    .eq(InsPlyIncome::getJqPolicyNo, vo.getJqPolicyNo()));
-
-            // 封装修改数据
-            InsPlyIncome insPlyIncome = new InsPlyIncome();
-            insPlyIncome.setId(IdGenerate.nextId());
-            insPlyIncome.setLicenseNo(vo.getLicenseNo());
-            insPlyIncome.setJqPolicyNo(vo.getJqPolicyNo());
-            insPlyIncome.setJqSuperviseCostsProportion(vo.getJqSuperviseCostsProportion());
-            insPlyIncome.setJqOtherCostsProportion(vo.getJqOtherCostsProportion());
-            insPlyIncome.setSyPolicyNo(vo.getSyPolicyNo());
-            insPlyIncome.setSySuperviseCostsProportion(vo.getSySuperviseCostsProportion());
-            insPlyIncome.setSyOtherCostsProportion(vo.getSyOtherCostsProportion());
-            insPlyIncome.setJyPolicyNo(vo.getJyPolicyNo());
-            insPlyIncome.setJySuperviseCostsProportion(vo.getJySuperviseCostsProportion());
-            insPlyIncome.setJyOtherCostsProportion(vo.getJyOtherCostsProportion());
-            // 签单时间
-            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            insPlyIncome.setSigningTime(LocalDateTime.parse(vo.getSigningTime(), formatter));
-            // 协议编号
-            insPlyIncome.setAgreementId(ptlAgreement.getId());
-            insPlyIncome.setAgreementName(ptlAgreement.getAgreementName());
-            insPlyIncome.setAgreementType(ptlAgreement.getAgreementType().toString());
-            insPlyIncome.setSystemCode(ptlAgreement.getSystemCode());
-            // 险种编号
-            insPlyIncome.setProductId(ProductsType.getCodeByDesc(vo.getProductName()));
-            // 险种名称
-            insPlyIncome.setProductName(vo.getProductName());
-            // 被保险人姓名
-            insPlyIncome.setInsuredPerson(vo.getInsuredPerson());
-            // 对接人信息
-            insPlyIncome.setContactPerson(vo.getContactPerson());
-            insPlyIncome.setContactPersonPhone(vo.getContactPersonPhone());
+            failedNumber = spliceData(vo, ptlAgreement, esmInsCompanyList, insertExcel, successOrderNoList, failedNumber, failedExcel, updateExcel);
+        }
 
-            // 数据库不存在 → 直接失败
-            if (Objects.isNull(existIncome)) {
-                // 加入修改列表
-                // 机构id
-                insPlyIncome.setDeptId(baseController.getUserDeptId());
-                EsmInsCompany esmInsCompany = esmInsCompanyList.stream().filter(company -> company.getName().equals(vo.getCompanyName())).findFirst().orElse(new EsmInsCompany());
-                insPlyIncome.setCompanyId(esmInsCompany.getId());
-                insPlyIncome.setOrderNo(vo.getOrderNo());
-                insertExcel.add(insPlyIncome);
-                // 新增成功,记录订单号
-                successOrderNoList.add(vo.getOrderNo());
-            }else{
-                // 数据库已存在 → 继续后续校验
-                // 判断已开票 / 已结算
-                String settlementFlag = "1";
-                if (settlementFlag.equals(existIncome.getSuperviseSettlement()) || settlementFlag.equals(existIncome.getOtherSettlement())
-                        || settlementFlag.equals(existIncome.getJySuperviseSettlement()) || settlementFlag.equals(existIncome.getJyOtherSettlement())
-                        || settlementFlag.equals(existIncome.getPlatformSuperviseSettlement()) || settlementFlag.equals(existIncome.getPlatformOtherSettlement())) {
-                    failedNumber++;
-                    vo.setErrorMessage("应收数据已结算");
-                    failedExcel.add(vo);
-                    continue;
-                }
+        getDataManipulationResult(updateExcel, insertExcel, failedExcel, importExcelResultVo, failedNumber, successOrderNoList);
 
-                insPlyIncome.setId(existIncome.getId());
-                // 加入修改列表
-                updateExcel.add(insPlyIncome);
-                // 更新成功,记录订单号
-                successOrderNoList.add(vo.getOrderNo());
-            }
-        }
+        return importExcelResultVo;
+    }
 
+    /**
+     * <p>
+     * 1. 获取保司名称
+     * 2. 校验Excel内部保单号重复
+     * 3. 处理数据
+     * 4. 执行批量更新
+     * 5. 生成失败数据下载链接
+     * 6. 返回结果
+     * </p>
+     *
+     * @return List<InvoiceReceivableExportExcelVo> 处理后的数据列表
+     */
+    private void getDataManipulationResult(List<InsPlyIncome> updateExcel, List<InsPlyIncome> insertExcel, List<InvoiceReceivableExportExcelVo> failedExcel, ImportUpdateExcelResultVo importExcelResultVo, int failedNumber, List<String> successOrderNoList) {
         // 执行批量更新
         if (CollUtil.isNotEmpty(updateExcel)) {
             baseMapper.updateById(updateExcel);
@@ -2402,10 +2357,184 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         importExcelResultVo.setFailedNumber(failedNumber);
         // 导出成功的orderNos
         importExcelResultVo.setOrderNos(successOrderNoList);
+    }
+
+    /**
+     * 导入平台的应收数据
+     * @param file
+     * @return
+     */
+    @Override
+    public ImportUpdateExcelResultVo importPlatformReceivableInvoice(MultipartFile file) {
+        String userName = baseController.getUserName();
+        log.info("用户[{}]导入平台协议文件",userName);
+        ImportUpdateExcelResultVo importExcelResultVo = new ImportUpdateExcelResultVo();
+        List<InvoiceReceivableExportExcelVo> receivableExportExcelVos = importInvoiceReceivableExcel(file);
+        if (CollUtil.isEmpty(receivableExportExcelVos)){
+            throw new SystemException("数据不能为空,导入失败");
+        }
+        AssertionUtils.isEmpty(receivableExportExcelVos, "数据处理失败,导入失败");
+        // 获取保司名称
+        HttpResult<List<EsmInsCompany>> listHttpResult = esmInsCompanyClient.liveCompanyList();
+        AssertionUtils.isFail(listHttpResult.getCode() != 200, listHttpResult.getMsg());
+        List<EsmInsCompany> esmInsCompanyList = CollUtil.isNotEmpty(listHttpResult.getData()) ? listHttpResult.getData() : CollUtil.newArrayList();
+
+        int failedNumber = 0;
+        List<InvoiceReceivableExportExcelVo> failedExcel = new ArrayList<>();
+        // 只存储需要【修改】的数据
+        List<InsPlyIncome> updateExcel = new ArrayList<>();
+        List<InsPlyIncome> insertExcel = new ArrayList<>();
+        // 存储导入成功的订单号
+        List<String> successOrderNoList = new ArrayList<>();
+
+        // 校验Excel内部保单号重复
+        Set<String> existPolicyNoSet = new HashSet<>();
+        Set<String> repeatPolicyNoSet = new HashSet<>();
+        Set<String> existCompanyIdSet = new HashSet<>();
+
+        for (InvoiceReceivableExportExcelVo vo : receivableExportExcelVos) {
+            String policyNo = vo.getJqPolicyNo();
+            if (existPolicyNoSet.contains(policyNo)) {
+                repeatPolicyNoSet.add(policyNo);
+            } else {
+                existPolicyNoSet.add(policyNo);
+            }
+            existCompanyIdSet.add(vo.getCompanyName());
+        }
+
+        // 导入只能一个保司
+        if (existCompanyIdSet.size() > 1) {
+            throw new SystemException("导入数据不能包含多个保险公司");
+        }
+
+        // 处理数据
+        for (InvoiceReceivableExportExcelVo vo : receivableExportExcelVos) {
+            // 1. 空数据校验
+            ImportResultVo resultVo = vo.checkEmpty();
+            if (!resultVo.isSuccess()) {
+                failedNumber++;
+                vo.setErrorMessage(resultVo.getMessage());
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 2. Excel内部保单号重复
+            if (repeatPolicyNoSet.contains(vo.getJqPolicyNo())) {
+                failedNumber++;
+                vo.setErrorMessage("保单号重复");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 查询订单
+            HttpResult<InsOrdersVo> insOrdersVoHttpResult = insOrdersClient.selectById(vo.getOrderNo());
+            InsOrdersVo data = insOrdersVoHttpResult.getData();
+            if (null == data){
+                failedNumber++;
+                vo.setErrorMessage("订单号不存在");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            // 查询数据库中是否已存在该协议
+            PtlAgreement ptlAgreement = ptlAgreementMapper.selectOne(new LambdaQueryWrapper<PtlAgreement>()
+                    .eq(PtlAgreement::getId, data.getAgreementId()));
+
+            // 数据库不存在 → 直接失败
+            if (Objects.isNull(ptlAgreement) || !"1".equals(ptlAgreement.getAgreementType().toString())) {
+                failedNumber++;
+                vo.setErrorMessage("协议编码在协议中不存在");
+                failedExcel.add(vo);
+                continue;
+            }
+
+            failedNumber = spliceData(vo, ptlAgreement, esmInsCompanyList, insertExcel, successOrderNoList, failedNumber, failedExcel, updateExcel);
+            continue;
+        }
+
+        // 执行批量更新
+        getDataManipulationResult(updateExcel, insertExcel, failedExcel, importExcelResultVo, failedNumber, successOrderNoList);
 
         return importExcelResultVo;
     }
 
+    /**
+     * 批量处理数据
+     * @param updateExcel
+     * @param insertExcel
+     * @param failedExcel
+     * @param failedNumber
+     * @param successOrderNoList
+     */
+    private int spliceData(InvoiceReceivableExportExcelVo vo, PtlAgreement ptlAgreement, List<EsmInsCompany> esmInsCompanyList, List<InsPlyIncome> insertExcel, List<String> successOrderNoList, int failedNumber, List<InvoiceReceivableExportExcelVo> failedExcel, List<InsPlyIncome> updateExcel) {
+        // 查询数据库中是否已存在该保单号
+        InsPlyIncome existIncome = baseMapper.selectOne(new LambdaQueryWrapper<InsPlyIncome>()
+                .eq(InsPlyIncome::getJqPolicyNo, vo.getJqPolicyNo()));
+
+        // 封装修改数据
+        InsPlyIncome insPlyIncome = new InsPlyIncome();
+        insPlyIncome.setId(IdGenerate.nextId());
+        insPlyIncome.setLicenseNo(vo.getLicenseNo());
+        insPlyIncome.setJqPolicyNo(vo.getJqPolicyNo());
+        insPlyIncome.setJqSuperviseCostsProportion(vo.getJqSuperviseCostsProportion());
+        insPlyIncome.setJqOtherCostsProportion(vo.getJqOtherCostsProportion());
+        insPlyIncome.setSyPolicyNo(vo.getSyPolicyNo());
+        insPlyIncome.setSySuperviseCostsProportion(vo.getSySuperviseCostsProportion());
+        insPlyIncome.setSyOtherCostsProportion(vo.getSyOtherCostsProportion());
+        insPlyIncome.setJyPolicyNo(vo.getJyPolicyNo());
+        insPlyIncome.setJySuperviseCostsProportion(vo.getJySuperviseCostsProportion());
+        insPlyIncome.setJyOtherCostsProportion(vo.getJyOtherCostsProportion());
+        // 签单时间
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        insPlyIncome.setSigningTime(LocalDateTime.parse(vo.getSigningTime(), formatter));
+        // 协议编号
+        insPlyIncome.setAgreementId(ptlAgreement.getId());
+        insPlyIncome.setAgreementName(ptlAgreement.getAgreementName());
+        insPlyIncome.setAgreementType(ptlAgreement.getAgreementType().toString());
+        insPlyIncome.setSystemCode(ptlAgreement.getSystemCode());
+        // 险种编号
+        insPlyIncome.setProductId(ProductsType.getCodeByDesc(vo.getProductName()));
+        // 险种名称
+        insPlyIncome.setProductName(vo.getProductName());
+        // 被保险人姓名
+        insPlyIncome.setInsuredPerson(vo.getInsuredPerson());
+        // 对接人信息
+        insPlyIncome.setContactPerson(vo.getContactPerson());
+        insPlyIncome.setContactPersonPhone(vo.getContactPersonPhone());
+
+        // 数据库不存在 → 直接失败
+        if (Objects.isNull(existIncome)) {
+            // 加入修改列表
+            // 机构id
+            insPlyIncome.setDeptId(baseController.getUserDeptId());
+            EsmInsCompany esmInsCompany = esmInsCompanyList.stream().filter(company -> company.getName().equals(vo.getCompanyName())).findFirst().orElse(new EsmInsCompany());
+            insPlyIncome.setCompanyId(esmInsCompany.getId());
+            insPlyIncome.setOrderNo(vo.getOrderNo());
+            insertExcel.add(insPlyIncome);
+            // 新增成功,记录订单号
+            successOrderNoList.add(vo.getOrderNo());
+        }else{
+            // 数据库已存在 → 继续后续校验
+            // 判断已开票 / 已结算
+            String settlementFlag = "1";
+            if (settlementFlag.equals(existIncome.getSuperviseSettlement()) || settlementFlag.equals(existIncome.getOtherSettlement())
+                    || settlementFlag.equals(existIncome.getJySuperviseSettlement()) || settlementFlag.equals(existIncome.getJyOtherSettlement())
+                    || settlementFlag.equals(existIncome.getPlatformSuperviseSettlement()) || settlementFlag.equals(existIncome.getPlatformOtherSettlement())) {
+                failedNumber++;
+                vo.setErrorMessage("应收数据已结算");
+                failedExcel.add(vo);
+                return failedNumber;
+            }
+
+            insPlyIncome.setId(existIncome.getId());
+            // 加入修改列表
+            updateExcel.add(insPlyIncome);
+            // 更新成功,记录订单号
+            successOrderNoList.add(vo.getOrderNo());
+        }
+        return failedNumber;
+    }
+
 
     /**
      * 平台协议结算-删除结算记录
@@ -3950,7 +4079,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         invoice.setPaymentReason(vo.getPaymentReason());
         invoice.setReceivableSupervisePremium(vo.getReceivableSupervisePremium());
         invoice.setTaxPoint(vo.getTaxPoint());
-        invoice.setInvoiceTime(LocalDateTime.now());
+        invoice.setInvoiceTime(vo.getInvoiceTime());
         // 初始状态:0-待处理
         invoice.setStatus("0");
         return invoice;
@@ -4601,7 +4730,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 //                    settlementPaymentDifference = BigDecimalUtil.subtract(settlementAmount,receivableSupervisePremium);
 //                }
                 // 待结算金额 = 开票金额 - 已收金额
-                BigDecimal remainSettlementAmount = receivableSupervisePremium.subtract(BigDecimalUtil.add(settlementAmount, settlementPaymentDifference));
+                BigDecimal remainSettlementAmount = receivableSupervisePremium.subtract(BigDecimalUtil.subtract(settlementAmount, settlementPaymentDifference));
                 // 设置已结算的金额
                 action.setSettlementAmount(settlementAmount);
                 // 设置待结算金额

+ 4 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java

@@ -91,6 +91,7 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
         UserAccountStatisVo payableStatistics = this.baseMapper.getPayableStatistics(param);
         BigDecimal payingAmountSum = sysAmountAuditingMapper.queryPayingAmountSum();
         payableStatistics.setPayingAmountSum(payingAmountSum== null? BigDecimal.ZERO:payingAmountSum);
+        payableStatistics.setNotPaidSum(BigDecimalUtil.subtract(payableStatistics.getNotPaidSum(),payableStatistics.getPayingAmountSum()));
         return payableStatistics;
     }
 
@@ -113,6 +114,7 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             List<SysAmountAuditing> sysAmountAuditings1 = collect.get(userId);
             if(CollUtil.isNotEmpty(sysAmountAuditings1)){
                 action.setPayingAmount(sysAmountAuditings1.get(0).getAmount());
+                action.setSumAmountUnpaid(BigDecimalUtil.subtract(action.getSumAmountUnpaid(),sysAmountAuditings1.get(0).getAmount()));
             }else{
                 action.setPayingAmount(BigDecimal.ZERO);
             }
@@ -381,8 +383,8 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             if ("0".equals(record.getIncomeAndExpense())) {
                 // 收入
                 summary.setIncome(BigDecimalUtil.add(summary.getIncome(),record.getAmount()));
-            } else {
-                // 支出
+            } else if("1".equals(record.getIncomeAndExpense()) && !"2".equals(record.getStatus())){
+                // 支出, 并且不是审核驳回的数据
                 summary.setExpense(BigDecimalUtil.add(summary.getExpense(),record.getAmount()));
             }
 

+ 13 - 2
tenant/organization/src/main/resources/logback-spring.xml

@@ -6,9 +6,20 @@
         </encoder>
     </appender>
 
+
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
-        <graylogHost>192.168.1.250</graylogHost>
-<!--        <graylogHost>172.24.144.227</graylogHost>-->
+
+        <springProfile name="prod">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="test">
+            <graylogHost>172.24.144.227</graylogHost>
+        </springProfile>
+
+        <springProfile name="dev">
+            <graylogHost>192.168.1.250</graylogHost>
+        </springProfile>
         <graylogPort>12201</graylogPort>
         <includeMdcData>true</includeMdcData>
         <extractStackTrace>true</extractStackTrace>

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

@@ -1552,6 +1552,7 @@
         ipii.overinflated_amount,
         ipii.receivable_supervise_premium,
         ipii.tax_point,
+        ipii.invoice_time,
         ipii.create_time,
         ipii.create_by,
         ipii.update_time,