Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

lixiaolong před 1 měsícem
rodič
revize
b5d08e6f0f

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostCopyParam.java

@@ -20,4 +20,10 @@ public class PtlAgreementCostCopyParam extends PageRequest {
     @Schema(description = "承保规则id")
     @Schema(description = "承保规则id")
     private String coverRuleId;
     private String coverRuleId;
 
 
+    @Schema(description = "险别类型")
+    private String productName;
+
+    @Schema(description = "险别类id")
+    private String productId;
+
 }
 }

+ 27 - 1
consoleStatistics/src/main/java/com/jzg/console/quotationReport/controller/QuotationReportController.java

@@ -1,5 +1,6 @@
 package com.jzg.console.quotationReport.controller;
 package com.jzg.console.quotationReport.controller;
 
 
+import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
 import com.jzg.commons.entity.report.vo.ReportSearchCommonVo;
 import com.jzg.console.quotationReport.service.QuotationReportService;
 import com.jzg.console.quotationReport.service.QuotationReportService;
@@ -18,12 +19,13 @@ import org.springframework.web.bind.annotation.RestController;
 @RequiredArgsConstructor
 @RequiredArgsConstructor
 @RequestMapping("/console/quotationReport")
 @RequestMapping("/console/quotationReport")
 @Tag(name = "报价数据-报价订单")
 @Tag(name = "报价数据-报价订单")
-public class QuotationReportController {
+public class QuotationReportController extends BaseController {
     private final QuotationReportService quotationReportService;
     private final QuotationReportService quotationReportService;
 
 
     @PostMapping("/quotation/page")
     @PostMapping("/quotation/page")
     @Operation(summary = "报价订单报表分页查询")
     @Operation(summary = "报价订单报表分页查询")
     public HttpResult<?> quotationPage(@RequestBody ReportSearchCommonVo q) {
     public HttpResult<?> quotationPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
         return HttpResult.ok(quotationReportService.quotationPage(q));
         return HttpResult.ok(quotationReportService.quotationPage(q));
     }
     }
 
 
@@ -31,6 +33,7 @@ public class QuotationReportController {
     @PostMapping("/quotation/export")
     @PostMapping("/quotation/export")
     @Operation(summary = "报价订单报表导出")
     @Operation(summary = "报价订单报表导出")
     public HttpResult<?> quotationExport(@RequestBody ReportSearchCommonVo q) {
     public HttpResult<?> quotationExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
         quotationReportService.quotationExport(q);
         quotationReportService.quotationExport(q);
         return HttpResult.ok("导出任务已提交,请在导出中心查看");
         return HttpResult.ok("导出任务已提交,请在导出中心查看");
     }
     }
@@ -39,14 +42,37 @@ public class QuotationReportController {
     @PostMapping("/company/page")
     @PostMapping("/company/page")
     @Operation(summary = "保险公司分页查询")
     @Operation(summary = "保险公司分页查询")
     public HttpResult<?> companyPage(@RequestBody ReportSearchCommonVo q) {
     public HttpResult<?> companyPage(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
         return HttpResult.ok(quotationReportService.companyPage(q));
         return HttpResult.ok(quotationReportService.companyPage(q));
     }
     }
 
 
     @PostMapping("/company/export")
     @PostMapping("/company/export")
     @Operation(summary = "保险公司报表导出")
     @Operation(summary = "保险公司报表导出")
     public HttpResult<?> companyExport(@RequestBody ReportSearchCommonVo q) {
     public HttpResult<?> companyExport(@RequestBody ReportSearchCommonVo q) {
+        q.setSystemCode(getUserSystemCode());
         quotationReportService.companyExport(q);
         quotationReportService.companyExport(q);
         return HttpResult.ok("导出任务已提交,请在导出中心查看");
         return HttpResult.ok("导出任务已提交,请在导出中心查看");
     }
     }
 
 
+    @PostMapping("/salesman/page")
+    @Operation(summary = "业务员/渠道/电销/ 分页查询")
+    public HttpResult<?> salesmanPage(@RequestBody ReportSearchCommonVo q) {
+        if(q.getSalesmanTypes() == null ||q.getSalesmanTypes().isEmpty()){
+            return HttpResult.error("SalesmanTypes 业务员类型参数错误!");
+        }
+        q.setSystemCode(getUserSystemCode());
+        return HttpResult.ok(quotationReportService.salesmanPage(q));
+    }
+
+    @PostMapping("/salesman/export")
+    @Operation(summary = "保险公司报表导出")
+    public HttpResult<?> salesmanExport(@RequestBody ReportSearchCommonVo q) {
+        if(q.getSalesmanTypes() == null ||q.getSalesmanTypes().isEmpty()){
+            return HttpResult.error("SalesmanTypes 业务员类型参数错误!");
+        }
+        q.setSystemCode(getUserSystemCode());
+        quotationReportService.salesmanExport(q);
+        return HttpResult.ok("导出任务已提交,请在导出中心查看");
+    }
+
 }
 }

