浏览代码

Merge branch 'master' into wrq_dev

wangrq 3 月之前
父节点
当前提交
27bbd2981d

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java

@@ -7,6 +7,7 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.vo.InsFeeOrdersVo;
 import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -127,6 +128,12 @@ public class InsOrdersVo extends QuoteVo {
     @Schema(description = "订单费用")
     private InsFeeOrdersVo feeOrdersVo;
 
+    /**
+     * 费用比例信息
+     */
+    @Schema(description = "费用比例信息")
+    private PtlAgreementCostRatioVo costRatio;
+
     @Data
     public static class Salesman{
 

+ 6 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -201,6 +201,12 @@ public interface OrgClient {
     @GetMapping(value = "/agreementRules/rulesGet")
     HttpResult rulesGet(@RequestParam("ruleId") String ruleId);
 
+    /**
+     * 复制承保规则(含parentId)
+     */
+    @GetMapping(value = "/agreementRules/rulesCopy")
+    HttpResult rulesCopy(@RequestParam("ruleId") String ruleId);
+
     /**
      * 根据父ID查询子规则列表
      */

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HtCrawlerRequestComponent.java

@@ -62,7 +62,7 @@ public class HtCrawlerRequestComponent {
 
     private final HuaTaiCrawlerCacheComponent huaTaiCrawlerCacheComponent;
 
-    private static final String proxyHostName = "39.98.41.104";
+    private static final String proxyHostName = "172.24.144.226";//39.98.41.104
 
     private static final int proxyPort = 2025;
 

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

@@ -139,7 +139,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                 super.prepareConnection(c, m);
             }
         };
-        factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("39.98.41.104", 2025)));
+        factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("172.24.144.226", 2025)));//39.98.41.104
         return new RestTemplate(factory);
     }
 
@@ -823,7 +823,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         HtCrawlerConfigureParameters params = ConfigureParametersConversion.conversionEntity(
                 HtCrawlerConfigureParameters.class, attr.getConfigInfo());
         doLoginCookie(attr);
-
+        UnderwritingResultsVo r = new UnderwritingResultsVo();
+        r.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+        r.setUnderwritingResult("核保失败");
         HtCrawlerOrder order = orderService.findByOrdersNo(vo.getOrder().getOrdersNo());
         if("N".equals(order.getCiCategory()) || "6C".equals(order.getCiCategory())) throw new SystemException("核保失败-------强制下发修改意见,1.N类、6C类业务,请确认业务类别后再提交核保。");
         vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
@@ -833,12 +835,14 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         String res = req.submit2(submit, req.getHeaders());
         log.info("提交核保结果: {}", res);
 
-        if(res.contains("<html>")) throw new SystemException("核保失败, 服务器繁忙, 请稍后重试");
-
+        if(res.contains("<html>")) {
+            r.setUnderwritingResult("核保失败, 服务器繁忙, 请稍后重试");
+            return r;
+        }
         if (res.contains("起保时间不正确")) {
-            throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
+            r.setUnderwritingResult("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
+            return r;
         }
-
         Map<String, Object> map = new HashMap<>();
         try {
             // 忽略未知字段
@@ -858,18 +862,18 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
             map = reader.readValue(res);
         } catch (JsonProcessingException e) {
-            throw new SystemException("核保失败, {}", convertResponseMsg(res));
+            r.setUnderwritingResult(convertResponseMsg(res));
+            return r;
         }
+        if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo, map);
 
         if (!"1,2,3,4,Y1,Y2,Y3".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver")) || "Y".equals(str(map, "isOver1"))
                 || "重新计算保费".equals(str(map, "MSG")) || (res.contains("下发修改意见") && !res.contains("isPassHB")) || res.contains("转人工意见")) {
-            throw new SystemException("核保失败-------" + convertResponseMsg(res));
+            r.setUnderwritingResult("核保失败-------" + convertResponseMsg(res));
+            return r;
         }
-        if (res.contains("转人工")) return handleManualUnderwriting(order, params);
-        if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo);
-
-        UnderwritingResultsVo r = new UnderwritingResultsVo();
-        r.setUnderwritingStatus(InsOrderStatusEnum.WAIT_AUDIT);
+        // 转人工处理
+        if (res.contains("infomsg\":\"") && res.contains("htmlMsgTeam\":\"")) return handleManualUnderwriting(order, params);
         return r;
     }
 
@@ -905,7 +909,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         } catch (Exception e) { throw new SystemException(e.getMessage()); }
     }
 
