Explorar o código

报价 工厂类 规则模块

785834757 hai 1 ano
pai
achega
ead5a628fc
Modificáronse 25 ficheiros con 1223 adicións e 37 borrados
  1. 86 0
      commons/src/main/java/com/jzg/commons/constants/CompanyConstants.java
  2. 6 6
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java
  3. 38 0
      tenant/costsorrule/pom.xml
  4. 17 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/CostsOrRuleApplication.java
  5. 25 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/AttrTypeConstant.java
  6. 48 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/OperatorConstant.java
  7. 41 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/controller/CostsController.java
  8. 68 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/controller/RuleController.java
  9. 31 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/model/RuleAttrLinkVo.java
  10. 17 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/model/ValidateSchemeRuleVo.java
  11. 18 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/CostsService.java
  12. 37 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/RuleService.java
  13. 249 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/CostsServiceImpl.java
  14. 372 0
      tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/RuleServiceImpl.java
  15. 4 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/quote/CustomerInfoVo.java
  16. 11 5
      tenant/insurance/quotation-summary/pom.xml
  17. 35 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  18. 23 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java
  19. 58 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteRestrictDecorator.java
  20. 6 6
      tenant/insurance/quotation-yongcheng/pom.xml
  21. 9 9
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java
  22. 0 1
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/QuoteRequest.java
  23. 2 1
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/YongChengApiRequest.java
  24. 1 5
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  25. 21 3
      tenant/pom.xml

+ 86 - 0
commons/src/main/java/com/jzg/commons/constants/CompanyConstants.java

@@ -0,0 +1,86 @@
+package com.jzg.commons.constants;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum CompanyConstants {
+    AAIC("AAIC1000000","安信农业保险股份有限公司"),
+    ABIC("ABIC1000000","安邦财产保险股份有限公司"),
+    ACIC("ACIC1000000","安诚财险"),
+    AHIC("AHIC1000000","安华农业保险股份有限公司"),
+    AICS("AICS1000000","永诚财险"),
+    AIGC("AIGC1000000","美亚财产保险有限公司"),
+    AMIC("AMIC1000000","中航安盟财产保险有限公司"),
+    APIC("APIC1000000","安心财产保险有限责任公司"),
+    AZCN("AZCN1000000","京东安联财产保险有限公司"),
+    BGIC("BGIC1000000","北部湾财产保险股份有限公司"),
+    BOCI("BOCI1000000","中银保险有限公司"),
+    BPIC("BPIC1000000","渤海财险"),
+    CAIC("CAIC1000000","长安责任保险股份有限公司"),
+    CATH("CATH1000000","国泰财产保险有限责任公司"),
+    CCBP("CCBP1000000","建信财产保险有限公司"),
+    CCIC("CCIC1000000","大地财险"),
+    CHAC("CHAC1000000","诚泰财险"),
+    CICP("CICP1000000","中华财险"),
+    CJCX("CJCX1000000","长江财产保险股份有限公司"),
+    CPIC("CPIC1000000","太平洋财险"),
+    CRCI("CRCI1000000","中国铁路财产保险自保有限公司"),
+    CRIC("CRIC1000000","富德财产保险股份有限公司"),
+    DBIC("DBIC1000000","都邦财险"),
+    DHIC("DHIC1000000","鼎和财产保险股份有限公司"),
+    DICC("DICC1000000","史带财产保险股份有限公司"),
+    DJPC("DJPC1000000","大家财险"),
+    EAIC("EAIC1000000","易安财产保险股份有限公司"),
+    FPIC("FPIC1000000","富邦财产保险有限公司"),
+    GPIC("GPIC1000000","中国人寿"),
+    GYIC("GYIC1000000","国元农业保险股份有限公司"),
+    HAIC("HAIC1000000","华安财险"),
+    HBIC("HBIC1000000","恒邦财险"),
+    HGIC("HGIC1000000","海峡金桥财产保险股份有限公司"),
+    HHBX("HHBX1000000","华海财产保险股份有限公司"),
+    HNIC("HNIC1000000","华农财险"),
+    HTIC("HTIC1000000","华泰财险"),
+    HYIC("HYIC1000000","现代财产保险(中国)有限公司"),
+    JLIC("JLIC1000000","久隆财产保险有限公司"),
+    JTIC("JTIC1000000","锦泰财产保险股份有限公司"),
+    LIHI("LIHI1000000","利宝保险有限公司"),
+    MACN("MACN1000000","亚太财产保险有限公司"),
+    MSIC("MSIC1000000","三井住友海上火灾保险(中国)有限公司"),
+    PAIC("PAIC1000000","平安财险"),
+    PICC("PICC1000000","人保财险"),
+    QHIC("QHIC1000000","新疆前海联合财产保险股份有限公司"),
+    RSIC("RSIC1000000","融盛财产保险股份有限公司"),
+    SJIC("SJIC1000000","日本财产保险(中国)有限公司"),
+    SMIC("SMIC1000000","阳光农业相互保险公司"),
+    SNPIC("SNPIC1000000","申能财险"),
+    SPIC("SPIC1000000","三星财产保险(中国)有限公司"),
+    TAIC("TAIC1000000","天安财险"),
+    TKIC("TKIC1000000","泰康财险"),
+    TMNF("TMNF1000000","东京海上日动火灾保险(中国)有限公司"),
+    TPBX("TPBX1000000","安盛天平"),
+    TPIC("TPIC1000000","太平财险"),
+    TSBX("TSBX1000000","泰山财险"),
+    ULIC("ULIC1000000","合众财产保险股份有限公司"),
+    UTIC("UTIC1000000","众诚汽车保险股份有限公司"),
+    XAIC("XAIC1000000","鑫安汽车保险股份有限公司"),
+    XDCX("XDCX1000000","国任财险"),
+    YAIC("YAIC1000000","永安财险"),
+    YDCX("YDCX1000000","英大泰和财产保险股份有限公司"),
+    YGBX("YGBX1000000","阳光财险"),
+    YPIC("YPIC1000000","黄河财产保险股份有限公司"),
+    YZIC("YZIC1000000","燕赵财产保险股份有限公司"),
+    ZAPA("ZAPA1000000","众安财险"),
+    ZFIC("ZFIC1000000","珠峰财产保险股份有限公司"),
+    ZKIC("ZKIC1000000","紫金财险"),
+    ZLIC("ZLIC1000000","中路财产保险股份有限公司"),
+    ZMBX("ZMBX1000000","中煤财险"),
+    ZSIC("ZSIC1000000","浙商财产保险股份有限公司"),
+    ZYBX("ZYBX1000000","中原农业保险股份有限公司"),
+    ZYIC("ZYIC1000000","中意财产保险有限公司");
+    
+    public final String companyCode;
+    public final String companyName;
+}

