xuqiang há 1 mês atrás
pai
commit
b02fccf111

+ 159 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/component/enums/RequestUrl.java

@@ -0,0 +1,159 @@
+package com.jzg.quotation.guoshou.crawler.component.enums;
+
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import lombok.AllArgsConstructor;
+
+
+@AllArgsConstructor
+public enum RequestUrl implements CrawlerRequestUrlStandard {
+
+    // 绑定信息查询
+    BIND_INFO_URL("/mesci/sales/SalesManagerBind/getBindInfo", "获取绑定信息"),
+
+    // 根据车牌号查询订单ID
+    ORDER_ID_URL("/mesci/order/MesOrderInfos/searchBylicensePlateNo", "根据车牌号查询订单信息"),
+
+    // 车辆信息查询
+    CAR_INFO_URL("/mesci/car/MesCarInfo/getVinModePage", "获取VIN车型分页信息"),
+
+    // 密码校验
+    CHECK_PASSWORD_URL("/createver/userService/user/check/password", "校验用户密码"),
+
+    // 用户信息查询
+    USER_INFO_URL("/createver/userService/user/info", "获取用户信息"),
+
+    // 我的门店
+    MY_STORE_URL("/createver/customerService/customer-service/myStore", "获取我的门店信息"),
+
+    // 获取Token
+    GET_TOKEN_URL("/MesBaseUrl/getToken", "获取接口令牌"),
+
+    // 获取登录信息
+    GET_LOGIN_INFO_URL("/mesci/sales/SalesManager/getLoginInfo", "获取登录信息"),
+
+    // JLLX车辆信息
+    JLLX_CAR_INFO_URL("/mesci/car/MesCarInfo/getJllxVinModePage", "获取JLLX VIN车型分页信息"),
+
+    // 提交投保信息
+    SUBMIT_INS_URL("/mesci/order/MesOrderInfos/submitInsuranceInformation", "提交投保信息"),
+
+    // 保费计算
+    CALCULATE_URL("/mesci/order/MesOrderInfos/doCalculate", "执行保费计算"),
+
+    // 查询投保信息
+    QUERY_INS_URL("/mesci/order/MesOrderInfos/getInsuranceInformation", "获取投保信息"),
+
+    // 加密转换
+    ENCRYPTION_CONVERT_URL("/ncisp/gatewayncisp/ncisp/ncisp/login/encryptionConvert", "加密转换"),
+
+    // 车辆确认信息
+    CAR_CONFIRM_URL("/mesci/order/MesCarInfo/getCarConfirmInfoForFrontByOrderId", "根据订单ID获取车辆确认信息"),
+
+    // 更新车辆信息
+    UPDATE_CAR_INFO_URL("/mesci/order/MesOrderInfos/updateCarInfo", "更新车辆信息"),
+
+    // 获取平台车辆信息
+    GET_PLAT_CAR_INFO_URL("/mesci/order/MesOrderInfos/getPlatCarInfo", "获取平台车辆信息"),
+
+    // 计算初始化
+    CALCULATION_INITIALIZATION_URL("/mesci/order/MesOrderInfos/calculationInitialization", "保费计算初始化"),
+
+    // 事故记录
+    DO_ACCIDENT_RECORD("/mesci/order/MesOrderInfos/doAccidentRecord", "处理事故记录"),
+
+    // 自动生成
+    DO_AUTO_GENERATE("/mesci/order/MesOrderInfos/doAutoGenerate", "自动生成订单相关信息"),
+
+    // 订单详情
+    DO_MESORDER_DETAIL("/mesci/order/MesOrderInfos/doMesOrderDetail", "查询MES订单详情"),
+
+    // 获取上传结果
+    GET_UPLOAD_SUCCESS("/mesci/img/ImgRest/getUploadSuccess", "查询图片上传结果"),
+
+    // 查询日志
+    DO_QUERY_LOG("/mesci/order/MesOrderInfos/doQueryLog", "查询操作日志"),
+
+    // 校验所有图片
+    CHECK_IMAGES_ALL("/mesci/img/ImgRest/checkImagesAll", "校验所有图片"),
+
+    // 图片上传
+    UPLOAD_URL("/mesci/img/ImgRest/uploadImages", "上传图片"),
+
+    // 合保完成任务
+    HE_BAO_URL("/mesci/order/MesOrderInfos/doCompleteTask", "执行合保完成任务"),
+
+    // 获取授权Token
+    GET_AUTH_TOKEN("/ncisp/gateway/elec/Insurance/getAuthToken", "获取授权令牌"),
+
+    // 获取分享信息
+    GET_SHARE_INFO("/ncisp/gateway/elec/Insurance/getShareInfo", "获取分享信息"),
+
+    // 创建订单/计算费用
+    CREAT_ORDER_URL("/mesci/order/MesOrderInfos/doCalcFee", "计算保费/创建订单"),
+
+    // 删除订单
+    REMOVE_ORDER_URL("/mesci/order/MesOrderInfos/removeOrder", "删除订单"),
+
+    // 获取车险产品
+    GET_FROMCAR_PRODUCTS_URL("/ncisp/gatewayncisp/ncisp/ncisp/manageProducts/getFromCarProducts", "获取车险产品列表"),
+
+    // 销售归属信息
+    SALES_FCBE_LONG_INFO_URL("/mesci/order/MesOrderInfos/salesFCBelongInfo", "查询销售FC归属信息"),
+
+    // 获取订单详情
+    GET_ORDER_DETAIL_URL("/ncisp/gateway/elec/Insurance/getOrderDetail", "获取订单详情"),
+
+    // 查询订单列表
+    DO_MES_ORDERS_URL("/mesci/order/MesOrderInfos/doMesOrders", "查询MES订单列表"),
+
+    // 获取承保方式
+    GET_UNDERWRITING_URL("/ncisp/gatewayncisp/ncisp/ncisp/manageProducts/getUnderwritingById", "查询MES订单列表"),
+
+
+    // 承保
+    UNDERWRITING_PRE_URL("/ncisp/gatewayncisp/ncisp/ncisp/order/underwritingPre", "查询MES订单列表"),
+
+    // 承保
+    ENCRYPTIONCONVERT_URL("/ncisp/gatewayncisp/ncisp/ncisp/login/encryptionConvert", "查询MES订单列表"),
+
+    // 承保
+    EMPLOYEELOGIN_URL("/ncisp/gatewayncisp/ncisp/ncisp/login/employeeLogin", "查询MES订单列表"),
+
+
+    // 承保
+    FROMCARMODELCHECK_URL("/ncisp/gatewayncisp/ncisp/ncisp/manageProducts/fromCarModelCheck", "查询MES订单列表"),
+
+
+    // 承保
+    GET_PRODUCT_INFO_BY_ID_URL("/ncisp/gatewayncisp/ncisp/ncisp/manageProducts/getProductInfoById", "查询MES订单列表"),
+
+    // 承保
+    GET_INDIVIDUAL_VO_URL("/ncisp/gatewayncisp/ncisp/ncisp/carOrderInfo/getIndividualVo", "查询MES订单列表"),
+
+
+    // 承保
+    FINDAGENTRATE_URL("/ncisp/gatewayncisp/ncisp/ncisp/manageProducts/FindAgentRate", "查询MES订单列表"),
+
+
+    // 承保
+    UNDERWRITINGVARIABLE_PREMIUMVARIABLE_PREMIUM_URL("/ncisp/gatewayncisp/ncisp/ncisp/order/underwritingVariablePremiumVariablePremium", "查询MES订单列表"),
+
+
+    ;
+
+
+    private final String uri;
+
+    private final String description;
+
+
+    @Override
+    public String getRequestDescription() {
+        return description;
+    }
+
+    @Override
+    public String uri() {
+        return uri;
+    }
+}

