Просмотр исходного кода

(+)查询权益信息、权益入库

郭子栋 6 месяцев назад
Родитель
Сommit
b8c4f94eae
38 измененных файлов с 2954 добавлено и 7 удалено
  1. 0 1
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostEnd.java
  2. 102 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsDto.java
  3. 26 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsInfoDto.java
  4. 112 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsPackageDto.java
  5. 26 0
      commons/src/main/java/com/jzg/commons/entity/rights/dto/RightsGrantReceiverDTO.java
  6. 1 0
      commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRights.java
  7. 0 2
      commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRightsPackage.java
  8. 23 0
      commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsInfoVo.java
  9. 199 0
      commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsPackageVo.java
  10. 201 0
      commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsVo.java
  11. 12 0
      commons/src/main/java/com/jzg/commons/entity/system/po/SysSystemBusPerms.java
  12. 15 1
      commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java
  13. 2 0
      gateway/src/main/resources/application-dev.yml
  14. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/SummaryQuotationApplication.java
  15. 57 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/LocalLivingClient.java
  16. 84 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/components/LiveServiceCacheComponent.java
  17. 864 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/constant/CommonConstant.java
  18. 39 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrderRightsInfoController.java
  19. 107 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/RightsGrantController.java
  20. 208 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/Result.java
  21. 22 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelApiDistrLoginDTO.java
  22. 47 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsApiGrantReceiverDTO.java
  23. 56 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsApiGrantRecordDTO.java
  24. 36 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsGrantRightsDTO.java
  25. 44 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsPackageQueryDTO.java
  26. 40 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsQueryDTO.java
  27. 22 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/TokenInfo.java
  28. 54 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelRightsPackageVO.java
  29. 87 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelRightsVO.java
  30. 80 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/interceptor/LiveServiceTokenInterceptor.java
  31. 37 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsInfoService.java
  32. 33 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsPackageService.java
  33. 37 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsService.java
  34. 153 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsInfoServiceImpl.java
  35. 58 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsPackageServiceImpl.java
  36. 56 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsServiceImpl.java
  37. 10 1
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  38. 3 1
      tenant/insurance/quotation-summary/src/main/resources/application-test.yaml

+ 0 - 1
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostEnd.java

@@ -134,7 +134,6 @@ public class PtlAgreementCostEnd {
          */
         @Schema(description = "出口留点比例")
         private BigDecimal exportKeepPointRatio;
-
     }
 
 }

+ 102 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsDto.java

@@ -0,0 +1,102 @@
+package com.jzg.commons.entity.rights.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/18 17:39
+ */
+@Schema(description = "订单选择权益券DTO")
+@Data
+public class InsOrderRightsDto {
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "订单ID")
+    private String orderId;
+    @Schema(description = "权益券ID")
+    private String rightsInfoId;
+    /**类型(1.兑换券 2.折扣卷 3.抵现劵)*/
+    @Schema(description= "类型(1.兑换券 2.折扣卷 3.抵现劵)")
+    private String type;
+    /**权益名称*/
+    @Schema(description = "权益名称")
+    private String rightsName;
+    /**分类*/
+    @Schema(description = "分类")
+    private String classify;
+    /**折扣值*/
+    @Schema(description = "折扣值")
+    private String rebate;
+    /**抵现金额*/
+    @Schema(description = "抵现金额")
+    private java.math.BigDecimal amount;
+    /**权益图片*/
+    @Schema(description = "权益图片")
+    private String rightsPicture;
+    /**使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)*/
+    @Schema(description = "使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)")
+    private String useCondition;
+    /**天数*/
+    @Schema(description = "天数")
+    private Integer dayNum;
+    /**开始时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @Schema(description = "开始时间")
+    private Date startTime;
+    /**结束时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @Schema(description = "结束时间")
+    private Date endTime;
+    /**市场售价*/
+    @Schema(description = "市场售价")
+    private java.math.BigDecimal marketPrice;
+    /**协议价*/
+    @Schema(description = "协议价")
+    private java.math.BigDecimal contractRate;
+    /**三方结算价格*/
+    @Schema(description = "三方结算价格")
+    private java.math.BigDecimal settlePrice;
+    /**服务说明*/
+    @Schema(description = "服务说明")
+    private String description;
+
+    /**是否删除(0,:否 1:是)*/
+    @Schema(description = "是否删除(0,:否 1:是)")
+    private Integer delFlag;
+    /**创建者*/
+    @Schema(description = "创建者")
+    private String createBy;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+    /**修改者*/
+    @Schema(description = "修改者")
+    private String updateBy;
+    /**修改时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "修改时间")
+    private Date updateTime;
+
+    @Schema(description = "权益卷状态(1:上架,2:下架 )")
+    private Integer rightsStatus;
+
+    @Schema(description = "权益券数量")
+    private Integer rightsCount;
+
+    @Schema(description = "权益类型:1-权益")
+    private Integer rightsType;
+}

+ 26 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsInfoDto.java

@@ -0,0 +1,26 @@
+package com.jzg.commons.entity.rights.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 类描述:订单权益信息入参
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 16:31
+ */
+@Schema(description = "订单选择权益DTO")
+@Data
+public class InsOrderRightsInfoDto {
+    @Schema(description = "订单关联权益套餐列表")
+    private List<InsOrderRightsPackageDto> insOrderRightsPackageList;
+    @Schema(description = "订单关联权益券列表")
+    private List<InsOrderRightsDto> insOrderRightsList;
+
+    @Schema(description = "权益接收人")
+    private RightsGrantReceiverDTO rightsGrantReceiverDTO;
+
+}

+ 112 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/InsOrderRightsPackageDto.java

@@ -0,0 +1,112 @@
+package com.jzg.commons.entity.rights.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/18 17:39
+ */
+@Schema(description = "订单选择权益套餐DTO")
+@Data
+public class InsOrderRightsPackageDto {
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "订单ID")
+    private String orderId;
+    @Schema(description = "权益套餐id")
+    private String rightsPackageId;
+    @Schema(description = "权益套餐名称")
+    private String equityPackageName;
+
+    /**费用最大值*/
+    @Schema(description = "费用最大值")
+    private BigDecimal costPriceMax;
+    /**费用最小值*/
+    @Schema(description = "费用最小值")
+    private BigDecimal costPriceMin;
+
+
+
+    /**市场价*/
+    @Schema(description = "市场价")
+    private BigDecimal marketPrice;
+
+
+    /**协议价*/
+    @Schema(description= "协议价")
+    private BigDecimal agreementPrice;
+    /**三方结算价*/
+    @Schema(description = "三方结算价")
+    private BigDecimal threeSettlementPrice;
+
+    /**套餐售价*/
+    @Schema(description = "套餐售价")
+    private BigDecimal packagePrice;
+    /**行业id*/
+    @Schema(description = "行业id")
+    private String industryId;
+    /**是否删除(0,:否 1:是)*/
+    @Schema(description = "是否删除(0,:否 1:是)")
+    private Integer delFlag;
+    /**创建者*/
+    @Schema(description = "创建者")
+    private String createBy;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+    /**修改者*/
+    @Schema(description = "修改者")
+    private String updateBy;
+    /**修改时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "修改时间")
+    private Date updateTime;
+
+    /**是否上架(0 未上架  1  上架)*/
+    @Schema(description = "是否上架(0 未上架  1  上架)")
+    private String status;
+    @Schema(description = "第三方用户id")
+    private String threeUserId;
+//    /**总数*/
+//    @Schema(description = "权益包总数")
+//    @TableField(exist = false)
+//    private Integer totalNumber;
+
+    /**套餐id套餐名称*/
+    @Schema(description = "套餐id套餐名称")
+    @TableField(exist = false)
+    private String selectNameId;
+
+
+
+    /**第三方用户id*/
+    @Schema(description = "第三方用户id")
+    @TableField(exist = false)
+    private List<String> threeUserIdList;
+
+
+    @Schema(description  = "渠道用户id")
+    @TableField(exist = false)
+    private List<String> channelIds;
+
+    @Schema(description = "权益套餐数量")
+    private Integer rightsCount;
+
+    @Schema(description = "权益类型:2-权益包")
+    private Integer rightsType;
+}

+ 26 - 0
commons/src/main/java/com/jzg/commons/entity/rights/dto/RightsGrantReceiverDTO.java

@@ -0,0 +1,26 @@
+package com.jzg.commons.entity.rights.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Description: 渠道权益api发放接收人DTO
+ * @Author: jeecg-boot
+ * @Date: 2025-12-30
+ * @Version: V1.0
+ */
+@Data
+@Schema(description = "权益发放接收人DTO")
+public class RightsGrantReceiverDTO {
+
+    @Schema(description = "接收人类型 1 车主 2 投保人 3 被保人")
+    private Integer receiverType;
+
+    @Schema(description = "接收人姓名")
+    private String receiverName;
+
+    @Schema(description = "接收人手机号")
+    private String receiverMobile;
+
+
+}

+ 1 - 0
commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRights.java