+ 6 - 6
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java

@@ -119,15 +119,15 @@ public class PtlSchemeSaveVo {
         ptlScheme.setProductId(productId);
         ptlScheme.setProductName(ProductsType.getByCode(productId).getDesc());
         List<PtlAgreementUndwrtRulesAttr> collect = ruleAttrs.stream().filter(x ->
-                x.getAttrCode().equals("NewEnergy") ||
-                x.getAttrCode().equals("CarClass") ||
-                x.getAttrCode().equals("NatureOfUse")).collect(Collectors.toList());
+                x.getAttrCode().equals("NewEnergyMark") ||
+                x.getAttrCode().equals("VehicleUseCode") ||
+                x.getAttrCode().equals("CarTypeCode")).collect(Collectors.toList());
         if(collect.size() != 3){
             throw new ValidateException("方案规则不完整");
         }
-        ptlScheme.setEnergyType(collect.stream().filter(x->x.getAttrCode().equals("NewEnergy")).findFirst().get().getMin());
-        ptlScheme.setCarnature(collect.stream().filter(x->x.getAttrCode().equals("CarClass")).findFirst().get().getMin());
-        ptlScheme.setVehicleType(collect.stream().filter(x->x.getAttrCode().equals("NatureOfUse")).findFirst().get().getMin());
+        ptlScheme.setEnergyType(collect.stream().filter(x->x.getAttrCode().equals("NewEnergyMark")).findFirst().get().getMin());
+        ptlScheme.setCarnature(collect.stream().filter(x->x.getAttrCode().equals("VehicleUseCode")).findFirst().get().getMin());
+        ptlScheme.setVehicleType(collect.stream().filter(x->x.getAttrCode().equals("CarTypeCode")).findFirst().get().getMin());
         ptlScheme.setRuleDesc(buildDesc(this.getRuleAttrs(), undwrtRulesAttrList));
 
         return ptlScheme;

+ 38 - 0
tenant/costsorrule/pom.xml

@@ -0,0 +1,38 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>tenant</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>costsorrule</artifactId>
+    <packaging>jar</packaging>
+    <name>costsorrule Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.jzg.costsorrule.CostsOrRuleApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 17 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/CostsOrRuleApplication.java

@@ -0,0 +1,17 @@
+package com.jzg.costsorrule;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+//@EnableDiscoveryClient
+@ComponentScan(basePackages = {"com.jzg.commons","com.jzg.costsorrule"})
+@MapperScan({"com.jzg.costsorrule.mapper","com.jzg.commons.mapper"})
+public class CostsOrRuleApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(CostsOrRuleApplication.class, args);
+    }
+}

+ 25 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/AttrTypeConstant.java

@@ -0,0 +1,25 @@
+package com.jzg.costsorrule.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum AttrTypeConstant {
+    //多选框
+    CHECKBOX("checkbox","多选框"),
+    //数字输入框
+    INPUTNUMBER("inputNumber","数字输入框"),
+    //文本输入框
+    INPUTTAG("inputTag","文本输入框"),
+    //选择框
+    SELECT("select","选择框"),
+    //单选框
+    RADIO("radio","单选框"),
+    DATETIME("datetime","时间");
+
+    private final String code;
+    private final String name;
+
+}

+ 48 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/constants/OperatorConstant.java

@@ -0,0 +1,48 @@
+package com.jzg.costsorrule.constants;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+@Data
+public class OperatorConstant {
+
+    @Getter
+    @AllArgsConstructor
+    public enum InputNumber{
+        //数字型输入框
+        EQ("1","等于"),
+        //数字输入框
+        LT("2","小于"),
+        //文本输入框
+        LE("3","小于等于"),
+        //选择框
+        GT("4","大于"),
+        //单选框
+        GE("5","大于等于");
+
+        private final String code;
+        private final String name;
+
+    }
+
+    @Getter
+    @AllArgsConstructor
+    public static  enum DateTime{
+        //数字型输入框
+        EQ("1","等于"),
+        //数字输入框
+        LT("2","小于"),
+        //文本输入框
+        LE("3","小于等于"),
+        //选择框
+        GT("4","大于"),
+        //单选框
+        GE("5","大于等于");
+
+        private final String code;
+        private final String name;
+
+    }
+}

+ 41 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/controller/CostsController.java

@@ -0,0 +1,41 @@
+package com.jzg.costsorrule.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.scheme.po.PtlSchemeRulesAttrLink;
+import com.jzg.commons.entity.vo.SysAreaVo;
+import com.jzg.costsorrule.mapper.PtlAgreementUndwrtRulesAttrMapper;
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+import com.jzg.costsorrule.model.ValidateSchemeRuleVo;
+import com.jzg.costsorrule.service.CostsService;
+import com.jzg.costsorrule.service.RuleService;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 协议管理接口
+ *
+ * @author tz
+ */
+@Tag(name="费用计算接口")
+@RestController
+@RequestMapping("/validate/costs")
+public class CostsController extends BaseController {
+
+    @Autowired
+    private CostsService costsService;
+
+
+}

+ 68 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/controller/RuleController.java