+ 19 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/entity/request/ProductUnderwriteRequest.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.guoshou.crawler.entity.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor  // 无参构造
+@AllArgsConstructor // 全参构造
+public class ProductUnderwriteRequest {
+    private String productId;
+    private String managerId;
+    private String businessNatureCode;
+    private String preId;
+    private String isPreUnderwriting;
+    private String systemSource;
+    private String comCode;
+
+}

+ 701 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/entity/response/ApiResponse.java

@@ -0,0 +1,701 @@
+package com.jzg.quotation.guoshou.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 接口根响应实体
+ */
+@Data
+public class ApiResponse {
+    /**
+     * 响应状态码
+     */
+    private Integer status;
+
+    /**
+     * 响应消息
+     */
+    private String msg;
+
+    /**
+     * 响应信息
+     */
+    private String message;
+
+    /**
+     * 响应数据主体
+     */
+    private StoreData data;
+
+    /**
+     * 模型
+     */
+    private Object model;
+
+    /**
+     * 校验码
+     */
+    private String parityCode;
+
+
+    /**
+     * 门店数据实体
+     */
+    @Data
+    public static class StoreData {
+        /**
+         * 评价分页对象
+         */
+        private Object evaluateDTOPage;
+
+        /**
+         * 门店列表
+         */
+        private Object storeVOList;
+
+        /**
+         * 门店ID
+         */
+        private String storeId;
+
+        /**
+         * 门店名称
+         */
+        private String storeName;
+
+        /**
+         * 浏览量
+         */
+        private Integer pageView;
+
+        /**
+         * 门店状态
+         */
+        private Object storeStatus;
+
+        /**
+         * 销售额
+         */
+        private Integer sales;
+
+        /**
+         * 订单数量
+         */
+        private Integer orderNum;
+
+        /**
+         * 业务用户信息
+         */
+        private Object businessUserDTO;
+
+        /**
+         * 门店管理员用户ID
+         */
+        private String storeKeeperUserId;
+
+        /**
+         * 门店管理员用户编码
+         */
+        private String storeKeeperUserCode;
+
+        /**
+         * 业务用户列表
+         */
+        private Object businessUserDTOList;
+
+        /**
+         * 手机号
+         */
+        private Object phone;
+
+        /**
+         * 产品数量
+         */
+        private Integer productNum;
+
+        /**
+         * 评论数量
+         */
+        private Integer commentNum;
+
+        /**
+         * 关注数量
+         */
+        private Integer followNum;
+
+        /**
+         * 标签列表
+         */
+        private Object tagDTOs;
+
+        /**
+         * 门店描述
+         */
+        private String desc;
+
+        /**
+         * 图片路径
+         */
+        private Object picPath;
+
+        /**
+         * 音频路径
+         */
+        private Object audioPath;
+
+        /**
+         * 视频路径
+         */
+        private Object videoPath;
+
+        /**
+         * 文件路径
+         */
+        private Object filePath;
+
+        /**
+         * 是否推荐
+         */
+        private Boolean recommend;
+
+        /**
+         * 产品类型ID
+         */
+        private Object productTypeId;
+
+        /**
+         * 产品ID集合
+         */
+        private Object productIds;
+
+        /**
+         * 海报列表
+         */
+        private List<Object> postersDTOS;
+
+        /**
+         * 单个产品信息
+         */
+        private Object productDTO;
+
+        /**
+         * 产品列表
+         */
+        private Object productDTOS;
+
+        /**
+         * 产品链接
+         */
+        private Object productUrl;
+
+        /**
+         * 产品海报链接
+         */
+        private Object productPostUrl;
+
+        /**
+         * 城市名称
+         */
+        private String cityName;
+
+        /**
+         * 保险产品列表
+         */
+        private List<InsuranceProduct> ncispProducts;
+
+        /**
+         * 评分
+         */
+        private Double score;
+
+        /**
+         * 头像链接
+         */
+        private String headUrl;
+
+        /**
+         * 是否用户
+         */
+        private String isUser;
+
+        /**
+         * 门店海报
+         */
+        private String storePoster;
+
+        /**
+         * 门店内容
+         */
+        private String storeContent;
+
+        /**
+         * 门店海报ID
+         */
+        private String storePosterId;
+
+        /**
+         * 门店允许数量
+         */
+        private Integer storeAllowNum;
+
+        /**
+         * 评价数量
+         */
+        private Integer evaluateNum;
+
+        /**
+         * 手机号码
+         */
+        private String mobile;
+
+        /**
+         * 投标ID
+         */
+        private String bid;
+
+        /**
+         * 首页横幅
+         */
+        private Object homeBanner;
+
+        /**
+         * 收藏类型
+         */
+        private Object collectType;
+
+        /**
+         * 跳转链接
+         */
+        private String jumpLink;
+    }
+
+
+    /**
+     * 保险产品实体
+     */
+    @Data
+    public static class InsuranceProduct {
+        /**
+         * 期限类型数量
+         */
+        private Object periodTypeNum;
+
+        /**
+         * 期限
+         */
+        private Object periods;
+
+        /**
+         * 最小期限
+         */
+        private Object minPeriod;
+
+        /**
+         * 最大期限
+         */
+        private Object maxPeriod;
+
+        /**
+         * 保险数量
+         */
+        private Object insuranceNum;
+
+        /**
+         * 描述链接列表
+         */
+        private Object descirbUrlList;
+
+        /**
+         * 产品模型ID
+         */
+        private String productModelId;
+
+        /**
+         * 产品模型路径
+         */
+        private Object productModelPath;
+
+        /**
+         * 特别约定
+         */
+        private Object specialAgreement;
+
+        /**
+         * 特别约定状态
+         */
+        private Object specialAgreementStatus;
+
+        /**
+         * 产品编码
+         */
+        private Object productCode;
+
+        /**
+         * 机构ID
+         */
+        private Object officeId;
+
+        /**
+         * 产品名称
+         */
+        private String productName;
+
+        /**
+         * 产品描述
+         */
+        private String productDescribe;
+
+        /**
+         * 产品介绍
+         */
+        private String productIntroduce;
+
+        /**
+         * 产品声明标题
+         */
+        private Object productStatementTitle;
+
+        /**
+         * 产品声明内容
+         */
+        private Object productStatementContent;
+
+        /**
+         * 是否有声明
+         */
+        private Object hasStatement;
+
+        /**
+         * 配额项目编号
+         */
+        private String quotaProjectNo;
+
+        /**
+         * 产品描述链接
+         */
+        private Object productDescirbUrl;
+
+        /**
+         * 产品横幅链接
+         */
+        private String productBannerUrl;
+
+        /**
+         * 产品海报链接
+         */
+        private String productPosterUrl;
+
+        /**
+         * 期限
+         */
+        private Object period;
+
+        /**
+         * 期限类型
+         */
+        private String periodType;
+
+        /**
+         * 总金额
+         */
+        private Object totalAmount;
+
+        /**
+         * 总保费
+         */
+        private String totalPremium;
+
+        /**
+         * 比例保费
+         */
+        private Object ratioPremium;
+
+        /**
+         * 原始保费
+         */
+        private Object originalPremium;
+
+        /**
+         * 审核状态
+         */
+        private Object examineStatus;
+
+        /**
+         * 代理费率审核状态
+         */
+        private Object agentRateExamineStatus;
+
+        /**
+         * 审核拒绝原因
+         */
+        private Object examineRefuseReason;
+
+        /**
+         * 使用状态
+         */
+        private String usingStatus;
+
+        /**
+         * 所属类型
+         */
+        private Object belongToType;
+
+        /**
+         * 版本状态
+         */
+        private Object versionStatus;
+
+        /**
+         * 版本号
+         */
+        private Object versionNo;
+
+        /**
+         * 分类编码
+         */
+        private String classificationCode;
+
+        /**
+         * 保险类型ID
+         */
+        private String insuranceTypeId;
+
+        /**
+         * 保险类型名称
+         */
+        private Object insuranceTypeName;
+
+        /**
+         * 代理费率
+         */
+        private Object agentRate;
+
+        /**
+         * 全渠道
+         */
+        private Object allChannel;
+
+        /**
+         * 投保人与被保人相同
+         */
+        private Object sameHolderAndInsured;
+
+        /**
+         * 今日活动数量
+         */
+        private Object todayActNum;
+
+        /**
+         * 固定被保人关系
+         */
+        private Object fixedInsuredPersonRelation;
+
+        /**
+         * 被保人最小年龄
+         */
+        private Object insuredPersonAgeMin;
+
+        /**
+         * 被保人最大年龄
+         */
+        private Object insuredPersonAgeMax;
+
+        /**
+         * 投保人最小年龄
+         */
+        private Object policyHolderAgeMin;
+
+        /**
+         * 投保人最大年龄
+         */
+        private Object policyHolderAgeMax;
+
+        /**
+         * 投保人年龄限制
+         */
+        private Object policyHolderAgeLimit;
+
+        /**
+         * 被保人年龄限制
+         */
+        private Object insuredPersonAgeLimit;
+
+        /**
+         * 关系列表
+         */
+        private Object relationList;
+
+        /**
+         * 消息模板ID
+         */
+        private Object messageTemplateId;
+
+        /**
+         * 最早生效时间
+         */
+        private Object earliestEffectiveTime;
+
+        /**
+         * 是否可变保费
+         */
+        private String isVariablePremium;
+
+        /**
+         * 投保人类型
+         */
+        private Object policyHolderType;
+
+        /**
+         * 被保人类型
+         */
+        private Object insuredPersonType;
+
+        /**
+         * 投保人最小年龄单位
+         */
+        private Object policyHolderAgeMinUnit;
+
+        /**
+         * 被保人最小年龄单位
+         */
+        private Object insuredPersonAgeMinUnit;
+
+        /**
+         * 立即生效
+         */
+        private Object immediateEffect;
+
+        /**
+         * 立即生效数量
+         */
+        private Object immediateEffectNum;
+
+        /**
+         * 立即生效最大数量
+         */
+        private Object immediateEffectMaxNum;
+
+        /**
+         * 立即生效最晚时间
+         */
+        private Object immediateEffectLatestTime;
+
+        /**
+         * 查看费用
+         */
+        private Object seeFee;
+
+        /**
+         * 是否赠送保险
+         */
+        private Object isGiveInsurance;
+
+        /**
+         * 权限
+         */
+        private Object authority;
+
+        /**
+         * 限制被保人数
+         */
+        private Object limitInsuredNum;
+
+        /**
+         * 电子开关
+         */
+        private Object elecSwitch;
+
+        /**
+         * 电子功能开关
+         */
+        private Object elecFunSwitch;
+
+        /**
+         * 生活备注
+         */
+        private Object lifeNote;
+
+        /**
+         * 销售区域编码
+         */
+        private Object salesAreaCode;
+
+        /**
+         * 销售区域名称
+         */
+        private Object salesAreaName;
+
+        /**
+         * 部门编码
+         */
+        private Object deptCode;
+
+        /**
+         * 部门名称
+         */
+        private Object deptName;
+
+        /**
+         * 分类名称
+         */
+        private Object classificationName;
+
+        /**
+         * 产品ID
+         */
+        private String id;
+
+        /**
+         * 创建人
+         */
+        private Object createBy;
+
+        /**
+         * 创建时间
+         */
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+        private Date createDate;
+
+        /**
+         * 更新人
+         */
+        private Object updateBy;
+
+        /**
+         * 更新时间
+         */
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+        private Date updateDate;
+
+        /**
+         * 备注
+         */
+        private Object remarks;
+
+        /**
+         * 状态
+         */
+        private Object status;
+
+        /**
+         * 新标识
+         */
+        private Object newFlag;
+
+        /**
+         * 销量
+         */
+        private String salesVolume;
+
+        /**
+         * 类型
+         */
+        private String type;
+    }
+
+
+}