@@ -102,6 +102,7 @@ public class InsOrderRights {
 
     @Schema(description = "权益券数量")
     private Integer rightsCount;
+
     @Schema(description = "权益类型:1-权益")
     private Integer rightsType;
     @Schema(description = "接收人类型 1 车主 2 投保人 3 被保人")

+ 0 - 2
commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRightsPackage.java

@@ -56,8 +56,6 @@ public class InsOrderRightsPackage {
     @Schema(description = "三方结算价")
     private BigDecimal threeSettlementPrice;
 
-    @Schema(description = "套餐总价")
-    private BigDecimal totalPackagePrice;
     /**套餐售价*/
     @Schema(description = "套餐售价")
     private BigDecimal packagePrice;

+ 23 - 0
commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsInfoVo.java

@@ -0,0 +1,23 @@
+package com.jzg.commons.entity.rights.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 类描述:订单权益信息入参
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 16:31
+ */
+@Schema(description = "订单关联权益VO")
+@Data
+public class InsOrderRightsInfoVo {
+    @Schema(description = "订单关联权益套餐列表")
+    private List<InsOrderRightsPackageVo> insOrderRightsPackageList;
+    @Schema(description = "订单关联权益券列表")
+    private List<InsOrderRightsVo> insOrderRightsList;
+
+}

+ 199 - 0
commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsPackageVo.java

@@ -0,0 +1,199 @@
+package com.jzg.commons.entity.rights.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.entity.rights.po.InsOrderRightsPackage;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 类描述:订单权益套餐VO
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 11:05
+ */
+@Data
+public class InsOrderRightsPackageVo {
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "订单ID")
+    private String orderId;
+    @Schema(description = "权益套餐id")
+    private String rightsPackageId;
+    @Schema(description = "权益套餐名称")
+    private String equityPackageName;
+
+    /**费用最大值*/
+    @Schema(description = "费用最大值")
+    private BigDecimal costPriceMax;
+    /**费用最小值*/
+    @Schema(description = "费用最小值")
+    private BigDecimal costPriceMin;
+
+
+
+    /**市场价*/
+    @Schema(description = "市场价")
+    private BigDecimal marketPrice;
+
+
+    /**协议价*/
+    @Schema(description= "协议价")
+    private BigDecimal agreementPrice;
+    /**三方结算价*/
+    @Schema(description = "三方结算价")
+    private BigDecimal threeSettlementPrice;
+
+    @Schema(description = "该订单下该权益套餐的总价:数量*单价")
+    private BigDecimal totalPackagePrice;
+    /**套餐售价*/
+    @Schema(description = "套餐售价")
+    private BigDecimal packagePrice;
+    /**行业id*/
+    @Schema(description = "行业id")
+    private String industryId;
+    /**是否删除(0,:否 1:是)*/
+    @Schema(description = "是否删除(0,:否 1:是)")
+    private Integer delFlag;
+    /**创建者*/
+    @Schema(description = "创建者")
+    private String createBy;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+    /**修改者*/
+    @Schema(description = "修改者")
+    private String updateBy;
+    /**修改时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "修改时间")
+    private Date updateTime;
+
+    /**是否上架(0 未上架  1  上架)*/
+    @Schema(description = "是否上架(0 未上架  1  上架)")
+    private String status;
+    @Schema(description = "第三方用户id")
+    private String threeUserId;
+//    /**总数*/
+//    @Schema(description = "权益包总数")
+//    @TableField(exist = false)
+//    private Integer totalNumber;
+
+    /**套餐id套餐名称*/
+    @Schema(description = "套餐id套餐名称")
+    private String selectNameId;
+
+    /**第三方用户id*/
+    @Schema(description = "第三方用户id")
+    private List<String> threeUserIdList;
+
+
+    @Schema(description  = "渠道用户id")
+    private List<String> channelIds;
+
+    @Schema(description = "权益套餐数量")
+    private Integer rightsCount;
+
+    @Schema(description = "权益类型:2-权益包")
+    private Integer rightsType;
+    @Schema(description = "接收人类型 1 车主 2 投保人 3 被保人")
+    private Integer receiverType;
+
+    @Schema(description = "接收人姓名")
+    private String receiverName;
+
+    @Schema(description = "接收人手机号")
+    private String receiverMobile;
+    @Schema(description = "接收人信息展示,格式为:投保人(amind-18334988143)")
+    private String receiverShow;
+    @Schema(description = "权益类型前端展示:权益套餐")
+    private String rightsTypeShow;
+
+    public InsOrderRightsPackageVo(InsOrderRightsPackage rightsPackage) {
+        if (rightsPackage != null) {
+            this.id = rightsPackage.getId();
+            this.orderId = rightsPackage.getOrderId();
+            this.rightsPackageId = rightsPackage.getRightsPackageId();
+            this.equityPackageName = rightsPackage.getEquityPackageName();
+            this.costPriceMax = rightsPackage.getCostPriceMax();
+            this.costPriceMin = rightsPackage.getCostPriceMin();
+            this.marketPrice = rightsPackage.getMarketPrice();
+            this.agreementPrice = rightsPackage.getAgreementPrice();
+            this.threeSettlementPrice = rightsPackage.getThreeSettlementPrice();
+            //该订单下该权益包总数的总价
+            BigDecimal price = rightsPackage.getPackagePrice();
+            Integer count = rightsPackage.getRightsCount();
+            if (price != null && count != null) {
+                this.totalPackagePrice = price
+                        .multiply(BigDecimal.valueOf(count))
+                        .setScale(2, RoundingMode.HALF_UP);//保留小数点后两位
+            } else {
+                // 处理 null 值的情况
+                this.totalPackagePrice = BigDecimal.ZERO;
+            }
+
+            this.packagePrice = rightsPackage.getPackagePrice();
+            this.industryId = rightsPackage.getIndustryId();
+            this.delFlag = rightsPackage.getDelFlag();
+            this.createBy = rightsPackage.getCreateBy();
+            this.createTime = rightsPackage.getCreateTime();
+            this.updateBy = rightsPackage.getUpdateBy();
+            this.updateTime = rightsPackage.getUpdateTime();
+            this.status = rightsPackage.getStatus();
+            this.threeUserId = rightsPackage.getThreeUserId();
+            this.selectNameId = rightsPackage.getSelectNameId();
+            this.threeUserIdList = rightsPackage.getThreeUserIdList();
+            this.channelIds = rightsPackage.getChannelIds();
+            this.rightsCount = rightsPackage.getRightsCount();
+            this.rightsType = rightsPackage.getRightsType();
+            this.receiverType = rightsPackage.getReceiverType();
+            this.receiverName = rightsPackage.getReceiverName();
+            this.receiverMobile = rightsPackage.getReceiverMobile();
+
+            // 组装 receiverShow 字段
+            this.receiverShow = assembleReceiverShow();
+            this.rightsTypeShow = "权益套餐";
+        }
+    }
+
+    /**
+     * 组装接收人显示信息
+     * 格式为:接收人类型(接收人姓名-接收人手机号)
+     * 例如:投保人(amind-18334988143)
+     */
+    private String assembleReceiverShow() {
+        if (this.receiverType == null || this.receiverName == null || this.receiverMobile == null) {
+            return null;
+        }
+
+        String receiverTypeDesc = convertReceiverType(this.receiverType);
+        return String.format("%s(%s-%s)",
+                receiverTypeDesc,
+                this.receiverName,
+                this.receiverMobile);
+    }
+
+    /**
+     * 转换接收人类型
+     */
+    private String convertReceiverType(Integer receiverType) {
+        if (receiverType == null)
+            return "未知";
+        switch (receiverType) {
+            case 1: return "车主";
+            case 2: return "投保人";
+            case 3: return "被保人";
+            default: return "其他";
+        }
+    }
+}

+ 201 - 0
commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsVo.java

@@ -0,0 +1,201 @@
+package com.jzg.commons.entity.rights.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jzg.commons.entity.rights.po.InsOrderRights;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+
+/**
+ * 类描述:订单权益券VO
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 16:46
+ */
+@Data
+public class InsOrderRightsVo {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "订单ID")
+    private String orderId;
+    @Schema(description = "权益券ID")
+    private String rightsInfoId;
+    /**类型(1.兑换券 2.折扣卷 3.抵现劵)*/
+    @Schema(description= "类型(1.兑换券 2.折扣卷 3.抵现劵)")
+    private String type;
+    /**权益名称*/
+    @Schema(description = "权益名称")
+    private String rightsName;
+    /**分类*/
+    @Schema(description = "分类")
+    private String classify;
+    /**折扣值*/
+    @Schema(description = "折扣值")
+    private String rebate;
+    /**抵现金额*/
+    @Schema(description = "抵现金额")
+    private java.math.BigDecimal amount;
+    @Schema(description = "该订单下该权益券的总价:数量*单价")
+    private BigDecimal totalPrice;
+    /**权益图片*/
+    @Schema(description = "权益图片")
+    private String rightsPicture;
+    /**使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)*/
+    @Schema(description = "使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)")
+    private String useCondition;
+    /**天数*/
+    @Schema(description = "天数")
+    private Integer dayNum;
+    /**开始时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @Schema(description = "开始时间")
+    private Date startTime;
+    /**结束时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @Schema(description = "结束时间")
+    private Date endTime;
+    /**市场售价*/
+    @Schema(description = "市场售价")
+    private java.math.BigDecimal marketPrice;
+    /**协议价*/
+    @Schema(description = "协议价")
+    private java.math.BigDecimal contractRate;
+    /**三方结算价格*/
+    @Schema(description = "三方结算价格")
+    private java.math.BigDecimal settlePrice;
+    /**服务说明*/
+    @Schema(description = "服务说明")
+    private String description;
+
+    /**是否删除(0,:否 1:是)*/
+    @Schema(description = "是否删除(0,:否 1:是)")
+    private Integer delFlag;
+    /**创建者*/
+    @Schema(description = "创建者")
+    private String createBy;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+    /**修改者*/
+    @Schema(description = "修改者")
+    private String updateBy;
+    /**修改时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "修改时间")
+    private Date updateTime;
+
+    @Schema(description = "权益卷状态(1:上架,2:下架 )")
+    private Integer rightsStatus;
+
+    @Schema(description = "权益券数量")
+    private Integer rightsCount;
+    @Schema(description = "权益类型:1-权益")
+    private Integer rightsType;
+    @Schema(description = "接收人类型 1 车主 2 投保人 3 被保人")
+    private Integer receiverType;
+
+    @Schema(description = "接收人姓名")
+    private String receiverName;
+
+    @Schema(description = "接收人手机号")
+    private String receiverMobile;
+    @Schema(description = "接收人信息展示,格式为:投保人(amind-18334988143)")
+    private String receiverShow;
+
+    @Schema(description = "权益类型前端展示:权益券")
+    private String rightsTypeShow;
+    public InsOrderRightsVo(InsOrderRights rights) {
+        if (rights == null) {
+            return;
+        }
+
+        // 复制基本属性
+        this.id = rights.getId();
+        this.orderId = rights.getOrderId();
+        this.rightsInfoId = rights.getRightsInfoId();
+        this.type = rights.getType();
+        this.rightsName = rights.getRightsName();
+        this.classify = rights.getClassify();
+        this.rebate = rights.getRebate();
+        this.amount = rights.getAmount();
+        this.rightsPicture = rights.getRightsPicture();
+        this.useCondition = rights.getUseCondition();
+        this.dayNum = rights.getDayNum();
+        this.startTime = rights.getStartTime();
+        this.endTime = rights.getEndTime();
+        this.marketPrice = rights.getMarketPrice();
+        this.contractRate = rights.getContractRate();
+        this.settlePrice = rights.getSettlePrice();
+        this.description = rights.getDescription();
+        this.delFlag = rights.getDelFlag();
+        this.createBy = rights.getCreateBy();
+        this.createTime = rights.getCreateTime();
+        this.updateBy = rights.getUpdateBy();
+        this.updateTime = rights.getUpdateTime();
+        this.rightsStatus = rights.getRightsStatus();
+        this.rightsCount = rights.getRightsCount();
+        this.rightsType = rights.getRightsType();
+        this.receiverType = rights.getReceiverType();
+        this.receiverName = rights.getReceiverName();
+        this.receiverMobile = rights.getReceiverMobile();
+        //该订单下该权益券总价
+        BigDecimal price = rights.getAmount();
+        Integer count = rights.getRightsCount();
+        if (price != null && count != null) {
+            this.totalPrice = price
+                    .multiply(BigDecimal.valueOf(count))
+                    .setScale(2, RoundingMode.HALF_UP);//保留小数点后两位
+        } else {
+            // 处理 null 值的情况
+            this.totalPrice = BigDecimal.ZERO;
+        }
+        // 组装 receiverShow 字段(用于前端展示)
+        this.receiverShow = assembleReceiverShow();
+        this.rightsTypeShow = "权益券";
+    }
+
+    /**
+     * 组装接收人显示信息
+     * 格式为:投保人(amind-18334988143)
+     */
+    private String assembleReceiverShow() {
+        if (this.receiverType == null) {
+            return null;
+        }
+
+        String typeDesc = convertReceiverType(this.receiverType);
+        String name = this.receiverName != null ? this.receiverName : "";
+        String mobile = this.receiverMobile != null ? this.receiverMobile : "";
+
+        if (name.isEmpty() && mobile.isEmpty()) {
+            return typeDesc;
+        } else {
+            return String.format("%s(%s-%s)", typeDesc, name, mobile);
+        }
+    }
+
+    /**
+     * 转换接收人类型
+     */
+    private String convertReceiverType(Integer receiverType) {
+        if (receiverType == null) return "未知";
+        switch (receiverType) {
+            case 1: return "车主";
+            case 2: return "投保人";
+            case 3: return "被保人";
+            default: return "其他";
+        }
+    }
+}

