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

Merge branch 'master' into wrq_dev

wangrq 2 сар өмнө
parent
commit
9d37ccc5eb
18 өөрчлөгдсөн 187 нэмэгдсэн , 59 устгасан
  1. 2 1
      commons/src/main/java/com/jzg/commons/constants/SystemBusPermsConstants.java
  2. 5 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/FollowCompanyFeeVO.java
  3. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementReportQueryVo.java
  4. 6 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  5. 8 0
      commons/src/main/java/com/jzg/commons/entity/system/po/SysSystemBusPermsLink.java
  6. 8 2
      commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java
  7. 20 10
      consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportReceivableDataServiceImpl.java
  8. 4 4
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HuaTaiCrawlerCacheComponent.java
  9. 19 13
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java
  10. 25 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java
  11. 5 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  12. 3 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  13. 11 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  14. 7 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersTrackServiceImpl.java
  15. 2 0
      tenant/organization/src/main/java/com/jzg/organization/controller/UserAccountController.java
  16. 44 21
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  17. 4 0
      tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml
  18. 11 3
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 2 - 1
commons/src/main/java/com/jzg/commons/constants/SystemBusPermsConstants.java

@@ -15,7 +15,8 @@ public enum SystemBusPermsConstants {
     SALESMAN_AUDIT_DEPT(3,"salesmanAuditDept","业务员审核机构"),
     SALESMAN_WITHDRAW_ACCOUNT_AUDIT_DEPT(4,"salesmanWithdrawAccountAuditDept","业务员提现账号审核机构"),
     SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT(5,"salesmanWithdrawPaymentAuditDept","业务员提现申请付款审核机构"),
-    AccountLinking(6,"accountLinking","账号互通");
+    AccountLinking(6,"accountLinking","账号互通"),
+    CLIENT_TYPE(6,"clientType","PC端还是APP端可用"),;
 
     private Integer id;
     private String code;

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

@@ -69,4 +69,9 @@ public class FollowCompanyFeeVO {
      */
     private String followId;
 
+    /**
+     * 开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
+     */
+    private String invoiceType;
+
 }

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

@@ -52,6 +52,9 @@ public class SettlementReportQueryVo extends PageRequest {
     @Schema(description = "开票类型 1 手续费  2 跟单费  3 驾意险手续费 4 驾意险跟单费")
     private List<String> invoiceTypes;
 
+    @Schema(description = "开票类型 1 手续费  2 跟单费  3 驾意险手续费 4 驾意险跟单费")
+    private String invoiceType;
+
     @Schema(description = "上级公司id")
     private String parentId;
 

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

@@ -279,6 +279,12 @@ public class QuoteEchoVo extends QuoteVo {
     @Schema(description = "订单批改信息")
     private InsOrderAdjustVo insOrderAdjustVo;
 
+    @Schema(description = "权益是否可用")
+    private String ownerRights;
+
+    @Schema(description = "权益可用范围")
+    private String clientType;
+
     @Schema(description = "权益信息")
     private InsOrderRightsInfoVo insOrderRightsInfoVo;
 

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/system/po/SysSystemBusPermsLink.java

@@ -82,6 +82,14 @@ public class SysSystemBusPermsLink implements Serializable {
                 links.add(sysSystemBusPermsLink);
             }
         }
+        if (sysSystemBusPermsVo.getClientTypeList() != null && !sysSystemBusPermsVo.getClientTypeList().isEmpty()) {
+            for (String clientTypeId : sysSystemBusPermsVo.getClientTypeList()) {
+                SysSystemBusPermsLink sysSystemBusPermsLink = new SysSystemBusPermsLink();
+                sysSystemBusPermsLink.setBusId(clientTypeId);
+                sysSystemBusPermsLink.setBusCode(SystemBusPermsConstants.CLIENT_TYPE.getCode());
+                links.add(sysSystemBusPermsLink);
+            }
+        }
         return links;
     }
 }

+ 8 - 2
commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java