+ 349 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/entity/response/GetUserInfoResponse.java

@@ -0,0 +1,349 @@
+package com.jzg.quotation.guoshou.crawler.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class GetUserInfoResponse {
+
+
+    @JsonProperty("status")
+    private Integer status;
+
+    @JsonProperty("msg")
+    private String msg;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("data")
+    private UserData data;
+
+    @JsonProperty("model")
+    private Object model;
+
+    @JsonProperty("parityCode")
+    private String parityCode;
+
+    /**
+     * data 节点嵌套实体
+     */
+    @Data
+    public static class UserData {
+
+        @JsonProperty("userCode")
+        private String userCode;
+
+        @JsonProperty("managerId")
+        private String managerId;
+
+        @JsonProperty("channels")
+        private Object channels;
+
+        @JsonProperty("mesChannel")
+        private Object mesChannel;
+
+        @JsonProperty("ncispChannel")
+        private NcispChannel ncispChannel;
+
+        @JsonProperty("provinceBid")
+        private String provinceBid;
+
+        @JsonProperty("bid")
+        private String bid;
+
+        @JsonProperty("bidName")
+        private String bidName;
+
+        @JsonProperty("deptId")
+        private String deptId;
+
+        @JsonProperty("deptName")
+        private String deptName;
+
+        @JsonProperty("depttype")
+        private String depttype;
+
+        @JsonProperty("mobile")
+        private String mobile;
+
+        @JsonProperty("pid")
+        private String pid;
+
+        @JsonProperty("practfno")
+        private String practfno;
+
+        @JsonProperty("psnname")
+        private String psnname;
+
+        @JsonProperty("tid")
+        private String tid;
+
+        @JsonProperty("teamName")
+        private String teamName;
+
+        @JsonProperty("downgradeFlag")
+        private Object downgradeFlag;
+
+        @JsonProperty("controlDownloads")
+        private Integer controlDownloads;
+
+        @JsonProperty("status")
+        private Integer status;
+
+        @JsonProperty("tags")
+        private Object tags;
+
+        @JsonProperty("occupation")
+        private Object occupation;
+
+        @JsonProperty("roles")
+        private Object roles;
+
+        @JsonProperty("levelDTO")
+        private LevelDTO levelDTO;
+
+        @JsonProperty("currentRole")
+        private CurrentRole currentRole;
+
+        @JsonProperty("phone")
+        private String phone;
+
+        @JsonProperty("nickname")
+        private String nickname;
+
+        @JsonProperty("realName")
+        private String realName;
+
+        @JsonProperty("email")
+        private String email;
+
+        @JsonProperty("age")
+        private Integer age;
+
+        @JsonProperty("idCard")
+        private String idCard;
+
+        @JsonProperty("sex")
+        private Integer sex;
+
+        @JsonProperty("headImg")
+        private String headImg;
+
+        @JsonProperty("height")
+        private Object height;
+
+        @JsonProperty("birthday")
+        private Long birthday;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("lng")
+        private Object lng;
+
+        @JsonProperty("lat")
+        private Object lat;
+
+        @JsonProperty("provinceId")
+        private String provinceId;
+
+        @JsonProperty("provinceName")
+        private String provinceName;
+
+        @JsonProperty("cityId")
+        private String cityId;
+
+        @JsonProperty("cityName")
+        private String cityName;
+
+        @JsonProperty("countyId")
+        private String countyId;
+
+        @JsonProperty("countyName")
+        private String countyName;
+
+        @JsonProperty("userId")
+        private String userId;
+
+        @JsonProperty("openId")
+        private String openId;
+
+        @JsonProperty("contactNumber")
+        private String contactNumber;
+
+        @JsonProperty("studyTime")
+        private Integer studyTime;
+
+        @JsonProperty("score")
+        private BigDecimal score;
+
+        @JsonProperty("fiscalUserCode")
+        private String fiscalUserCode;
+
+        @JsonProperty("fiscalUserCodeUsedFlag")
+        private String fiscalUserCodeUsedFlag;
+
+        @JsonProperty("pre")
+        private Boolean pre;
+
+        @JsonProperty("password")
+        private String password;
+
+        @JsonProperty("downFlag")
+        private Integer downFlag;
+
+        @JsonProperty("frozenIdCard")
+        private String frozenIdCard;
+
+        @JsonProperty("createDate")
+        private Long createDate;
+
+        @JsonProperty("tenantId")
+        private String tenantId;
+
+        @JsonProperty("enUserCode")
+        private String enUserCode;
+
+        @JsonProperty("anxinAesUserCode")
+        private String anxinAesUserCode;
+    }
+
+    /**
+     * ncispChannel 嵌套实体
+     */
+    @Data
+    public static class NcispChannel {
+
+        @JsonProperty("id")
+        private String id;
+
+        @JsonProperty("userBusinessId")
+        private String userBusinessId;
+
+        @JsonProperty("userCode")
+        private String userCode;
+
+        @JsonProperty("mechanismCode")
+        private String mechanismCode;
+
+        @JsonProperty("managerId")
+        private String managerId;
+
+        @JsonProperty("channelType")
+        private String channelType;
+
+        @JsonProperty("channelName")
+        private String channelName;
+
+        @JsonProperty("userResourceCode")
+        private String userResourceCode;
+
+        @JsonProperty("userResource")
+        private String userResource;
+
+        @JsonProperty("userAgentCode")
+        private String userAgentCode;
+
+        @JsonProperty("userAgentId")
+        private String userAgentId;
+
+        @JsonProperty("userAgentName")
+        private String userAgentName;
+
+        @JsonProperty("interactionCommissionerCode")
+        private String interactionCommissionerCode;
+
+        @JsonProperty("interactionCommissionerName")
+        private String interactionCommissionerName;
+
+        @JsonProperty("handlerCode")
+        private String handlerCode;
+
+        @JsonProperty("handlerName")
+        private String handlerName;
+
+        @JsonProperty("identificationCode")
+        private String identificationCode;
+
+        @JsonProperty("qfdepttype")
+        private String qfdepttype;
+
+        @JsonProperty("registeredAddressOfAgenc")
+        private String registeredAddressOfAgenc;
+
+        @JsonProperty("permitNo")
+        private String permitNo;
+
+        @JsonProperty("qlfyctfNo")
+        private String qlfyctfNo;
+
+        @JsonProperty("saleschlcode")
+        private String saleschlcode;
+
+        @JsonProperty("agreementNo")
+        private String agreementNo;
+
+        @JsonProperty("businessType")
+        private String businessType;
+    }
+
+    /**
+     * levelDTO 嵌套实体
+     */
+    @Data
+    public static class LevelDTO {
+
+        @JsonProperty("id")
+        private String id;
+
+        @JsonProperty("grade")
+        private Integer grade;
+
+        @JsonProperty("levelNumber")
+        private Integer levelNumber;
+
+        @JsonProperty("growthNum")
+        private Integer growthNum;
+
+        @JsonProperty("days")
+        private Object days;
+
+        @JsonProperty("message")
+        private String message;
+
+        @JsonProperty("extras")
+        private Object extras;
+
+        @JsonProperty("type")
+        private String type;
+
+        @JsonProperty("upgradeTime")
+        private Long upgradeTime;
+
+        @JsonProperty("cycle")
+        private Boolean cycle;
+    }
+
+    /**
+     * currentRole 嵌套实体
+     */
+    @Data
+    public static class CurrentRole {
+
+        @JsonProperty("roleId")
+        private String roleId;
+
+        @JsonProperty("name")
+        private String name;
+
+        @JsonProperty("permissions")
+        private Object permissions;
+    }
+
+
+
+}