+ 12 - 0
commons/src/main/java/com/jzg/commons/entity/system/po/SysSystemBusPerms.java

@@ -53,6 +53,12 @@ public class SysSystemBusPerms implements Serializable {
 
     @Schema(description = "微信客服")
     private Integer wechatCustomerService;
+    @Schema(description = "车主权益是否开启")
+    private Integer ownerRights;
+    @Schema(description = "车主权益PC端可用还是APP端可用1.PC,2:APP")
+    private Integer clientType;
+
+
 
     public SysSystemBusPerms(SysSystemBusPermsVo sysSystemBusPermsVo) {
         if(sysSystemBusPermsVo.getId() != null && !sysSystemBusPermsVo.getId().isEmpty())
@@ -70,5 +76,11 @@ public class SysSystemBusPerms implements Serializable {
         this.salesmanWithdrawAccountAuditDept = sysSystemBusPermsVo.getSalesmanWithdrawAccountAuditDept();
         this.salesmanWithdrawPaymentAuditDept = sysSystemBusPermsVo.getSalesmanWithdrawPaymentAuditDept();
         this.wechatCustomerService = sysSystemBusPermsVo.getWechatCustomerService();
+        if(null == sysSystemBusPermsVo.getOwnerRights()){
+            this.ownerRights = 0;//空时默认关闭赋值0
+        }else{
+            this.ownerRights = sysSystemBusPermsVo.getOwnerRights();
+        }
+        this.clientType  = sysSystemBusPermsVo.getClientType();
     }
 }

+ 15 - 1
commons/src/main/java/com/jzg/commons/entity/system/vo/SysSystemBusPermsVo.java

@@ -74,6 +74,15 @@ public class SysSystemBusPermsVo implements Serializable {
     @Schema(description = "微信客服")
     private Integer wechatCustomerService;
 
+    @Schema(description = "app查看出单费用")
+    private Integer appQueryOrderPremium;
+
+    @Schema(description = "车主权益1:开启,0:关闭")
+    private Integer ownerRights;
+
+    @Schema(description = "PC端还是APP端可用1:PC,2:APP")
+    private Integer clientType;
+
     public SysSystemBusPermsVo(SysSystemBusPerms sysSystemBusPerms, List<SysSystemBusPermsLink> links) {
         this.id = sysSystemBusPerms.getId();
 //        this.companyId = sysSystemBusPerms.getCompanyId();
@@ -85,7 +94,12 @@ public class SysSystemBusPermsVo implements Serializable {
         this.salesmanWithdrawAccountAuditDept = sysSystemBusPerms.getSalesmanWithdrawAccountAuditDept();
         this.salesmanWithdrawPaymentAuditDept = sysSystemBusPerms.getSalesmanWithdrawPaymentAuditDept();
         this.wechatCustomerService = sysSystemBusPerms.getWechatCustomerService();
-
+        if(null == sysSystemBusPerms.getOwnerRights()){
+            this.ownerRights = 0;//空时默认关闭赋值0
+        }else{
+            this.ownerRights = sysSystemBusPerms.getOwnerRights();
+        }
+        this.clientType = sysSystemBusPerms.getClientType();
         //报价的保司
         this.quoteCompanyList.addAll(links.stream()
                 .filter(link -> link.getBusCode().equals(SystemBusPermsConstants.QUOTE_COMPANY_BUS.getCode()))

+ 2 - 0
gateway/src/main/resources/application-dev.yml

@@ -113,6 +113,8 @@ spring:
                   - /adjust/**
                   - /homepage/**
                   - /order/searchHistory/**
+                  - /rightsGrant/**
+                  - /insOrderRights/**
 
         - id: costsorrule_route
           uri: http://localhost:8085/

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/SummaryQuotationApplication.java

@@ -14,7 +14,7 @@ import org.springframework.data.mongodb.repository.support.SimpleMongoRepository
 
 @SpringBootApplication(scanBasePackages = {"com.jzg"})
 @MapperScan({"com.jzg.quotation.summary.mapper", "com.jzg.commons.mapper"})
-@EnableFeignClients(basePackages = "com.jzg.quotation.commons.client")
+@EnableFeignClients(basePackages = {"com.jzg.quotation.commons.client","com.jzg.quotation.summary.client"})
 @ComponentScan(basePackages = {"com.jzg"}, nameGenerator = QuoteServiceProcessor.class)
 @EnableConfigurationProperties(YcConfigurationProperties.class)
 @EnableMongoRepositories(

+ 57 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/LocalLivingClient.java

@@ -0,0 +1,57 @@
+package com.jzg.quotation.summary.client;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.quotation.summary.entity.Result;
+import com.jzg.quotation.summary.entity.dto.*;
+import com.jzg.quotation.summary.entity.vo.ChannelRightsPackageVO;
+import com.jzg.quotation.summary.entity.vo.ChannelRightsVO;
+import jakarta.validation.Valid;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 调用生活服务平台client
+ */
+@FeignClient(value = "jeecg-boot", url = "${feign.client.jeecg-boot.url}")
+public interface LocalLivingClient {
+    /**
+     * 渠道api认证-登录
+     * @param apiDistrLoginDTO
+     * @return
+     */
+    @PostMapping("/channel/api/rightsGrant/login")
+    Result<TokenInfo> login(@RequestBody @Valid ChannelApiDistrLoginDTO apiDistrLoginDTO);
+
+    /**
+     * 权益发放-api发放
+     * @param dto
+     * @return
+     */
+    @PostMapping(value = "/channel/api/rightsGrant/apiGrant")
+    Result<String> apiGrant(@RequestBody @Valid ChannelRightsApiGrantRecordDTO dto);
+    /**
+     * 分页查询权益套餐
+     * @param queryDTO 查询条件(包含页码和每页大小)
+     * @return 分页结果
+     */
+    @PostMapping(value = "/channel/api/rightsGrant/package/list")
+    Result<Page<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO);
+
+    /**
+     * 查询权益套餐明细
+     *
+     * @param packageId 套餐ID
+     * @return 权益券列表
+     */
+    @GetMapping(value = "/channel/api/rightsGrant/package/detail/{packageId}")
+    Result<List<ChannelRightsVO>> queryRightsPackageDetail(@PathVariable String packageId);
+    /**
+     * 分页查询权益券
+     * @param queryDTO 查询条件(包含页码和每页大小)
+     * @return 分页结果
+     */
+    @PostMapping(value = "/channel/api/rightsGrant/rights/list")
+    Result<Page<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO);
+}

+ 84 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/components/LiveServiceCacheComponent.java

@@ -0,0 +1,84 @@
+package com.jzg.quotation.summary.components;
+
+import com.jzg.quotation.summary.client.LocalLivingClient;
+import com.jzg.quotation.summary.entity.Result;
+import com.jzg.quotation.summary.entity.dto.ChannelApiDistrLoginDTO;
+import com.jzg.quotation.summary.entity.dto.TokenInfo;
+import lombok.RequiredArgsConstructor;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.util.Date;
+
+/**
+ * 类描述:掌柜调生活服务平台token缓存
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/18 14:37
+ */
+@Component
+@RequiredArgsConstructor
+public class LiveServiceCacheComponent {
+    private final RedissonClient redissonClient;
+
+    public static final String LIVESERVICE_TOKEN = "liveservice:token:rights";
+
+    public static final Duration LIVESERVICE_TOKEN_TIME = Duration.ofHours(4L);
+    @Value("${live.service.appKey:}")
+    private String appKey;
+
+    @Value("${live.service.appSeCret:}")
+    private String appSeCret;
+    private final LocalLivingClient localLivingClient;
+    /**
+     * 缓存 token 信息
+     *
+     * @param expireTimeAt 过期时间
+     * @param token    token
+     */
+    public void  cacheToken(String token, Duration expireTimeAt) {
+        RBucket<String> bucket = redissonClient.getBucket(LIVESERVICE_TOKEN);
+        if(null != expireTimeAt){
+            bucket.set(token, expireTimeAt);
+        }else{
+            bucket.set(token, LIVESERVICE_TOKEN_TIME);
+        }
+    }
+    /**
+     * 获取token
+     */
+    public String getToken() {
+        RBucket<String> bucket = redissonClient.getBucket(LIVESERVICE_TOKEN);
+        return bucket.get();
+    }
+
+    /**
+     * 调生活服务平台获取token接口
+     * @return
+     */
+    public String getTokenFromLiveService() {
+        ChannelApiDistrLoginDTO apiDistrLoginDTO = new ChannelApiDistrLoginDTO();
+        apiDistrLoginDTO.setAppKey(appKey);
+        apiDistrLoginDTO.setAppSecret(appSeCret);
+        //调生活服务平台
+        Result<TokenInfo> result = localLivingClient.login(apiDistrLoginDTO);
+        if(result != null){
+            String token = result.getResult().getToken();
+            if(token != null){
+                Date expireTimeAt = result.getResult().getExpireTimeAt();
+                Date nowDate = new Date();
+                if(null != expireTimeAt){
+                    Duration duration = Duration.ofMillis(expireTimeAt.getTime() - nowDate.getTime());
+                    this.cacheToken(token,duration);
+                }
+
+            }
+            return token;
+        }
+        return null;
+    }
+}

+ 864 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/constant/CommonConstant.java

@@ -0,0 +1,864 @@
+package com.jzg.quotation.summary.constant;
+
+/**
+ * @Description: 通用常量
+ * @author: jeecg-boot
+ */
+public interface CommonConstant {
+
+    /**
+     * 正常状态
+     */
+    Integer STATUS_NORMAL = 0;
+
+    /**
+     * 禁用状态
+     */
+    Integer STATUS_DISABLE = -1;
+
+    /**
+     * 删除标志
+     */
+    Integer DEL_FLAG_1 = 1;
+
+    /**
+     * 未删除
+     */
+    Integer DEL_FLAG_0 = 0;
+
+    /**
+     * 系统日志类型: 登录
+     */
+    int LOG_TYPE_1 = 1;
+
+    /**
+     * 系统日志类型: 操作
+     */
+    int LOG_TYPE_2 = 2;
+
+    /**
+     * 系统日志类型: 租户操作日志
+     */
+    int LOG_TYPE_3 = 3;
+
+    /**
+     * 系统日志类型: 异常
+     */
+    int LOG_TYPE_4 = 4;
+
+    /**
+     * 操作日志类型: 查询
+     */
+    int OPERATE_TYPE_1 = 1;
+
+    /**
+     * 操作日志类型: 添加
+     */
+    int OPERATE_TYPE_2 = 2;
+
+    /**
+     * 操作日志类型: 更新
+     */
+    int OPERATE_TYPE_3 = 3;
+
+    /**
+     * 操作日志类型: 删除
+     */
+    int OPERATE_TYPE_4 = 4;
+
+    /**
+     * 操作日志类型: 倒入
+     */
+    int OPERATE_TYPE_5 = 5;
+
+    /**
+     * 操作日志类型: 导出
+     */
+    int OPERATE_TYPE_6 = 6;
+
+
+    /**
+     * {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
+     */
+    Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
+
+    /**
+     * {@code 404 Not Found} (HTTP/1.0 - RFC 1945)
+     */
+    Integer SC_INTERNAL_NOT_FOUND_404 = 404;
+
+    /**
+     * {@code 200 OK} (HTTP/1.0 - RFC 1945)
+     */
+    Integer SC_OK_200 = 200;
+
+    /**
+     * 访问权限认证未通过 510
+     */
+    Integer SC_JEECG_NO_AUTHZ = 510;
+
+    /**
+     * 登录用户Shiro权限缓存KEY前缀
+     */
+    public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:";
+
+    /**
+     * 登录用户Token令牌缓存KEY前缀
+     */
+    String PREFIX_USER_TOKEN = "prefix_user_token:";
+
+    /**
+     * 渠道登录token
+     */
+    String CHANNEL_USER_TOKEN = "channel_user_token:";
+    /**
+     * 渠道API token
+     */
+    String CHANNEL_API_TOKEN = "channel_api_token:";
+//    /** Token缓存时间:3600秒即一小时 */
+//    int  TOKEN_EXPIRE_TIME  = 3600;
+
+    /**
+     * 登录二维码
+     */
+    String LOGIN_QRCODE_PRE = "QRCODELOGIN:";
+
+    String LOGIN_QRCODE = "LQ:";
+
+    /**
+     * 登录二维码token
+     */
+    String LOGIN_QRCODE_TOKEN = "LQT:";
+
+
+    /**
+     * 0:一级菜单
+     */
+    Integer MENU_TYPE_0 = 0;
+
+    /**
+     * 1:子菜单
+     */
+    Integer MENU_TYPE_1 = 1;
+
+    /**
+     * 2:按钮权限
+     */
+    Integer MENU_TYPE_2 = 2;
+
+    /**
+     * 通告对象类型(USER:指定用户,ALL:全体用户)
+     */
+    String MSG_TYPE_UESR = "USER";
+
+    String MSG_TYPE_ALL = "ALL";
+
+    /**
+     * 发布状态(0未发布,1已发布,2已撤销)
+     */
+    String NO_SEND = "0";
+
+    String HAS_SEND = "1";
+
+    String HAS_CANCLE = "2";
+
+    /**
+     * 阅读状态(0未读,1已读)
+     */
+    Integer HAS_READ_FLAG = 1;
+
+    Integer NO_READ_FLAG = 0;
+
+    /**
+     * 优先级(L低,M中,H高)
+     */
+    String PRIORITY_L = "L";
+
+    String PRIORITY_M = "M";
+
+    String PRIORITY_H = "H";
+
+    /**
+     * 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
+     */
+    String SMS_TPL_TYPE_0 = "0";
+
+    String SMS_TPL_TYPE_1 = "1";
+
+    String SMS_TPL_TYPE_2 = "2";
+
+    /**
+     * 状态(0无效1有效)
+     */
+    String STATUS_0 = "0";
+
+    String STATUS_1 = "1";
+
+    Integer STATUS_0_INT = 0;
+
+    Integer STATUS_1_INT = 1;
+
+    /**
+     * 同步工作流引擎1同步0不同步
+     */
+    Integer ACT_SYNC_1 = 1;
+
+    Integer ACT_SYNC_0 = 0;
+
+    /**
+     * 消息类型1:通知公告2:系统消息
+     */
+    String MSG_CATEGORY_1 = "1";
+
+    String MSG_CATEGORY_2 = "2";
+
+    /**
+     * 是否配置菜单的数据权限 1是0否
+     */
+    Integer RULE_FLAG_0 = 0;
+
+    Integer RULE_FLAG_1 = 1;
+
+    /**
+     * 是否用户已被冻结 1正常(解冻) 2冻结 3离职
+     */
+    Integer USER_UNFREEZE = 1;
+
+    Integer USER_FREEZE = 2;
+
+    Integer USER_QUIT = 3;
+
+    /**
+     * 字典翻译文本后缀
+     */
+    String DICT_TEXT_SUFFIX = "_dictText";
+
+    /**
+     * 字典翻译颜色后缀
+     */
+    String DICT_COLOR_SUFFIX = "_dictColor";
+
+    /**
+     * 表单设计器主表类型
+     */
+    Integer DESIGN_FORM_TYPE_MAIN = 1;
+
+    /**
+     * 表单设计器子表表类型
+     */
+    Integer DESIGN_FORM_TYPE_SUB = 2;
+
+    /**
+     * 表单设计器URL授权通过
+     */
+    Integer DESIGN_FORM_URL_STATUS_PASSED = 1;
+
+    /**
+     * 表单设计器URL授权未通过
+     */
+    Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2;
+
+    /**
+     * 表单设计器新增 Flag
+     */
+    String DESIGN_FORM_URL_TYPE_ADD = "add";
+
+    /**
+     * 表单设计器修改 Flag
+     */
+    String DESIGN_FORM_URL_TYPE_EDIT = "edit";
+
+    /**
+     * 表单设计器详情 Flag
+     */
+    String DESIGN_FORM_URL_TYPE_DETAIL = "detail";
+
+    /**
+     * 表单设计器复用数据 Flag
+     */
+    String DESIGN_FORM_URL_TYPE_REUSE = "reuse";
+
+    /**
+     * 表单设计器编辑 Flag (已弃用)
+     */
+    String DESIGN_FORM_URL_TYPE_VIEW = "view";
+
+    /**
+     * online参数值设置(是:Y, 否:N)
+     */
+    String ONLINE_PARAM_VAL_IS_TURE = "Y";
+
+    String ONLINE_PARAM_VAL_IS_FALSE = "N";
+
+    /**
+     * 文件上传类型(本地:local,Minio:minio,阿里云:alioss)
+     */
+    String UPLOAD_TYPE_LOCAL = "local";
+
+    String UPLOAD_TYPE_MINIO = "minio";
+
+    String UPLOAD_TYPE_OSS = "alioss";
+
+    /**
+     * 文档上传自定义桶名称
+     */
+    String UPLOAD_CUSTOM_BUCKET = "eoafile";
+
+    /**
+     * 文档上传自定义路径
+     */
+    String UPLOAD_CUSTOM_PATH = "eoafile";
+
+    /**
+     * 文件外链接有效天数
+     */
+    Integer UPLOAD_EFFECTIVE_DAYS = 1;
+
+    /**
+     * 员工身份 (1:普通员工  2:上级)
+     */
+    Integer USER_IDENTITY_1 = 1;
+
+    Integer USER_IDENTITY_2 = 2;
+
+    /**
+     * sys_user 表 username 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_SYS_USER_USERNAME = "uniq_sys_user_username";
+
+    /**
+     * sys_user 表 work_no 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_SYS_USER_WORK_NO = "uniq_sys_user_work_no";
+
+    /**
+     * sys_user 表 phone 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_SYS_USER_PHONE = "uniq_sys_user_phone";
+
+    /**
+     * 达梦数据库升提示。违反表[SYS_USER]唯一性约束
+     */
+    String SQL_INDEX_UNIQ_SYS_USER = "唯一性约束";
+
+    /**
+     * sys_user 表 email 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_SYS_USER_EMAIL = "uniq_sys_user_email";
+
+    /**
+     * sys_quartz_job 表 job_class_name 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_JOB_CLASS_NAME = "uniq_job_class_name";
+
+    /**
+     * sys_position 表 code 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_CODE = "uniq_code";
+
+    /**
+     * sys_role 表 code 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_SYS_ROLE_CODE = "uniq_sys_role_role_code";
+
+    /**
+     * sys_depart 表 code 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_DEPART_ORG_CODE = "uniq_depart_org_code";
+
+    /**
+     * sys_category 表 code 唯一键索引
+     */
+    String SQL_INDEX_UNIQ_CATEGORY_CODE = "idx_sc_code";
+
+    /**
+     * 在线聊天 是否为默认分组
+     */
+    String IM_DEFAULT_GROUP = "1";
+
+    /**
+     * 在线聊天 图片文件保存路径
+     */
+    String IM_UPLOAD_CUSTOM_PATH = "biz/user_imgs";
+
+    /**
+     * 在线聊天 用户状态
+     */
+    String IM_STATUS_ONLINE = "online";
+
+    /**
+     * 在线聊天 SOCKET消息类型
+     */
+    String IM_SOCKET_TYPE = "chatMessage";
+
+    /**
+     * 在线聊天 是否开启默认添加好友 1是 0否
+     */
+    String IM_DEFAULT_ADD_FRIEND = "1";
+
+    /**
+     * 在线聊天 用户好友缓存前缀
+     */
+    String IM_PREFIX_USER_FRIEND_CACHE = "sys:cache:im:im_prefix_user_friend_";
+
+    /**
+     * 缓存用户id与用户名关系
+     */
+    String SYS_USER_ID_MAPPING_CACHE = "sys:cache:user:id_mapping";
+
+    /**
+     * 考勤补卡业务状态 (1:同意  2:不同意)
+     */
+    String SIGN_PATCH_BIZ_STATUS_1 = "1";
+
+    String SIGN_PATCH_BIZ_STATUS_2 = "2";
+
+    /**
+     * 公文文档上传自定义路径
+     */
+    String UPLOAD_CUSTOM_PATH_OFFICIAL = "officialdoc";
+
+    /**
+     * 公文文档下载自定义路径
+     */
+    String DOWNLOAD_CUSTOM_PATH_OFFICIAL = "officaldown";
+
+    /**
+     * WPS存储值类别(1 code文号 2 text(WPS模板还是公文发文模板))
+     */
+    String WPS_TYPE_1 = "1";
+
+    String WPS_TYPE_2 = "2";
+
+
+    /**===============================================================================================*/
+    /**
+     * ::非常重要::
+     * 注意:这四个常量值如果修改,需要与 jeecg-boot-starter/jeecg-boot-common/org.jeecg.config.FeignConfig 类中的值保持一致。
+     */
+    String X_ACCESS_TOKEN = "X-Access-Token";
+
+    String X_SIGN = "X-Sign";
+
+    String X_TIMESTAMP = "X-TIMESTAMP";
+
+    /**
+     * 租户请求头 更名为:X-Tenant-Id
+     */
+    String TENANT_ID = "X-Tenant-Id";
+
+    /**
+     * 简流接口请求头,用于排除不支持的控件字段
+     */
+    String X_MiniFlowExclusionFieldMode = "X-Miniflowexclusionfieldmode";
+
+    /**
+     * ===============================================================================================
+     */
+
+    String TOKEN_IS_INVALID_MSG = "Token失效,请重新登录!";
+
+    String X_FORWARDED_SCHEME = "X-Forwarded-Scheme";
+
+
+    /**
+     * 微服务读取配置文件属性 服务地址
+     */
+    String CLOUD_SERVER_KEY = "spring.cloud.nacos.discovery.server-addr";
+
+    /**
+     * 第三方登录 验证密码/创建用户 都需要设置一个操作码 防止被恶意调用
+     */
+    String THIRD_LOGIN_CODE = "third_login_code";
+
+    /**
+     * 第三方APP同步方向:本地 --> 第三方APP
+     */
+    String THIRD_SYNC_TO_APP = "SYNC_TO_APP";
+
+    /**
+     * 第三方APP同步方向:第三方APP --> 本地
+     */
+    String THIRD_SYNC_TO_LOCAL = "SYNC_TO_LOCAL";
+
+    /**
+     * 系统通告消息状态:0=未发布
+     */
+    String ANNOUNCEMENT_SEND_STATUS_0 = "0";
+
+    /**
+     * 系统通告消息状态:1=已发布
+     */
+    String ANNOUNCEMENT_SEND_STATUS_1 = "1";
+
+    /**
+     * 系统通告消息状态:2=已撤销
+     */
+    String ANNOUNCEMENT_SEND_STATUS_2 = "2";
+
+    /**
+     * ONLINE 报表权限用 从request中获取地址栏后的参数
+     */
+    String ONL_REP_URL_PARAM_STR = "onlRepUrlParamStr";
+
+    /**
+     * POST请求
+     */
+    String HTTP_POST = "POST";
+
+    /**
+     * PUT请求
+     */
+    String HTTP_PUT = "PUT";
+
+    /**
+     * PATCH请求
+     */
+    String HTTP_PATCH = "PATCH";
+
+    /**
+     * 未知的
+     */
+    String UNKNOWN = "unknown";
+
+    /**
+     * 字符串http
+     */
+    String STR_HTTP = "http";
+
+    /**
+     * String 类型的空值
+     */
+    String STRING_NULL = "null";
+
+    /**
+     * 前端vue3版本Header参数名
+     */
+    String VERSION = "X-Version";
+
+    String VERSION_V3 = "v3";
+
+    /**
+     * 存储在线程变量里的动态表名
+     */
+    String DYNAMIC_TABLE_NAME = "DYNAMIC_TABLE_NAME";
+
+    /**
+     * http:// http协议
+     */
+    String HTTP_PROTOCOL = "http://";
+
+    /**
+     * https:// https协议
+     */
+    String HTTPS_PROTOCOL = "https://";
+
+    /**
+     * 部门表唯一key,id
+     */
+    String DEPART_KEY_ID = "id";
+
+    /**
+     * 部门表唯一key,orgCode
+     */
+    String DEPART_KEY_ORG_CODE = "orgCode";
+
+    /**======【消息推送相关】==============================================================================*/
+    /**
+     * 发消息 会传递一些信息到map
+     */
+    String NOTICE_MSG_SUMMARY = "NOTICE_MSG_SUMMARY";
+
+    /**
+     * 发消息 会传递一个业务ID到map
+     */
+    String NOTICE_MSG_BUS_ID = "NOTICE_MSG_BUS_ID";
+
+    /**
+     * 发消息 消息业务类型
+     */
+    String NOTICE_MSG_BUS_TYPE = "NOTICE_MSG_BUS_TYPE";
+
+    /**
+     * 邮箱消息中地址登录时地址后携带的token,需要替换成真实的token值
+     */
+    String LOGIN_TOKEN = "{LOGIN_TOKEN}";
+
+    /**
+     * 模板消息中 跳转地址的对应的key
+     */
+    String MSG_HREF_URL = "url";
+
+    /**
+     * sys_data_log表的类型 用于区别评论区域的日志数据
+     */
+    String DATA_LOG_TYPE_COMMENT = "comment";
+
+    /**
+     * sys_data_log表的类型 老的数据比较 类型都设置为json
+     */
+    String DATA_LOG_TYPE_JSON = "json";
+
+    /**
+     * 消息模板:markdown
+     */
+    String MSG_TEMPLATE_TYPE_MD = "5";
+    /**========【消息推送相关】==========================================================================*/
+
+    /**
+     * 短信验证码redis-key的前缀
+     */
+    String PHONE_REDIS_KEY_PRE = "phone_msg";
+
+    /**
+     * 是文件夹
+     */
+    String IT_IS_FOLDER = "1";
+
+    /**
+     * 文件拥有者
+     */
+    String FILE_OWNER = "owner";
+
+    /**
+     * 文件管理员
+     */
+    String FILE_ADMIN = "admin";
+
+    /**
+     * 只允许编辑
+     */
+    String FILE_EDITABLE = "editable";
+
+    /**
+     * 文件 只读
+     */
+    String FILE_READONLY = "readonly";
+
+    /**
+     * 登录失败,用于记录失败次数的key
+     */
+    String LOGIN_FAIL = "LOGIN_FAIL_";
+
+    /**
+     * 入职事件
+     */
+    Integer BPM_USER_EVENT_ADD = 1;
+
+    /**
+     * 离职事件
+     */
+    Integer BPM_USER_EVENT_LEVEL = 2;
+
+    /**
+     * 用户租户状态(正常/已通过审核的)
+     */
+    String USER_TENANT_NORMAL = "1";
+
+    /**
+     * 用户租户状态(离职)
+     */
+    String USER_TENANT_QUIT = "2";
+
+    /**
+     * 用户租户状态(审核中)
+     */
+    String USER_TENANT_UNDER_REVIEW = "3";
+
+    /**
+     * 用户租户状态(拒绝)
+     */
+    String USER_TENANT_REFUSE = "4";
+
+    /**
+     * 用户租户状态(邀请)
+     */
+    String USER_TENANT_INVITE = "5";
+
+    /**
+     * 不是叶子节点
+     */
+    Integer NOT_LEAF = 0;
+
+    /**
+     * 是叶子节点
+     */
+    Integer IS_LEAF = 1;
+
+    /**
+     * 钉钉
+     */
+    String DINGTALK = "DINGTALK";
+
+    /**
+     * 企业微信
+     */
+    String WECHAT_ENTERPRISE = "WECHAT_ENTERPRISE";
+
+    /**
+     * 系统默认租户id 0
+     */
+    Integer TENANT_ID_DEFAULT_VALUE = 0;
+
+    /**
+     * 【low-app用】 应用级别的复制
+     */
+    String COPY_LEVEL_APP = "app";
+
+    /**
+     * 【low-app用】 菜单级别的复制
+     */
+    String COPY_LEVEL_MENU = "menu";
+
+
+    /**
+     * 【low-app用】 应用备份
+     */
+    String COPY_LEVEL_BAK = "backup";
+
+    /**
+     * 【low-app用】 从备份还原
+     */
+    String COPY_LEVEL_COVER = "cover";
+
+    /**
+     * 【QQYUN-6034】关联字段变更历史值,缓存半个小时
+     */
+    String CACHE_REL_FIELD_OLD_VAL = "sys:cache:desform:relFieldOldVal:";
+
+    /**
+     * 排序类型:升序
+     */
+    String ORDER_TYPE_ASC = "ASC";
+
+    /**
+     * 排序类型:降序
+     */
+    String ORDER_TYPE_DESC = "DESC";
+
+
+    //update-begin---author:scott ---date:2023-09-10  for:积木报表常量----
+
+    /**
+     * 报表允许设计开发的角色
+     */
+    public static String[] allowDevRoles = new String[]{"lowdeveloper", "admin"};
+
+    /**
+     * 【对应积木报表的常量】
+     * 数据隔离模式: 按照创建人隔离
+     */
+    public static final String SAAS_MODE_CREATED = "created";
+
+    /**
+     * 【对应积木报表的常量】
+     * 数据隔离模式: 按照租户隔离
+     */
+    public static final String SAAS_MODE_TENANT = "tenant";
+    //update-end---author:scott ---date::2023-09-10  for:积木报表常量----
+
+    //update-begin---author:wangshuai---date:2024-04-07---for:修改手机号常量---
+
+    /**
+     * 修改手机号短信验证码redis-key的前缀
+     */
+    String CHANGE_PHONE_REDIS_KEY_PRE = "sys:cache:phone:change_phone_msg:";
+
+    /**
+     * 手机号短信验证码redis-key的前缀
+     */
+    String LOG_OFF_PHONE_REDIS_KEY_PRE = "sys:cache:phone:qqy_log_off_user_msg:";
+
+    /**
+     * 缓存用户最后一次收到消息通知的时间 KEY
+     */
+    String CACHE_KEY_USER_LAST_ANNOUNT_TIME_1HOUR = "sys:cache:userinfo:user_last_annount_time::%s";
+
+    /**
+     * 验证原手机号
+     */
+    String VERIFY_ORIGINAL_PHONE = "verifyOriginalPhone";
+
+    /**
+     * 短信登录验证码
+     */
+    String SMS_LOGIN_PHONE = "sys:cache:phone:sms_login_phone";
+
+    /**
+     * openId短信登录验证码
+     */
+    String PREFIX_OPEN_ID_CODE = "openId:code:";
+
+    /**
+     * 订单临时支付token
+     */
+    String PAY_ORDER_TOKEN = "pay:order:token:";
+
+    /**
+     * 修改手机号
+     */
+    String UPDATE_PHONE = "updatePhone";
+    //update-end---author:wangshuai---date:2024-04-07---for:修改手机号常量---
+
+    /**
+     * 修改手机号验证码请求次数超出
+     */
+    Integer PHONE_SMS_FAIL_CODE = 40002;
+
+    String LONGIN_APP = "AppType";
+
+    String LONGIN_APP_USER = "longinAppUser";
+
+    String LONGIN_APP_USER_ID = "longinAppUserId";
+
+    /**
+     * 三方用户id
+     */
+    String LONGIN_THREE_USER_ID = "longinThreeUserId";
+
+    /**
+     * 三方用户信息
+     */
+    String LONGIN_THREE_USER = "longinThreeUser";
+
+    /**
+     * appToken
+     */
+    String PREFIX_APP_USER_TOKEN = "prefix_app_user_token:";
+
+    /**
+     * h5token
+     */
+    String PREFIX_H5_USER_TOKEN = "prefix_h5_user_token:";
+
+    /**
+     * 未查询有普通用户角色
+     **/
+    Integer MERCHANT_LOGIN_ERROR_501 = 501;
+
+    /**
+     * 用户状态为“回收箱”、“黑名单”、“失效用户”  或者 其他报错
+     **/
+    Integer MERCHANT_LOGIN_ERROR_502 = 502;
+
+    /**
+     * 商家apptoken缓存
+     */
+    String PREFIX_WECHAT_USER_TOKEN = "prefix_wechat_user_token:";
+
+
+    /**
+     * 设备类型
+     */
+    String DEVICE_ID = "deviceId";
+
+    /**
+     * 卷中心登录用户Token令牌缓存KEY前缀
+     */
+
+    String COUPONCENTER_PREFIX_USER_TOKEN = "couponcenter_prefix_user_token";
+
+    String LONGIN_COUPONCENTER_USER = "longinCouponcenterUser";
+
+    String LONGIN_COUPONCENTER_USER_ID = "longinCouponcenterUserId";
+}

+ 39 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrderRightsInfoController.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.summary.controller;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.rights.dto.InsOrderRightsInfoDto;
+import com.jzg.quotation.summary.service.InsOrderRightsInfoService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotBlank;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 类描述:订单选择权益入口controller
+ * @author guozidong
+ * @version 1.0
+ * @date 2026/3/13 16:23
+ */
+@Tag(name="订单选择权益接口")
+@RestController
+@RequestMapping("/insOrderRights")
+public class InsOrderRightsInfoController {
+    @Autowired
+    private InsOrderRightsInfoService insOrderRightsInfoService;
+    @PostMapping("/saveRights")
+    @Operation(summary = "保存权益券信息")
+    public HttpResult saveInsOrderRightsInfo(@RequestBody InsOrderRightsInfoDto insOrderRightsInfoDto,@RequestParam("orderNo") String orderNo) {
+        return insOrderRightsInfoService.saveInsOrderRightsInfo(insOrderRightsInfoDto,orderNo);
+    }
+    @GetMapping("/getRightsByOrderNo")
+    @Operation(summary = "获取该订单下的权益信息")
+    public HttpResult getRightsByOrderNo(@NotBlank(message = "订单号不能为空") @RequestParam("orderNo") String orderNo){
+        return HttpResult.ok(insOrderRightsInfoService.queryByOrderNo(orderNo));
+    }
+    @GetMapping("/deleteRightsInfoById")
+    @Operation(summary = "根据主键id删除某订单的某权益")
+    public HttpResult deleteRightsInfoById(@NotBlank(message = "主键不能为空") @RequestParam("id") String id,@NotBlank(message = "权益类型不能为空") @RequestParam("rightsType")  Integer rightsType){
+        return insOrderRightsInfoService.deleteRightsInfoById(id,rightsType);
+    }
+}

+ 107 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/RightsGrantController.java

@@ -0,0 +1,107 @@
+package com.jzg.quotation.summary.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.quotation.summary.client.LocalLivingClient;
+import com.jzg.quotation.summary.entity.Result;
+import com.jzg.quotation.summary.entity.dto.*;
+import com.jzg.quotation.summary.entity.vo.ChannelRightsPackageVO;
+import com.jzg.quotation.summary.entity.vo.ChannelRightsVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 类描述:权益对接(权益查询、权益保存)
+ *
+ * @author guozidong
+ * @version 1.0
+ * @date 2026/3/11 18:20
+ */
+@Slf4j
+@Tag(name = "权益对接")
+@RestController
+@RequestMapping("/rightsGrant")
+public class RightsGrantController {
+
+
+    @Autowired
+    private LocalLivingClient localLivingClient;
+
+    @PostMapping("/login")
+    @Operation(summary = "渠道api认证-登录")
+    public HttpResult<TokenInfo> login(@RequestBody @Valid ChannelApiDistrLoginDTO apiDistrLoginDTO) {
+        //调生活服务平台
+        Result<TokenInfo> result = localLivingClient.login(apiDistrLoginDTO);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<TokenInfo> apiAuthToken = new HttpResult<>();
+        apiAuthToken.setData(result.getResult());
+        apiAuthToken.setCode(result.getCode());
+        apiAuthToken.setMsg(result.getMessage());
+        return apiAuthToken;
+    }
+
+    @Operation(summary = "权益发放-api发放")
+    @PostMapping(value = "/apiGrant")
+    public HttpResult<String> apiGrant(@RequestBody @Valid ChannelRightsApiGrantRecordDTO dto){
+        //调生活服务平台
+        Result<String> result = localLivingClient.apiGrant(dto);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<String> grantResult = new HttpResult<>();
+        grantResult.setData(result.getResult());
+        grantResult.setCode(result.getCode());
+        grantResult.setMsg(result.getMessage());
+        return grantResult;
+    }
+
+    @Operation(summary = "权益套餐-分页查询")
+    @PostMapping(value = "package/list")
+    public HttpResult<Page<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO) {
+        //调生活服务平台
+        Result<Page<ChannelRightsPackageVO>> result = localLivingClient.queryRightsPackagePage(queryDTO);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<Page<ChannelRightsPackageVO>> rightsPackageResult = new HttpResult<>();
+
+        rightsPackageResult.setData(result.getResult());
+        rightsPackageResult.setCode(result.getCode());
+        rightsPackageResult.setMsg(result.getMessage());
+        return rightsPackageResult;
+    }
+
+    @Operation(summary = "权益套餐-查询明细")
+    @GetMapping(value = "package/detail/{packageId}")
+    public HttpResult<List<ChannelRightsVO>> queryRightsPackageDetail(@PathVariable String packageId){
+        //调生活服务平台
+        Result<List<ChannelRightsVO>> result = localLivingClient.queryRightsPackageDetail(packageId);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<List<ChannelRightsVO>> detailResult = new HttpResult<>();
+        detailResult.setData(result.getResult());
+        detailResult.setCode(result.getCode());
+        detailResult.setMsg(result.getMessage());
+        return detailResult;
+    }
+
+    /**
+     * 分页查询权益券
+     *
+     * @param queryDTO 查询条件(包含页码和每页大小)
+     * @return 分页结果
+     */
+    @Operation(summary = "权益券-分页查询")
+    @PostMapping(value = "/rights/list")
+    public HttpResult<Page<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO) {
+        //调生活服务平台
+        Result<Page<ChannelRightsVO>> result = localLivingClient.queryRightsPage(queryDTO);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<Page<ChannelRightsVO>> rightsResult = new HttpResult<>();
+        rightsResult.setData(result.getResult());
+        rightsResult.setCode(result.getCode());
+        rightsResult.setMsg(result.getMessage());
+        return rightsResult;
+    }
+}

+ 208 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/Result.java

@@ -0,0 +1,208 @@
+package com.jzg.quotation.summary.entity;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jzg.quotation.summary.constant.CommonConstant;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *   接口返回数据格式
+ * @author scott
+ * @email jeecgos@163.com
+ * @date  2019年1月19日
+ */
+@Data
+@Tag(name = "权益对接接口返回对象")
+public class Result<T> implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 成功标志
+	 */
+	@Schema(description = "成功标志")
+	private boolean success = true;
+
+	/**
+	 * 返回处理消息
+	 */
+	@Schema(description = "返回处理消息")
+	private String message = "";
+
+	/**
+	 * 返回代码
+	 */
+	@Schema(description = "返回代码")
+	private Integer code = 0;
+	
+	/**
+	 * 返回数据对象 data
+	 */
+	@Schema(description = "返回数据对象")
+	private T result;
+	
+	/**
+	 * 时间戳
+	 */
+	@Schema(description = "时间戳")
+	private long timestamp = System.currentTimeMillis();
+	// 分页查询专用(可选)
+	private List<T> records;
+	private Long total;
+	private Long size;
+	private Long current;
+	public Result() {
+	}
+
+    /**
+     * 兼容VUE3版token失效不跳转登录页面
+     * @param code
+     * @param message
+     */
+	public Result(Integer code, String message) {
+		this.code = code;
+		this.message = message;
+	}
+
+	public Result<T> success(String message) {
+		this.message = message;
+		this.code = CommonConstant.SC_OK_200;
+		this.success = true;
+		return this;
+	}
+
+	public static<T> Result<T> ok() {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		return r;
+	}
+
+	public static<T> Result<T> ok(String msg) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		//Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D
+		r.setResult((T) msg);
+		r.setMessage(msg);
+		return r;
+	}
+
+	public static<T> Result<T> ok(T data) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setResult(data);
+		return r;
+	}
+
+	public static<T> Result<T> OK() {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		return r;
+	}
+
+	/**
+	 * 此方法是为了兼容升级所创建
+	 *
+	 * @param msg
+	 * @param <T>
+	 * @return
+	 */
+	public static<T> Result<T> OK(String msg) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setMessage(msg);
+		//Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D
+		r.setResult((T) msg);
+		return r;
+	}
+
+	public static<T> Result<T> OK(T data) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setResult(data);
+		return r;
+	}
+	// 分页成功响应
+	public static <T> Result<List<T>> ok(Page<T> page) {
+		Result<List<T>> result = new Result<>();
+		result.setCode(200);
+		result.setMessage("success");
+		result.setRecords((List<List<T>>) page.getRecords());
+		result.setTotal(page.getTotal());
+		result.setSize(page.getSize());
+		result.setCurrent(page.getCurrent());
+		result.setResult(page.getRecords());  // 兼容旧版
+		return result;
+	}
+	public static<T> Result<T> OK(String msg, T data) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setMessage(msg);
+		r.setResult(data);
+		return r;
+	}
+
+	public static <T> Result<T> ok(String msg, T data) {
+		Result<T> r = new Result<>();
+		r.setMessage(msg) ;
+		r.setResult(data);
+		return r;
+	}
+
+	public static<T> Result<T> error(String msg, T data) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(false);
+		r.setCode(CommonConstant.SC_INTERNAL_SERVER_ERROR_500);
+		r.setMessage(msg);
+		r.setResult(data);
+		return r;
+	}
+
+	public static<T> Result<T> error(String msg) {
+		return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
+	}
+	
+	public static<T> Result<T> error(int code, String msg) {
+		Result<T> r = new Result<T>();
+		r.setCode(code);
+		r.setMessage(msg);
+		r.setSuccess(false);
+		return r;
+	}
+
+	public Result<T> errorNew(int code, String msg) {
+		this.message = msg;
+		this.code = code;
+		this.success = false;
+		return this;
+	}
+
+	public Result<T> error500(String message) {
+		this.message = message;
+		this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
+		this.success = false;
+		return this;
+	}
+
+	/**
+	 * 无权限访问返回结果
+	 */
+	public static<T> Result<T> noauth(String msg) {
+		return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);
+	}
+
+	@JsonIgnore
+	private String onlTable;
+
+}