@@ -0,0 +1,68 @@
+package com.jzg.costsorrule.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.scheme.po.PtlSchemeRulesAttrLink;
+import com.jzg.costsorrule.mapper.PtlAgreementUndwrtRulesAttrMapper;
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+import com.jzg.costsorrule.model.ValidateSchemeRuleVo;
+import com.jzg.costsorrule.service.RuleService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 协议管理接口
+ *
+ * @author tz
+ */
+@Tag(name="规则校验")
+@RestController
+@RequestMapping("/validate/rule")
+public class RuleController extends BaseController {
+
+    @Autowired
+    private RuleService ruleService;
+
+    @Autowired
+    private PtlAgreementUndwrtRulesAttrMapper ptlAgreementUndwrtRulesAttrMapper;
+
+
+    @PostMapping(value = "/validateSchemeRule")
+    public HttpResult validateSchemeRule(@RequestBody ValidateSchemeRuleVo validateSchemeRuleVo){
+        Map<String, List<PtlSchemeRulesAttrLink>> maps = validateSchemeRuleVo.getAttrLinks().stream().collect(Collectors.groupingBy(PtlSchemeRulesAttrLink::getSchemeId));
+        HashMap<String,String> attrMap = new HashMap<>();
+        //将传入的对象转换成Map对象用于校验因子
+        ruleService.traverseJsonObject(JSON.parseObject(JSON.toJSONString(validateSchemeRuleVo.getQuoteVo())),attrMap);
+        List<PtlAgreementUndwrtRulesAttr> rulesAttrs = ptlAgreementUndwrtRulesAttrMapper.selectList(new LambdaQueryWrapper<>());
+
+
+        //转换对象 将List<PtlSchemeRulesAttrLink>转换为List<RuleAttrLinkVo>
+        Map<String, List<RuleAttrLinkVo>> converMaps = ruleService.convertSchemeRule(maps);
+
+        //规则过滤 获取满足规则的方案id
+        List<String> schemeIds = new ArrayList<>();
+        StringBuilder logs = new StringBuilder();
+        for (Map.Entry<String, List<RuleAttrLinkVo>> entry : converMaps.entrySet()) {
+            String key = entry.getKey();
+            List<RuleAttrLinkVo> vos = entry.getValue();
+            if(ruleService.verificationRule(attrMap,vos,rulesAttrs,logs)){
+                schemeIds.add(key);
+            }
+        }
+
+        return HttpResult.ok(schemeIds);
+    }
+}

+ 31 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/model/RuleAttrLinkVo.java

@@ -0,0 +1,31 @@
+package com.jzg.costsorrule.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * 规则的vo
+ */
+@Data
+public class RuleAttrLinkVo {
+
+    private String id;
+
+    @TableField(value = "attr_id")
+    private String attrId;
+
+    @TableField(value = "attr_code")
+    private String attrCode;
+
+    @TableField(value = "min")
+    private String min;
+
+    @TableField(exist = false)
+    private String[] minArray;
+
+    @TableField(value = "operator")
+    private String operator;
+
+    @TableField(value = "max")
+    private String max;
+}

+ 17 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/model/ValidateSchemeRuleVo.java

@@ -0,0 +1,17 @@
+package com.jzg.costsorrule.model;
+
+import com.jzg.commons.entity.scheme.po.PtlSchemeRulesAttrLink;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ValidateSchemeRuleVo {
+    private QuoteVo quoteVo;
+    private List<PtlSchemeRulesAttrLink> attrLinks;
+}

+ 18 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/CostsService.java

@@ -0,0 +1,18 @@
+package com.jzg.costsorrule.service;
+
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+
+import java.util.List;
+
+public interface CostsService {
+
+    /**
+     * 校验费用规则
+     * @return
+     */
+    public boolean verificationCostsRule(List<RuleAttrLinkVo> ruleAttrLinkVos, QuoteVo quoteVo, QuoteResultsVo quoteResultsVo);
+
+
+}

+ 37 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/RuleService.java

@@ -0,0 +1,37 @@
+package com.jzg.costsorrule.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.scheme.po.PtlSchemeRulesAttrLink;
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public interface RuleService {
+
+    /**
+     * 规则校验
+     * @param maps      传入表单的值
+     * @param linkVos   规则因子
+     * @param logs      日志
+     * @return
+     */
+    boolean verificationRule(Map<String,String> maps, List<RuleAttrLinkVo> linkVos, List<PtlAgreementUndwrtRulesAttr> rulesAttrs, StringBuilder logs);
+
+
+    /**
+     * 将实体对象转换为Map
+     * @param jsonObject
+     * @param attrMap
+     */
+    public void traverseJsonObject(JSONObject jsonObject, HashMap<String,String> attrMap);
+
+    /**
+     * 将方案的规则转换成通用规则实体
+     * @param schemeRules
+     * @return
+     */
+    public Map<String, List<RuleAttrLinkVo>> convertSchemeRule(Map<String, List<PtlSchemeRulesAttrLink>> schemeRules);
+}

+ 249 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/CostsServiceImpl.java