-    private UnderwritingResultsVo handlePassedUnderwriting(HtCrawlerOrder order, HtCrawlerConfigureParameters params, UnderwritingVo vo) {
+    private UnderwritingResultsVo handlePassedUnderwriting(HtCrawlerOrder order, HtCrawlerConfigureParameters params, UnderwritingVo vo, Map<String, Object> map) {
         HtCrawlerPaymentLinkResponse pl = queryPaymentLink(order, params, new PaymentLinkVo());
         log.info("paymentLinkResponse: {}", JSONObject.toJSONString(pl));
         vo.getInsOrders().setPayLink(pl.getImg());
@@ -913,6 +917,8 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         vo.getInsOrders().setCompanyOrderNo(order.getQuotationRelaNo());
         UnderwritingResultsVo r = new UnderwritingResultsVo();
         r.setPaymentLink(pl.getImg());
+        r.setJqPolicyno(map.get("jqProposalno") == null ? "" : map.get("jqProposalno").toString());
+        r.setSyPolicyno(map.get("syProposalno") == null ? "" : map.get("syProposalno").toString());
         r.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         return r;
     }

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/util/CookieUtils.java

@@ -154,7 +154,7 @@ public class CookieUtils {
             }
         };
 
-        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("39.98.41.104", 2025));
+        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("172.24.144.226", 2025));//39.98.41.104
         factory.setProxy(proxy);
 
         RestTemplate restTemplate = new RestTemplate(factory);

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

@@ -390,7 +390,7 @@ public class QuoteVerificationAspect {
         BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
 
         // 计算应付金额(保费 * 出口比例,保留2位小数)
-        BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN));
+        BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN)).setScale(2,RoundingMode.DOWN);
 
         // 计算各类费用并设置到订单对象
         setPayable.accept(insFeeOrders, payable);

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

@@ -517,6 +517,15 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrdersVo.getInsuredPersonInfo().setIdentifyType(insOrdersVo.getInsuredPersonInfo().getPersonType());
         }
 