+ 22 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelApiDistrLoginDTO.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChannelApiDistrLoginDTO {
+
+    @NotBlank(message = "appKey不能为空")
+    @Schema(description = "appKey")
+    private String appKey;
+    @NotBlank(message = "appSecret不能为空")
+    @Schema(description = "appSecret")
+    private String appSecret;
+
+}

+ 47 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsApiGrantReceiverDTO.java

@@ -0,0 +1,47 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * @Description: 渠道权益api发放接收人DTO
+ * @Author: guozidong
+ * @Date: 2025-12-30
+ * @Version: V1.0
+ */
+@Data
+@Schema(description = "渠道权益api发放接收人DTO")
+public class ChannelRightsApiGrantReceiverDTO {
+
+    /** 接收人手机号 */
+    @Schema(description = "接收人手机号")
+    private String phone;
+
+    /** 保单号 */
+    @Schema(description = "保单号")
+    private String policyNo;
+
+    /** 车架号 */
+    @Schema(description = "车架号")
+    private String vin;
+
+    /** 接收人姓名 */
+    @Schema(description = "接收人姓名")
+    private String receiverName;
+
+    /** 返现金额(元) */
+    @Schema(description = "接收人发券金额上限(元)")
+    @NotNull(message = "接收人发券金额上限不能为空")
+    private BigDecimal receiverAmountLimit;
+
+    /** 车牌号 */
+    @Schema(description = "车牌号")
+    private String plateNo;
+
+    /** 备注 */
+    @Schema(description = "备注")
+    private String remark;
+}