@@ -80,9 +80,12 @@ public class SysSystemBusPermsVo implements Serializable {
     @Schema(description = "车主权益1:开启,0:关闭")
     private Integer ownerRights;
 
-    @Schema(description = "PC端还是APP端可用1:PC,2:APP")
+    @Schema(description = "PC端还是APP端可用1:PC,2:APP,3:PC+APP")
     private Integer clientType;
 
+    @Schema(description = "权益PC APP 回显列表")
+    private List<String> clientTypeList = new ArrayList<>();
+
     @Schema(description = "账号互通")
     private Integer accountLinking;
 
@@ -130,7 +133,10 @@ public class SysSystemBusPermsVo implements Serializable {
         this.salesmanWithdrawPaymentAuditDeptList.addAll(links.stream()
                 .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.SALESMAN_WITHDRAW_PAYMENT_AUDIT_DEPT.getCode()))
                 .map(link->link.getBusId()).collect(Collectors.toList()));
-
+        //权益PC APP 回显列表
+        this.clientTypeList.addAll(links.stream()
+                .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.CLIENT_TYPE.getCode()))
+                .map(link->link.getBusId()).collect(Collectors.toList()));
     }
 
 }

+ 20 - 10
consoleStatistics/src/main/java/com/jzg/console/service/impl/ReportReceivableDataServiceImpl.java

@@ -1,21 +1,19 @@
 package com.jzg.console.service.impl;
 
 
-import com.alibaba.excel.annotation.ExcelIgnore;
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.alibaba.excel.annotation.write.style.ColumnWidth;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.report.dto.*;
 import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
-import com.jzg.console.service.ReportCostVerificationDataService;
 import com.jzg.console.service.ReportReceivableDataService;