+        // 费用信息
+        InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
+                .eq(InsFeeOrders::getOrderNo, insOrdersVo.getInsOrders().getId()));
+        // 比例信息
+        if (insFeeOrders != null) {
+            insOrdersVo.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
+            insOrdersVo.setFeeOrdersVo(new InsFeeOrdersVo(insFeeOrders));
+        }
+
         if (CollectionUtil.isNotEmpty(insOrdersVo.getInsOrdersRiskList())) {
             insOrdersVo.getInsOrdersRiskList().forEach(riskInfo -> {
                 insOrdersVo.setBiRiskInfoVo(getRiskInfoVo(riskInfo));

+ 7 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/build/ZhongAnCrawlerQuoteResultsVoBuild.java

@@ -13,6 +13,7 @@ import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerQuoteResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -93,6 +94,12 @@ public class ZhongAnCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setBiPremium(String.valueOf(vehiclePremium.getBizTotalPremium()));
         // 设置非车险(驾意险)保费,报价返回数据中不存在
         quoteResultsVo.getCosts().setNiPremium(String.valueOf(vehiclePremium.getNonTotalPremium()));
+        // 总保费
+        BigDecimal jqPremium = BigDecimal.valueOf(vehiclePremium.getCompelPremium());
+        BigDecimal syPremium = BigDecimal.valueOf(vehiclePremium.getBizTotalPremium());
+        BigDecimal vvTaxPremium = BigDecimal.valueOf(vehiclePremium.getTaxPremium());
+        BigDecimal niPremium = BigDecimal.valueOf(vehiclePremium.getNonTotalPremium());
+        quoteResultsVo.getCosts().setSumPremium(String.valueOf(jqPremium.add(syPremium).add(vvTaxPremium).add(niPremium)));
     }
 
     public static QuoteResultsVo.ScoreVo buildScoreVo(ZhongAnCrawlerQuoteResponse.ValueDTO.DataDTO dataDTO) {

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementUndwrtRulesService.java

@@ -45,6 +45,17 @@ public interface PtlAgreementUndwrtRulesService extends IService<PtlAgreementUnd
      */
     AgreementRulesVo rulesGet(String ruleId);
 
+
+
+    /**
+     * 承保规则复制
+     * @param ruleId
+     * @return
+     */
+    AgreementRulesVo rulesCopy(String ruleId);
+
+
+
     /**
      * 根据父ID查询规则列表
      *

+ 136 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -391,6 +391,142 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         return rulesVo;
     }
 
+
+
+    public AgreementRulesVo rulesCCC(String ruleId) {
+        PtlAgreementUndwrtRules rules = baseMapper.selectById(ruleId);
+        if (rules == null) {
+            log.info("承保规则不存在, ruleId={}", ruleId);
+            return null;
+        }
+        PtlAgreement agreement = ptlAgreementService.getById(rules.getAgreementId());//协议id
+        AgreementRulesVo rulesVo = new AgreementRulesVo();
+        BeanUtils.copyProperties(rules, rulesVo);
+
+        // 获取费用因子属性(公共逻辑,仅查询一次)
+        List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
+        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
+
+        // 确定需要处理的规则ID列表
+        List<String> ruleIds;
+        if (rules.getParentId() != null && !rules.getParentId().isEmpty()) {
+            ruleIds = baseMapper.queryListByParentId(rules.getParentId()).stream()
+                    .map(AgreementRulesVo::getId).collect(Collectors.toList());
+        } else {
+            ruleIds = List.of(ruleId);
+        }
+
+        // 统一组装 groups
+        List<RulesGroupParam> groups = new ArrayList<>();
+        for (String id : ruleIds) {
+            List<PtlAgreementUndwrtRulesAttrLink> linkList = agreementUndwrtRulesAttrLinkService.queryLinkList(id);
+            List<PtlAgreementUndwrtRulesAttr> enrichedAttrs = enrichAttrLinks(linkList, attrMap);
+            RulesGroupParam group = new RulesGroupParam();
+            group.setRulesAttrList(linkList);
+            group.setCostsAttrLinks(enrichedAttrs);
+            groups.add(group);
+        }
+        rulesVo.setRulesGroups(groups);
+        // 单条模式向后兼容,同时设置 costsAttrLinks
+        if (ruleIds.size() == 1) {
+            rulesVo.setCostsAttrLinks(groups.get(0).getCostsAttrLinks());
+        }
+        return rulesVo;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AgreementRulesVo rulesCopy(String ruleId) {
+        PtlAgreementUndwrtRules rules = baseMapper.selectById(ruleId);
+        if (rules == null) {
+            log.info("承保规则不存在, ruleId={}", ruleId);
+            return null;
+        }
+
+        // 获取费用因子属性(公共逻辑,仅查询一次)
+        List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
+
+        // 根据协议id获取最大的序号
+        LambdaQueryWrapper<PtlAgreementUndwrtRules> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PtlAgreementUndwrtRules::getAgreementId, rules.getAgreementId())
+                .eq(PtlAgreementUndwrtRules::getIsDelete, 0);
+        queryWrapper.orderByDesc(PtlAgreementUndwrtRules::getOrderNum);
+        queryWrapper.last("LIMIT 1");
+        PtlAgreementUndwrtRules maxRules = baseMapper.selectOne(queryWrapper);
+        int startOrderNum = Objects.nonNull(maxRules) ? maxRules.getOrderNum() + 1 : 1;
+
+        // 确定需要复制的源规则ID列表
+        List<String> sourceRuleIds;
+        if (rules.getParentId() != null && !rules.getParentId().isEmpty()) {
+            sourceRuleIds = baseMapper.queryListByParentId(rules.getParentId()).stream()
+                    .map(AgreementRulesVo::getId).collect(Collectors.toList());
+        } else {
+            sourceRuleIds = List.of(ruleId);
+        }
+
+        // 批量复制:多条规则共享同一个新 parentId
+        String newParentId = sourceRuleIds.size() > 1 ? IdGenerate.nextId() : null;
+        List<RulesGroupParam> groups = new ArrayList<>();
+
+        // 获取属性映射(用于组装返回结果)
+        PtlAgreement agreement = ptlAgreementService.getById(rules.getAgreementId());
+        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = undwrtRulesAttrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
+
+        for (int i = 0; i < sourceRuleIds.size(); i++) {
+            String sourceId = sourceRuleIds.get(i);
+            // 查询源规则的属性链接
+            List<PtlAgreementUndwrtRulesAttrLink> sourceLinkList = agreementUndwrtRulesAttrLinkService.queryLinkList(sourceId);
+
+            // 构建新规则记录
+            String newRuleId = IdGenerate.nextId();
+            PtlAgreementUndwrtRules newRules = new PtlAgreementUndwrtRules();
+            newRules.setId(newRuleId);
+            newRules.setAgreementId(rules.getAgreementId());
+            newRules.setStartTime(rules.getStartTime());
+            newRules.setEndTime(rules.getEndTime());
+            newRules.setInputDescription(rules.getInputDescription());
+            newRules.setParentId(newParentId);
+            newRules.setOrderNum(startOrderNum + i);
+
+            // 复制属性链接,关联到新规则ID
+            List<PtlAgreementUndwrtRulesAttrLink> newAttrLinks = processAndAttrs(sourceLinkList, undwrtRulesAttrList, newRuleId);
+            if (CollUtil.isNotEmpty(newAttrLinks)) {
+                agreementUndwrtRulesAttrLinkMapper.insert(newAttrLinks);
+            }
+
+            newRules.setRuleDescription(buildDesc(newAttrLinks, undwrtRulesAttrList));
+            baseMapper.insert(newRules);
+
+            // 组装返回的 groups
+            List<PtlAgreementUndwrtRulesAttr> enrichedAttrs = enrichAttrLinks(newAttrLinks, attrMap);
+            RulesGroupParam group = new RulesGroupParam();
+            group.setRulesAttrList(newAttrLinks);
+            group.setCostsAttrLinks(enrichedAttrs);
+            groups.add(group);
+        }
+
+        // 构建返回结果
+        AgreementRulesVo rulesVo = new AgreementRulesVo();
+        rulesVo.setAgreementId(rules.getAgreementId());
+        rulesVo.setStartTime(rules.getStartTime());
+        rulesVo.setEndTime(rules.getEndTime());
+        rulesVo.setInputDescription(rules.getInputDescription());
+        rulesVo.setParentId(newParentId);
+        rulesVo.setRulesGroups(groups);
+        if (groups.size() == 1) {
+            rulesVo.setCostsAttrLinks(groups.get(0).getCostsAttrLinks());
+        }
+        return rulesVo;
+    }
+
+
+
+
     /**
      * 将属性链接丰富为完整的属性对象
      */