+ 143 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/entity/response/LoginInfoResponse.java

@@ -0,0 +1,143 @@
+package com.jzg.quotation.guoshou.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class LoginInfoResponse {
+
+    // 响应消息
+    @JsonProperty("msg")
+    private String msg;
+
+    // 响应数据
+    @JsonProperty("data")
+    private UserData data;
+
+    // 响应状态码
+    @JsonProperty("status")
+    private String status;
+
+
+    @Data
+    public static class UserData {
+
+        @JsonProperty("managerId")
+        private String managerId;
+
+        @JsonProperty("userCode")
+        private String userCode;
+
+        @JsonProperty("userName")
+        private String userName;
+
+        @JsonProperty("userLevel")
+        private String userLevel;
+
+        @JsonProperty("userDepartment")
+        private String userDepartment;
+
+        @JsonProperty("userResourceCode")
+        private String userResourceCode;
+
+        @JsonProperty("userResource")
+        private String userResource;
+
+        @JsonProperty("userAgentCode")
+        private String userAgentCode;
+
+        @JsonProperty("userAgentName")
+        private String userAgentName;
+
+        @JsonProperty("channelType")
+        private String channelType;
+
+        @JsonProperty("channelName")
+        private String channelName;
+
+        @JsonProperty("groupCode")
+        private String groupCode;
+
+        @JsonProperty("groupType")
+        private String groupType;
+
+        @JsonProperty("resourceAgentStatus")
+        private String resourceAgentStatus;
+
+        @JsonProperty("provincialCom")
+        private String provincialCom;
+
+        @JsonProperty("bussMappingList")
+        private List<BussMapping> bussMappingList;
+
+        @JsonProperty("qfdepttype")
+        private String qfdepttype;
+
+        @JsonProperty("permitNo")
+        private String permitNo;
+
+        @JsonProperty("qlfyctfNo")
+        private String qlfyctfNo;
+
+        @JsonProperty("isHaveBind")
+        private String isHaveBind;
+
+        @JsonProperty("bindId")
+        private String bindId;
+
+        @JsonProperty("handerUserResourceCode")
+        private String handerUserResourceCode;
+
+        @JsonProperty("coreSystemSource")
+        private String coreSystemSource;
+
+        @JsonProperty("oriSysOperator")
+        private String oriSysOperator;
+
+        @JsonProperty("oriSysOperatorKey")
+        private String oriSysOperatorKey;
+
+        @JsonProperty("isTSuccess")
+        private String isTSuccess;
+
+        @JsonProperty("practfno")
+        private String practfno;
+
+        @JsonProperty("initialSystemSource")
+        private String initialSystemSource;
+
+        @JsonProperty("businessnatureStr")
+        private String businessnatureStr;
+
+        @JsonProperty("recommendGarageFlag")
+        private String recommendGarageFlag;
+
+        @JsonProperty("aesCode")
+        private String aesCode;
+
+        @JsonProperty("appliPendPaymentFlag")
+        private String appliPendPaymentFlag;
+
+        @JsonProperty("syShow")
+        private String syShow;
+
+        @JsonProperty("userLoginType")
+        private String userLoginType;
+    }
+
+    @Data
+    public static class BussMapping {
+
+        @JsonProperty("businessnature")
+        private String businessnature;
+
+        @JsonProperty("bussname")
+        private String bussname;
+
+    }
+
+
+}