+ 56 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsApiGrantRecordDTO.java

@@ -0,0 +1,56 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Description: 渠道权益发放记录DTO(内部/Service层使用)
+ * @Author: jeecg-boot
+ * @Date: 2025-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Schema(description = "渠道权益发放记录内部DTO")
+public class ChannelRightsApiGrantRecordDTO {
+
+
+    /** 机构ID */
+    @Schema(description = "机构ID")
+    private String institutionId;
+
+    /** 发放人姓名 */
+    @Schema(description = "发放人姓名")
+    private String grantUserName;
+
+    /** 发放人手机号 */
+    @Schema(description = "发放人手机号")
+    private String grantUserPhone;
+
+    /** 备注说明 */
+    @Schema(description = "备注说明")
+    private String remark;
+
+    /** 权益列表 */
+    @NotNull(message = "权益列表不能为空")
+    @Valid
+    @Schema(description = "权益列表")
+    private List<ChannelRightsGrantRightsDTO> rightsList;
+
+    /** 发放方式:1-API发放,2-H5发放,3-后台发放 */
+    @Schema(description = "发放方式:1-API发放,2-H5发放,3-后台发放")
+    private Integer grantType;
+
+    @Schema(description = "基础ID")
+    private String basicId;
+
+    /** 动态接收人(H5/API发放时使用) */
+    @NotNull(message = "动态接收人不能为空")
+    @Valid
+    @Schema(description = "动态接收人(H5/API发放时使用)")
+    private ChannelRightsApiGrantReceiverDTO receiverDTO;
+}