-import io.swagger.v3.oas.annotations.media.Schema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -26,6 +24,9 @@ import java.util.List;
  */
 @Service
 public class ReportReceivableDataServiceImpl extends ReportBaseServiceImpl implements ReportReceivableDataService {
+
+    private static final Logger log = LoggerFactory.getLogger(ReportReceivableDataServiceImpl.class);
+
     /**
      *  @version
      *  @author: hxl
@@ -34,7 +35,8 @@ public class ReportReceivableDataServiceImpl extends ReportBaseServiceImpl imple
      */
     @Override
     public List<?> getListByParams(ReportSearchCommonVo reportSearchCommonVo){
-        return getList();
+        log.info("数据报表-财务数据-应收. reportSearchCommonVo=[{}]", JSONUtil.toJsonStr(reportSearchCommonVo));
+        return getList(reportSearchCommonVo);
     }
     @Override
     public IPage<?> getPageListByParams(ReportSearchCommonVo reportSearchCommonVo) {
@@ -48,7 +50,7 @@ public class ReportReceivableDataServiceImpl extends ReportBaseServiceImpl imple
      */
     @Override
     public void downloadListByParams(ReportSearchCommonVo reportSearchCommonVo) {
-        List<ReportReceivableDataDto> list = getList();
+        List<ReportReceivableDataDto> list = getList(reportSearchCommonVo);
         upLoadFile(reportSearchCommonVo, ReportReceivableDataDto.class,list,"财务数据-应收-列表导出-"+ reportSearchCommonVo.getUserId());
     }
     /**
@@ -83,8 +85,16 @@ public class ReportReceivableDataServiceImpl extends ReportBaseServiceImpl imple
      *  @Date: 2025/9/24 10:42
      *  @Description:  模拟数据
      */
-    public List<ReportReceivableDataDto>  getList(){
+    public List<ReportReceivableDataDto>  getList(ReportSearchCommonVo param){
+        log.info("数据报表-财务数据-应收。 param=[{}]", JSONUtil.toJsonStr(param));
         List<ReportReceivableDataDto> list =new ArrayList<>();
+        // 和财务沟通过, 开票的时候,一个月的进行开票,不进行跨月开票。
+        List<String> years = param.getYear();
+        String year="";
+        if(CollUtil.isNotEmpty(years)){
+            year = years.get(0);
+        }
+
         ReportReceivableDataDto reportReceivableDataDto = ReportReceivableDataDto.builder()
                 .yearAndMonthTime("2023-10").accountsReceivableMoney(new BigDecimal(100))
                 .uninvoicedMoney(new BigDecimal(100)).invoicedMoney(new BigDecimal(100))

+ 4 - 4
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HuaTaiCrawlerCacheComponent.java

@@ -39,7 +39,7 @@ public class HuaTaiCrawlerCacheComponent {
         authorizationMap.put(COOKIE, cookie);
         RMap<Object, Object> map = redissonClient.getMap(HUATAI_COOKIE);
         map.putAll(authorizationMap);
-        map.expire(Duration.ofHours(2L));
+        map.expire(Duration.ofHours(3L));
     }
 
     public void cacheGsInfo(String gsinfo) {
@@ -48,7 +48,7 @@ public class HuaTaiCrawlerCacheComponent {
         authorizationMap.put(GSINFO, gsinfo);
         RMap<Object, Object> map = redissonClient.getMap(HUATAI_GSINFO);
         map.putAll(authorizationMap);
-        map.expire(Duration.ofHours(2L));
+        map.expire(Duration.ofHours(3L));
     }
 
     public void cacheComCode(String comcode) {
@@ -57,7 +57,7 @@ public class HuaTaiCrawlerCacheComponent {
         authorizationMap.put(COMCODE, comcode);
         RMap<Object, Object> map = redissonClient.getMap(HUATAI_COMCODE);
         map.putAll(authorizationMap);
-        map.expire(Duration.ofHours(2L));
+        map.expire(Duration.ofHours(3L));
     }
 
     public void cacheYingXiangUploaded(String yx) {
@@ -66,7 +66,7 @@ public class HuaTaiCrawlerCacheComponent {
         authorizationMap.put(YINGXIANG_UPLOADED, yx);
         RMap<Object, Object> map = redissonClient.getMap(HUATAI_YINGXIANG_UPLOADED);
         map.putAll(authorizationMap);
-        map.expire(Duration.ofHours(2L));
+        map.expire(Duration.ofHours(3L));
     }
 
     public String getCookie() {

+ 19 - 13
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java

@@ -123,6 +123,13 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private final PlatformClient platformClient;
     private final CookieUtils cookieUtils;
     private static final ObjectMapper MAPPER = new ObjectMapper();
+    static {
+        // 初始化时统一配置所有 Feature,避免运行时多线程并发配置导致不稳定
+        MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        MAPPER.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+        MAPPER.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+    }
 
     // ====================== 登录 ======================
     @Override public void login(LoginBase loginBase) { }
@@ -239,7 +246,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         // 报价前预处理-保存车辆信息、过滤车型等处理
         PreResult pre = null;
         try {
-            pre = prepareQuote(attr, mmap, car, modelcodexh, cookie, quotationNo, xbResult);
+            pre = prepareQuote(attr, mmap, car, modelcodexh, cache.getCookie(), quotationNo, xbResult);
         } catch (Exception e) {
             log.error("报价失败:保存车辆信息、过滤车型异常,{}",e.getMessage());
             throw new SystemException(e.getMessage());
@@ -247,7 +254,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         // 报价
         CoreResult core = null;
         try {
-            core = executeQuote(quoteVo, quotationNo, dto, cookie, pre, gsInfo, attr);
+            core = executeQuote(quoteVo, quotationNo, dto, cache.getCookie(), pre, gsInfo, attr);
         } catch (Exception e) {
             log.error("报价失败,{}",e.getMessage());
             throw new SystemException(e.getMessage());
@@ -341,9 +348,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         //车型查询 -- renewCarInfo
         String carData = executeCarModelCodexhQuery(carDTO, car, cookie, quotationNo);
         // 核心:关闭「未知字段抛出异常」,优先级 > 类注解
-        MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        //MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
         // 可选:兼容空字符串、大小写字段(对接第三方接口常用)
-        MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        //MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
         Map<String, Object> rootMap = MAPPER.readValue(carData, new TypeReference<Map<String, Object>>() {});
         String datalistStr = (String) rootMap.get("datalist");
         String datalist2Str = (String) rootMap.get("datalist2");
@@ -371,6 +378,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
     private void executeSaveCarQuery(HtCrawlerCarQueryResponse.DataDTO.DataListDTO carDTO,
                                      HtCrawlerCarQueryResponse.DataDTO dataDTO, CarInfoVo car, String cookie) throws JsonProcessingException {
+        if (dataDTO.getDatalist2() == null || dataDTO.getDatalist2().isEmpty()) {
+            throw new SystemException("车辆信息不完整");
+        }
         String aa = URLEncoder.encode(MAPPER.writeValueAsString(carDTO), StandardCharsets.UTF_8);
         String bb = URLEncoder.encode(MAPPER.writeValueAsString(dataDTO.getDatalist2().get(0)), StandardCharsets.UTF_8);
 
@@ -796,10 +806,6 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         //cookie还在,但服务器已断开连接,需重新连接
         if(res.contains("<html>")) {
             refreshLogin(buildLoginDTO(attr));
-            Map<String, Object> m = login(buildLoginDTO(attr));
-            String cookie = (String) m.get("cookie");
-            req.getHeaders().remove(HtRequestConstant.COOKIE);
-            req.getHeaders().add(HtRequestConstant.COOKIE, cookie);
             return underwriting(vo);
         }
         if (res.contains("起保时间不正确")) {
@@ -809,12 +815,12 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         Map<String, Object> map = new HashMap<>();
         try {
             // 忽略未知字段
-            MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            // MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
             // 空字符串转null
-            MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+            // MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
             // 允许单引号、宽松JSON格式(第三方不规范返回必备)
-            MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-            MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+            // MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+            // MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
             // 允许换行符、回车符存在于字符串值中
             // MAPPER.configure(JsonParser.Feature.ALLOW_UNESCAPED_CONTROL_CHARS, true);
 
@@ -927,7 +933,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private void doLoginCookie(AttributionInformationVo attr) {
         if (StringUtils.isBlank(req.getCookie())) {
             Map<String, Object> m = login(buildLoginDTO(attr));
-            String cookie = (String) m.get("cookie");
+            String cookie = (String) m.get("cookies");
             req.getHeaders().remove(HtRequestConstant.COOKIE);
             req.getHeaders().add(HtRequestConstant.COOKIE, cookie);
         }

+ 25 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java

@@ -195,6 +195,16 @@ public class OrderOperationLogAspect {
             track.setOptContent(log.description());
             track.setChangeAfter(JSONUtil.toJsonStr(vo));
             track.setResult(JSONUtil.toJsonStr(result));
+            InsOrders insOrders = orderService.getById(orderNo);
+            if(insOrders != null){
+                InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
+                track.setLicenseNo(carInfo.getLicenseNo());
+                track.setCompanyId(insOrders.getCompanyId());
+                // track.setResult(result.getMsg());
+            }else{
+                track.setResult("要修改的订单不存在");
+            }
+            track.setStatus(1);
             track.setOrderNo(orderNo);
             traceService.save(track);
 
@@ -209,13 +219,25 @@ public class OrderOperationLogAspect {
      */
     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(result));
-        track.setChangeAfter(JSONUtil.toJsonStr(vo));
-        track.setOrderNo(vo.getOrderNo());
+        track.setResult(JSONUtil.toJsonStr(vo));
+        InsOrders insOrders = orderService.getById(orderNo);
+        if(insOrders != null){
+            InsOrdersCarInfo carInfo = carInfoService.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));
         traceService.save(track);
     }

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

@@ -357,6 +357,7 @@ public class QuoteVerificationAspect {
 
         // modify by lipf ,2026年6月17日15:30:54 是否除以1.06,不再根据平台协议还是私有协议进行判断,而是根据协议的是否含税来进行判断
         BigDecimal taxFactor = insOrdersService.obtainTaxRate(insOrders.getId());
+        log.info("订单[{}]是否属于补录订单.[{}]",Objects.toString(insOrders.getId(),insOrders.getInsOrderNo()), isrecordByLeader);
         // 6. 统一处理各险种的费用计算(应收、应付、各类费用)
         processInsuranceType(
                 insOrdersCosts.getJqPremium(), jqCostType, jqEntranceFeeRatio, jqFollowRatio, taxFactor,
@@ -477,6 +478,10 @@ public class QuoteVerificationAspect {
         if(isrecordByLeader){
             // 如果是代客录单,出口比例减去一个百分比,也就是 0.01 2026年7月11日09:30:09
             exportPercent = BigDecimalUtil.subtract(exportPercent, new BigDecimal("0.01"));
+            // 代客录单-1时,出口不够减的情况直接为0 add by lipf 2026年7月14日09:06:50
+            if(BigDecimal.ZERO.compareTo(exportPercent) <0){
+                exportPercent = new BigDecimal("0");
+            }
         }
 
         // 去税保费金额

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

@@ -494,6 +494,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
             // 更新用户账户
             feeOrders = feeOrdersService.getById(param.getOrderNo());
+            log.info("根据订单查询出的费用信息如下:feeOrders=[{}]", JSONUtil.toJsonStr(feeOrders));
             HttpResult<SysUser> sysUserResult = orgClient.getUserOnlyIdByMobile(orders.getRealQuoteUserId());
             SysUser ywySysUser = sysUserResult.getData();
             HttpResult<SysUserAccount> result = orgClient.accountGet(ywySysUser.getId());
@@ -517,6 +518,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             }
             BigDecimal sumAmountUnpaid = userAccount.getSumAmountUnpaid();
             BigDecimal amount = feeOrders.getTotalPayablePremium();
+            log.info("费用审核通过。 amount=[{}].feeOrders=[{}]",amount, JSONUtil.toJsonStr(feeOrders));
             userAccount.setSumAmount(BigDecimalUtil.add(amount,userAccount.getSumAmount()));
             userAccount.setSumAmountUnpaid(BigDecimalUtil.add(amount, sumAmountUnpaid));
             orgClient.saveOrUpdate(userAccount);
@@ -531,6 +533,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             exportChangeLog.setIsDelete(0);
             exportChangeLog.setRemark("保单费用");
             exportChangeLog.setAmountBefore(sumAmountUnpaid);
+            log.info("准备调用orgClient保存账号变更明细:exportChangeLog=[{}]", JSONUtil.toJsonStr(exportChangeLog));
             orgClient.addUserAccountChangeLog(exportChangeLog);
 
             // 进入应收表

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

@@ -42,6 +42,7 @@ import com.jzg.commons.entity.quote.vo.orders.InsOrdersAdd;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersEnd;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
+import com.jzg.commons.entity.system.vo.SysSystemBusPermsVo;
 import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.ServiceException;
 import com.jzg.commons.exception.SystemException;
@@ -52,6 +53,7 @@ import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.utils.BeanCopyUtil;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
 import com.jzg.quotation.summary.aop.aspect.QuoteVerificationAspect;
+import com.jzg.quotation.summary.client.EsmInsCompanyClient;
 import com.jzg.quotation.summary.consumer.template.OrderMessageTemplate;
 import com.jzg.quotation.summary.entity.bo.DataValueBo;
 import com.jzg.quotation.summary.entity.vo.*;
@@ -118,6 +120,8 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     private final PlatformClient platformClient;
 
+    private final EsmInsCompanyClient esmInsCompanyClient;
+
     private final BaseController baseController;
 
     private final InsOrderAdjustInfoService orderAdjustInfoService;
@@ -1405,7 +1409,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             resultVo.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
             resultVo.setInsFeeOrders(new InsFeeOrdersVo(insFeeOrders));
         }
-        //权益信息
+        // 权益权限
+        HttpResult<SysSystemBusPermsVo> sysSystemBusPermsVoHttpResult = esmInsCompanyClient.getBusPerms(baseController.getSystemCode());
+        if (sysSystemBusPermsVoHttpResult.getCode() == 200) {
+            resultVo.setOwnerRights(String.valueOf(sysSystemBusPermsVoHttpResult.getData().getOwnerRights()));
+            resultVo.setClientType(String.valueOf(sysSystemBusPermsVoHttpResult.getData().getClientType()));
+        }
+        // 权益信息
         InsOrderRightsInfoVo insOrderRightsInfoVo = insOrderRightsInfoService.queryByOrderNo(ordersNo);
         resultVo.setInsOrderRightsInfoVo(insOrderRightsInfoVo);
         log.info("根据订单ordersNo=[{}]获取到订单的详细信息resultVo=[{}]", ordersNo, JSONUtil.toJsonStr(resultVo));

+ 7 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersTrackServiceImpl.java

@@ -1,12 +1,15 @@
 package com.jzg.quotation.summary.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.entity.dto.OrdersTrackParam;
 import com.jzg.commons.entity.orders.po.InsOrdersTrack;
 import com.jzg.commons.entity.vo.OrdersTrackVo;
 import com.jzg.quotation.summary.mapper.InsOrdersTrackMapper;
 import com.jzg.quotation.summary.service.InsOrdersTrackService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -20,8 +23,11 @@ import java.util.List;
 public class InsOrdersTrackServiceImpl extends ServiceImpl<InsOrdersTrackMapper, InsOrdersTrack>
     implements InsOrdersTrackService {
 
+    private static final Logger log = LoggerFactory.getLogger(InsOrdersTrackServiceImpl.class);
+
     @Override
     public List<OrdersTrackVo> list(OrdersTrackParam param) {
+        log.info("查询订单轨迹:param=[{}]", JSONUtil.toJsonStr(param));
         List<OrdersTrackVo> ordersTrackVos = baseMapper.queryList(param);
         return ordersTrackVos;
     }

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

@@ -1,6 +1,7 @@
 package com.jzg.organization.controller;
 
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
@@ -114,6 +115,7 @@ public class UserAccountController {
     @PostMapping("/addUserAccountChangeLog")
     public HttpResult<String> addUserAccountChangeLog(@RequestBody SysUserAccountChangeLog changeLog){
         try{
+            log.info("添加用户钱包账户记录。 changeLog=[{}]", JSONUtil.toJsonStr(changeLog));
            boolean save = sysUserAccountIncomeLogService.save(changeLog);
             if(save){
                 return HttpResult.ok("保存业务员账号明细成功");

+ 44 - 21
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -827,12 +827,14 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             String partnerCompanyId = splitArr[0];
             String year = splitArr[1];
             String month = splitArr[2];
+            String invoiceType = splitArr[3];
             List<FollowCompanyFeeVO> voList = entry.getValue();
 
             FollowCompanyFeeVO vo = new FollowCompanyFeeVO();
             vo.setPartnerCompanyId(partnerCompanyId);
             vo.setYear(year);
             vo.setMonth(month);
+            vo.setInvoiceType(invoiceType);
             vo.setCompanyName(getCompanyName(partnerCompanyId, companyMap));
 
             // 汇总当前分组所有followId、settlementId
@@ -904,9 +906,16 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     }
 
     /**
-     * 构建分组Key:partnerCompanyId_year_month
+     * 构建分组Key:partnerCompanyId_year_month_invoiceType
      */
     private String buildGroupKey(FollowCompanyFeeVO vo) {
+        return StrUtil.format("{}_{}_{}_{}", vo.getPartnerCompanyId(), vo.getYear(), vo.getMonth(), vo.getInvoiceType());
+    }
+
+    /**
+     * 构建分组Key:partnerCompanyId_year_month
+     */
+    private String buildFillGroupKey(FollowCompanyFeeVO vo) {
         return StrUtil.format("{}_{}_{}", vo.getPartnerCompanyId(), vo.getYear(), vo.getMonth());
     }
 
@@ -1023,7 +1032,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         // 现有结果集Key缓存
         Map<String, FollowCompanyFeeVO> existVoMap = resultList.stream()
                 .collect(Collectors.toMap(
-                        this::buildGroupKey,
+                        this::buildFillGroupKey,
                         Function.identity(),
                         (oldVal, newVal) -> oldVal
                 ));
@@ -3437,7 +3446,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      * @return PtlAgreementCostRatioVo 返回计算后的协议成本比例配置对象,包含各险种的入口比例、手续费比例、跟单费比例等
      */
     private PtlAgreementCostRatioVo calRatio(InsPlyIncome insPlyIncome, BatchModifyVo batchModifyVo) {
-        log.info("batchModifyVo.转换百分比之前的数据=【{}】", JSONUtil.toJsonStr(batchModifyVo));
+        log.info("batchModifyVo.转换百分比之前的数据=[{}]", JSONUtil.toJsonStr(batchModifyVo));
         PtlAgreementCostRatioVo vo = new PtlAgreementCostRatioVo();
         vo.setOrderNo(insPlyIncome.getOrderNo());
 
@@ -3445,7 +3454,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 //        vo.setJqAdditionalRatio(insPlyIncome.getJqAdditionalRatio());
 //        vo.setSyAdditionalRatio(insPlyIncome.getSyAdditionalRatio());
 //        vo.setJyAdditionalRatio(insPlyIncome.getJyAdditionalRatio());
-
+        vo.setJyCommissionRatio(batchModifyVo.getJySuperviseCostsProportion());
+        vo.setJyFollowRatio(batchModifyVo.getJyOtherCostsProportion());
         this.calCommissionAndFollowAndInlet(vo, batchModifyVo, insPlyIncome);
 
         // 出口比例
@@ -4525,12 +4535,16 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                         .map(InsPlyIncomeInvoiceSettlement::getActualReceivedAmount)
                         .filter(Objects::nonNull)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
-                BigDecimal settlementPaymentDifference = insPlyIncomeInvoiceSettlements.stream()
-                        .map(InsPlyIncomeInvoiceSettlement::getSettlementPaymentDifference)
-                        .filter(Objects::nonNull)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+//                BigDecimal settlementPaymentDifference = insPlyIncomeInvoiceSettlements.stream()
+//                        .map(InsPlyIncomeInvoiceSettlement::getSettlementPaymentDifference)
+//                        .filter(Objects::nonNull)
+//                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+
                 BigDecimal receivableSupervisePremium = action.getReceivableSupervisePremium()  != null ? action.getReceivableSupervisePremium(): BigDecimal.ZERO;
+
 //                BigDecimal overinflatedAmount = action.getOverinflatedAmount() != null? action.getOverinflatedAmount(): BigDecimal.ZERO;
+                // 回款差计算逻辑调整 2026年7月14日09:29:08
+                BigDecimal settlementPaymentDifference = BigDecimalUtil.subtract(settlementAmount,receivableSupervisePremium);
                 // 待结算金额 = 开票金额 - 已收金额
                 BigDecimal remainSettlementAmount = receivableSupervisePremium.subtract(BigDecimalUtil.add(settlementAmount, settlementPaymentDifference));
                 // 设置已结算的金额
@@ -4543,6 +4557,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 action.setRemainSettlementAmount( remainSettlementAmount);
                 action.setCompanyAllName(allCompanyHierarchyPaths.get(Objects.toString(action.getCompanyId(),"")));
                 action.setSettlementStatus(settlementStatusName);
+
                 // 回款差额
                 action.setSettlementPaymentDifference(settlementPaymentDifference);
 
@@ -5322,24 +5337,32 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         // 1. 先将有数据的保险公司进行汇总
         // 累计应收金额, 应收手续费(手续费)
         List<CompanySuperviseSettlementReportDto> allCompaniesIncomeDatas = baseMapper.queryCumulativeAccountsReceivable(systemCode, queryVo);
-        
-        // 车险
-        if("10".equals(queryVo.getAccountsReceivable())){
-            // 默认情况下,superviseFee 得到的就是车险的手续费
-            allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().toList();
-        }else if("20".equals(queryVo.getAccountsReceivable())){
-            allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().peek(action->{
-                // 统计非车的手续费
-              action.setSuperviseFee(action.getSuperviseFee4Other());
-            }).toList();
-        }else if(StrUtil.isEmpty(queryVo.getAccountsReceivable())){
-                // 统计总的手续费
+        // 结算状态在上面的sql进行过筛选了,后面就不再筛选了
+        queryVo.setStatus(null);
+        if("20".equals(queryVo.getAccountsReceivable())){
             allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().peek(action->{
                 // 统计非车的手续费
-                action.setSuperviseFee(action.getTotalReceivable());
+                action.setSuperviseFee(action.getSuperviseFee4Other());
             }).toList();
         }
 
+        // 车险
+//        if("10".equals(queryVo.getAccountsReceivable())){
+//            // 默认情况下,superviseFee 得到的就是车险的手续费
+//            allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().toList();
+//        }else if("20".equals(queryVo.getAccountsReceivable())){
+//            allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().peek(action->{
+//                // 统计非车的手续费
+//              action.setSuperviseFee(action.getSuperviseFee4Other());
+//            }).toList();
+//        }else if(StrUtil.isEmpty(queryVo.getAccountsReceivable())){
+//                // 统计总的手续费
+////            allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().peek(action->{
+////                // 统计非车的手续费
+////                action.setSuperviseFee(action.getTotalReceivable());
+////            }).toList();
+//        }
+
         // for test, 查看一家公司的数据,将不可变对象变成 可变对象
 //        allCompaniesIncomeDatas = allCompaniesIncomeDatas.stream().filter(action-> "1738811735599338932".equals(action.getCompanyId())).toList();
 //        allCompaniesIncomeDatas = new ArrayList<>(allCompaniesIncomeDatas);

+ 4 - 0
tenant/organization/src/main/resources/mapper/InsFeeFollowOrderMapper.xml

@@ -51,6 +51,7 @@
         ffo.id AS followId,
         ffo.year,
         ffo.month,
+        ffo.invoice_type,
         inv.id AS invoiceId,
         sett.id AS settlementId
         FROM ins_fee_follow_order ffo
@@ -91,6 +92,9 @@
             <if test="query.settlementStartTime != null and query.settlementStartTime != '' and query.settlementEndTime != null and query.settlementEndTime != ''">
                 AND sett.create_time BETWEEN #{query.settlementStartTime} AND #{query.settlementEndTime}
             </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND ffo.invoice_type = #{query.invoiceType}
+            </if>
         </where>
     </select>
 

+ 11 - 3
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -1552,7 +1552,7 @@
         eic.name_simple as companyNameSimple,
         sum( ipiis.actual_received_amount ) AS actual_received_amount,
         ipii.status,
-        ipii.payment_reason,
+        GROUP_CONCAT(DISTINCT iffo.falsely_increased_reason SEPARATOR ',') as paymentReason,
         GROUP_CONCAT(DISTINCT iffo.year SEPARATOR ',') AS year,
         GROUP_CONCAT(DISTINCT iffo.month SEPARATOR ',') AS month,
         iffo.partner_company_id,
@@ -1930,8 +1930,8 @@
         ipi.company_id,
         ipi.system_code,
         sum(COALESCE(ipi.jq_receivable_premium, 0)+ COALESCE(ipi.sy_receivable_premium ,0)+coalesce(ipi.jy_receivable_premium ,0 )) as totalReceivable,
-        sum(COALESCE(ipi.jq_other_costs_premiums, 0)+ COALESCE(ipi.sy_other_costs_premiums,0)+coalesce(ipi.jy_other_costs_premiums,0 )) as superviseFee4Other ,
-        sum(COALESCE(ipi.jq_supervise_costs_premiums, 0)+ COALESCE(ipi.sy_supervise_costs_premiums,0)+coalesce(ipi.jy_supervise_costs_premiums,0 )) as superviseFee
+        sum(coalesce(ipi.jy_supervise_costs_premiums, 0)) AS superviseFee4Other,
+        sum(COALESCE(ipi.jq_supervise_costs_premiums, 0) + COALESCE(ipi.sy_supervise_costs_premiums,0) ) AS superviseFee
         from
         ins_ply_income ipi
         left join esm_ins_company eic on eic.id = ipi.company_id AND eic.is_delete = 0
@@ -1941,6 +1941,14 @@
             <if test="vo.agreementType != null and vo.agreementType != ''">
                 AND ipi.agreement_type = #{vo.agreementType}
             </if>
+            <if test="vo.status != null">
+                <if test="vo.status == 1">
+                    AND ipi.settlement_time IS NOT NULL
+                </if>
+                <if test="vo.status == 0">
+                    AND ipi.settlement_time IS NULL
+                </if>
+            </if>
             <if test="vo.signingStartTime != null and vo.signingStartTime != '' and vo.signingEndTime != null and vo.signingEndTime != ''">
                 AND DATE(ipi.signing_time) between #{vo.signingStartTime} and #{vo.signingEndTime}
             </if>