+ 4 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/mapper/QuotationReportMapper.java

@@ -21,4 +21,8 @@ public interface QuotationReportMapper {
     IPage<ReportCompanyQuotationDataDto> companyPage(Page<ReportCompanyQuotationDataDto> p, @Param("q")ReportSearchCommonVo q);
     IPage<ReportCompanyQuotationDataDto> companyPage(Page<ReportCompanyQuotationDataDto> p, @Param("q")ReportSearchCommonVo q);
     @IgnoreTenant
     @IgnoreTenant
     List<ReportCompanyQuotationDataDto> companyExport( @Param("q")ReportSearchCommonVo q);
     List<ReportCompanyQuotationDataDto> companyExport( @Param("q")ReportSearchCommonVo q);
+    @IgnoreTenant
+    IPage<ReportCompanyQuotationDataDto> salesmanPage(Page<Object> objectPage, ReportSearchCommonVo q);
+    @IgnoreTenant
+    List<ReportCompanyQuotationDataDto> salesmanExport( @Param("q")ReportSearchCommonVo q);
 }
 }

+ 4 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/QuotationReportService.java

@@ -18,4 +18,8 @@ public interface QuotationReportService {
     IPage<ReportCompanyQuotationDataDto> companyPage(ReportSearchCommonVo q);
     IPage<ReportCompanyQuotationDataDto> companyPage(ReportSearchCommonVo q);
 
 
     void companyExport(ReportSearchCommonVo q);
     void companyExport(ReportSearchCommonVo q);
+
+    IPage<ReportCompanyQuotationDataDto> salesmanPage(ReportSearchCommonVo q);
+
+    void salesmanExport(ReportSearchCommonVo q);
 }
 }

+ 21 - 0
consoleStatistics/src/main/java/com/jzg/console/quotationReport/service/impl/QuotationReportServiceImpl.java

@@ -13,6 +13,8 @@ import com.jzg.console.quotationReport.service.QuotationReportService;
 import com.jzg.console.service.impl.ReportBaseServiceImpl;
 import com.jzg.console.service.impl.ReportBaseServiceImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 /**
 /**
  * 保险公司业务报表独立实现。
  * 保险公司业务报表独立实现。
  */
  */
@@ -47,4 +49,23 @@ public class QuotationReportServiceImpl extends ReportBaseServiceImpl implements
     public void  companyExport(ReportSearchCommonVo q) {
     public void  companyExport(ReportSearchCommonVo q) {
         upLoadFile(q, ReportCompanyQuotationDataDto.class, mapper.companyExport(q), "报价数据-保险公司-列表-" + q.getUserId());
         upLoadFile(q, ReportCompanyQuotationDataDto.class, mapper.companyExport(q), "报价数据-保险公司-列表-" + q.getUserId());
     }
     }
+
+    @Override
+    public IPage<ReportCompanyQuotationDataDto> salesmanPage(ReportSearchCommonVo q) {
+        return mapper.salesmanPage(pageOf(q), q);
+    }
+
+    @Override
+    public void salesmanExport(ReportSearchCommonVo q) {
+        List<String> salesmanTypes = q.getSalesmanTypes();
+        String upLoadName = "";
+        if(salesmanTypes.get(0).equals("6")){
+            upLoadName = "业务员";
+        }else if(salesmanTypes.get(0).equals("7")){
+            upLoadName = "渠道";
+        }else if(salesmanTypes.get(0).equals("8")){
+            upLoadName = "电销";
+        }
+        upLoadFile(q, ReportCompanyQuotationDataDto.class, mapper.salesmanExport(q), "报价数据-"+upLoadName+"-列表-" + q.getUserId());
+    }
 }
 }

+ 98 - 0
consoleStatistics/src/main/resources/mapper/QuotationReportMapper.xml