+ 36 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsGrantRightsDTO.java

@@ -0,0 +1,36 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 渠道权益发放权益DTO
+ * @Author: jeecg-boot
+ * @Date: 2025-12-30
+ * @Version: V1.0
+ */
+@Data
+@Schema(description = "渠道权益发放权益DTO")
+public class ChannelRightsGrantRightsDTO {
+
+    /** 权益类型:1-单独权益,2-权益包 */
+    @NotNull(message = "权益类型不能为空")
+    @Min(value = 1, message = "权益类型必须是1(单独权益)或2(权益包)")
+    @Schema(description = "权益类型:1-单独权益,2-权益包")
+    private Integer rightsType;
+
+    /** 权益内容ID(如权益ID、权益包ID) */
+    @NotBlank(message = "权益内容ID不能为空")
+    @Schema(description = "权益内容ID")
+    private String rightsContentId;
+
+    /** 权益数量 */
+    @NotNull(message = "权益数量不能为空")
+    @Min(value = 1, message = "权益数量必须大于0")
+    @Schema(description = "权益数量")
+    private Integer rightsCount;
+}

+ 44 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsPackageQueryDTO.java

@@ -0,0 +1,44 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类描述:ChannelRightsPackageQueryDTO
+ * 前端请求实体:分页查询权益套餐
+ * @author guozidong
+ * @version 1.0
+ * @date 2026/3/11 11:21
+ */
+@Data
+@Schema(description = "权益套餐查询参数")
+public class ChannelRightsPackageQueryDTO {
+
+    @Schema(description = "省市编码",example = "140000,140100")
+    private String countryAll;
+
+    @Schema(description = "筛选最低价格")
+    private BigDecimal minPrice;
+
+    @Schema(description = "筛选最高价格")
+    private BigDecimal maxPrice;
+
+    @Schema(description = "排序方式:1-低价优先,2-高价优先")
+    private Integer sortType;
+
+    @Schema(description = "渠道ID")
+    private String channelId;
+
+    @Schema(description = "套餐名称")
+    private String packageName;
+
+    @Schema(description = "页码,默认1")
+    private Integer pageNo = 1;
+
+    @Schema(description = "每页大小,默认10")
+    private Integer pageSize = 10;
+
+
+}