+ 67 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/entity/response/RedisResultDTO.java

@@ -0,0 +1,67 @@
+package com.jzg.quotation.guoshou.crawler.entity.response;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RedisResultDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 令牌
+     */
+    private String token;
+
+    /**
+     * 用户编码
+     */
+    private String userCode;
+
+    /**
+     * 业务ID/标识
+     */
+    private String bid;
+
+    /**
+     * 解码后的商品/项目信息
+     */
+    private String gstcItem;
+
+    /**
+     * 业务部门/办公部门
+     */
+    private String businessOffice;
+
+    /**
+     * 用户ID
+     */
+    private String userID;
+
+    /**
+     * H5跳转地址
+     */
+    private String H5URL;
+
+    /**
+     * 视图令牌
+     */
+    private String viewtoken;
+
+
+    public RedisResultDTO build(String token, String userCode, String bid, String gstcItem,
+                                String businessOffice, String userID, String H5URL, String viewtoken) {
+        this.token = token;
+        this.userCode = userCode;
+        this.bid = bid;
+        this.gstcItem = gstcItem;
+        this.businessOffice = businessOffice;
+        this.userID = userID;
+        this.H5URL = H5URL;
+        this.viewtoken = viewtoken;
+        return this;
+    }
+}
+

+ 33 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/properties/GuoShouCrawlerProperties.java