@@ -16,8 +16,14 @@
             left join ins_fee_orders ifo on o.id = ifo.order_no
             left join ins_fee_orders ifo on o.id = ifo.order_no
             LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
             LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
             LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
             LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+            LEFT JOIN sys_user su on su.mobile = o.real_quote_user_id
+            LEFT JOIN sys_user_jzg_info suji on su.id = suji.user_id and suji.system_code = #{q.systemCode}
             WHERE o.is_delete = 0
             WHERE o.is_delete = 0
 
 
+              <if test="q != null and q.salesmanTypes != null and q.salesmanTypes.size() &gt; 0">
+                    AND suji.type_attr IN
+                    <foreach collection="q.salesmanTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
+              </if>
               <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
               <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() &gt; 0">
                     AND a.partner_company_id IN
                     AND a.partner_company_id IN
                     <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
                     <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
@@ -259,4 +265,96 @@
 
 
 
 
     </select>
     </select>
+
+    <select id="salesmanPage" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
+        <include refid="base"/>,
+        company_stat AS (
+        SELECT
+        o.company_id AS companyId,
+        o.company_name AS companyName,
+        COALESCE(a.partner_company_id,'') partnerCompanyId,
+        COALESCE(pc.name_simple,'') partnerCompanyName,
+        COUNT(o.id) AS quoteCountNum,
+        SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
+        SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
+        SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END)  AS total_quote_second,
+        COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
+        SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
+        SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
+        SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
+        SUM(CASE WHEN o.order_status = 5  THEN 1 ELSE 0 END) AS dealOrderNum,
+        SUM(COUNT(*)) OVER () AS totalQuoteNum
+        FROM orders o
+        LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+        GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
+        )
+        SELECT
+        companyId,
+        companyName,
+        partnerCompanyId,
+        partnerCompanyName,
+        quoteCountNum,
+        ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
+        quoteSuccessNum,
+        quoteFailNum,
+        CASE WHEN valid_quote_count = 0 THEN 0.00
+        ELSE ROUND(total_quote_second / valid_quote_count, 2)
+        END AS avgQuoteTime,
+        waitAuditNum,
+        staffProcessNum,
+        underwritPassNum,
+        underwritRejectNum,
+        CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
+        dealOrderNum,
+        CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
+        FROM company_stat
+    </select>
+    <select id="salesmanExport" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
+        <include refid="base"/>,
+        company_stat AS (
+        SELECT
+        o.company_id AS companyId,
+        o.company_name AS companyName,
+        COALESCE(a.partner_company_id,'') partnerCompanyId,
+        COALESCE(pc.name_simple,'') partnerCompanyName,
+        COUNT(o.id) AS quoteCountNum,
+        SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
+        SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
+        SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END)  AS total_quote_second,
+        COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
+        SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
+        SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
+        SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
+        SUM(CASE WHEN o.order_status = 5  THEN 1 ELSE 0 END) AS dealOrderNum,
+        SUM(COUNT(*)) OVER () AS totalQuoteNum
+        FROM orders o
+        LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
+        LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
+        GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
+        )
+        SELECT
+        companyId,
+        companyName,
+        partnerCompanyId,
+        partnerCompanyName,
+        quoteCountNum,
+        ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
+        quoteSuccessNum,
+        quoteFailNum,
+        CASE WHEN valid_quote_count = 0 THEN 0.00
+        ELSE ROUND(total_quote_second / valid_quote_count, 2)
+        END AS avgQuoteTime,
+        waitAuditNum,
+        staffProcessNum,
+        underwritPassNum,
+        underwritRejectNum,
+        CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
+        dealOrderNum,
+        CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
+        FROM company_stat
+    </select>
+
 </mapper>
 </mapper>

+ 8 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/build/GuoRenCrawlerQuoteResultsVoBuild.java

@@ -22,7 +22,7 @@ import java.util.stream.Collectors;
  */
  */
 public final class GuoRenCrawlerQuoteResultsVoBuild {
 public final class GuoRenCrawlerQuoteResultsVoBuild {
 
 
-    public static QuoteResultsVo buildQuoteResultsVo(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumData calculationPremium, GuoRenCrawlerProposalNoSaveData proposalNoSave) {
+    public static QuoteResultsVo buildQuoteResultsVo(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumData calculationPremium, GuoRenCrawlerProposalNoSaveData proposalNoSave, String duplicateMessage) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
         quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
 
 
@@ -92,6 +92,13 @@ public final class GuoRenCrawlerQuoteResultsVoBuild {
                     .fluentPut("scoreKey", "syScore")
                     .fluentPut("scoreKey", "syScore")
                     .fluentPut("score", calculationPremium.getBi().getPrpTmainRate().getBillcomeGroup()));
                     .fluentPut("score", calculationPremium.getBi().getPrpTmainRate().getBillcomeGroup()));
         }
         }