+ 40 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsQueryDTO.java

@@ -0,0 +1,40 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "权益券查询参数")
+public class ChannelRightsQueryDTO {
+
+    @Schema(description = "省市编码")
+    private String countryAll;
+
+    @Schema(description = "筛选最低价格")
+    private BigDecimal minPrice;
+
+    @Schema(description = "筛选最高价格")
+    private BigDecimal maxPrice;
+
+    @Schema(description = "排序方式:1-低价优先,2-高价优先")
+    private Integer sortType;
+
+    @Schema(description = "渠道ID")
+    private String channelId;
+
+    @Schema(description = "权益券名称")
+    private String rightsName;
+
+    @Schema(description = "权益券分类")
+    private String classify;
+
+    @Schema(description = "页码,默认1")
+    private Integer pageNo = 1;
+
+    @Schema(description = "每页大小,默认10")
+    private Integer pageSize = 10;
+
+    
+}

+ 22 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/TokenInfo.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TokenInfo {
+
+    @Schema(description = "token")
+    private String token;
+    @Schema(description = "过期时刻")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expireTimeAt;
+
+}

+ 54 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelRightsPackageVO.java

@@ -0,0 +1,54 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+/**
+ * 类描述:ChannelRightsPackageVO
+ * 返回前端报文实体:分页查询权益套餐
+ * @author guozidong
+ * @version 1.0
+ * @date 2026/3/11 11:21
+ */
+@Data
+@Schema(description = "权益套餐VO")
+public class ChannelRightsPackageVO {
+
+    @Schema(description = "套餐ID")
+    private String id;
+
+    @Schema(description = "套餐名称")
+    private String equityPackageName;
+
+    @Schema(description = "套餐价格/关联券的市场价之和")
+    private BigDecimal totalPackagePrice;
+
+    @Schema(description = "三方结算价")
+    private BigDecimal threeSettlementPrice;
+
+    @Schema(description = "套餐售价")
+    private BigDecimal packagePrice;
+
+    @Schema(description = "套餐状态:1-上架,0-下架")
+    private String status;
+
+    @Schema(description = "套餐描述")
+    private String packageDescription;
+
+    @Schema(description = "套餐图片")
+    private String packageImage;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @Schema(description = "权益券总数")
+    private Integer totalNumber;
+
+    @Schema(description = "订单下选择权益套餐数量,默认0")
+    private Integer rightsCount = 0;
+
+}

+ 87 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelRightsVO.java

@@ -0,0 +1,87 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 类描述:查询权益套餐明细返回报文实体
+ *
+ * @author guozidong
+ * @version 1.0
+ * @date 2026/3/11 14:25
+ */
+@Data
+@Schema(description = "权益券VO")
+public class ChannelRightsVO {
+
+    @Schema(description = "权益券ID")
+    private String id;
+
+    @Schema(description = "权益券名称")
+    private String rightsName;
+
+    @Schema(description = "权益券类型")
+    private String type;
+
+    @Schema(description = "权益券分类")
+    private String classify;
+
+    @Schema(description = "权益券价格")
+    private BigDecimal amount;
+
+    @Schema(description = "市场价")
+    private BigDecimal marketPrice;
+
+    @Schema(description = "协议价")
+    private BigDecimal contractRate;
+
+    @Schema(description = "三方结算价格")
+    private BigDecimal settlePrice;
+
+    @Schema(description = "权益券状态:1-上架,2-下架")
+    private Integer rightsStatus;
+
+    @Schema(description = "权益券数量")
+    private Integer number;
+
+    @Schema(description = "权益券描述")
+    private String description;
+
+    @Schema(description = "权益券图片")
+    private String rightsPicture;
+
+    @Schema(description = "使用条件")
+    private String useCondition;
+
+    @Schema(description = "有效期天数")
+    private Integer dayNum;
+
+    @Schema(description = "开始时间")
+    private Date startTime;
+
+    @Schema(description = "结束时间")
+    private Date endTime;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**赠送时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "赠送时间")
+    private Date giftTime;
+
+    /**领取时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "领取时间")
+    private Date receiveTime;
+    @Schema(description = "订单下选择权益套餐数量,默认0")
+    private Integer rightsCount = 0;
+}

+ 80 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/interceptor/LiveServiceTokenInterceptor.java

@@ -0,0 +1,80 @@
+package com.jzg.quotation.summary.interceptor;
+
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.summary.components.LiveServiceCacheComponent;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 类描述:Token拦截器 - 在调用特定接口前自动获取Token
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/18 16:19
+ */
+@Slf4j
+@Component
+public class LiveServiceTokenInterceptor implements RequestInterceptor {
+    @Autowired
+    private LiveServiceCacheComponent liveServiceCacheComponent;
+    // 需要自动获取Token的特定方法(支持通配符)
+    private static final List<String> TOKEN_REQUIRED_METHODS = Arrays.asList(
+            "/rightsGrant/package/list",
+            "/rightsGrant/package/detail",
+            "/rightsGrant/rights/list"
+    );
+    @Override
+    public void apply(RequestTemplate requestTemplate) {
+        //获取请求信息
+        String url = requestTemplate.url();
+        //判断是否需要自动获取Token
+        if (shouldAcquireToken(url)) {
+            //获取Token(优先从缓存获取,缓存不存在则重新获取)
+            String token = getOrAcquireToken();
+
+            //设置Token到请求头
+            if (StringUtils.hasText(token)) {
+                requestTemplate.header("X-Access-Token", token);
+            } else {
+                log.warn("未能获取到有效的Token, url: {}", url);
+            }
+        }
+    }
+    /**
+     * 判断是否需要获取Token
+     */
+    private boolean shouldAcquireToken(String url) {
+        // 检查URL是否需要Token
+        return TOKEN_REQUIRED_METHODS.stream()
+                .anyMatch(pattern -> matchUrl(pattern, url));
+    }
+    /**
+     * 简单的URL匹配(支持*通配符)
+     */
+    private boolean matchUrl(String pattern, String url) {
+        if (pattern.contains("*")) {
+            String prefix = pattern.substring(0, pattern.indexOf("*"));
+            return url.startsWith(prefix);
+        }
+        return url.contains(pattern);
+    }
+    /**
+     * 获取Token
+     */
+    private String getOrAcquireToken() {
+        // 1. 先从缓存获取
+        String token = liveServiceCacheComponent.getToken();
+        // 2. 如果缓存不存在重新获取
+        if (!StringUtils.hasText(token)) {
+            token = liveServiceCacheComponent.getTokenFromLiveService();
+            return token;
+        }
+        return token;
+    }
+}

+ 37 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsInfoService.java

@@ -0,0 +1,37 @@
+package com.jzg.quotation.summary.service;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.rights.dto.InsOrderRightsInfoDto;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
+
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 17:16
+ */
+public interface InsOrderRightsInfoService {
+   /**
+    * 保存该订单对应的权益
+    * @param insOrderRightsInfoDto
+    * @return
+    */
+   HttpResult saveInsOrderRightsInfo(InsOrderRightsInfoDto insOrderRightsInfoDto,String orderNo);
+
+   /**
+    * 根据订单ID查询权益信息
+    * @param orderNo
+    * @return
+    */
+   InsOrderRightsInfoVo queryByOrderNo(String orderNo);
+
+   /**
+    * 根据主键删除订单下的某权益
+    * @param id
+    */
+   HttpResult deleteRightsInfoById(String id,Integer rightsType);
+
+
+}

+ 33 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsPackageService.java

@@ -0,0 +1,33 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.rights.po.InsOrderRightsPackage;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsPackageVo;
+
+import java.util.List;
+
+/**
+ * 类描述:订单关联权益套餐service
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 15:33
+ */
+public interface InsOrderRightsPackageService extends IService<InsOrderRightsPackage> {
+
+    void saveInsOrderRightsPackage(List<InsOrderRightsPackage> insOrderRightsPackageList);
+
+
+    /**
+     * 根据订单ID查询权益信息
+     * @param orderNo
+     * @return
+     */
+    List<InsOrderRightsPackageVo> queryByOrderNo(String orderNo);
+    /**
+     * 根据订单删除权益
+     * @param orderNo
+     * @return
+     */
+    Integer deleteByOrderNo(String orderNo);
+}

+ 37 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrderRightsService.java

@@ -0,0 +1,37 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.commons.entity.rights.po.InsOrderRights;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsVo;
+
+import java.util.List;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 16:30
+ */
+public interface InsOrderRightsService extends IService<InsOrderRights> {
+    /**
+     * 订单选择权益入库
+     * @param insOrderRightsList
+     */
+    void saveInsOrderRights(List<InsOrderRights> insOrderRightsList);
+
+    /**
+     * 根据订单ID查询权益信息
+     * @param orderNo
+     * @return
+     */
+    List<InsOrderRightsVo> queryByOrderNo(String orderNo);
+    /**
+     * 根据订单删除权益
+     * @param orderNo
+     * @return
+     */
+    Integer deleteByOrderNo(String orderNo);
+
+
+}

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