@@ -0,0 +1,33 @@
+package com.jzg.quotation.guoshou.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 国寿配置
+ */
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "guoshou.crawler")
+public class GuoShouCrawlerProperties {
+
+    /**
+     * 请求路劲
+     */
+    private String baseUrl;
+
+
+    /**
+     * 请求路劲
+     */
+    private String quoteUrl;
+
+    /**
+     * 请求路劲
+     */
+    private String tokenUrl;
+
+}

+ 452 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/util/ModularDataProcessor.java

@@ -0,0 +1,452 @@
+package com.jzg.quotation.guoshou.crawler.util;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.quotation.guoshou.crawler.entity.response.UserInfoResponse;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 模块化数据处理器 - 优化版
+ * 功能:根据产品白名单处理核保信息模块,填充、加密、显隐控制字段
+ * 保留所有JSON null字段
+ */
+
+@Component
+public class ModularDataProcessor {
+
+    // ====================== 常量定义 ======================
+    /** 白名单产品ID */
+    private static final List<String> VALID_PRODUCT_IDS = List.of(
+            "fd2dc8abe5f94eacbc8efd3bf62a8581",
+            "39f47efbd6004899b4fa7c80bfdba801",
+            "54b7cce17316444aade70427d8abea0a",
+            "7e1108d1db2c428d8cf35e3e6896bb15",
+            "fc9cd193ce444508b355b5d5522ffc00",
+            "71d3c2271fe5404d82c78fb07d116cf0",
+            "77bcfb9bff014a93bfca0ed792c30258",
+            "new-2d0bc85a46c799ff4ad0c8521348",
+            "f65730fe001a4c998aabc1d2e7258a96"
+    );
+
+    private static final String TYPE_1 = "1";
+    private static final String DISPLAY_BLOCK = "block";
+    private static final String DISPLAY_NONE = "none";
+    private static final String MUST_FILL_0 = "0";
+    private static final String MUST_FILL_2 = "2";
+    private static final String FIELD_TYPE_NEGATIVE_1 = "-1";
+    private static final String READONLY_1 = "1";
+
+    public void processModularData(JSONArray modularList, String productId, QuoteVo quoteVo,
+                                   String seat, JSONObject jsonObject, UserInfoResponse.UserData loginInfo,
+                                   String branchOfficeName, JSONObject data8vo) {
+        // 非白名单产品直接返回
+        if (!VALID_PRODUCT_IDS.contains(productId)) {
+            return;
+        }
+
+        // 提取基础信息(空值安全)
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        CustomerInfoVo policyHolder = quoteVo.getPolicyHolderInfo();
+        CustomerInfoVo insuredPerson = quoteVo.getInsuredPersonInfo();
+
+        // 遍历模块列表
+        for (int i = 0; i < modularList.size(); i++) {
+            JSONObject modular = modularList.getJSONObject(i);
+            if (modular == null) {
+                continue;
+            }
+
+            Integer sortNo = modular.getInteger("sortNo");
+            JSONArray infoList = modular.getJSONArray("ncispUnderwritingInfoList");
+            if (sortNo == null || infoList == null) {
+                continue;
+            }
+
+            // 根据sortNo处理对应模块
+            JSONArray newInfoList = switch (sortNo) {
+                case 0 -> handleSortNoZero(infoList, policyHolder);
+                case 100 -> handleSortNoHundred(infoList, insuredPerson);
+                case 200 -> handleSortNoTwoHundred(infoList, carInfoVo);
+                case 300, 600 -> handleSortNoThreeHundredOrSixHundred(infoList, seat);
+                case 9999 -> handleSortNoMax(infoList);
+                default -> new JSONArray();
+            };
+
+            // 模块统一设置(保留原有逻辑)
+            if (List.of(0, 100, 200, 9999).contains(sortNo)) {
+                modular.put("selected", true);
+            }
+            // 保留所有null字段,强制覆盖
+            modular.put("ncispUnderwritingInfoList", newInfoList);
+        }
+
+        overwriteData(data8vo, productId, jsonObject, loginInfo, branchOfficeName, quoteVo);
+
+    }
+
+    // ====================== 模块处理方法(拆分后职责单一) ======================
+
+    /**
+     * 处理 sortNo = 0 投保人信息模块
+     */
+    private JSONArray handleSortNoZero(JSONArray infoList, CustomerInfoVo policyHolder) {
+        JSONArray newList = new JSONArray();
+        String today = LocalDate.now().toString();
+
+        for (int i = 0; i < infoList.size(); i++) {
+            JSONObject item = infoList.getJSONObject(i);
+            if (item == null) {
+                newList.add(null); // 保留null
+                continue;
+            }
+
+            String fieldName = item.getString("backEndTranslationNameYl");
+            String type = item.getString("type");
+
+            if (TYPE_1.equals(type)) {
+                switch (fieldName) {
+                    case "customerName" -> setEncryptedField(item, policyHolder.getName());
+                    case "mobile" -> setEncryptedField(item, policyHolder.getMobile());
+                    case "identifyType" -> {
+                        item.put("readonly", READONLY_1);
+                        item.put("fieldValue", "idCard");
+                        item.put("fieldValueName", "居民身份证");
+                        item.put("mustFill", MUST_FILL_2);
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                    case "identifyNumber" -> setEncryptedField(item, policyHolder.getIdentifyNumber());
+                    case "age" -> item.put("display", DISPLAY_NONE);
+                    case "sex" -> {
+                        String sexVal = item.getString("fieldValueName");
+                        item.put("fieldValueName", "2".equals(sexVal) ? "女" : "男");
+                        item.put("fieldValue", "1");
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "identifyEffectiveStartDate" -> {
+                        item.put("fieldType", FIELD_TYPE_NEGATIVE_1);
+                        item.put("mustFill", MUST_FILL_0);
+                        item.put("display", DISPLAY_BLOCK);
+                        item.put("minDate", "1900-01-01");
+                        item.put("maxDate", today);
+                    }
+                    case "identifyEffectiveTerm" -> {
+                        item.put("fieldType", FIELD_TYPE_NEGATIVE_1);
+                        item.put("fieldValue", "100");
+                        item.put("mustFill", MUST_FILL_0);
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                    case "citizenship" -> item.put("display", DISPLAY_BLOCK);
+                    case "provinceCode" -> {
+                        item.put("readonly", READONLY_1);
+                        item.put("fieldDescribe", "省市地区");
+                        item.put("fieldValue", policyHolder.getProvinceCode());
+                        item.put("fieldValueName", policyHolder.getProvince());
+                        item.put("areaCodeList", List.of(
+                                policyHolder.getProvinceCode(),
+                                policyHolder.getCityCode(),
+                                policyHolder.getCountyCode()
+                        ));
+                        item.put("remarks", policyHolder.getProvince());
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                    case "cityCode" -> {
+                        item.put("readonly", READONLY_1);
+                        item.put("fieldValue", policyHolder.getCityCode());
+                        item.put("fieldValueName", policyHolder.getCity());
+                        item.put("remarks", policyHolder.getCity());
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "districtCode" -> {
+                        item.put("readonly", READONLY_1);
+                        item.put("fieldValue", policyHolder.getCountyCode());
+                        item.put("fieldValueName", policyHolder.getCounty());
+                        item.put("remarks", policyHolder.getCounty());
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "email" -> {
+                        if (item.get("type") == null) {
+                            item.put("display", DISPLAY_BLOCK);
+                        }
+                    }
+                }
+            }
+            newList.add(item); // 保留所有字段,包括null
+        }
+        return newList;
+    }
+
+    /**
+     * 处理 sortNo = 100 被保人信息模块
+     */
+    private JSONArray handleSortNoHundred(JSONArray infoList, CustomerInfoVo insuredPerson) {
+        JSONArray newList = new JSONArray();
+        String today = LocalDate.now().toString();
+
+        for (int i = 0; i < infoList.size(); i++) {
+            JSONObject item = infoList.getJSONObject(i);
+            if (item == null) {
+                newList.add(null);
+                continue;
+            }
+
+            String fieldName = item.getString("backEndTranslationNameYl");
+            String type = item.getString("type");
+
+            if (TYPE_1.equals(type)) {
+                switch (fieldName) {
+                    case "relationToApplicantCode" -> {
+                        item.put("fieldValue", "1");
+                        item.put("fieldValueName", "本人");
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                    case "customerName" -> {
+                        item.put("display", DISPLAY_NONE);
+                        setEncryptedFieldValueOnly(item, insuredPerson.getName());
+                    }
+                    case "mobile" -> {
+                        item.put("display", DISPLAY_NONE);
+                        setEncryptedFieldValueOnly(item, insuredPerson.getMobile());
+                    }
+                    case "identifyType" -> {
+                        item.put("display", DISPLAY_NONE);
+                        item.put("fieldValueName", "居民身份证");
+                    }
+                    case "identifyNumber" -> {
+                        item.put("display", DISPLAY_NONE);
+                        setEncryptedFieldValueOnly(item, insuredPerson.getIdentifyNumber());
+                    }
+                    case "sex" -> {
+                        String sexVal = item.getString("fieldValueName");
+                        item.put("fieldValueName", "2".equals(sexVal) ? "女" : "男");
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "citizenship", "age" -> item.put("display", DISPLAY_NONE);
+                    case "identifyEffectiveStartDate" -> {
+                        item.put("minDate", "1900-01-01");
+                        item.put("maxDate", today);
+                        item.put("display", DISPLAY_NONE);
+                        item.put("mustFill", MUST_FILL_0);
+                    }
+                    case "identifyEffectiveTerm" -> {
+                        item.put("display", DISPLAY_NONE);
+                        item.put("mustFill", MUST_FILL_0);
+                    }
+                    case "provinceCode" -> {
+                        item.put("fieldValue", insuredPerson.getProvinceCode());
+                        item.put("fieldValueName", insuredPerson.getProvince());
+                        item.put("fieldDescribe", "省市地区");
+                        item.put("remarks", insuredPerson.getProvince());
+                        item.put("areaCodeList", List.of(
+                                insuredPerson.getProvinceCode(),
+                                insuredPerson.getCityCode(),
+                                insuredPerson.getCountyCode()
+                        ));
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "cityCode" -> {
+                        item.put("fieldValue", insuredPerson.getCityCode());
+                        item.put("fieldValueName", insuredPerson.getCity());
+                        item.put("remarks", insuredPerson.getCity());
+                        item.put("display", DISPLAY_NONE);
+                    }
+                    case "districtCode" -> {
+                        item.put("fieldValue", insuredPerson.getCountyCode());
+                        item.put("fieldValueName", insuredPerson.getCounty());
+                        item.put("remarks", insuredPerson.getCounty());
+                        item.put("display", DISPLAY_NONE);
+                    }
+                }
+            }
+            newList.add(item);
+        }
+        return newList;
+    }
+
+    /**
+     * 处理 sortNo = 200 车辆信息模块
+     */
+    private JSONArray handleSortNoTwoHundred(JSONArray infoList, CarInfoVo carInfoVo) {
+        JSONArray newList = new JSONArray();
+
+        for (int i = 0; i < infoList.size(); i++) {
+            JSONObject item = infoList.getJSONObject(i);
+            if (item == null) {
+                newList.add(null);
+                continue;
+            }
+
+            String fieldName = item.getString("backEndTranslationNameYl");
+            if (item.get("type") == null) {
+                switch (fieldName) {
+                    case "licensePlateNo" -> setEncryptedField(item, carInfoVo.getLicenseNo());
+                    case "engineNumber" -> setEncryptedField(item, carInfoVo.getEngineNo());
+                    case "frameNo" -> setEncryptedField(item, carInfoVo.getVinNo());
+                    case "passengersNumber" -> {
+                        item.put("readonly", READONLY_1);
+                        String seatNum = carInfoVo.getSeatCount();
+                        item.put("fieldValue", seatNum);
+                        item.put("fieldValueName", seatNum + "座");
+                        item.put("mustFill", MUST_FILL_2);
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                    case "carUserNatureCode" -> {
+                        item.put("readonly", READONLY_1);
+                        item.put("fieldValue", "8A");
+                        item.put("fieldValueName", "家庭自用");
+                        item.put("mustFill", MUST_FILL_2);
+                        item.put("display", DISPLAY_BLOCK);
+                    }
+                }
+            }
+            newList.add(item);
+        }
+        return newList;
+    }
+
+    /**
+     * 处理 sortNo = 300 / 600 座位数模块
+     */
+    private JSONArray handleSortNoThreeHundredOrSixHundred(JSONArray infoList, String seat) {
+        JSONArray newList = new JSONArray();
+        for (int i = 0; i < infoList.size(); i++) {
+            JSONObject item = infoList.getJSONObject(i);
+            if (item == null) {
+                newList.add(null);
+                continue;
+            }
+
+            String fieldName = item.getString("backEndTranslationNameYl");
+            if (item.get("type") == null && "passengersNumber".equals(fieldName)) {
+                item.put("fieldValue", String.valueOf(seat));
+                item.put("fieldValueName", seat + "座");
+                newList.add(item);
+            }
+        }
+        return newList;
+    }
+
+    /**
+     * 处理 sortNo = 9999 备注模块
+     */
+    private JSONArray handleSortNoMax(JSONArray infoList) {
+        JSONArray newList = new JSONArray();
+        for (int i = 0; i < infoList.size(); i++) {
+            JSONObject item = infoList.getJSONObject(i);
+            if (item == null) {
+                newList.add(null);
+                continue;
+            }
+
+            String fieldName = item.getString("backEndTranslationNameYl");
+            if (item.get("type") == null && "mark1".equals(fieldName)) {
+                item.put("display", DISPLAY_BLOCK);
+                newList.add(item);
+            }
+        }
+        return newList;
+    }
+
+    // ====================== 通用工具方法(复用逻辑) ======================
+
+    /**
+     * 设置加密字段(通用投保人/车辆)
+     */
+    private void setEncryptedField(JSONObject item, String rawValue) {
+        item.put("fieldType", FIELD_TYPE_NEGATIVE_1);
+        item.put("mustFill", MUST_FILL_2);
+        item.put("display", DISPLAY_BLOCK);
+        String encrypted = RsaUtils.encrypt(rawValue);
+        item.put("fieldValue", encrypted);
+        item.put("fieldValueName", encrypted);
+    }
+
+    /**
+     * 仅加密赋值,不修改显示/必填属性(被保人专用)
+     */
+    private void setEncryptedFieldValueOnly(JSONObject item, String rawValue) {
+        String encrypted = RsaUtils.encrypt(rawValue);
+        item.put("fieldValue", encrypted);
+        item.put("fieldValueName", encrypted);
+    }
+
+
+
+
+    public void overwriteData(com.alibaba.fastjson2.JSONObject secondData, String productId, com.alibaba.fastjson2.JSONObject jsonObject, UserInfoResponse.UserData loginInfo, String branchOfficeName, QuoteVo quoteVo){
+        if ("fd2dc8abe5f94eacbc8efd3bf62a8581".equals(productId)
+                || "39f47efbd6004899b4fa7c80bfdba801".equals(productId)
+                || "54b7cce17316444aade70427d8abea0a".equals(productId)
+                || "7e1108d1db2c428d8cf35e3e6896bb15".equals(productId)
+                || "fc9cd193ce444508b355b5d5522ffc00".equals(productId)
+                || "71d3c2271fe5404d82c78fb07d116cf0".equals(productId)
+                || "77bcfb9bff014a93bfca0ed792c30258".equals(productId)
+                || "new-2d0bc85a46c799ff4ad0c8521348".equals(productId)
+                || "f65730fe001a4c998aabc1d2e7258a96".equals(productId)) {
+            secondData.put("salesmanCode",loginInfo.getUserCode());
+            secondData.put("channelType", loginInfo.getChannelType());
+            secondData.put("lockType", "0");
+            secondData.put("recommendGarageFlag", "0");
+            secondData.put("remarks", "");
+            secondData.put("selectGroupId", null);
+            secondData.put("fromCarSystemSource", "gstc");
+            secondData.put("orderSource", "0");
+            secondData.put("policyHolderTypeOption", null);
+            secondData.put("policyHolderType", "1");
+            secondData.put("insuredPersonType", "1");
+            secondData.put("insuredPersonTypeOption", null);
+            secondData.put("saleAgreementNo", jsonObject.getString("saleAgreementNo"));
+            secondData.put("businessNatureName", jsonObject.getString("businessNatureName"));
+            secondData.put("salesman", jsonObject.getString("salesman"));
+
+
+            secondData.put("comCode", loginInfo.getUserDepartment());
+
+            secondData.put("systemSource", "fromCar");
+
+            secondData.put("saleAgreementName", jsonObject.getString("userAgentName"));
+
+            secondData.put("businessOfficeName", branchOfficeName);
+            secondData.put("makeCom", loginInfo.getUserDepartment());
+            secondData.put("policeConfirmedFlag", "0");
+
+            // 三目运算 + 时间方法(完全对应Python)
+            RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
+            RiskInfoVo ciRiskInfoVo = quoteVo.getCiRiskInfoVo();
+            String startDate;
+            String endDate;
+            if (Objects.nonNull(biRiskInfoVo)) {
+                startDate = biRiskInfoVo.getStartDate();
+                endDate = biRiskInfoVo.getEndDate();
+            } else {
+                startDate = ciRiskInfoVo.getStartDate();
+                endDate = ciRiskInfoVo.getEndDate();
+            }
+            secondData.put("startDate", startDate);
+            secondData.put("period", "");
+            secondData.put("recordClerkCode",loginInfo.getUserCode());
+            secondData.put("agreeCusFlag", "0");
+            secondData.put("endDate", endDate);
+
+            // 空值字段
+            secondData.put("docSalePracticeNo", (Object) null);
+            secondData.put("docSalesName", (Object) null);
+            secondData.put("docSalesPhone", (Object) null);
+            secondData.put("recommendGarageName", (Object) null);
+            secondData.put("recommendGarageCode", (Object) null);
+
+            secondData.put("businessNatureCode",jsonObject.getString("businessNatureCode"));
+            secondData.put("remarks",quoteVo.getCarInfoVo().getLicenseNo()); // 覆盖remarks
+        }
+    }
+
+
+
+}