+        // 重试成功时,将提前记录的重复投保信息放入评分字段
+        if (duplicateMessage != null) {
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "重复投保信息")
+                    .fluentPut("scoreKey", "duplicateInfo")
+                    .fluentPut("score", duplicateMessage));
+        }
 
 
         scoreVo.setScoreJson(scoreJson);
         scoreVo.setScoreJson(scoreJson);
         quoteResultsVo.setScoreVo(scoreVo);
         quoteResultsVo.setScoreVo(scoreVo);

+ 35 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -143,9 +143,12 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
         }
         }
 
 
         GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
         GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
+        // 提前记录重复投保信息,避免重试成功后丢失
+        String duplicateMessage = null;
         // 处理重复投保
         // 处理重复投保
         String message = calculationPremium.getResultMsg();
         String message = calculationPremium.getResultMsg();
         if (calculationPremium.getResultCode() == 1 && message.contains("重复投保")) {
         if (calculationPremium.getResultCode() == 1 && message.contains("重复投保")) {
+            duplicateMessage = message;
             String startTime = extractDuplicateEndTime(message);
             String startTime = extractDuplicateEndTime(message);
             String endTime;
             String endTime;
             if (startTime == null) {
             if (startTime == null) {
@@ -213,7 +216,14 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
             // 第一步:驾意险校验
             // 第一步:驾意险校验
             GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderCheckData> checkResponse = guoRenCrawlerRequestComponent.createOrderCheck(createOrderRequest, headers);
             GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderCheckData> checkResponse = guoRenCrawlerRequestComponent.createOrderCheck(createOrderRequest, headers);
             if (!checkResponse.getCode().equals("0000")) {
             if (!checkResponse.getCode().equals("0000")) {
-                throw new SystemException("驾意险订单校验失败:" + checkResponse.getMessage());
+                // 身份证有效期错误时,切换certiValidity后重试
+                if ("9999".equals(checkResponse.getCode()) && "请输入正确的身份证有效期".equals(checkResponse.getMessage())) {
+                    toggleCertiValidity(createOrderRequest);
+                    checkResponse = guoRenCrawlerRequestComponent.createOrderCheck(createOrderRequest, headers);
+                }
+                if (!checkResponse.getCode().equals("0000")) {
+                    throw new SystemException("驾意险订单校验失败:" + checkResponse.getMessage());
+                }
             }
             }
             // 第二步:驾意险投保
             // 第二步:驾意险投保
             GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderDataData> dataResponse = guoRenCrawlerRequestComponent.createOrderData(createOrderRequest, headers);
             GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderDataData> dataResponse = guoRenCrawlerRequestComponent.createOrderData(createOrderRequest, headers);
@@ -233,7 +243,7 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
 
 
         // 保存数据
         // 保存数据
         guoRenCrawlerOrderService.saveOrderInfo(quoteVo, proposalNoSave, niPolicyNumber);
         guoRenCrawlerOrderService.saveOrderInfo(quoteVo, proposalNoSave, niPolicyNumber);
-        return GuoRenCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, calculationPremiumData, proposalNoSave);
+        return GuoRenCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, calculationPremiumData, proposalNoSave, duplicateMessage);
     }
     }
 
 
     private GuoRenCrawlerWriteBackAddressData writeBackAddress(String addressNew, String addressOld, GuoRenCrawlerWriteBackAddressData writeBackAddressData, HttpHeaders headers) {
     private GuoRenCrawlerWriteBackAddressData writeBackAddress(String addressNew, String addressOld, GuoRenCrawlerWriteBackAddressData writeBackAddressData, HttpHeaders headers) {
@@ -312,6 +322,29 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
         return null;
         return null;
     }
     }
 
 