@@ -0,0 +1,153 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.rights.dto.InsOrderRightsDto;
+import com.jzg.commons.entity.rights.dto.InsOrderRightsInfoDto;
+import com.jzg.commons.entity.rights.dto.InsOrderRightsPackageDto;
+import com.jzg.commons.entity.rights.dto.RightsGrantReceiverDTO;
+import com.jzg.commons.entity.rights.po.InsOrderRights;
+import com.jzg.commons.entity.rights.po.InsOrderRightsPackage;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsPackageVo;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsVo;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.summary.service.InsOrderRightsInfoService;
+import com.jzg.quotation.summary.service.InsOrderRightsPackageService;
+import com.jzg.quotation.summary.service.InsOrderRightsService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 17:17
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class InsOrderRightsInfoServiceImpl implements InsOrderRightsInfoService {
+
+    private final InsOrderRightsService insOrderRightsService;
+    private final InsOrderRightsPackageService insOrderRightsPackageService;
+
+    /**
+     * 订单关联权益信息入库
+     * @param insOrderRightsInfoDto
+     * @param orderNo
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public HttpResult saveInsOrderRightsInfo(InsOrderRightsInfoDto insOrderRightsInfoDto,String orderNo) {
+        //1.参数校验
+        if (insOrderRightsInfoDto == null) {
+            return HttpResult.error("权益券信息为空,请确认!");
+        }
+        // 2. 业务校验:至少有一个集合有数据
+        boolean hasRights = CollectionUtils.isNotEmpty(insOrderRightsInfoDto.getInsOrderRightsList());
+        boolean hasPackages = CollectionUtils.isNotEmpty(insOrderRightsInfoDto.getInsOrderRightsPackageList());
+        if (!hasRights && !hasPackages) {
+            return HttpResult.error("请选择权益!");
+        }
+        try{
+            // 先删除现有的权益券
+            if (hasRights) {
+                Integer deletedRights =  insOrderRightsService.deleteByOrderNo(orderNo);
+                log.info("删除订单 {} 现有权益券 {} 条", orderNo, deletedRights);
+            }
+            //删除现有的权益包
+            if (hasPackages) {
+                int deletedPackages = insOrderRightsPackageService.deleteByOrderNo(orderNo);
+                log.info("删除订单 {} 现有权益包 {} 条", orderNo, deletedPackages);
+            }
+            //保存权益券信息
+            if(hasRights){
+                List<InsOrderRightsDto> insOrderRightsDtoList = insOrderRightsInfoDto.getInsOrderRightsList();
+                List<InsOrderRights> insOrderRightsList = new ArrayList<>();
+                for(InsOrderRightsDto insOrderRightsDto:insOrderRightsDtoList){
+                    InsOrderRights insOrderRights = new InsOrderRights();
+                    BeanUtils.copyProperties(insOrderRights,insOrderRightsDto);
+                    //获取接收人信息入库
+                    RightsGrantReceiverDTO rightsGrantReceiverDTO  = insOrderRightsInfoDto.getRightsGrantReceiverDTO();
+                    insOrderRights.setReceiverMobile(rightsGrantReceiverDTO.getReceiverMobile());
+                    insOrderRights.setReceiverName(rightsGrantReceiverDTO.getReceiverName());
+                    insOrderRights.setReceiverType(rightsGrantReceiverDTO.getReceiverType());
+                    insOrderRightsList.add(insOrderRights);
+                }
+                insOrderRightsService.saveInsOrderRights(insOrderRightsList);
+                log.info("保存订单 {} 权益券 {} 条", orderNo, insOrderRightsList.size());
+            }
+            //保存权益套餐信息
+            if(hasPackages){
+                List<InsOrderRightsPackageDto> insOrderRightsPackageDtoList = insOrderRightsInfoDto.getInsOrderRightsPackageList();
+                List<InsOrderRightsPackage> insOrderRightsPackageList = new ArrayList<>();
+                for(InsOrderRightsPackageDto insOrderRightsPackageDto:insOrderRightsPackageDtoList){
+                    InsOrderRightsPackage insOrderRightsPackage = new InsOrderRightsPackage();
+                    BeanUtils.copyProperties(insOrderRightsPackage,insOrderRightsPackageDto);
+                    //获取接收人信息入库
+                    RightsGrantReceiverDTO rightsGrantReceiverDTO  = insOrderRightsInfoDto.getRightsGrantReceiverDTO();
+                    insOrderRightsPackage.setReceiverMobile(rightsGrantReceiverDTO.getReceiverMobile());
+                    insOrderRightsPackage.setReceiverName(rightsGrantReceiverDTO.getReceiverName());
+                    insOrderRightsPackage.setReceiverType(rightsGrantReceiverDTO.getReceiverType());
+                    insOrderRightsPackageList.add(insOrderRightsPackage);
+                }
+                insOrderRightsPackageService.saveInsOrderRightsPackage(insOrderRightsPackageList);
+                log.info("保存订单 {} 权益包 {} 条", orderNo, insOrderRightsInfoDto.getInsOrderRightsPackageList().size());
+            }
+            return HttpResult.ok("订单权益券信息保存成功!");
+        }catch (Exception e) {
+            log.error("保存订单权益信息失败,订单ID: {}", orderNo, e);
+            throw new SystemException("保存权益信息失败:" + e.getMessage());
+        }
+
+    }
+
+    /**
+     *  根据订单号查询权益券和权益套餐信息
+     * @param orderNo
+     * @return
+     */
+    @Override
+    public InsOrderRightsInfoVo queryByOrderNo(String orderNo) {
+        InsOrderRightsInfoVo insOrderRightsInfoVo = new InsOrderRightsInfoVo();
+        //根据订单号查询权益券
+        List<InsOrderRightsVo> insOrderRightsVoList = insOrderRightsService.queryByOrderNo(orderNo);
+        //根据订单号查询权益包
+        List<InsOrderRightsPackageVo> insOrderRightsPackageVoList = insOrderRightsPackageService.queryByOrderNo(orderNo);
+
+        insOrderRightsInfoVo.setInsOrderRightsList(insOrderRightsVoList);
+        insOrderRightsInfoVo.setInsOrderRightsPackageList(insOrderRightsPackageVoList);
+        return insOrderRightsInfoVo;
+    }
+
+    /**
+     * 根据权益id删除某订单的某权益
+     * @param id
+     * @param rightsType
+     * @return
+     */
+    @Override
+    public HttpResult deleteRightsInfoById(String id,Integer rightsType) {
+        if(null == rightsType){
+            return HttpResult.error("权益类型不能为空,请确认");
+        }
+        if(1 == rightsType){//权益券
+            return HttpResult.ok(insOrderRightsService.removeById(id));
+        }
+        if(2 == rightsType){//权益包
+            return HttpResult.ok(insOrderRightsPackageService.removeById(id));
+        }
+        return HttpResult.error("权益类型不匹配,请确认");
+    }
+
+
+}

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

@@ -0,0 +1,58 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.rights.po.InsOrderRightsPackage;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsPackageVo;
+import com.jzg.quotation.summary.mapper.InsOrderRightsPackageMapper;
+import com.jzg.quotation.summary.service.InsOrderRightsPackageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 类描述:权益套餐数据库操作service
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 15:36
+ */
+@RequiredArgsConstructor
+@Service
+public class InsOrderRightsPackageServiceImpl extends ServiceImpl<InsOrderRightsPackageMapper, InsOrderRightsPackage> implements InsOrderRightsPackageService {
+
+    private final InsOrderRightsPackageMapper insOrderRightsPackageMapper;
+    @Override
+    public void saveInsOrderRightsPackage(List<InsOrderRightsPackage> insOrderRightsPackageList) {
+        this.saveBatch(insOrderRightsPackageList);
+    }
+
+    @Override
+    public List<InsOrderRightsPackageVo> queryByOrderNo(String orderNo) {
+        //1.查询数据库层
+        List<InsOrderRightsPackage> insOrderRightsPackageList = insOrderRightsPackageMapper.queryByOrderNo(orderNo);
+        // 2. 转换为VO列表
+        return convertToVoList(insOrderRightsPackageList);
+    }
+
+    @Override
+    public Integer deleteByOrderNo(String orderNo) {
+        return insOrderRightsPackageMapper.deleteByOrderNo(orderNo);
+    }
+
+    /**
+     * 列表转换方法
+     */
+    private List<InsOrderRightsPackageVo> convertToVoList(List<InsOrderRightsPackage> poList) {
+        if (CollectionUtils.isEmpty(poList)) {
+            return Collections.emptyList();
+        }
+
+        return poList.stream()
+                .map(InsOrderRightsPackageVo::new)  // 使用构造函数
+                .collect(Collectors.toList());
+    }
+}

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

@@ -0,0 +1,56 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.entity.rights.po.InsOrderRights;
+import com.jzg.commons.entity.rights.vo.InsOrderRightsVo;
+import com.jzg.quotation.summary.mapper.InsOrderRightsMapper;
+import com.jzg.quotation.summary.service.InsOrderRightsService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/3/13 17:11
+ */
+@RequiredArgsConstructor
+@Service
+public class InsOrderRightsServiceImpl extends ServiceImpl<InsOrderRightsMapper, InsOrderRights> implements InsOrderRightsService {
+    private final InsOrderRightsMapper insOrderRightsMapper;
+    @Override
+    public void saveInsOrderRights(List<InsOrderRights> insOrderRightsList) {
+       this.saveBatch(insOrderRightsList);
+    }
+    @Override
+    public List<InsOrderRightsVo> queryByOrderNo(String orderNo){
+        // 1.前端展示
+        List<InsOrderRights> insOrderRightsList  = insOrderRightsMapper.queryByOrderNo(orderNo);
+        // 2. 转换为返回前端的VO列表
+        return convertToVoList(insOrderRightsList);
+    }
+
+    @Override
+    public Integer deleteByOrderNo(String orderNo) {
+        return insOrderRightsMapper.deleteByOrderNo(orderNo);
+    }
+
+    /**
+     * 列表转换方法
+     */
+    private List<InsOrderRightsVo> convertToVoList(List<InsOrderRights> poList) {
+        if (CollectionUtils.isEmpty(poList)) {
+            return Collections.emptyList();
+        }
+
+        return poList.stream()
+                .map(InsOrderRightsVo::new)  // 使用构造函数
+                .collect(Collectors.toList());
+    }
+}

+ 10 - 1
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -219,4 +219,13 @@ feign:
     jzg-costsorrule:
       url: http://localhost:8085/
     jzg-platform:
-      url: http://localhost:8083/
+      url: http://localhost:8083/
+    jzg-partner:
+      url: http://localhost:8087/
+    jeecg-boot:
+      url: http://localhost:8082/jeecg-boot
+# 和生活服务平台约定的appkey、appSeCret,用于获取token
+live:
+  service:
+    appKey: _N7dxVy3UJQUNwvacEHUFPzZ63kGwSx1OxXablRXJ9g
+    appSeCret: UByV_498NU1unnr3b0hvQtIKbRyIj0HGCkZXxxgzwAU

+ 3 - 1
tenant/insurance/quotation-summary/src/main/resources/application-test.yaml

@@ -266,4 +266,6 @@ feign:
     jzg-costsorrule:
       url: http://192.168.0.250:9085/
     jzg-platform:
-      url: http://192.168.0.250:9083/
+      url: http://192.168.0.250:9083/
+    jeecg-boot:
+      url: http://192.168.0.250:8080/