@@ -0,0 +1,249 @@
+package com.jzg.costsorrule.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.costsorrule.mapper.PtlAgreementUndwrtRulesAttrMapper;
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+import com.jzg.costsorrule.service.CostsService;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.KindInfoVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class CostsServiceImpl implements CostsService {
+
+    @Autowired
+    PtlAgreementUndwrtRulesAttrMapper ptlAgreementUndwrtRulesAttrMapper;
+
+    @Override
+    public boolean verificationCostsRule(List<RuleAttrLinkVo> ruleAttrLinkVos, QuoteVo quoteVo, QuoteResultsVo quoteResultsVo) {
+        List<KindInfoVo> kindInfoVos = new ArrayList<>();
+        KindInfoVo kindInfoVo = new KindInfoVo("1","2","3","4","5","6","7","8","9","10");
+        KindInfoVo kindInfoVo1 = new KindInfoVo("1","2","3","4","5","6","7","8","9","10");
+        kindInfoVos.add(kindInfoVo);
+        kindInfoVos.add(kindInfoVo1);
+        quoteVo.setKindInfoVo(kindInfoVos);
+        List<String> fieldValues = getFieldValues(quoteVo);
+        List<PtlAgreementUndwrtRulesAttr> ptlAgreementUndwrtRulesAttrs = ptlAgreementUndwrtRulesAttrMapper.selectList(new LambdaQueryWrapper<>());
+        for (int i=0;i<ruleAttrLinkVos.size();i++) {
+            if (judgements(ruleAttrLinkVos.get(i), ptlAgreementUndwrtRulesAttrs)) {
+                //匹配成功 返回费用的id
+//                return agreementProductCosts.get(i).getId();
+            }
+        }
+
+        return false;
+    }
+
+    private boolean judgements(RuleAttrLinkVo ruleAttrLinkVo,
+                               List<PtlAgreementUndwrtRulesAttr> rulesAttrs) {
+        boolean useFlag = true;
+
+            //查找规则中的 传值属性
+//            RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
+//                    .filter(x -> x.getAttrCode().equals(ruleAttrLinkVo.getAttrCode()))
+//                    .findFirst()
+//                    .orElse(null);
+
+            //如果查找不到 传值属性 直接费用对比失败
+//            if (ruleAttrMappingVo == null) {
+//                log.debug("传入的值找不到该属性:" + ruleAttrLinkVo.getAttrCode());
+//                log.debug("规则匹配失败:" + ruleAttrLinkVo.getAttrCode());
+//
+//
+//                List<PtlAgreementUndwrtRulesAttr> collect = rulesAttrs.stream()
+//                        .filter(x -> x.getAttrCode().equals(ruleAttrLinkVo.getAttrCode()))
+//                        .collect(Collectors.toList());
+//                if (!collect.isEmpty()) {
+//                    logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
+//                }
+//                return false;
+//            }
+//
+//            //查找 费用因子规则
+//            PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = rulesAttrs.stream()
+//                    .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+//                    .findFirst()
+//                    .get();
+//
+//            if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
+//                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
+//            }else{
+//                useFlag = false;
+//            }
+//
+//            if (!useFlag) {
+//                log.debug("检验的值:" + ptlAgreementProductCostsAttrLink.getMin());
+//                log.debug("传入的值:" + ruleAttrMappingVo.getValue());
+//                log.debug("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+//
+//
+//                List<PtlAgreementUndwrtRulesAttr> collect = rulesAttrs.stream()
+//                        .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
+//                        .collect(Collectors.toList());
+//
+//
+//                if (ptlAgreementProductCostsAttrLink.getMin() != null) {
+//                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMin() + "\n");
+//                } else {
+//                    logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMax() + "\n");
+//                }
+//
+//                logs.append("传入的值:" + ruleAttrMappingVo.getValue() + "\n");
+//
+//                if (!collect.isEmpty()) {
+//                    logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
+//                }
+//
+//
+//
+//                return false;
+//            }
+//
+//        }
+
+        return useFlag;
+    }
+
+
+//    private boolean attrEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink,
+//                              PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value) {
+//        if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
+//            return checkBoxEqual(ptlAgreementProductCostsAttrLink, value);
+//        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")) {
+//            return inputNumberEqual(ptlAgreementProductCostsAttrLink, value);
+//        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")) {
+//            //截取身份证号码
+//            if (ptlAgreementProductCostsAttrLink.getAttrCode().equals("CarOwnersIDNumber") || ptlAgreementProductCostsAttrLink.getAttrCode().equals("ApplicantIDNumber") ||
+//                    ptlAgreementProductCostsAttrLink.getAttrCode().equals("InsuredIDNumber")) {
+//                value = value.substring(0, ptlAgreementProductCostsAttrLink.getMin().length());
+//            }
+//            return inputTextEqual(ptlAgreementProductCostsAttrLink, value);
+//        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")) {
+//            //截取车牌
+//            if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("LicenseNo")) {
+//                value = value.substring(0, 2);
+//            }
+//            return selectEqual(ptlAgreementProductCostsAttrLink, value);
+//        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
+//            return radioEqual(ptlAgreementProductCostsAttrLink, value);
+//        } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("datetime")){ // 时间
+//            return dateTimeEqual(ptlAgreementProductCostsAttrLink, value);
+//        }
+//
+//        return false;
+//    }
+//
+//    private boolean checkBoxEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
+//        String[] split = ptlAgreementProductCostsAttrLink.getMin().split(",");
+//        for (String sp : split) {
+//            if (sp.equals(value)) {
+//                return true;
+//            }
+//        }
+//        return false;
+//    }
+//
+//    private boolean inputNumberEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
+//        double v = Double.parseDouble(value);
+//        //统一处理数值
+//        if ("1".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
+//            if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) <= v &&
+//                    Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) >= v) {
+//                return true;
+//            }
+//        } else if ("2".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
+//            if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) > v) {
+//                return true;
+//            }
+//        } else if ("3".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
+//            if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) >= v) {
+//                return true;
+//            }
+//        } else if ("4".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
+//            if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) < v) {
+//                return true;
+//            }
+//        } else if ("5".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
+//            if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) <= v) {
+//                return true;
+//            }
+//        }
+//        return false;
+//    }
+
+
+    // 通过反射获取对象的所有字段及其值
+    public static List<String> getFieldValues(Object obj) {
+        List<String> fieldValues = new ArrayList<>();
+        if (obj == null) {
+            return fieldValues;
+        }
+
+        // 获取对象的类
+        Class<?> clazz = obj.getClass();
+
+        if("ArrayList".equals(clazz.getSimpleName())){
+            System.out.printf(clazz.getName());
+//            if(((ArrayList<?>)obj).size() > 0){
+//                return getFieldValues(((ArrayList<?>)obj).get(0));
+//            }
+        }
+
+        // 遍历所有字段
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field field : fields) {
+            // 设置可访问
+            if("serialVersionUID".equals(field.getName())){
+                continue;
+            }
+            field.setAccessible(true);
+
+            try {
+                // 获取字段的值
+                Object value = field.get(obj);
+
+                // 如果字段的值是基本类型或String类型,直接添加到结果中
+                if (value != null  && isPrimitiveOrString(value)) {
+                    fieldValues.add(field.getName() + ": " + value.toString());
+                }
+
+                // 如果字段的值是对象类型,则递归处理
+                if (value != null && !isPrimitiveOrString(value)) {
+                    // 递归调用
+                    fieldValues.addAll(getFieldValues(value));
+                }
+
+
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return fieldValues;
+    }
+
+
+
+    // 判断字段是否是基本类型或String类型
+    private static boolean isPrimitiveOrString(Object obj) {
+        return obj.getClass().isPrimitive() || obj instanceof String || obj instanceof Long || obj instanceof Integer || obj instanceof Double || obj instanceof Boolean;
+    }
+
+    // 判断字段是否是自定义对象类型
+    private static boolean isCustomObject(Object obj) {
+        // 如果该字段的类是 Object 或者其父类是 Object,则认为是自定义对象
+        return !(obj.getClass().isPrimitive() || obj instanceof String || obj instanceof Number || obj instanceof Boolean);
+    }
+}

+ 372 - 0
tenant/costsorrule/src/main/java/com/jzg/costsorrule/service/impl/RuleServiceImpl.java

@@ -0,0 +1,372 @@
+package com.jzg.costsorrule.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.scheme.po.PtlSchemeRulesAttrLink;
+import com.jzg.costsorrule.constants.AttrTypeConstant;
+import com.jzg.costsorrule.constants.OperatorConstant;
+import com.jzg.costsorrule.model.RuleAttrLinkVo;
+import com.jzg.costsorrule.service.RuleService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+@Service
+public class RuleServiceImpl implements RuleService {
+
+    /**
+     * 预处理数据
+     * @param attrMap
+     * @param linkVos
+     * @return
+     */
+    private void dealData(Map<String,String> attrMap, List<RuleAttrLinkVo> linkVos){
+        //需要截取的字符串
+        Set<String> idNumbers = Set.of("OwnersInfoIdentifyNumber", "ApplicantIDNumber", "InsuredIDNumber","LicenseNo")
+                .stream().map(String::toLowerCase).collect(Collectors.toSet());
+        //boolean 类型的转换
+        Set<String> inputTags = Set.of("NewEnergyMark")
+                .stream().map(String::toLowerCase).collect(Collectors.toSet());
+        linkVos.forEach(vo->{
+            if(idNumbers.contains(vo.getAttrCode())){
+                String value = attrMap.get(vo.getAttrCode().toLowerCase());
+                String substring = value.substring(0, vo.getMin().length());
+                attrMap.put(vo.getAttrCode(),substring);
+            }
+            if(inputTags.contains(vo.getAttrCode())){
+                String value = attrMap.get(vo.getAttrCode().toLowerCase());
+                if("false".equals(value)){
+                    attrMap.put(vo.getAttrCode(),"0");
+                }else if("true".equals(value)){
+                    attrMap.put(vo.getAttrCode(),"1");
+                }
+            }
+        });
+
+
+
+    }
+
+    @Override
+    public boolean verificationRule(Map<String,String> maps, List<RuleAttrLinkVo> linkVos,List<PtlAgreementUndwrtRulesAttr> rulesAttrs, StringBuilder logs) {
+        //预处理数据
+        dealData(maps,linkVos);
+        //匹配费用因子
+        for (int i = 0; i < linkVos.size(); i++) {
+            //判断是否匹配
+//            logs.append("费用id:" + agreementProductCosts.get(i).getId() + "\n");
+//            logs.append("费用因子描述:" + agreementProductCosts.get(i).getCostsDescription() + "\n");
+//            String attrCode = linkVos.get(i).getAttrCode();
+            String attrValue = maps.get(linkVos.get(i).getAttrCode().toLowerCase());
+            int finalI = i;
+            PtlAgreementUndwrtRulesAttr rulesAttr = rulesAttrs.stream().filter(value -> value.getAttrCode().toLowerCase().equals(linkVos.get(finalI).getAttrCode().toLowerCase())).findFirst().orElse(null);
+            if(Objects.isNull(attrValue) || Objects.isNull(rulesAttr)){
+                return false;
+            }
+            if (!judgements(attrValue, linkVos.get(i),rulesAttr, logs)) {
+                //返回 费用id   如果需要匹配非车的情况  将返回值返回list 后赛选
+                return false;
+            }
+//            log.debug("当前费用因子匹配结束\n");
+        }
+        return true;
+//        throw new SystemException("费用因子匹配失败");
+    }
+
+    /**
+     * 匹配费用因子
+     * @param value     表单值
+     * @param linkVo    费用因子
+     * @param rulesAttr 规则因子
+     * @param logs      日志
+     * @return
+     */
+    private boolean judgements(String value,
+                               RuleAttrLinkVo linkVo,
+                               PtlAgreementUndwrtRulesAttr rulesAttr,
+                               StringBuilder logs) {
+
+        boolean useFlag = attrEqual(value, linkVo, rulesAttr);
+        return useFlag;
+    }
+
+
+
+
+    private boolean attrEqual(String value,RuleAttrLinkVo linkVo,PtlAgreementUndwrtRulesAttr rulesAttr) {
+        if (rulesAttr.getAttrType().equals(AttrTypeConstant.CHECKBOX.getCode())) {
+            return checkBoxEqual(linkVo, value);
+        } else if (rulesAttr.getAttrType().equals(AttrTypeConstant.INPUTNUMBER.getCode())) {
+            return inputNumberEqual(linkVo, value);
+        } else if (rulesAttr.getAttrType().equals(AttrTypeConstant.INPUTTAG.getCode())) {
+            return inputTagEqual(linkVo, value);
+        } else if (rulesAttr.getAttrType().equals(AttrTypeConstant.SELECT.getCode())) {
+            //截取车牌
+            if (linkVo.getAttrCode().equals("LicenseNo")) {
+                value = value.substring(0, 2);
+            }
+            return selectEqual(linkVo, value);
+        } else if (rulesAttr.getAttrType().equals(AttrTypeConstant.RADIO.getCode())) {
+            return radioEqual(linkVo, value);
+        } else if (rulesAttr.getAttrType().equals(AttrTypeConstant.DATETIME.getCode())){
+            return dateTimeEqual(linkVo, value);
+        }
+
+        return true;
+    }
+
+    private boolean checkBoxEqual(RuleAttrLinkVo linkVo, String value) {
+        String[] split = linkVo.getMin().split(",");
+        for (String sp : split) {
+            if (sp.equals(value)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean inputNumberEqual(RuleAttrLinkVo linkVo, String value) {
+        double v = Double.parseDouble(value);
+        //统一处理数值
+        if (OperatorConstant.InputNumber.EQ.getCode().equals(linkVo.getOperator())) {
+            if (Double.parseDouble(linkVo.getMin()) <= v &&
+                    Double.parseDouble(linkVo.getMax()) >= v) {
+                return true;
+            }
+        } else if (OperatorConstant.InputNumber.LT.getCode().equals(linkVo.getOperator())) {
+            if (Double.parseDouble(linkVo.getMin()) > v) {
+                return true;
+            }
+        } else if (OperatorConstant.InputNumber.LE.getCode().equals(linkVo.getOperator())) {
+            if (Double.parseDouble(linkVo.getMin()) >= v) {
+                return true;
+            }
+        } else if (OperatorConstant.InputNumber.GT.getCode().equals(linkVo.getOperator())) {
+            if (Double.parseDouble(linkVo.getMax()) < v) {
+                return true;
+            }
+        } else if (OperatorConstant.InputNumber.GE.getCode().equals(linkVo.getOperator())) {
+            if (Double.parseDouble(linkVo.getMax()) <= v) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    private boolean inputTagEqual(RuleAttrLinkVo linkVo, String value) {
+        //将值进行分割
+
+        AtomicBoolean returnBool = new AtomicBoolean(false);
+
+        List<String> equalsMap = new ArrayList<>();
+        //字符型评分
+        equalsMap.add("CharacterBasedRating");
+        //交强字符型评分
+        equalsMap.add("JqCharacterBasedRating");
+        //商业字符型评分
+        equalsMap.add("SyCharacterBasedRating");
+
+
+
+        //equest 等于判断
+//        if(equalsMap.contains(linkVo.getAttrCode())){
+//            boolean b = value.anyMatch(value::equals);
+//            returnBool.set(b);
+//        }else if((ptlAgreementProductCostsAttrLink.getAttrCode().equals("BrandandModel") || ptlAgreementProductCostsAttrLink.getAttrCode().equals("CarOwnerName"))
+//                && ptlAgreementProductCostsAttrLink.getOperator().equals("2")){
+//            //处理品牌型号  不包含的情况
+//            boolean anyMatch = Arrays.stream(split)
+//                    .anyMatch(value::contains);
+//            returnBool.set(!anyMatch);
+//        }else {
+//            boolean anyMatch = Arrays.stream(split)
+//                    .anyMatch(value::contains);
+//            returnBool.set(anyMatch);
+//        }
+        return returnBool.get();
+    }
+
+
+    private boolean selectEqual(RuleAttrLinkVo linkVo, String value) {
+        if (linkVo.getMin() != null && linkVo.getMin().contains(value)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean radioEqual(RuleAttrLinkVo linkVo, String value) {
+        //新能源判断
+//        if ("NewEnergy".equals(linkVo.getAttrCode())) {
+//            // 是否是新能源车
+//            boolean newEnergy = EnergyType.isNewEnergy(value);
+//            if (newEnergy && linkVo.getMin().equals("1")) {
+//                return true;
+//            } else if (!newEnergy && linkVo.getMin().equals("0")) {
+//                return true;
+//            }
+//        } else if (linkVo.getMin().contains(value)) {
+//            return true;
+//        }
+        return linkVo.getMin().equals(value);
+    }
+
+    public boolean dateTimeEqual(RuleAttrLinkVo linkVo, String value){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        if(Objects.isNull(value) || value.equals("")){
+            return false;
+        }
+        LocalDateTime v = LocalDateTime.parse(value,formatter);
+        LocalDateTime min = null,max = null;
+        if(!Objects.isNull(linkVo.getMin())){
+            min = LocalDateTime.parse(linkVo.getMin(),formatter);
+        }
+        if(!Objects.isNull(linkVo.getMax())){
+            max = LocalDateTime.parse(linkVo.getMax(),formatter);
+        }
+
+        //统一处理数值
+        if (OperatorConstant.DateTime.EQ.getCode().equals(linkVo.getOperator())) {
+            if (v.isAfter(min) && v.isBefore(max)) {
+                return true;
+            }
+        } else if (OperatorConstant.DateTime.LT.getCode().equals(linkVo.getOperator())) {
+            if (v.isBefore(min)) {
+                return true;
+            }
+        } else if (OperatorConstant.DateTime.LE.getCode().equals(linkVo.getOperator())) {
+            if (v.isBefore(min) || v.isEqual(min)) {
+                return true;
+            }
+        } else if (OperatorConstant.DateTime.GT.getCode().equals(linkVo.getOperator())) {
+            if (v.isAfter(max)) {
+                return true;
+            }
+        } else if (OperatorConstant.DateTime.GE.getCode().equals(linkVo.getOperator())) {
+            if (v.isAfter(max) || v.isEqual(max)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    //region  表单转换成json对象
+
+    @Override
+    public void traverseJsonObject(JSONObject jsonObject, HashMap<String,String> attrMap) {
+        if (Objects.isNull(jsonObject)) {
+            return;
+        }
+        // 遍历 JSONObject 的所有键值对
+        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+            String key = entry.getKey();
+            Object value = entry.getValue();
+
+            if(!(value instanceof JSONObject) && !(value instanceof JSONArray)){
+                attrMap.put(key.toLowerCase(),value.toString());
+            }
+
+            // 如果值是嵌套的 JSONObject,递归遍历
+            if (value instanceof JSONObject) {
+                if(isUserKey(key))
+                {
+                    traverseJsonObject((JSONObject) value,attrMap,key);
+                }else{
+                    traverseJsonObject((JSONObject) value,attrMap);
+                }
+            }
+
+            // 如果值是嵌套的数组(JSONArray),遍历数组
+            if (value instanceof JSONArray) {
+                System.out.println("Nested JSONArray for key: " + key);
+                traverseJsonArray((JSONArray) value,attrMap);
+            }
+        }
+    }
+
+    /**
+     * 处理车主 投保人 被保人信息
+     * @param jsonObject
+     * @param attrMap
+     * @param parentKey
+     */
+    public void traverseJsonObject(JSONObject jsonObject,HashMap<String,String> attrMap,String parentKey) {
+        if (Objects.isNull(jsonObject)) {
+            return;
+        }
+        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+            String key = entry.getKey();
+            Object value = entry.getValue();
+
+            if(!(value instanceof JSONObject) && !(value instanceof JSONArray)){
+                attrMap.put(parentKey.toLowerCase() + key.toLowerCase(),value.toString());
+            }
+        }
+    }
+
+    public void traverseJsonArray(JSONArray jsonArray,HashMap<String,String> attrMap) {
+        if (jsonArray == null) {
+            System.out.println("JSONArray is null.");
+            return;
+        }
+
+        // 遍历 JSONArray 的所有元素
+        for (int i = 0; i < jsonArray.size(); i++) {
+            Object element = jsonArray.get(i);
+
+            // 打印数组元素
+            System.out.println("Array element at index " + i + ": " + element);
+
+            // 如果元素是嵌套的 JSONObject,递归遍历
+            if (element instanceof JSONObject) {
+                System.out.println("Nested JSONObject in array at index: " + i);
+                traverseJsonObject((JSONObject) element,attrMap);
+            }
+
+            // 如果元素是嵌套的数组(JSONArray),递归遍历
+            if (element instanceof JSONArray) {
+                System.out.println("Nested JSONArray in array at index: " + i);
+                traverseJsonArray((JSONArray) element,attrMap);
+            }
+        }
+    }
+
+    //判断是否是车主 投保人 被保人信息
+    public boolean isUserKey(String key){
+        if(key.equals("ownersInfo") || key.equals("policyHolderInfo") || key.equals("insuredPersonInfo")){
+            return true;
+        }
+        return false;
+    }
+
+    //endregion
+
+
+    @Override
+    public Map<String, List<RuleAttrLinkVo>> convertSchemeRule(Map<String, List<PtlSchemeRulesAttrLink>> schemeRules){
+        Map<String, List<RuleAttrLinkVo>> convertMaps = new HashMap<>();
+        for (Map.Entry<String, List<PtlSchemeRulesAttrLink>> entry : schemeRules.entrySet()) {
+            String key = entry.getKey();
+            List<RuleAttrLinkVo> vos = new ArrayList<>();
+            List<PtlSchemeRulesAttrLink> values = entry.getValue();
+
+            values.forEach(value->{
+                RuleAttrLinkVo vo = new RuleAttrLinkVo();
+                vo.setMin(value.getMin());
+                vo.setMax(value.getMax());
+                vo.setAttrCode(value.getAttrCode());
+                vo.setOperator(value.getOperator());
+                vo.setMinArray(value.getMinArray().toArray(new String[0]));
+                vos.add(vo);
+            });
+            convertMaps.put(key,vos);
+        }
+        return convertMaps;
+    }
+}

+ 4 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/quote/CustomerInfoVo.java

@@ -115,5 +115,8 @@ public class CustomerInfoVo implements Serializable {
      * 法人身份证止期
      */
     private String leaderOtherEffectiveDate;
-
+    /**
+     * 注册资本金
+     */
+    private String registeredCapital;
 }

+ 11 - 5
tenant/insurance/quotation-summary/pom.xml

@@ -18,11 +18,6 @@
     </properties>
 
     <dependencies>
-        <dependency>
-            <groupId>com.jzg</groupId>
-            <artifactId>quotation-commons</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
 <!--        <dependency>-->
 <!--            <groupId>com.jzg</groupId>-->
 <!--            <artifactId>quotation-dajia</artifactId>-->
@@ -38,6 +33,17 @@
 <!--            <artifactId>quotation-zijin</artifactId>-->
 <!--            <version>1.0-SNAPSHOT</version>-->
 <!--        </dependency>-->
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-yongcheng</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 35 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -0,0 +1,35 @@
+package com.jzg.quotation.summary.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.summary.factory.CompanyFactory;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/unify/order")
+@Tag(name = "统一订单报价管理")
+@RequiredArgsConstructor
+public class UnifyOrderManager {
+
+    /**
+     * 统一报价
+     * @param quoteVo
+     * @return
+     */
+    @PostMapping("/quote")
+    public HttpResult quote(@RequestBody QuoteVo quoteVo) throws JsonProcessingException {
+        //获取保司实体
+        QuotationApiBaseService quoteService = CompanyFactory.getQuoteService(quoteVo.getOrder().getInsuranceCompanyCode());
+        QuoteResultsVo quote = quoteService.quote(quoteVo);
+        return HttpResult.ok(quote);
+    }
+
+}

+ 23 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.summary.factory;
+
+import com.jzg.commons.constants.CompanyConstants;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.summary.factory.decorator.QuoteRestrictDecorator;
+import com.jzg.quotation.yongcheng.api.service.impl.YongChengApiRequestImpl;
+
+/**
+ * 保司工厂类
+ */
+public class CompanyFactory {
+
+    public static QuotationApiBaseService getQuoteService(String companyCode){
+        QuotationApiBaseService quoteService = null;
+        //永诚
+        if(CompanyConstants.AICS.getCompanyCode().equals(companyCode)){
+            quoteService = new YongChengApiRequestImpl();
+        }
+        //返回报价限制增强装饰器
+        return new QuoteRestrictDecorator(quoteService);
+    }
+
+}

+ 58 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteRestrictDecorator.java

@@ -0,0 +1,58 @@
+package com.jzg.quotation.summary.factory.decorator;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+
+/**
+ * 报价限制装饰器
+ */
+public class QuoteRestrictDecorator implements QuotationApiBaseService {
+    private final QuotationApiBaseService quotationApiBaseService;
+
+    public QuoteRestrictDecorator(QuotationApiBaseService quotationApiBaseService) {
+
+        this.quotationApiBaseService = quotationApiBaseService;
+
+    }
+
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        //报价前置检测次数
+
+        QuoteResultsVo quote = quotationApiBaseService.quote(quoteVo);
+        //报价后置计算费用
+
+        return quote;
+    }
+
+    @Override
+    public void underwriting(UnderwritingVo underwritingVo) {
+        quotationApiBaseService.underwriting(underwritingVo);
+    }
+
+    @Override
+    public String getPaymentLink(OrderBase orderBase) throws JsonProcessingException {
+        String paymentLink = quotationApiBaseService.getPaymentLink(orderBase);
+        return paymentLink;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+
+    }
+
+    @Override
+    public void queryOrderState(OrderBase orderBase) {
+
+    }
+}

+ 6 - 6
tenant/insurance/quotation-yongcheng/pom.xml

@@ -20,12 +20,12 @@
             <artifactId>jackson-dataformat-xml</artifactId>
             <version>2.9.0</version>
         </dependency>
-        <dependency>
-            <groupId>com.jzg</groupId>
-            <artifactId>quotation-summary</artifactId>
-            <version>1.0-SNAPSHOT</version>
-            <scope>compile</scope>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.jzg</groupId>-->
+<!--            <artifactId>quotation-summary</artifactId>-->
+<!--            <version>1.0-SNAPSHOT</version>-->
+<!--            <scope>compile</scope>-->
+<!--        </dependency>-->
     </dependencies>
     <build>
         <finalName>quotation-yongcheng</finalName>

+ 9 - 9
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java

@@ -364,15 +364,15 @@ public class AuditRequest {
         condition.setTResvTm("");
         condition.setCScsyxz("");
 
-        if(iac.getJypremium().compareTo(new BigDecimal(0)) > 0){
-            condition.setYwFlag("1");
-        }
-
-        condition.setCProdNoSY(condition.getSyFlag().equals("1") ? "0364" : "");
-        condition.setCProdNoJQ(condition.getJqFlag().equals("1") ? "0326" : "");
-
-        condition.setQuerySequenceNoSy(iac.getSyapplyno());
-        condition.setQuerySequenceNoJq(iac.getJqapplyno());
+//        if(iac.getJypremium().compareTo(new BigDecimal(0)) > 0){
+//            condition.setYwFlag("1");
+//        }
+//
+//        condition.setCProdNoSY(condition.getSyFlag().equals("1") ? "0364" : "");
+//        condition.setCProdNoJQ(condition.getJqFlag().equals("1") ? "0326" : "");
+//
+//        condition.setQuerySequenceNoSy(iac.getSyapplyno());
+//        condition.setQuerySequenceNoJq(iac.getJqapplyno());
 
         //<condition>
         Condition.Customer customer = new Condition.Customer();

+ 0 - 1
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/QuoteRequest.java

@@ -17,7 +17,6 @@ import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
 import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.DateUtil;
-import com.jzg.quotation.summary.converter.QuoteInfoConverter;
 import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
 import com.jzg.quotation.yongcheng.api.entity.dto.CarInsDateDto;
 import com.jzg.quotation.yongcheng.api.properties.AuthorityDataXml;

+ 2 - 1
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/YongChengApiRequest.java

@@ -1,11 +1,12 @@
 package com.jzg.quotation.yongcheng.api.service;
 
 import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
 import com.jzg.quotation.commons.service.QuotationBaseService;
 import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
 import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
 
-public interface YongChengApiRequest extends QuotationBaseService {
+public interface YongChengApiRequest extends QuotationApiBaseService {
 
     public ModelsQueryResponse.VehicleInfo gainVehicleModel(YcApiConfigurationProperties ycConfigureParameters, CarInfoVo carInfo);
 }

+ 1 - 5
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

@@ -15,7 +15,6 @@ import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
 import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
-import com.jzg.quotation.summary.service.QuoteRuleMappingService;
 import com.jzg.quotation.commons.utils.DuplicateInsuranceUtil;
 import com.jzg.quotation.yongcheng.api.client.SysAreaClient;
 import com.jzg.quotation.yongcheng.api.components.YcRequestApiComponents;
@@ -53,13 +52,10 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
     @Autowired
     private YcRequestApiComponents ycRequestApiComponents;
 
-    @Autowired
-    private QuoteRuleMappingService quoteRuleMappingService;
-
     @Autowired
     private RedissonClient redissonClient;
 
-    @Autowired
+//    @Autowired
     private SysAreaClient sysAreaClient;
 
 

+ 21 - 3
tenant/pom.xml

@@ -14,6 +14,7 @@
         <module>organization</module>
         <module>openfeign</module>
         <module>insurance</module>
+        <module>costsorrule</module>
     </modules>
     <dependencies>
         <dependency>
@@ -40,6 +41,7 @@
             <groupId>com.jzg</groupId>
             <artifactId>commons</artifactId>
             <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
         </dependency>
 
         <dependency>
@@ -65,6 +67,25 @@
     </dependencyManagement>
     <build>
         <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
@@ -78,9 +99,6 @@
                         <configuration>
 
                             <transformers>
-                                <!--                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">-->
-                                <!--                  <mainClass>com.example.MainClass</mainClass>-->
-                                <!--                </transformer>-->
                                 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>META-INF/spring.handlers</resource>
                                 </transformer>