+    /**
+     * 切换身份证有效期类型:4(长期有效)↔ 2(有效期限)
+     * 当 createOrderCheck 返回"请输入正确的身份证有效期"时,尝试切换后重试
+     */
+    private void toggleCertiValidity(GuoRenCrawlerCreateOrderRequest request) {
+        List<GuoRenCrawlerCreateOrderRequest.OrderListDTO> orderList = request.getData().getOrderList();
+        if (CollUtil.isEmpty(orderList)) {
+            return;
+        }
+        GuoRenCrawlerCreateOrderRequest.OrderListDTO order = orderList.get(0);
+        // 切换 insuredList 中的 certiValidity
+        if (CollUtil.isNotEmpty(order.getInsuredList())) {
+            for (GuoRenCrawlerCreateOrderRequest.InsuredListDTO insured : order.getInsuredList()) {
+                insured.setCertiValidity("4".equals(insured.getCertiValidity()) ? "2" : "4");
+            }
+        }
+        // 切换 orderAppl 中的 certiValidity
+        if (order.getOrderAppl() != null) {
+            GuoRenCrawlerCreateOrderRequest.OrderApplDTO appl = order.getOrderAppl();
+            appl.setCertiValidity("4".equals(appl.getCertiValidity()) ? "2" : "4");
+        }
+    }
+
     /**
     /**
      * 获取特约数据
      * 获取特约数据
      * 从报价单中的特约条款列表转换为国任特约VO列表
      * 从报价单中的特约条款列表转换为国任特约VO列表

+ 2 - 0
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -943,6 +943,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                         if (prpCmain != null && prpCmain.get("piccscore") != null) {
                         if (prpCmain != null && prpCmain.get("piccscore") != null) {
                             scoreJson.add(new JSONObject()
                             scoreJson.add(new JSONObject()
                                     .fluentPut("scoreName", "商业险评分")
                                     .fluentPut("scoreName", "商业险评分")
+                                    .fluentPut("scoreKey", "biScore")
                                     .fluentPut("score", prpCmain.get("piccscore").toString()));
                                     .fluentPut("score", prpCmain.get("piccscore").toString()));
                         }
                         }
                         // 获取交强险评分
                         // 获取交强险评分
@@ -950,6 +951,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                         if (prpCmainCI != null && prpCmainCI.get("piccscore") != null) {
                         if (prpCmainCI != null && prpCmainCI.get("piccscore") != null) {
                             scoreJson.add(new JSONObject()
                             scoreJson.add(new JSONObject()
                                     .fluentPut("scoreName", "交强险评分")
                                     .fluentPut("scoreName", "交强险评分")
+                                    .fluentPut("scoreKey", "ciScore")
                                     .fluentPut("score", prpCmainCI.get("piccscore").toString()));
                                     .fluentPut("score", prpCmainCI.get("piccscore").toString()));
                         }
                         }
 
 

+ 2 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -405,6 +405,8 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
             ptlAgreementCost.setPtlAgreementId(costCopyParam.getAgreementId());
             ptlAgreementCost.setPtlAgreementId(costCopyParam.getAgreementId());
             ptlAgreementCost.setCostDescribe("复制的费用:" + ptlAgreementCost.getCostDescribe());
             ptlAgreementCost.setCostDescribe("复制的费用:" + ptlAgreementCost.getCostDescribe());
             ptlAgreementCost.setCreateTime(LocalDateTime.now());
             ptlAgreementCost.setCreateTime(LocalDateTime.now());
+            ptlAgreementCost.setProductId(costCopyParam.getProductId());
+            ptlAgreementCost.setProductName(costCopyParam.getProductName());
 
 
             ptlAgreementCostTypes.forEach(item->{
             ptlAgreementCostTypes.forEach(item->{
                 item.setId(IdGenerate.nextId());
                 item.setId(IdGenerate.nextId());

+ 35 - 16
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -25,12 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -70,13 +65,39 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         List<AgreementRulesVo> rulesVos = baseMapper.queryList(agreementId);
         List<AgreementRulesVo> rulesVos = baseMapper.queryList(agreementId);
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
         if(CollUtil.isNotEmpty(rulesVos)){
         if(CollUtil.isNotEmpty(rulesVos)){
+            // 预计算相同parentId下的所有规则ID,用于后续费用汇总查询
+            Map<String, List<String>> parentIdToRuleIds = new LinkedHashMap<>();
+            for (AgreementRulesVo vo : rulesVos) {
+                String parentId = vo.getParentId();
+                if (parentId != null && !parentId.isEmpty()) {
+                    parentIdToRuleIds.computeIfAbsent(parentId, k -> new ArrayList<>()).add(vo.getId());
+                }
+            }
+            // 相同parentId的规则合并为一条,ruleDescription以","拼接
+            rulesVos = mergeByParentId(rulesVos);
+            // 查询费用:对合并后的规则,匹配同一parentId下所有规则的费用
             for (AgreementRulesVo rulesVo : rulesVos) {
             for (AgreementRulesVo rulesVo : rulesVos) {
-                CostAgreementParam param = new CostAgreementParam();
-                param.setPtlAgreementId(agreementId);
-                param.setCoverRuleId(rulesVo.getId());
-                List<CostListVo> costVos = ptlAgreementCostService.queryByAgreementIdAndCoverRuleId(param);
-                if(CollUtil.isNotEmpty(costVos)){
-                    costVos.forEach(cost-> cost.getPtlAgreementCostVoList().forEach(vo->{
+                List<CostListVo> allCostVos = new ArrayList<>();
+                String parentId = rulesVo.getParentId();
+                if (parentId != null && !parentId.isEmpty() && parentIdToRuleIds.containsKey(parentId)) {
+                    // 查询同一parentId下所有规则的费用并汇总
+                    for (String ruleId : parentIdToRuleIds.get(parentId)) {
+                        CostAgreementParam param = new CostAgreementParam();
+                        param.setPtlAgreementId(agreementId);
+                        param.setCoverRuleId(ruleId);
+                        List<CostListVo> costVos = ptlAgreementCostService.queryByAgreementIdAndCoverRuleId(param);
+                        if (CollUtil.isNotEmpty(costVos)) {
+                            allCostVos.addAll(costVos);
+                        }
+                    }
+                } else {
+                    CostAgreementParam param = new CostAgreementParam();
+                    param.setPtlAgreementId(agreementId);
+                    param.setCoverRuleId(rulesVo.getId());
+                    allCostVos = ptlAgreementCostService.queryByAgreementIdAndCoverRuleId(param);
+                }
+                if (CollUtil.isNotEmpty(allCostVos)) {
+                    allCostVos.forEach(cost -> cost.getPtlAgreementCostVoList().forEach(vo -> {
                         LocalDateTime effectiveTime = vo.getEffectiveTime().toInstant()
                         LocalDateTime effectiveTime = vo.getEffectiveTime().toInstant()
                                 .atZone(ZoneId.systemDefault())
                                 .atZone(ZoneId.systemDefault())
                                 .toLocalDateTime();
                                 .toLocalDateTime();
@@ -90,11 +111,9 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
                         }
                         }
 
 
                     }));
                     }));
-                    rulesVo.setCostVoList(costVos);
+                    rulesVo.setCostVoList(allCostVos);
                 }
                 }
             }
             }
-            // 相同parentId的规则合并为一条,ruleDescription以","拼接
-            rulesVos = mergeByParentId(rulesVos);
         }
         }
         return rulesVos;
         return rulesVos;
     }
     }
@@ -176,7 +195,7 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
             return true;
             return true;
         }
         }
 
 
-        // 兼容旧的单条规则模式
+        // 兼容旧的单条规则模式F
         PtlAgreementUndwrtRules rules = buildRulesRecord(param, null, startOrderNum);
         PtlAgreementUndwrtRules rules = buildRulesRecord(param, null, startOrderNum);
         List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList = param.getRulesAttrList();
         List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList = param.getRulesAttrList();
         List<PtlAgreementUndwrtRulesAttrLink> costsAttrLink = new ArrayList<>();
         List<PtlAgreementUndwrtRulesAttrLink> costsAttrLink = new ArrayList<>();

+ 1 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java

@@ -54,6 +54,7 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
     public SysUserJzgInfo getByUserIdOrId(String id) {
     public SysUserJzgInfo getByUserIdOrId(String id) {
         return baseMapper.selectOne(new LambdaQueryWrapper<SysUserJzgInfo>()
         return baseMapper.selectOne(new LambdaQueryWrapper<SysUserJzgInfo>()
                 .eq(SysUserJzgInfo::getUserId,id)
                 .eq(SysUserJzgInfo::getUserId,id)
+                .eq(SysUserJzgInfo::getIsDelete,0)
                 .or()
                 .or()
                 .eq(SysUserJzgInfo::getId,id));
                 .eq(SysUserJzgInfo::getId,id));
     }
     }