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

Merge remote-tracking branch 'origin/master'

Qchen 5 месяцев назад
Родитель
Сommit
48d5de502f
50 измененных файлов с 1752 добавлено и 224 удалено
  1. 1 0
      authentication/src/main/java/com/jzg/filter/TokenAuthenticationFilter.java
  2. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java
  3. 23 0
      commons/src/main/java/com/jzg/commons/entity/dto/LotteryCounDTO.java
  4. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysDeptParam.java
  5. 68 0
      commons/src/main/java/com/jzg/commons/entity/dto/UnifiedUserCenterDTO.java
  6. 5 2
      commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java
  7. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysSystem.java
  8. 18 5
      commons/src/main/java/com/jzg/commons/entity/po/SysUserActivityCompleteInRule.java
  9. 64 1
      commons/src/main/java/com/jzg/commons/entity/vo/LocalActivityTableVO.java
  10. 39 0
      commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityAwardVO.java
  11. 48 0
      commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityVO.java
  12. 26 0
      commons/src/main/java/com/jzg/commons/entity/vo/LotteryCountVO.java
  13. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/OrderRuleVO.java
  14. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/SignRuleVO.java
  15. 9 0
      commons/src/main/java/com/jzg/commons/entity/vo/UnderwritingRuleVO.java
  16. 52 0
      commons/src/main/java/com/jzg/commons/entity/vo/UnifiedUserClientVO.java
  17. 62 24
      partner/src/main/java/com/jzg/service/Impl/PartnerCommissionServiceImpl.java
  18. 55 21
      partner/src/main/java/com/jzg/service/Impl/PartnerPremiumDetailsServiceImpl.java
  19. 15 0
      platform/src/main/java/com/jzg/controller/SysSystemController.java
  20. 2 2
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  21. 14 3
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  22. 1 1
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/constant/RequestConstant.java
  23. 272 53
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  24. 5 1
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java
  25. 16 3
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  26. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  27. 38 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/LocalLivingClient.java
  28. 283 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  29. 51 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersMapper.java
  30. 61 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java
  31. 1 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/IdentifyServiceImpl.java
  32. 48 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  33. 118 2
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  34. 14 3
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/build/ZiJinAPIQuoteResultsVoBuild.java
  35. 4 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/entity/response/CalculatePremiumResponse.java
  36. 15 2
      tenant/organization/src/main/java/com/jzg/organization/client/LotteryActivityClient.java
  37. 31 0
      tenant/organization/src/main/java/com/jzg/organization/client/UnifiedUserCenterClient.java
  38. 4 5
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  39. 10 0
      tenant/organization/src/main/java/com/jzg/organization/controller/SignInController.java
  40. 1 1
      tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java
  41. 8 6
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserActivityCompleteInRuleMapper.java
  42. 29 3
      tenant/organization/src/main/java/com/jzg/organization/service/LotteryActivityService.java
  43. 9 2
      tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java
  44. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/SignInService.java
  45. 16 4
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  46. 116 30
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SignInServiceImpl.java
  47. 39 12
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java
  48. 3 14
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml
  49. 6 4
      tenant/organization/src/main/resources/mapper/SysUserActivityCompleteInRuleMapper.xml
  50. 22 9
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 1 - 0
authentication/src/main/java/com/jzg/filter/TokenAuthenticationFilter.java

@@ -50,6 +50,7 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
         doList.add("/auth/sendSmsCode");
         doList.add("/auth/forgotPassword");
         doList.add("/appAuth/partnerAppLogin");
+        doList.add("/system/sysListAccountLinking");
         String path = request.getRequestURI();
         for (String pattern : doList) {
             // 使用正则表达式匹配  .* 匹配所有以 pattern 开头的路径

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/dto/InsOrdersParam.java

@@ -11,6 +11,9 @@ import lombok.Data;
 public class InsOrdersParam extends PageRequest {
 
     @Schema(description = "订单号")
+    private String orderId;
+
+    @Schema(description = "报价号")
     private String orderNo;
 
     @Schema(description = "车牌号")

+ 23 - 0
commons/src/main/java/com/jzg/commons/entity/dto/LotteryCounDTO.java

@@ -0,0 +1,23 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 抽奖次数增加请求DTO
+ */
+@Data
+public class LotteryCounDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "本地生活用户id")
+    private String appUserId;
+
+    @Schema(description = "抽奖次数")
+    private Integer count;
+
+    @Schema(description = "活动id")
+    private String activityId;
+}

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysDeptParam.java

@@ -13,4 +13,7 @@ public class SysDeptParam {
 
     @Schema(description = "搜索名称")
     private String name;
+
+    @Schema(description = "机构下用户的信息")
+    private String userInfo;
 }

+ 68 - 0
commons/src/main/java/com/jzg/commons/entity/dto/UnifiedUserCenterDTO.java

@@ -0,0 +1,68 @@
+package com.jzg.commons.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 抽奖次数增加请求DTO
+ */
+@Data
+public class UnifiedUserCenterDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户id
+     */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /**
+     * 客户端ID
+     * 需要绑定的客户端ID
+     */
+    @Schema(description = "客户端ID")
+    private String clientId;
+
+    /**
+     * 租户ID
+     */
+    @Schema(description = "租户ID")
+    private String tenantId;
+
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号")
+    private String userPhone;
+
+    /**
+     * userID
+     * 源用户ID
+     */
+    @TableField(exist = false)
+    private String sourceUserId;
+
+    /**
+     * userID
+     * 目标用户ID
+     */
+    @TableField(exist = false)
+    private String targetUserId;
+
+    /**
+     * 客户端ID
+     * 源客户端ID
+     */
+    @TableField(exist = false)
+    private String sourceClientId;
+
+    /**
+     * 客户端ID
+     * 目标客户端ID
+     */
+    @TableField(exist = false)
+    private String targetClientId;
+}

+ 5 - 2
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoiceSettlement.java

@@ -1,19 +1,22 @@
 package com.jzg.commons.entity.finance.po;
 
-//import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.jzg.commons.core.base.BaseModel;
 import com.jzg.commons.util.idgen.IdGenerate;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
-import java.math.BigDecimal;
+import java.io.Serial;
 import java.util.Date;
 import java.util.List;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Schema(description = "财务应收开票结算表")
 public class InsPlyIncomeInvoiceSettlement extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = -2019053289601744522L;
     private String id;
 
     @Schema(description = "票据iD")

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysSystem.java

@@ -26,6 +26,9 @@ public class SysSystem extends BaseModel {
     @Schema(description = "是否是租户 0-否 1-是")
     private Integer isTenant;
 
+    @Schema(description = "账号互通(0否 1是)")
+    private Integer accountLinking;
+
     /** 租户Code */
     @Schema(description = "租户Code")
     private String sysCode;

+ 18 - 5
commons/src/main/java/com/jzg/commons/entity/po/SysUserSignInRule.java → commons/src/main/java/com/jzg/commons/entity/po/SysUserActivityCompleteInRule.java

@@ -16,8 +16,8 @@ import java.time.LocalDateTime;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("sys_user_sign_in_rule")
-public class SysUserSignInRule extends BaseModel {
+@TableName("sys_user_activity_complete_in_rule")
+public class SysUserActivityCompleteInRule extends BaseModel {
     private static final long serialVersionUID = 1L;
 
     @TableId(type = IdType.ASSIGN_ID)
@@ -29,19 +29,32 @@ public class SysUserSignInRule extends BaseModel {
     @Schema(description = "用户ID")
     private String userId;
 
+    @Schema(description = "手机号")
+    private String userPhone;
+
+    @Schema(description = "活动类型(6.报价 7.签到 8.出单 9.承保)")
+    private Integer activityType;
+
     @Schema(description = "活动ID(lottery_activity_id)")
     private String activityId;
 
     @Schema(description = "本地活动表ID(local_activity_table_id)")
     private String localActivityTableId;
 
-    @Schema(description = "规则标识(signNum,如:2、4)")
-    private String ruleSignNum;
+    @Schema(description = "规则完成次数(报价、出单、承保)/天数(签到)")
+    private String ruleCompleteNum;
 
     @Schema(description = "获得抽奖次数")
     private Integer lotteryNum;
 
-    @Schema(description = "领取状态 0-未领取 1-已领取")
+    @Schema(description = "报价每日最大获得抽奖次数")
+    private Integer lotteryMaxNum;
+
+    //远程调用增加次数接口 如果一账通查到已绑定 则调用增加抽奖次数接口,标记同步  如果没绑定 则本地只存签到记录
+    /**
+     * 同步状态 0-未同步/未领取 1-已同步/已领取
+     */
+    @Schema(description = "同步状态 0-未同步/未完成/未领取 1-已同步/已完成/已领取")
     private Integer status;
 
     @Schema(description = "领取时间")

+ 64 - 1
commons/src/main/java/com/jzg/commons/entity/vo/LocalActivityTableVO.java

@@ -14,54 +14,117 @@ import java.util.List;
 public class LocalActivityTableVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * ID
+     */
     @Schema(description = "ID")
     private String id;
 
+    /**
+     * 标题
+     */
     @Schema(description = "标题")
     private String title;
 
+    /**
+     * 说明
+     */
     @Schema(description = "说明")
     private String instructions;
 
+    /**
+     * 开始时间
+     */
     @Schema(description = "开始时间")
     private LocalDateTime startTime;
 
+    /**
+     * 结束时间
+     */
     @Schema(description = "结束时间")
     private LocalDateTime endTime;
 
+    /**
+     * 用户类型
+     */
     @Schema(description = "用户类型")
     private String userType;
 
+    /**
+     * 用户等级ID
+     */
     @Schema(description = "用户等级ID")
     private String userLevelId;
 
+    /**
+     * 奖品类型
+     */
     @Schema(description = "奖品类型")
     private String awardType;
 
+    /**
+     * 转盘ID
+     */
     @Schema(description = "转盘ID")
     private String turntableId;
 
-    @Schema(description = "类型 6-报价 7-签到 8-出单")
+    /**
+     * 类型 6-报价 7-签到 8-出单 9-承保
+     */
+    @Schema(description = "类型 6-报价 7-签到 8-出单 9-承保")
     private String type;
 
+    /**
+     * 租户ID
+     */
+    @Schema(description = "租户ID")
+    private String tenantId;
+
+    /**
+     * 租户名称
+     */
+    @Schema(description = "租户名称")
+    private Integer tenantName;
+
+    /**
+     * 背景图
+     */
     @Schema(description = "背景图")
     private String backImage;
 
+    /**
+     * 报价次数
+     */
     @Schema(description = "报价次数")
     private String qutNum;
 
+    /**
+     * 报价获得抽奖次数
+     */
     @Schema(description = "报价获得抽奖次数")
     private String qutLotteryNum;
 
+    /**
+     * 报价最大抽奖次数
+     */
     @Schema(description = "报价最大抽奖次数")
     private String qutLotteryMax;
 
+    /**
+     * 签到规则列表
+     */
     @Schema(description = "签到规则列表")
     private List<SignRuleVO> signRules;
 
+    /**
+     * 出单规则列表
+     */
     @Schema(description = "出单规则列表")
     private List<OrderRuleVO> orderRules;
 
+    /**
+     * 核保规则列表
+     */
     @Schema(description = "核保规则列表")
     private List<UnderwritingRuleVO> underwritingRules;
 }

+ 39 - 0
commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityAwardVO.java

@@ -13,42 +13,81 @@ import java.math.BigDecimal;
 public class LotteryActivityAwardVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 奖品ID
+     */
     @Schema(description = "奖品ID")
     private String id;
 
+    /**
+     * 活动ID
+     */
     @Schema(description = "活动ID")
     private String activityId;
 
+    /**
+     * 奖品类型 1-现金 2-积分 5-感谢参与 6-会员
+     */
     @Schema(description = "奖品类型 1-现金 2-积分 5-感谢参与 6-会员")
     private Integer awardType;
 
+    /**
+     * 优惠券ID
+     */
     @Schema(description = "优惠券ID")
     private String couponId;
 
+    /**
+     * 优惠券名称
+     */
     @Schema(description = "优惠券名称")
     private String couponName;
 
+    /**
+     * 奖品图标
+     */
     @Schema(description = "奖品图标")
     private String icon;
 
+    /**
+     * 中奖概率
+     */
     @Schema(description = "中奖概率")
     private Integer winningProbability;
 
+    /**
+     * 兑换类型
+     */
     @Schema(description = "兑换类型")
     private Integer redemptionType;
 
+    /**
+     * 奖品名称
+     */
     @Schema(description = "奖品名称")
     private String awardName;
 
+    /**
+     * 积分数量
+     */
     @Schema(description = "积分数量")
     private Integer pointNum;
 
+    /**
+     * 红包金额
+     */
     @Schema(description = "红包金额")
     private BigDecimal redAmount;
 
+    /**
+     * 付费会员ID
+     */
     @Schema(description = "付费会员ID")
     private Long paidMemberId;
 
+    /**
+     * 付费会员规则ID
+     */
     @Schema(description = "付费会员规则ID")
     private Long paidMemberRulesId;
 }

+ 48 - 0
commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityVO.java

@@ -15,45 +15,87 @@ import java.util.List;
 public class LotteryActivityVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 活动 ID
+     */
     @Schema(description = "活动ID")
     private String id;
 
+    /**
+     * 活动名称
+     */
     @Schema(description = "活动名称")
     private String activityName;
 
+    /**
+     * 场景编码
+     */
     @Schema(description = "场景编码")
     private Integer scene;
 
+    /**
+     * 场景名称
+     */
     @Schema(description = "场景名称")
     private String sceneName;
 
+    /**
+     * 类型
+     */
     @Schema(description = "类型")
     private Integer type;
 
+    /**
+     * 活动开始时间
+     */
     @Schema(description = "活动开始时间")
     private LocalDate activityStartTime;
 
+    /**
+     * 活动结束时间
+     */
     @Schema(description = "活动结束时间")
     private LocalDate activityEndTime;
 
+    /**
+     * 参与规则
+     */
     @Schema(description = "参与规则")
     private Integer participationRules;
 
+    /**
+     * 活动背景图
+     */
     @Schema(description = "活动背景图")
     private String activityBackgroundImage;
 
+    /**
+     * 海报背景图
+     */
     @Schema(description = "海报背景图")
     private String posterBackgroundImage;
 
+    /**
+     * 活动链接
+     */
     @Schema(description = "活动链接")
     private String activityUrl;
 
+    /**
+     * 活动描述
+     */
     @Schema(description = "活动描述")
     private String activityDescribe;
 
+    /**
+     * 创建人
+     */
     @Schema(description = "创建人")
     private String createBy;
 
+    /**
+     * 更新人
+     */
     @Schema(description = "更新人")
     private String updateBy;
 
@@ -63,9 +105,15 @@ public class LotteryActivityVO implements Serializable {
     @Schema(description = "更新时间")
     private LocalDateTime updateTime;
 
+    /**
+     * 奖品列表
+     */
     @Schema(description = "奖品列表")
     private List<LotteryActivityAwardVO> lotteryActivityAwards;
 
+    /**
+     * 本地活动表
+     */
     @Schema(description = "本地活动表")
     private List<LocalActivityTableVO> localActivityTables;
 }

+ 26 - 0
commons/src/main/java/com/jzg/commons/entity/vo/LotteryCountVO.java

@@ -0,0 +1,26 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 抽奖次数增加结果VO
+ */
+@Data
+public class LotteryCountVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "是否成功")
+    private Boolean success;
+
+    @Schema(description = "提示消息")
+    private String message;
+
+    @Schema(description = "响应码")
+    private Integer code;
+
+    @Schema(description = "签到日期")
+    private Long timestamp;
+}

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/vo/OrderRuleVO.java

@@ -12,9 +12,15 @@ import java.io.Serializable;
 public class OrderRuleVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 出单数量
+     */
     @Schema(description = "出单数量")
     private String ordNum;
 
+    /**
+     * 获得抽奖次数
+     */
     @Schema(description = "获得抽奖次数")
     private Integer ordLotteryNum;
 }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/vo/SignRuleVO.java

@@ -12,9 +12,15 @@ import java.io.Serializable;
 public class SignRuleVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 签到天数
+     */
     @Schema(description = "签到天数")
     private String signNum;
 
+    /**
+     * 获得抽奖次数
+     */
     @Schema(description = "获得抽奖次数")
     private String signLotteryNum;
 }

+ 9 - 0
commons/src/main/java/com/jzg/commons/entity/vo/UnderwritingRuleVO.java

@@ -13,12 +13,21 @@ import java.math.BigDecimal;
 public class UnderwritingRuleVO implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 最小保费
+     */
     @Schema(description = "最小保费")
     private BigDecimal uwMinPremium;
 
+    /**
+     * 最大保费
+     */
     @Schema(description = "最大保费")
     private BigDecimal uwMaxPremium;
 
+    /**
+     * 获得抽奖次数
+     */
     @Schema(description = "获得抽奖次数")
     private String uwLotteryNum;
 }

+ 52 - 0
commons/src/main/java/com/jzg/commons/entity/vo/UnifiedUserClientVO.java

@@ -0,0 +1,52 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 统一账户查询绑定、用户平台绑定结果VO
+ */
+@Data
+public class UnifiedUserClientVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户id
+     */
+    @Schema(description = "用户id")
+    private String userId;
+
+    /**
+     * 客户端ID
+     * 需要绑定的客户端ID
+     */
+    @Schema(description = "客户端ID")
+    private String clientId;
+
+    /**
+     * 唯一ID
+     */
+    @Schema(description = "唯一ID")
+    private String uuid;
+
+    /**
+     * 租户ID
+     */
+    @Schema(description = "租户ID")
+    private String tenantId;
+
+    /**
+     * 手机号
+     */
+    @Schema(description = "手机号")
+    private String userPhone;
+
+    /**
+     * 用户平台绑定列表
+     */
+    @Schema(description = "用户平台绑定列表")
+    private List<UnifiedUserClientVO> userClients;
+}

+ 62 - 24
partner/src/main/java/com/jzg/service/Impl/PartnerCommissionServiceImpl.java

@@ -43,13 +43,15 @@ public class PartnerCommissionServiceImpl extends ServiceImpl<PartnerCommissionM
             return 0;
         }
         try {
-            // 保存管理员规则
+            final int ADMIN_TYPE = 1;
+            final int PARTNER_TYPE = 2;
             PartnerCommissionRules administrator = rulesVo.getAdministrator();
             administrator.setFounderRatio(rulesVo.getOriginator());
-            saveCommissionRules(administrator, 1);
+            saveCommissionRules(administrator, ADMIN_TYPE);
             // 保存合伙人规则
-            saveCommissionRules(rulesVo.getPartner(), 2);
+            saveCommissionRules(rulesVo.getPartner(), PARTNER_TYPE);
         } catch (Exception e) {
+            e.printStackTrace();
             throw new SystemException("保存失败", e.getMessage());
         }
         return 1;
@@ -59,38 +61,74 @@ public class PartnerCommissionServiceImpl extends ServiceImpl<PartnerCommissionM
      * 保存 CommissionRules 及其 Ratio 数据
      */
     private void saveCommissionRules(PartnerCommissionRules commissionRules, int proportionType) {
+        // 主表保存
         if (StringUtils.isNotBlank(commissionRules.getId())) {
             baseMapper.updateById(commissionRules);
         } else {
             baseMapper.insert(commissionRules);
         }
+
         List<PartnerRulesRatio> rulesRatioList = commissionRules.getRulesRatioList();
-        if (CollectionUtil.isNotEmpty(rulesRatioList)){
-            for (PartnerRulesRatio rulesRatio : rulesRatioList) {
-                rulesRatio.setProportionType(proportionType);
-                rulesRatio.setCommissionRulesId(commissionRules.getId());
-                if (Objects.nonNull(rulesRatio)) {
-                    if (StringUtils.isNotBlank(rulesRatio.getId())) {
-                        rulesRatioMapper.updateById(rulesRatio);
-                    } else {
-                        rulesRatioMapper.insert(rulesRatio);
-                    }
-                    List<PartnerRatio> ratioList = rulesRatio.getPartnerRatioList();
-                    if (CollectionUtil.isNotEmpty(ratioList)){
-                        for (PartnerRatio ratio : ratioList) {
-                            ratio.setRulesRatioId(rulesRatio.getId());
-                            if (StringUtils.isNotBlank(ratio.getId())) {
-                                ratioMapper.updateById(ratio);
-                            } else {
-                                ratioMapper.insert(ratio);
-                            }
-                        }
-                    }
+        if (CollectionUtil.isEmpty(rulesRatioList)) {
+            return;
+        }
+        List<PartnerRulesRatio> dbRulesRatio = rulesRatioMapper.selectList(new LambdaQueryWrapper<>(PartnerRulesRatio.class)
+                .eq(PartnerRulesRatio::getCommissionRulesId, commissionRules.getId()));
+        // 获取要删除的ID
+        List<String> deleteRatioIds = getDeleteIds(dbRulesRatio, rulesRatioList);
+        if (CollectionUtil.isNotEmpty(deleteRatioIds)) {
+            rulesRatioMapper.deleteByIds(deleteRatioIds);
+        }
+        for (PartnerRulesRatio rulesRatio : rulesRatioList) {
+            if (Objects.isNull(rulesRatio)) {
+                continue;
+            }
+            rulesRatio.setProportionType(proportionType);
+            rulesRatio.setCommissionRulesId(commissionRules.getId());
+            if (StringUtils.isNotBlank(rulesRatio.getId())) {
+                rulesRatioMapper.updateById(rulesRatio);
+            } else {
+                rulesRatioMapper.insert(rulesRatio);
+            }
+            List<PartnerRatio> ratioList = rulesRatio.getPartnerRatioList();
+            if (CollectionUtil.isEmpty(ratioList)) {
+                continue;
+            }
+            List<PartnerRatio> dbRatio = ratioMapper.selectList(new LambdaQueryWrapper<>(PartnerRatio.class)
+                    .eq(PartnerRatio::getRulesRatioId, rulesRatio.getId()));
+            List<String> deleteIds = getDeleteIds(dbRatio, ratioList);
+            if (CollectionUtil.isNotEmpty(deleteIds)){
+                ratioMapper.deleteByIds(deleteIds);
+            }
+            for (PartnerRatio ratio : ratioList) {
+                ratio.setRulesRatioId(rulesRatio.getId());
+                if (StringUtils.isNotBlank(ratio.getId())) {
+                    ratioMapper.updateById(ratio);
+                } else {
+                    ratioMapper.insert(ratio);
                 }
             }
         }
     }
 
+    private <T> List<String> getDeleteIds(List<T> dbList, List<T> keepList) {
+        List<String> dbIds = dbList.stream().map(item -> {
+            try {
+                return (String) item.getClass().getMethod("getId").invoke(item);
+            } catch (Exception e) {
+                return null;
+            }
+        }).filter(Objects::nonNull).toList();
+        List<String> keepIds = keepList.stream().map(item -> {
+            try {
+                return (String) item.getClass().getMethod("getId").invoke(item);
+            } catch (Exception e) {
+                return null;
+            }
+        }).filter(Objects::nonNull).toList();
+        return dbIds.stream().filter(id -> !keepIds.contains(id)).toList();
+    }
+
     @Override
     public CommissionRulesVo queryAll() {
         List<PartnerCommissionRules> commissionRules = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerCommissionRules.class));

+ 55 - 21
partner/src/main/java/com/jzg/service/Impl/PartnerPremiumDetailsServiceImpl.java

@@ -1,6 +1,9 @@
 package com.jzg.service.Impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -26,10 +29,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -57,35 +57,69 @@ public class PartnerPremiumDetailsServiceImpl extends ServiceImpl<PartnerPremium
      * @author lipf
      * @date 2026/4/15 14:58
      */
-    @Override
     public IPage queryPage(PartnerDetailsParam detailsParam) {
         log.info("查询佣金明细:detailsParam=[{}]", JSONUtil.toJsonStr(detailsParam));
         QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
-
-        queryWrapper.like(StringUtils.isNotBlank(detailsParam.getUserName()), "info.`name`",detailsParam.getUserName());
-        queryWrapper.like(StringUtils.isNotBlank(detailsParam.getMobile()), "u.mobile",detailsParam.getMobile());
-        queryWrapper.like(StringUtils.isNotBlank(detailsParam.getUserId()), "d.user_id",detailsParam.getUserId());
-        queryWrapper.like(StringUtils.isNotBlank(detailsParam.getOrderno()), "d.orderno",detailsParam.getOrderno());
-        queryWrapper.like(StringUtils.isNotBlank(detailsParam.getLicenseno()), "d.licenseno",detailsParam.getLicenseno());
-        if (CollectionUtil.isNotEmpty(detailsParam.getSigningTime())){
-            String startTime = detailsParam.getSigningTime().get(0);
-            String endTime = null;
-            if (detailsParam.getSigningTime().size() >= 2){
-                endTime = detailsParam.getSigningTime().get(1);
-            }
-            if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
+        // 拼接查询条件
+        queryWrapper.like(StrUtil.isNotBlank(detailsParam.getUserName()), "info.`name`", detailsParam.getUserName());
+        queryWrapper.like(StrUtil.isNotBlank(detailsParam.getMobile()), "u.mobile", detailsParam.getMobile());
+        queryWrapper.like(StrUtil.isNotBlank(detailsParam.getUserId()), "d.user_id", detailsParam.getUserId());
+        queryWrapper.like(StrUtil.isNotBlank(detailsParam.getOrderno()), "d.orderno", detailsParam.getOrderno());
+        queryWrapper.like(StrUtil.isNotBlank(detailsParam.getLicenseno()), "d.licenseno", detailsParam.getLicenseno());
+        List<String> signingTime = detailsParam.getSigningTime();
+        if (CollectionUtil.isNotEmpty(signingTime)) {
+            String startTime = signingTime.size() > 0 ? signingTime.get(0) : null;
+            String endTime = signingTime.size() > 1 ? signingTime.get(1) : null;
+            startTime = formatStartTime(startTime);
+            endTime = formatEndTime(endTime);
+            if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {
                 queryWrapper.between("d.create_time", startTime, endTime);
-            } else if (startTime != null) {
+            } else if (StrUtil.isNotBlank(startTime)) {
                 queryWrapper.ge("d.create_time", startTime);
-            } else if (endTime != null) {
+            } else if (StrUtil.isNotBlank(endTime)) {
                 queryWrapper.le("d.create_time", endTime);
             }
         }
-        queryWrapper.orderByDesc("d.create_time");
         queryWrapper.eq("d.status", 1);
+        queryWrapper.orderByDesc("d.create_time");
         return baseMapper.queryPage(detailsParam.getPage(), queryWrapper);
     }
 
+    /**
+     * 格式化开始时间:没有时分秒则补 00:00:00
+     */
+    private String formatStartTime(String timeStr) {
+        if (StrUtil.isBlank(timeStr)) {
+            return null;
+        }
+        try {
+            Date date = DateUtil.parse(timeStr);
+            return DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN);
+        } catch (Exception e) {
+            log.warn("开始时间格式异常: {}", timeStr);
+            return null;
+        }
+    }
+
+    /**
+     * 格式化结束时间:没有时分秒则补 23:59:59
+     */
+    private String formatEndTime(String timeStr) {
+        if (StrUtil.isBlank(timeStr)) {
+            return null;
+        }
+        try {
+            Date date = DateUtil.parse(timeStr);
+            if (timeStr.length() <= 10) {
+                date = DateUtil.endOfDay(date);
+            }
+            return DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN);
+        } catch (Exception e) {
+            log.warn("结束时间格式异常: {}", timeStr);
+            return null;
+        }
+    }
+
     @Override
     public JSONObject queryExpiredLockRecords(PartnerDetailsParam detailsParam) {
         LambdaQueryWrapper<PartnerPremiumDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();

+ 15 - 0
platform/src/main/java/com/jzg/controller/SysSystemController.java

@@ -9,6 +9,7 @@ import com.jzg.commons.entity.dto.SysSystemEditParam;
 import com.jzg.commons.entity.dto.SysSystemParam;
 import com.jzg.commons.entity.enums.YesNoEnum;
 import com.jzg.commons.entity.po.SysConfig;
+import com.jzg.commons.entity.po.SysSystem;
 import com.jzg.commons.entity.po.SysUser;
 import com.jzg.commons.entity.system.vo.SysSystemBusPermsVo;
 import com.jzg.commons.entity.vo.SysSystemPermsVo;
@@ -107,6 +108,20 @@ public class SysSystemController {
         Page<SysSystemVo> result = sysSystemService.queryPage(page,param);
         return HttpResult.ok(result);
     }
+    /**
+     * 营销活动
+     * 本地生活调用
+     * 租户列表-账号互通的(account_linking新增字段)
+     * @return
+     */
+    @GetMapping("/sysListAccountLinking")
+    @Operation(summary = "租户列表分页")
+    public HttpResult sysListAccountLinking(){
+        List<SysSystem> result = sysSystemService.list(new LambdaQueryWrapper<SysSystem>()
+                .eq(SysSystem::getAccountLinking, YesNoEnum.YES.getCode())
+                .eq(SysSystem::getIsDelete, YesNoEnum.NO.getCode()));
+        return HttpResult.ok(result);
+    }
 
     /**
      * 租户列表

+ 2 - 2
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -471,7 +471,7 @@ public class RequestComponent {
      * @return <Response> ResponseEntity<Response>
      */
     public <Response> ResponseEntity<Response> post(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
-        log.info("URL的值:{},body的值:{}", url, body);
+        log.info("URL的值:{},body的值1:{}", url, body);
         WebClient webClient = selectNoSSLWebClient2();
         try {
             // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据
@@ -486,7 +486,7 @@ public class RequestComponent {
             ResponseEntity<String> rawResponse = webClient.post()
                     .uri(url)
                     .headers(setHeaders(requestHeaders))
-                    .body(BodyInserters.fromValue(body))
+                    .body(body != null ? BodyInserters.fromValue(body) : BodyInserters.empty())
                     .retrieve()
                     .toEntity(String.class)
                     .block();

+ 14 - 3
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -320,13 +320,23 @@ public class HengBangCrawlerRequestComponent {
         MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
         String encryptPlyappno;
         try {
-            encryptPlyappno = new StringBuilder(RequestConstant.ENCRYPTPRE).append(HengBangAESUtil.encryptStr(plyappno))
+            encryptPlyappno =  HengBangAESUtil.encryptStr(plyappno);
+            System.out.println("encryptPlyappno1 ===========" + encryptPlyappno);
+            encryptPlyappno = new StringBuilder(RequestConstant.ENCRYPTPRE).append(encryptPlyappno)
                     .toString();
+            System.out.println("encryptPlyappno2 ===========" + encryptPlyappno);
         } catch (Exception e) {
             throw new SystemException(e.getMessage());
         }
         params.add("plyappno", encryptPlyappno);
-        HbCrawlerSaleInfoResponse response = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, RequestUrl.PROPOSAL.getRequestDescription(), HbCrawlerSaleInfoResponse.class, headers);
+        HbCrawlerSaleInfoResponse response;
+        try {
+            response = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, RequestUrl.PROPOSAL.getRequestDescription(), HbCrawlerSaleInfoResponse.class, headers);
+        } catch (WebClientResponseException e) {
+            // 记录恒邦服务端返回的详细错误信息
+            String errorDetail = e.getResponseBodyAsString();
+            throw new SystemException("恒邦proposal接口调用失败[500]: " + errorDetail);
+        }
         try {
             String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
             System.out.println(resJson);
@@ -371,7 +381,8 @@ public class HengBangCrawlerRequestComponent {
      */
     public String coreProposal(String plyappno, HttpHeaders headers, List<Map<String, String>> paramList) {
         try {
-            ResponseEntity<String> responseEntity = requestComponent.objectPost(RequestUrl.SUBMIT.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" +plyappno, paramList, String.class, headers);
+            String requestBody = JSON.toJSONString(paramList);
+            ResponseEntity<String> responseEntity = requestComponent.objectPost(RequestUrl.SUBMIT.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" +plyappno, requestBody, String.class, headers);
             return JSONObject.parseObject(responseEntity.getBody()).getString("message");
         } catch (WebClientResponseException e) {
             if(e.getStatusCode().equals(HttpStatusCode.valueOf(500))){

+ 1 - 1
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/constant/RequestConstant.java

@@ -18,7 +18,7 @@ public class RequestConstant {
 
     public static final String BEARER = "Bearer ";
 
-    public static final String ENCRYPTPRE = "HbinsEncrypt_";
+    public static final  String  ENCRYPTPRE = "HbinsEncrypt_";
 
     /**
      * 恒邦影像上传类型

+ 272 - 53
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.hengbang.crawler.entity.request;
 
 import cn.hutool.core.collection.CollUtil;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.commons.utils.DateUtil;
@@ -18,57 +19,59 @@ import java.util.Objects;
  * @author: shenwd
  * @date: 2025/4/8 18:15
  * {
- * 	"outofwarrantytype": "N",
- * 	"clauseType": "2",
- * 	"ecarChargingPosts": [],
- * 	"carInsureDevices": [],
- * 	"effectfLag": null,
- * 	"accidentInsuranceList": [],
- * 	"epersonliabilityList": [{
- * 		"kindcode": "101",
- * 		"liabamt": 52248,
- * 		"liabname": "机动车损失保险",
- * 		"model": "0"
- * 	    }, {
- * 		"kindcode": "102",
- * 		"liabamt": 100000,
- * 		"liabname": "机动车第三者责任保险",
- * 		"model": "0"
- *    }, {
- * 		"kindcode": "103",
- * 		"liabamt": 5000,
- * 		"liabname": "机动车车上人员责任保险(司机)",
- * 		"model": "0",
- * 		"quantity": 1,
- * 		"unitAmount": 5000
- *    }, {
- * 		"kindcode": "104",
- * 		"liabamt": 40000,
- * 		"liabname": "机动车车上人员责任保险(乘客)",
- * 		"model": "0",
- * 		"quantity": 4,
- * 		"unitAmount": 10000
- *    }, {
- * 		"kindcode": "115",
- * 		"liabamt": 20000,
- * 		"liabname": "附加医保外医疗费用责任险(三者)",
- * 		"model": "0"
- *    }],
- * 	"begintimeBi": "2025-04-08T11:12:00.000Z",
- * 	"begintimeCi": "2025-04-08T11:12:00.000Z",
- * 	"endtimeBi": "",
- * 	"endtimeCi": "",
- * 	"plyappno": "T9704020801202589742122",
- * 	"risktype": "2",
- * 	"expdisc": "",
- * 	"ecarshiptaxPart": "投保人",
- * 	"taxonomyCode": "02",
- * 	"epolicyFlag": "Y",
- * 	"accidentEpolicyFlag": ""
+ * "outofwarrantytype": "N",
+ * "clauseType": "2",
+ * "ecarChargingPosts": [],
+ * "carInsureDevices": [],
+ * "effectfLag": null,
+ * "drivingtype":"",
+ * "relationCarOwner":"a",
+ * "accidentInsuranceList": [],
+ * "epersonliabilityList": [{
+ * "kindcode": "101",
+ * "liabamt": 52248,
+ * "liabname": "机动车损失保险",
+ * "model": "0"
+ * }, {
+ * "kindcode": "102",
+ * "liabamt": 100000,
+ * "liabname": "机动车第三者责任保险",
+ * "model": "0"
+ * }, {
+ * "kindcode": "103",
+ * "liabamt": 5000,
+ * "liabname": "机动车车上人员责任保险(司机)",
+ * "model": "0",
+ * "quantity": 1,
+ * "unitAmount": 5000
+ * }, {
+ * "kindcode": "104",
+ * "liabamt": 40000,
+ * "liabname": "机动车车上人员责任保险(乘客)",
+ * "model": "0",
+ * "quantity": 4,
+ * "unitAmount": 10000
+ * }, {
+ * "kindcode": "115",
+ * "liabamt": 20000,
+ * "liabname": "附加医保外医疗费用责任险(三者)",
+ * "model": "0"
+ * }],
+ * "begintimeBi": "2025-04-08T11:12:00.000Z",
+ * "begintimeCi": "2025-04-08T11:12:00.000Z",
+ * "endtimeBi": "",
+ * "endtimeCi": "",
+ * "plyappno": "T9704020801202589742122",
+ * "risktype": "2",
+ * "expdisc": "",
+ * "ecarshiptaxPart": "投保人",
+ * "taxonomyCode": "02",
+ * "epolicyFlag": "Y",
+ * "accidentEpolicyFlag": ""
  * }
  **/
 @Data
-public class HbCrawlerCalculationRequest extends HbBaseRequest{
+public class HbCrawlerCalculationRequest extends HbBaseRequest {
     @Serial
     private static final long serialVersionUID = -6130320344004620564L;
 
@@ -77,16 +80,18 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
         List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
         this.risktype = "0";
         this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
-        if(CollUtil.isNotEmpty(kindInfoVoList)){
+        if (CollUtil.isNotEmpty(kindInfoVoList)) {
             this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList);
             this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
             this.risktype = "2";
-        }else{
+        } else {
 //            this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
             this.epersonliabilityList = new ArrayList<>();
         }
-        if(Objects.nonNull(quoteVo.getCiRiskInfoVo())){
+        if (Objects.nonNull(quoteVo.getCiRiskInfoVo())) {
             this.begintimeCi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
             this.risktype = "1";
         }
         this.plyappno = plyappno;
@@ -100,7 +105,7 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
         this.effectfLag = null;
         this.ecarChargingPosts = new ArrayList<>();
         this.carInsureDevices = new ArrayList<>();
-        this.accidentInsuranceList = new ArrayList<>();
+        this.accidentInsuranceList = getAccidentInsuranceList(quoteVo.getAccidentalDrivings());
     }
 
     public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList) {
@@ -117,12 +122,149 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
         return epersonliabilityDTOList;
     }
 
+    public List<AccidentInsuranceDTO> getAccidentInsuranceList(List<AccidentalDrivingVo> accidentalDrivings) {
+        if (accidentalDrivings == null || accidentalDrivings.isEmpty()) {
+            return new ArrayList<>();
+        }
+        List<AccidentInsuranceDTO> accidentInsuranceList = new ArrayList<>();
+        for (AccidentalDrivingVo vo : accidentalDrivings) {
+            accidentInsuranceList.add(convertToAccidentInsuranceDTO(vo));
+        }
+        return accidentInsuranceList;
+    }
+
+    public static AccidentInsuranceDTO convertToAccidentInsuranceDTO(AccidentalDrivingVo vo) {
+        AccidentInsuranceDTO dto = new AccidentInsuranceDTO();
+        dto.setNonriskcode(vo.getProductCode().split("_")[1]);
+        dto.setProgramcode(vo.getProductCode());
+        dto.setProgramname(vo.getProductName());
+        dto.setCompanycode("0107");
+        dto.setSuminsured(vo.getSumAmount());
+        dto.setSumgrosspremium(vo.getSumPremium());
+        dto.setIfdefault(true);
+        dto.setBuynum(vo.getQuantity());
+        dto.setGgriskprogramclauselist(getGgriskprogramclauseList(vo.getProductCode().split("_")[1], vo.getProductCode()));
+        dto.setGgriskprogramdetailslist(getGgriskprogramdetailsList(vo.getProductCode().split("_")[1], vo.getProductCode()));
+        dto.setGgriskprogramdeductiblelist(new ArrayList<>());
+        dto.setGgriskprogramparamlist(new ArrayList<>());
+        return dto;
+    }
+
+    private static List<GgriskprogramclauseDTO> getGgriskprogramclauseList(String nonriskcode, String programcode) {
+        List<GgriskprogramclauseDTO> list = new ArrayList<>();
+        // 全司意外险特约一
+        GgriskprogramclauseDTO clause1 = new GgriskprogramclauseDTO();
+        clause1.setNonriskcode(nonriskcode);
+        clause1.setProgramcode(programcode);
+        clause1.setClausecode("1101_01");
+        clause1.setClausecname("全司意外险特约一");
+        clause1.setRemark("当被保险人与投保人不一致时,投保人已经就本保险合同载明的保险金额征得了被保险人的同意及认可。");
+        list.add(clause1);
+
+        // 山西驾乘意外险特约一
+        GgriskprogramclauseDTO clause2 = new GgriskprogramclauseDTO();
+        clause2.setNonriskcode(nonriskcode);
+        clause2.setProgramcode(programcode);
+        clause2.setClausecode("11190107_01");
+        clause2.setClausecname("山西驾乘意外险特约一");
+        clause2.setRemark("车辆驾驶员需持国家有关部门核发的有效驾驶证,驾驶投保车辆须符合国家的相关规定,受益人为法定。");
+        list.add(clause2);
+
+        // 山西驾乘意外险特约二
+        GgriskprogramclauseDTO clause3 = new GgriskprogramclauseDTO();
+        clause3.setNonriskcode(nonriskcode);
+        clause3.setProgramcode(programcode);
+        clause3.setClausecode("11190107_02");
+        clause3.setClausecname("山西驾乘意外险特约二");
+        clause3.setRemark("投保车辆必须符合国家规定的车辆使用标准、具备合法有效的行驶证、年检证明,并已投保交强险。");
+        list.add(clause3);
+
+        // 山西驾乘意外险特约四
+        GgriskprogramclauseDTO clause4 = new GgriskprogramclauseDTO();
+        clause4.setNonriskcode(nonriskcode);
+        clause4.setProgramcode(programcode);
+        clause4.setClausecode("11190107_04");
+        clause4.setClausecname("山西驾乘意外险特约四");
+        clause4.setRemark("被保险人每次发生的符合本保单所约定的合理医疗费用,保险人在每次扣除免赔__100___元后,按_80_%的比例进行赔付。");
+        list.add(clause4);
+
+        // 山西驾乘意外险特约五
+        GgriskprogramclauseDTO clause5 = new GgriskprogramclauseDTO();
+        clause5.setNonriskcode(nonriskcode);
+        clause5.setProgramcode(programcode);
+        clause5.setClausecode("11190107_05");
+        clause5.setClausecname("山西驾乘意外险特约五");
+        clause5.setRemark("严格按照车辆行驶证核定的座位数投保,投保内容和行驶证内容不符,则保单无效。");
+        list.add(clause5);
+
+        // 全司驾乘意外险特约一
+        GgriskprogramclauseDTO clause6 = new GgriskprogramclauseDTO();
+        clause6.setNonriskcode(nonriskcode);
+        clause6.setProgramcode(programcode);
+        clause6.setClausecode("111901_01");
+        clause6.setClausecname("全司驾乘意外险特约一");
+        clause6.setRemark("在保险期间内,被保险人乘坐或者驾驶保单中载明的机动车辆并在该车辆行驶过程中于机动车辆内遭受意外,保险人按保单约定承担保险责任。");
+        list.add(clause6);
+
+        return list;
+    }
+
+    private static List<GgriskprogramdetailsDTO> getGgriskprogramdetailsList(String nonriskcode, String programcode) {
+        List<GgriskprogramdetailsDTO> list = new ArrayList<>();
+
+        // 机动车辆驾乘意外伤害保险意外身故保险责任(2024款)
+        GgriskprogramdetailsDTO detail1 = new GgriskprogramdetailsDTO();
+        detail1.setNonriskcode(nonriskcode);
+        detail1.setProgramcode(programcode);
+        detail1.setSerialno(1);
+        detail1.setKindcode("1119066");
+        detail1.setKindname("机动车辆驾乘意外伤害保险意外身故保险责任(2024款)");
+        detail1.setKindrate("0.225");
+        detail1.setKindunitinsured("30000");
+        detail1.setKindsuminsured("240000");
+        detail1.setKindunitpremium("6.75");
+        detail1.setKindgrosspremium("54");
+        list.add(detail1);
+
+        // 机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)
+        GgriskprogramdetailsDTO detail2 = new GgriskprogramdetailsDTO();
+        detail2.setNonriskcode(nonriskcode);
+        detail2.setProgramcode(programcode);
+        detail2.setSerialno(2);
+        detail2.setKindcode("1119067");
+        detail2.setKindname("机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)");
+        detail2.setKindrate("0.09166");
+        detail2.setKindunitinsured("30000");
+        detail2.setKindsuminsured("240000");
+        detail2.setKindunitpremium("2.75");
+        detail2.setKindgrosspremium("22");
+        list.add(detail2);
+
+        // 附加机动车辆驾乘意外伤害医疗保险(2024款)
+        GgriskprogramdetailsDTO detail3 = new GgriskprogramdetailsDTO();
+        detail3.setNonriskcode(nonriskcode);
+        detail3.setProgramcode(programcode);
+        detail3.setSerialno(3);
+        detail3.setKindcode("1119065");
+        detail3.setKindname("附加机动车辆驾乘意外伤害医疗保险(2024款)");
+        detail3.setKindrate("1.0001");
+        detail3.setKindunitinsured("3000");
+        detail3.setKindsuminsured("24000");
+        detail3.setKindunitpremium("3");
+        detail3.setKindgrosspremium("24");
+        list.add(detail3);
+
+        return list;
+    }
+
     private String outofwarrantytype;
     private String clauseType;
     private List<String> ecarChargingPosts;
     private List<String> carInsureDevices;
     private String effectfLag;
-    private List<Object> accidentInsuranceList;
+    private String drivingtype;
+    private String relationCarOwner = "a";
+    private List<AccidentInsuranceDTO> accidentInsuranceList;
     private List<EpersonliabilityDTO> epersonliabilityList;
     private String begintimeBi;
     private String begintimeCi;
@@ -151,4 +293,81 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
         private String quantity;
         private String unitAmount;
     }
+
+    @Data
+    public static class AccidentInsuranceDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -9183755801236888528L;
+
+        private String id;
+        private String plyappno;
+        private String proposalno;
+        private String policycode;
+        private String nonriskcode;
+        private String programcode;
+        private String programname;
+        private String companycode;
+        private String resourcetype;
+        private String suminsured;
+        private String sumgrosspremium;
+        private String sumuwpricetaxtotal;
+        private Boolean ifdefault;
+        private String seatcount;
+        private String begintime;
+        private String endtime;
+        private String sumitcoretime;
+        private Integer buynum;
+        private String proposalnostatus;
+        private String proposalnoinfo;
+        private List<GgriskprogramclauseDTO> ggriskprogramclauselist;
+        private List<Object> ggriskprogramdeductiblelist;
+        private List<GgriskprogramdetailsDTO> ggriskprogramdetailslist;
+        private List<Object> ggriskprogramparamlist;
+        private String familyinsureitem;
+        private String gasinsureitem;
+        private String risk1205field;
+        private String risk1283items;
+        private String drivingtype;
+        private String relationcarowner;
+    }
+
+    @Data
+    public static class GgriskprogramclauseDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -9183755801236888529L;
+
+        private String id;
+        private String plyappno;
+        private String insureRiskId;
+        private String nonriskcode;
+        private String programcode;
+        private String clausecode;
+        private String clausecname;
+        private String remark;
+        private String serialno;
+    }
+
+    @Data
+    public static class GgriskprogramdetailsDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 9162613613204458328L;
+
+        private String id;
+        private String plyappno;
+        private String insureRiskId;
+        private String nonriskcode;
+        private String programcode;
+        private Integer serialno;
+        private String kindcode;
+        private String kindname;
+        private String kindrate;
+        private String kindunitinsured;
+        private String kindsuminsured;
+        private String kindunitpremium;
+        private String kindgrosspremium;
+        private String itemDetailCode;
+        private String itemDetailName;
+        private String kindInd;
+        private String calculateInd;
+    }
 }

+ 5 - 1
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java

@@ -57,7 +57,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureItemDTO.setNegotiationValue(Double.parseDouble(depreciationPrice));
         carInsureItemDTO.setLicenseKindCode(carInfoVo.getLicenseKindCode());
         carInsureItemDTO.setVehicleType(carInfoVo.getCarTypeCode());
-        carInsureItemDTO.setTransferDate(carInfoVo.getTransferDate());
+        carInsureItemDTO.setTransferDate(dateFormat(carInfoVo.getTransferDate()));
         carInsureItemDTO.setSeatCount(contentDTO.getSeatCount());
         carInsureItemDTO.setPurchasePrice(Double.parseDouble(contentDTO.getPurchasePriceNotTax()));
         carInsureItemDTO.setExhaustscale(String.valueOf(contentDTO.getExhaustScale()));
@@ -161,6 +161,10 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
     }
 
     private String dateFormat(String date){
+        // 空字符串直接返回
+        if (date == null || date.trim().isEmpty()){
+            return date;
+        }
         // 1. 解析为 LocalDateTime
         ZonedDateTime zdt = null;
         if (date.length() == 10){

+ 16 - 3
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -81,6 +81,11 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
      */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+
+        //http://192.168.5.250:8080/quote/quote
+
+
+
         // 1.0 获取token的请求头
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
@@ -189,9 +194,11 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
             }
         });
 
-        List<Object> accidnentList = new ArrayList<>();
-        quoteVo.getAccidentalDrivings().stream().filter(e -> StrUtil.isNotEmpty(e.getProductCode())).filter(e -> ObjectUtil.isNull(contentMap.get(e.getProductCode().trim()))).forEach(accidnentList::add);
-        calculationRequest.setAccidentInsuranceList(accidnentList);
+        List<HbCrawlerCalculationRequest.AccidentInsuranceDTO> accidentList = new ArrayList<>();
+        quoteVo.getAccidentalDrivings().stream()
+                .filter(e -> StrUtil.isNotEmpty(e.getProductCode()))
+                .forEach(e -> accidentList.add(HbCrawlerCalculationRequest.convertToAccidentInsuranceDTO(e)));
+        calculationRequest.setAccidentInsuranceList(accidentList);
     }
 
     // 重复投保提取时间
@@ -277,6 +284,12 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                 underwritingResultsVo.setUnderwritingResult("核保失败:" + response.getDesCription());
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             } else {
+                //核保成功  获取支付二维码
+                //延迟3秒 等待生成
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(underwritingVo.getOrder());
+                underwritingResultsVo.setPaymentLink(getPaymentLink(paymentLinkVo).getPaymentLink());
+                underwritingResultsVo.setCompanyOrderNo(hbCrawlerOrder.getPlyappno());
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
             }
             return underwritingResultsVo;

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


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

@@ -1,6 +1,12 @@
 package com.jzg.quotation.summary.client;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.LotteryCounDTO;
+import com.jzg.commons.entity.dto.UnifiedUserCenterDTO;
+import com.jzg.commons.entity.vo.LotteryActivityVO;
+import com.jzg.commons.entity.vo.LotteryCountVO;
+import com.jzg.commons.entity.vo.UnifiedUserClientVO;
 import com.jzg.quotation.summary.entity.Result;
 import com.jzg.quotation.summary.entity.dto.*;
 import com.jzg.quotation.summary.entity.vo.ChannelRightsPackageVO;
@@ -62,4 +68,36 @@ public interface LocalLivingClient {
      */
     @PostMapping(value = "/channel/api/rightsGrant/rights/list")
     Result<IPage<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO);
+
+    /**
+     * 查询抽奖活动规则
+     *
+     * @param scene 场景编码
+     * @return 活动列表
+     */
+    @GetMapping("lottery/lotteryActivity/queryActivityList")
+    HttpResult<List<LotteryActivityVO>> queryActivityRules(@RequestParam("scene") Integer scene);
+    /**
+     * 添加用户抽奖次数
+     *
+     * @param lotteryCounDTO
+     * @return
+     */
+    @PostMapping("/localUserLotteryCount/add")
+    HttpResult<LotteryCountVO> addLotteryCount(@RequestBody LotteryCounDTO lotteryCounDTO);
+
+    /**
+     * 查询用户绑定
+     * @param unifiedUserCenterDTO
+     * @return
+     */
+    @PostMapping("/userApp/queryBind")
+    HttpResult<UnifiedUserClientVO> queryBind(@RequestBody UnifiedUserCenterDTO unifiedUserCenterDTO);
+    /**
+     * 添加用户绑定
+     * @param unifiedUserCenterDTO
+     * @return
+     */
+    @PostMapping("/userApp/bind")
+    HttpResult<UnifiedUserClientVO> bind(@RequestBody UnifiedUserCenterDTO unifiedUserCenterDTO);
 }

+ 283 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.summary.controller;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,7 +15,10 @@ import com.jzg.commons.constants.quote.enums.base.QuoteRuleCategory;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.LotteryCounDTO;
+import com.jzg.commons.entity.dto.UnifiedUserCenterDTO;
 import com.jzg.commons.entity.enums.MessageCodeEnum;
+import com.jzg.commons.entity.enums.YesNoEnum;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -25,8 +29,7 @@ import com.jzg.commons.entity.quote.vo.underwriting.SpecialAppointmentsVo;
 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.vo.CompanyClauseVo;
-import com.jzg.commons.entity.vo.InsCompanyClauseVo;
+import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.exception.TokenExpireException;
 import com.jzg.commons.util.AssertionUtils;
@@ -39,6 +42,7 @@ import com.jzg.quotation.summary.aop.OrderOperationLog;
 import com.jzg.quotation.summary.aop.QuoteVerification;
 import com.jzg.quotation.summary.async.AsyncGetPayLink;
 import com.jzg.quotation.summary.classifier.QuoteInfoParameterFilling;
+import com.jzg.quotation.summary.client.LocalLivingClient;
 import com.jzg.quotation.summary.constants.QuoteNumberConstant;
 import com.jzg.quotation.summary.converter.QuoteInfoConverter;
 import com.jzg.quotation.summary.entity.po.QuoteRuleMapping;
@@ -54,12 +58,16 @@ import lombok.RequiredArgsConstructor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -145,6 +153,15 @@ public class UnifyOrderManager {
     @Autowired
     private AsyncGetPayLink asyncGetPayLink;
 
+    @Autowired
+    private LocalLivingClient localLivingClient;
+
+    @Value("${lottery.activity.scene:3}")
+    private Integer lotteryScene;
+
+    //本地生活在一账通的固定平台ID
+    private static final String CLIENT_ID = "bdsh-X9yZ1wV3uT5sR7qP9o";
+
     private String getSystemCode() {
         //如果是APP登录的话 则传递SystemCode的头部字段
         if (baseController.getUserSystemCode().equals("APP")) {
@@ -255,12 +272,107 @@ public class UnifyOrderManager {
                 QuoteInfoConverter.converterKindInfoVo(quoteVo.getKindInfoVo(), quoteKindMappingMap.get(QuoteRuleCategory.KIND.getCode()), quoteVo.getCarInfoVo());
             }
             quoteResultsVo = quoteService.quote(quoteVo);
+            // 格式化保费为两位小数
+            QuoteResultsVo.CostsVo costs = quoteResultsVo.getCosts();
+            if (costs != null) {
+                costs.setCiPremium(formatPremium(costs.getCiPremium()));       // 交强险
+                costs.setBiPremium(formatPremium(costs.getBiPremium()));       // 商业险
+                costs.setNiPremium(formatPremium(costs.getNiPremium()));       // 非车险
+                costs.setVvTax(formatPremium(costs.getVvTax()));               // 车船税
+                costs.setSumPremium(formatPremium(costs.getSumPremium()));     // 总保费
+            }
             quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
             quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
             quoteResultsVo.setQuoteStatus(quoteResultsVo.getQuoteStatusEnum().getCode());
             quoteResultsVo.setOrdersNo(ordersNo);
             // 报价后更新订单
             insOrdersService.orderAfterUpdateQuote(ordersNo, quoteResultsVo);
+
+            //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
+            //远程调用活动列表
+            //匹配规则 每报价()次,可得()次抽奖机会,每日最多()次抽奖
+            HttpResult<List<LotteryActivityVO>> result = localLivingClient.queryActivityRules(lotteryScene);
+            if (result == null || result.getCode() != 200 || result.getData() == null) {
+                log.error("统一报价,查询本地生活的活动列表异常");
+            } else {
+                for (LotteryActivityVO activity : result.getData()) {
+                    // 检查活动是否有效
+                    if (!LocalDate.now().isBefore(activity.getActivityStartTime())
+                            && !LocalDate.now().isAfter(activity.getActivityEndTime())) {
+                        continue;
+                    }
+
+                    if (activity.getLocalActivityTables() == null) {
+                        continue;
+                    }
+                    // 遍历所有本地活动表
+                    for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                        // 只处理 type=6 的报价规则
+                        if (!"6".equals(table.getType())) {
+                            continue;
+                        }
+
+                        // 只处理本租户的报价规则
+                        if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
+                            continue;
+                        }
+                        // 查询是否在一账通绑定
+                        UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                        unifiedUserCenterDTO.setUserId(quoteVo.getOrder().getRealQuoteUserId());
+                        unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                        unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
+                        HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                        try {
+                            unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
+                        } catch (Exception e) {
+                            log.info("业务员报价,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", quoteVo.getOrder().getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            log.error("业务员报价,查询用户绑定一账通接口异常", e);
+                        }
+                        if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                            // 判断是否满足条件
+                            // 业务员报价次数是否大于等于本活动规定时间范围内的报价次数
+                            // 统计业务员的报价次数
+                            int count = insOrdersService.countQuoteNum(baseController.getUserSystemCode(), quoteVo.getOrder().getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                            if (count >= Integer.parseInt(table.getQutNum()) && count <= Integer.parseInt(table.getQutLotteryMax())) {
+                                // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                completeRule(baseController.getUserSystemCode(), quoteVo.getOrder().getRealQuoteUserId(), null, activity.getId(),
+                                        table.getId(), table.getQutNum() ,table.getQutLotteryNum() ,table.getQutLotteryMax() ,YesNoEnum.NO.getCode(), 6);
+                                log.info("业务员报价,满足条件插入记录,userId:{},clientId:{},tenantId:{}", quoteVo.getOrder().getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            }
+                        }else {
+                            Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                    .stream()
+                                    .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                            // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                            if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                int count = insOrdersService.countQuoteNum(baseController.getUserSystemCode(), quoteVo.getOrder().getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                if (count >= Integer.parseInt(table.getQutNum()) && count <= Integer.parseInt(table.getQutLotteryMax())) {
+                                    LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                    lotteryCounDTO.setAppUserId(quoteVo.getOrder().getRealQuoteUserId());
+                                    lotteryCounDTO.setActivityId(activity.getId());
+                                    lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
+                                    HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                    try {
+                                        lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
+                                    } catch (Exception e) {
+                                        log.info("业务员报价,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", quoteVo.getOrder().getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
+                                        log.error("业务员报价,远程调用本地生活抽奖次数增加异常", e);
+                                    }
+                                    if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                        // 记录规则完成  标记已同步
+                                        completeRule(baseController.getUserSystemCode(), quoteVo.getOrder().getRealQuoteUserId(), null, activity.getId(),
+                                                table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 6);
+
+                                        log.info("业务员报价,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", quoteVo.getOrder().getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+
         } catch (Exception e) {
             log.error("车险报价异常", e);
             Throwable root = e.getCause() != null ? e.getCause() : e;
@@ -272,6 +384,50 @@ public class UnifyOrderManager {
                 .equals(InsOrderStatusEnum.WAIT_AUDIT) ? HttpResult.ok(quoteResultsVo) : HttpResult.error(500, quoteResultsVo, quoteResultsVo.getErrorMessage());
     }
 
+    /**
+     * 记录规则完成
+     */
+    private void completeRule(String tenantId, String userId, String userPhone, String activityId,
+                                  String tableId, String qutNum, String qutLotteryNum, String qutLotteryMax,Integer status, Integer activityType) {
+        SysUserActivityCompleteInRule exist = null;
+        // 先查询是否已存在记录(防重入)
+        if (9 != activityType) {
+            exist = insOrdersService.selectByRule(
+                    tenantId, userId, activityId, qutNum, activityType);
+        } else {
+            exist = insOrdersService.selectByRuleAndUserPhone(
+                    activityId, userPhone, qutNum, activityType);
+        }
+
+        if (exist != null) {
+            return;
+        }
+
+        SysUserActivityCompleteInRule record = new SysUserActivityCompleteInRule();
+        record.setTenantId(tenantId);
+        record.setUserId(userId);
+        record.setUserPhone(userPhone);
+        record.setActivityType(activityType);
+        record.setActivityId(activityId);
+        record.setLocalActivityTableId(tableId);
+        //报价/出单次数/承保费用
+        record.setRuleCompleteNum(qutNum);
+        //抽奖次数
+        record.setLotteryNum(StrUtil.isNotBlank(qutLotteryNum)
+                ? Integer.parseInt(qutLotteryNum) : 0);
+        //报价用,今日抽奖最大次数
+        record.setLotteryMaxNum(StrUtil.isNotBlank(qutLotteryMax)
+                ? Integer.parseInt(qutLotteryMax) : 0);
+        record.setStatus(status);
+        record.setReceiveTime(LocalDateTime.now());
+        record.setCreateBy(userId);
+        record.setUpdateBy(userId);
+        insOrdersService.insertActivityCompleteInRule(record);
+
+        log.info("匹配规则完成,activityType={}, tenantId={}, userId={}, activityId={}, qutNum={}, qutLotteryNum={}, qutLotteryMax={}, userPhone={}",
+                activityType, tenantId, userId, activityId, qutNum, qutLotteryNum,  qutLotteryMax, userPhone);
+    }
+
 
     @OrderOperationLog(
             module = "车险订单",
@@ -556,6 +712,110 @@ public class UnifyOrderManager {
 
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
+        //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
+        // 承保(客户)、出单(业务员)
+        if(orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
+            // 远程调用活动列表
+            // 匹配规则
+            // 规则一:累计出单()次,可得()次抽奖机会
+            // 规则二:累计出单()次,可得()次抽奖机会
+            // 下一个规则的出单次数不能不上一个规则出单次数小
+            HttpResult<List<LotteryActivityVO>> result = localLivingClient.queryActivityRules(lotteryScene);
+            if (result == null || result.getCode() != 200 || result.getData() == null) {
+                log.error("活动列表异常");
+            } else {
+                for (LotteryActivityVO activity : result.getData()) {
+                    // 检查活动是否有效
+                    if (!LocalDate.now().isBefore(activity.getActivityStartTime())
+                            && !LocalDate.now().isAfter(activity.getActivityEndTime())) {
+                        continue;
+                    }
+
+                    if (activity.getLocalActivityTables() == null) {
+                        continue;
+                    }
+                    // 遍历所有本地活动表
+                    for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                        // 处理 type=9 的承保规则
+                        if ("9".equals(table.getType())) {
+                            Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
+                            String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
+                            for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
+                                if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                                    // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                    completeRule(null, null, userPhone, activity.getId(),
+                                            table.getId(), underwritingRuleVO.getUwMinPremium()+"-"+underwritingRuleVO.getUwMaxPremium() , underwritingRuleVO.getUwLotteryNum(),null ,YesNoEnum.NO.getCode(), 9);
+                                    log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                }
+                            }
+                        }
+                        // 处理 type=8 的出单规则
+                        if ("8".equals(table.getType())) {
+                            // 只处理本租户的出单规则
+                            if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
+                                continue;
+                            }
+                            // 查询是否在一账通绑定
+                            UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                            unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
+                            unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                            unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
+                            HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                            try {
+                                unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
+                            } catch (Exception e) {
+                                log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                log.error("业务员出单,查询用户绑定一账通接口异常", e);
+                            }
+                            if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                                // 判断是否满足条件
+                                // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
+                                // 统计业务员的出单次数
+                                int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                    if (count >= Integer.parseInt(orderRule.getOrdNum())) {
+                                        // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                        completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                                table.getId(), orderRule.getOrdNum() , String.valueOf(orderRule.getOrdLotteryNum()),null ,YesNoEnum.NO.getCode(), 8);
+
+                                        log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                    }
+                                }
+                            }else {
+                                Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                        .stream()
+                                        .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                                // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                                if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                    int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                    for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                        if (count >= Integer.parseInt(orderRule.getOrdNum())) {
+                                            LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                            lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
+                                            lotteryCounDTO.setActivityId(activity.getId());
+                                            lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
+                                            HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                            try {
+                                                lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
+                                            } catch (Exception e) {
+                                                log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
+                                                log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
+                                            }
+                                            if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                                // 记录规则完成  标记已同步
+                                                completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                                        table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
+                                                log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
         return HttpResult.ok("状态刷新成功");
     }
 
@@ -681,4 +941,25 @@ public class UnifyOrderManager {
             }
         }
     }
+
+    /**
+     * 格式化保费字符串:非空判断 + 保留两位小数
+     * @param premium 原始保费字符串
+     * @return 格式化后两位小数的字符串
+     */
+    public static String formatPremium(String premium) {
+        // 1. 空值直接返回空
+        if (premium == null || premium.isBlank()) {
+            return premium;
+        }
+        try {
+            // 2. 转BigDecimal,保留两位小数(HALF_UP 四舍五入)
+            return new BigDecimal(premium.trim())
+                    .setScale(2, RoundingMode.HALF_UP)
+                    .toPlainString();
+        } catch (Exception e) {
+            // 格式错误直接返回原值,防止报错
+            return premium;
+        }
+    }
 }

+ 51 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersMapper.java

@@ -10,6 +10,7 @@ import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteQueryVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
 import com.jzg.commons.entity.orders.vo.OrderListVo;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.commons.entity.vo.OrdersListVo;
 import com.jzg.quotation.summary.entity.bo.StatDateCountBo;
@@ -17,6 +18,7 @@ import com.jzg.quotation.summary.entity.vo.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Set;
 
@@ -154,4 +156,53 @@ public interface InsOrdersMapper extends BaseMapper<InsOrders> {
     InsOrders selectMainOrderNumber(@Param("licenseNo") String licenseNo,@Param("realQuoteUserId") String realQuoteUserId);
 
     List<OrderQuotationCompany> selectListOrderQuotationCompany(@Param("noIds") Set<String> noIds);
+
+    /**
+     * 获取业务员在本地生活营销活动规定的活动时间内的报价次数
+     * @param systemCode
+     * @param realQuoteUserId
+     * @param activityStartTime
+     * @param activityEndTime
+     * @return
+     */
+    int countQuoteNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime);
+    /**
+     * 获取业务员在本地生活营销活动规定的活动时间内的出单次数
+     * @param systemCode
+     * @param realQuoteUserId
+     * @param activityStartTime
+     * @param activityEndTime
+     * @return
+     */
+    int countOrderNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime);
+    /**
+     * 查询营销活动规则表中符合的规则记录
+     * @param tenantId
+     * @param userId
+     * @param activityId
+     * @param qutNum
+     * @param activityType
+     * @return
+     */
+    SysUserActivityCompleteInRule selectByRule(String tenantId, String userId, String activityId, String qutNum, Integer activityType);
+    /**
+     * 添加营销活动规则表中的符合规则记录
+     * @param record
+     */
+    void insertActivityCompleteInRule(SysUserActivityCompleteInRule record);
+
+    /**
+     * 查询客户手机号
+     * @param insOrderNo
+     * @return
+     */
+    String queryCustomerPhone(String insOrderNo);
+    /**
+     * 获取订单保费
+     * @param insOrderNo
+     * @return
+     */
+    Double queryTotalFee(String insOrderNo);
+
+    SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType);
 }

+ 61 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java

@@ -14,6 +14,7 @@ import com.jzg.commons.entity.orders.vo.HistoryQuoteQueryVo;
 import com.jzg.commons.entity.orders.vo.HistoryQuoteResultVo;
 import com.jzg.commons.entity.orders.vo.OrderListVo;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.OrderStatusResultVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
@@ -26,6 +27,7 @@ import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.quotation.summary.entity.vo.*;
 
 import java.lang.reflect.InvocationTargetException;
+import java.time.LocalDate;
 import java.util.List;
 
 public interface InsOrdersService extends IService<InsOrders> {
@@ -221,4 +223,63 @@ public interface InsOrdersService extends IService<InsOrders> {
      * @return
      */
     String exportDynamicFields(InsOrdersParamVO insOrdersParam);
+
+    /**
+     * 获取业务员在本地生活营销活动规定的活动时间内的报价次数
+     * @param systemCode
+     * @param realQuoteUserId
+     * @param activityStartTime
+     * @param activityEndTime
+     * @return
+     */
+    int countQuoteNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime);
+    /**
+     * 获取业务员在本地生活营销活动规定的活动时间内的出单次数
+     * @param systemCode
+     * @param realQuoteUserId
+     * @param activityStartTime
+     * @param activityEndTime
+     * @return
+     */
+    int countOrderNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime);
+    /**
+     * 查询营销活动规则表中符合的规则记录
+     * @param tenantId
+     * @param userId
+     * @param activityId
+     * @param qutNum
+     * @param activityType
+     * @return
+     */
+    SysUserActivityCompleteInRule selectByRule(String tenantId, String userId, String activityId, String qutNum, Integer activityType);
+
+    /**
+     * 添加营销活动规则表中的符合规则记录
+     * @param record
+     */
+    void insertActivityCompleteInRule(SysUserActivityCompleteInRule record);
+
+    /**
+     * 查询订单投保人手机号
+     * @param insOrderNo
+     * @return
+     */
+    String queryCustomerPhone(String insOrderNo);
+
+    /**
+     * 获取订单总保费
+     * @param insOrderNo
+     * @return
+     */
+    Double queryTotalFee(String insOrderNo);
+
+    /**
+     * 获取营销活动规则表中符合的规则记录--承保--只有手机号
+     * @param activityId
+     * @param userPhone
+     * @param qutNum
+     * @param activityType
+     * @return
+     */
+    SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType);
 }

+ 1 - 5
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/IdentifyServiceImpl.java

@@ -213,8 +213,4 @@ public class IdentifyServiceImpl implements IdentifyService {
         }
 
     }
-
-
-
-
-}
+}

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

@@ -77,6 +77,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.net.URL;
 import java.time.Instant;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -162,12 +163,12 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     public HttpResult saveOrders(InsOrdersAdd ordersAdd) {
         // 检查输入参数是否为空,如果为空则返回错误信息
         try {
-
             // 获取订单对象并设置引用编号
             InsOrders insOrders = ordersAdd.getInsOrders();
-            insOrders.setRealQuoteUserId(baseController.getUserName());
+            String realQuoteUserId = StrUtil.isNotBlank(insOrders.getRealQuoteUserId()) ? insOrders.getRealQuoteUserId() : baseController.getUserName();
+            insOrders.setRealQuoteUserId(realQuoteUserId);
             InsOrdersAdd insOrdersAdd = BeanCopyUtil.deepCopy(ordersAdd, InsOrdersAdd.class);
-            InsOrders parentOrders = insOrdersMapper.selectMainOrderNumber(ordersAdd.getCarInfoVo().getLicenseNo(),ordersAdd.getInsOrders().getRealQuoteUserId());
+            InsOrders parentOrders = insOrdersMapper.selectMainOrderNumber(ordersAdd.getCarInfoVo().getLicenseNo(), realQuoteUserId);
             boolean nullOrders = ObjectUtil.isNull(parentOrders);
             if (nullOrders){
                 insOrders.setQuoteNo(SnowFlakeUtil.getSnowFlakeId());
@@ -426,6 +427,15 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrdersParam.setStartDate(insOrdersParam.getRecordingTime()[0]);
             insOrdersParam.setEndDate(insOrdersParam.getRecordingTime()[1]);
         }
+        String systemCode = "";
+        //如果是APP登录的话 则传递SystemCode的头部字段
+        if (baseController.getUserSystemCode().equals("APP")) {
+            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+            systemCode = request.getHeader("system_code");
+        } else {
+            systemCode =  baseController.getUserSystemCode();
+        }
+        insOrdersParam.setSystemCode(systemCode);
         IPage<OrdersListVo> ordersListVoIPage = insOrdersMapper.pageList(insOrdersParam.getPage(), insOrdersParam);
         return ordersListVoIPage;
     }
@@ -467,7 +477,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         }
 
         // 业务员信息
-        SalesmanVo salesmanInfo = orgClient.getUserByMobile(insOrdersVo.getCreateBy());
+        SalesmanVo salesmanInfo = orgClient.getUserByMobile(insOrdersVo.getInsOrders().getRealQuoteUserId());
         if (Objects.nonNull(salesmanInfo)) {
             InsOrdersVo.Salesman salesman = new InsOrdersVo.Salesman();
             salesman.setName(salesmanInfo.getName());
@@ -1579,4 +1589,38 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 "车险出单-订单管理-动态导出-" + Instant.now()
         );
     }
+
+
+    @Override
+    public int countQuoteNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime) {
+        return insOrdersMapper.countQuoteNum(systemCode, realQuoteUserId, activityStartTime, activityEndTime);
+    }
+
+    @Override
+    public int countOrderNum(String systemCode, String realQuoteUserId, LocalDate activityStartTime, LocalDate activityEndTime) {
+        return insOrdersMapper.countOrderNum(systemCode, realQuoteUserId, activityStartTime, activityEndTime);
+    }
+
+    @Override
+    public SysUserActivityCompleteInRule selectByRule(String tenantId, String userId, String activityId, String qutNum, Integer activityType) {
+        return insOrdersMapper.selectByRule(tenantId, userId, activityId, qutNum, activityType);
+    }
+
+    @Override
+    public void insertActivityCompleteInRule(SysUserActivityCompleteInRule record) {
+        insOrdersMapper.insertActivityCompleteInRule(record);
+    }
+    @Override
+    public String queryCustomerPhone(String insOrderNo){
+        return insOrdersMapper.queryCustomerPhone(insOrderNo);
+    }
+    @Override
+    public Double queryTotalFee(String insOrderNo) {
+        return insOrdersMapper.queryTotalFee(insOrderNo);
+    }
+
+    @Override
+    public SysUserActivityCompleteInRule selectByRuleAndUserPhone(String activityId, String userPhone, String qutNum, Integer activityType) {
+        return insOrdersMapper.selectByRuleAndUserPhone(activityId, userPhone, qutNum, activityType);
+    }
 }

+ 118 - 2
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -24,6 +24,7 @@
         <result property="insOrderNo" column="ins_order_no" jdbcType="VARCHAR"/>
         <result property="signingTime" column="signing_time" jdbcType="VARCHAR"/>
         <result property="isTemporarily" column="is_temporarily" jdbcType="VARCHAR"/>
+        <result property="realQuoteUserId" column="real_quote_user_id" jdbcType="VARCHAR"/>
     </resultMap>
     <!--    订单 车辆信息-->
     <resultMap id="carInfoMap" type="com.jzg.commons.entity.quote.vo.CarInfoVo">
@@ -512,7 +513,7 @@
         LEFT JOIN ins_orders_car_info c ON c.order_no = o.id
         LEFT JOIN ins_orders_costs s ON o.id = s.order_no
         LEFT JOIN sys_user su ON su.mobile = o.real_quote_user_id
-        LEFT JOIN sys_user_jzg_info suji ON suji.user_id = su.id
+        LEFT JOIN sys_user_jzg_info suji ON suji.user_id = su.id AND suji.system_code = #{insOrdersParam.systemCode}
         LEFT JOIN esm_ins_company eic on o.company_id = eic.id
         left join sys_dept sd on sd.id = suji.dept_id
         left join
@@ -538,6 +539,9 @@
             <if test="insOrdersParam.orderNo != null and insOrdersParam.orderNo != ''">
                 AND o.quote_no = #{insOrdersParam.orderNo}
             </if>
+            <if test="insOrdersParam.orderId != null and insOrdersParam.orderId != ''">
+                AND o.id = #{insOrdersParam.orderId}
+            </if>
             <if test="insOrdersParam.parentId == 0 ">
                 AND o.parent_id = 0
             </if>
@@ -550,11 +554,14 @@
             <if test="insOrdersParam.companyName != null and insOrdersParam.companyName != ''">
                 AND o.company_name = #{insOrdersParam.companyName}
             </if>
+            <if test="insOrdersParam.companyId != null and insOrdersParam.companyId != ''">
+                AND o.company_id = #{insOrdersParam.companyId}
+            </if>
             <if test="insOrdersParam.salesman != null and insOrdersParam.salesman != ''">
                 AND suji.name = #{insOrdersParam.salesman}
             </if>
             <if test="insOrdersParam.salesmanCompany != null and insOrdersParam.salesmanCompany != ''">
-                AND o.salesman_company = #{insOrdersParam.salesmanCompany}
+                AND sd.name = #{insOrdersParam.salesmanCompany}
             </if>
             <if test="insOrdersParam.auditStatus != null and insOrdersParam.auditStatus != ''">
                 AND o.audit_status = #{insOrdersParam.auditStatus}
@@ -584,6 +591,7 @@
                order_status,
                company_id,
                company_name,
+               real_quote_user_id,
                product_id,
                product_name,
                entry_status,
@@ -701,6 +709,7 @@
                company_name,
                product_id,
                product_name,
+               real_quote_user_id,
                audit_status,
                audit_comments,
                create_by,
@@ -1452,6 +1461,8 @@
         FROM ins_orders o
                  LEFT JOIN ins_orders_car_info c ON o.id = c.order_no
         WHERE o.parent_id = 0 AND o.entry_status = 3 AND c.license_no = #{licenseNo} AND o.real_quote_user_id = #{realQuoteUserId}
+        ORDER BY o.create_time DESC
+        LIMIT 1
     </select>
 
 
@@ -1465,4 +1476,109 @@
         </foreach>
     </select>
 
+    <select id="countQuoteNum" resultType="Integer">
+        SELECT COUNT(DISTINCT io.id)
+        FROM ins_orders io
+                 INNER JOIN sys_user su ON su.mobile = io.real_quote_user_id
+                 INNER JOIN sys_user_jzg_info suji ON suji.user_id = su.id
+        WHERE io.parent_id != 0
+          AND io.is_delete = 0
+          AND io.order_status > 0
+          AND suji.system_code = #{systemCode}
+          AND io.real_quote_user_id = #{realQuoteUserId}
+          AND io.create_time &gt;= CONCAT(#{activityStartTime},' 00:00:00')
+          AND io.create_time &lt;= CONCAT(#{activityEndTime},' 23:59:59')
+    </select>
+    <select id="countOrderNum" resultType="Integer">
+        SELECT COUNT(DISTINCT io.id)
+        FROM ins_orders io
+        INNER JOIN sys_user su ON su.mobile = io.real_quote_user_id
+        INNER JOIN sys_user_jzg_info suji ON suji.user_id = su.id
+        WHERE io.parent_id != 0
+        AND io.is_delete = 0
+        AND io.order_status = 5
+        AND suji.system_code = #{systemCode}
+        AND io.real_quote_user_id = #{realQuoteUserId}
+        AND io.create_time &gt;= CONCAT(#{activityStartTime},' 00:00:00')
+        AND io.create_time &lt;= CONCAT(#{activityEndTime},' 23:59:59')
+    </select>
+    <select id="selectByRule" resultType="com.jzg.commons.entity.po.SysUserActivityCompleteInRule">
+        SELECT *
+        FROM sys_user_activity_complete_in_rule
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND activity_id = #{activityId}
+          AND activity_type = #{activityType}
+          AND rule_complete_num = #{qutNum}
+          AND is_delete = 0
+            LIMIT 1
+    </select>
+
+    <select id="selectByRuleAndUserPhone" resultType="com.jzg.commons.entity.po.SysUserActivityCompleteInRule">
+        SELECT *
+        FROM sys_user_activity_complete_in_rule
+        WHERE
+          activity_id = #{activityId}
+          AND activity_type = #{activityType}
+          AND rule_complete_num = #{qutNum}
+          AND user_phone = #{userPhone}
+          AND is_delete = 0
+            LIMIT 1
+    </select>
+
+    <insert id="insertActivityCompleteInRule" parameterType="com.jzg.commons.entity.po.SysUserActivityCompleteInRule">
+        INSERT INTO sys_user_activity_complete_in_rule (
+            id,
+            tenant_id,
+            user_id,
+            activity_type,
+            activity_id,
+            local_activity_table_id,
+            rule_complete_num,
+            lottery_num,
+            lottery_max_num,
+            status,
+            receive_time,
+            create_time,
+            update_time,
+            create_by,
+            update_by,
+            is_delete
+        ) VALUES (
+             #{id},
+             #{tenantId},
+             #{userId},
+             #{activityType},
+             #{activityId},
+             #{localActivityTableId},
+             #{ruleCompleteNum},
+             #{lotteryNum},
+             #{lotteryMaxNum},
+             #{status},
+             #{receiveTime},
+             NOW(),
+             NOW(),
+             #{createBy},
+             #{updateBy},
+             0
+         )
+    </insert>
+    <select id="queryCustomerPhone" resultType="String">
+        SELECT ioci.mobile
+        FROM ins_orders io
+                 INNER JOIN ins_orders_car_user_info ioci ON io.id = ioci.order_no
+        WHERE io.ins_order_no = #{insOrderNo}
+          AND ioci.policy_person_type = 2
+          AND ioci.is_delete = 0
+            LIMIT 1
+    </select>
+    <select id="queryTotalFee" resultType="Double">
+        SELECT ifo.total_premium
+        FROM ins_orders io
+                 INNER JOIN ins_fee_orders ifo ON io.id = ifo.order_no
+        WHERE io.id = #{insOrderNo}
+          AND io.is_delete = 0
+            LIMIT 1
+    </select>
+
 </mapper>

+ 14 - 3
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/build/ZiJinAPIQuoteResultsVoBuild.java

@@ -65,7 +65,7 @@ public final class ZiJinAPIQuoteResultsVoBuild {
 //        List<ExpenseFactor> expenseFactors = buildExpenseFactor(calculatePremiumResponse.getPriceInfoList());
 //        quoteResultsVo.setExpenseFactors(expenseFactors);
         // 交强保费 车船税 商业保费
-        buildPremium(quoteResultsVo, calculatePremiumResponse.getPlanList());
+        buildPremium(quoteResultsVo, calculatePremiumResponse);
 
         CalculatePremiumResponse.BasePartDTO basePart = calculatePremiumResponse.getBasePart();
         if (null != basePart){
@@ -107,21 +107,32 @@ public final class ZiJinAPIQuoteResultsVoBuild {
         return kindInfoVo;
     }
 
-    private static void buildPremium(QuoteResultsVo quoteResultsVo, List<CalculatePremiumResponse.PlanListDTO> planList) {
+    private static void buildPremium(QuoteResultsVo quoteResultsVo, CalculatePremiumResponse response) {
+        List<CalculatePremiumResponse.PlanListDTO> planList = response.getPlanList();
         Map<String, String> planMap = planList
                 .stream()
                 .collect(Collectors.toMap(CalculatePremiumResponse.PlanListDTO::getRiskCode, CalculatePremiumResponse.PlanListDTO::getPlanFee));
         String ciPremiumStr = planMap.get(RiskCodeEnum.TRAFFIC_CODE);
         String biPremiumStr = planMap.get(RiskCodeEnum.BUSINESS_CODE);
+        // 计算驾意险总保费金额
+        BigDecimal niPremiumStr = new BigDecimal("0");
+        for (CalculatePremiumResponse.CarPolicySubInfoListDTO carPolicySubInfoListDTO : response.getCarPolicySubInfoList()) {
+            if (StrUtil.isNotBlank(carPolicySubInfoListDTO.getActualPremium())){
+                niPremiumStr = niPremiumStr.add(new BigDecimal(carPolicySubInfoListDTO.getActualPremium()));
+            }else if (StrUtil.isNotBlank(carPolicySubInfoListDTO.getSumPremium())){
+                niPremiumStr = niPremiumStr.add(new BigDecimal(carPolicySubInfoListDTO.getSumPremium()));
+            }
+        }
         String vvTaxStr = planMap.get(RiskCodeEnum.ACCIDENT_CODE);
         BigDecimal ciPremium = StringUtil.isNotEmpty(ciPremiumStr)? new BigDecimal(ciPremiumStr) : new BigDecimal(0);
         BigDecimal biPremium = StringUtil.isNotEmpty(biPremiumStr)? new BigDecimal(biPremiumStr) : new BigDecimal(0);
         BigDecimal vvTax = StringUtil.isNotEmpty(vvTaxStr)? new BigDecimal(vvTaxStr) : new BigDecimal(0);
         quoteResultsVo.getCosts().setCiPremium(ciPremiumStr);
         quoteResultsVo.getCosts().setBiPremium(biPremiumStr);
+        quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremiumStr));
         quoteResultsVo.getCosts().setVvTax(vvTaxStr);
         quoteResultsVo.getCosts().setSumPremium(String.valueOf(
-                ciPremium.add(biPremium).add(vvTax)
+                ciPremium.add(biPremium).add(vvTax).add(niPremiumStr)
         ));
     }
 

+ 4 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/entity/response/CalculatePremiumResponse.java

@@ -92,6 +92,10 @@ public class CalculatePremiumResponse extends BaseResponse implements Serializab
         private String isUseInsured;
         @JsonProperty("actualPremium")
         private String actualPremium;
+        @JsonProperty("sumPremium")
+        private String sumPremium;
+        @JsonProperty("sumAmount")
+        private String sumAmount;
         @JsonProperty("commi")
         private String commi;
         @JsonProperty("commi2")

+ 15 - 2
tenant/organization/src/main/java/com/jzg/organization/client/LotteryActivityClient.java

@@ -1,9 +1,13 @@
 package com.jzg.organization.client;
 
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.LotteryCounDTO;
 import com.jzg.commons.entity.vo.LotteryActivityVO;
+import com.jzg.commons.entity.vo.LotteryCountVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -11,7 +15,7 @@ import java.util.List;
 /**
  * 抽奖活动客户端
  */
-@FeignClient(name = "lottery-activity", url = "http://t5936d89.natappfree.cc/jeecg-boot/")
+@FeignClient(name = "lottery-activity", url = "http://m5cc629c.natappfree.cc/jeecg-boot/")
 public interface LotteryActivityClient {
 
     /**
@@ -20,6 +24,15 @@ public interface LotteryActivityClient {
      * @param scene 场景编码
      * @return 活动列表
      */
-    @GetMapping("/lotteryActivity/queryActivityRules")
+    @GetMapping("lottery/lotteryActivity/queryActivityList")
     HttpResult<List<LotteryActivityVO>> queryActivityRules(@RequestParam("scene") Integer scene);
+
+    /**
+     * 添加用户抽奖次数
+     *
+     * @param lotteryCounDTO
+     * @return
+     */
+    @PostMapping("/localUserLotteryCount/add")
+    HttpResult<LotteryCountVO> add(@RequestBody LotteryCounDTO lotteryCounDTO);
 }

+ 31 - 0
tenant/organization/src/main/java/com/jzg/organization/client/UnifiedUserCenterClient.java

@@ -0,0 +1,31 @@
+package com.jzg.organization.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.UnifiedUserCenterDTO;
+import com.jzg.commons.entity.vo.UnifiedUserClientVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 一账通客户端
+ */
+@FeignClient(name = "user-center", url = "https://test.baoxianzhanggui.com/lxl-api/usercenter")
+public interface UnifiedUserCenterClient {
+
+    /**
+     * 查询用户绑定
+     * @param unifiedUserCenterDTO
+     * @return
+     */
+    @PostMapping("/userApp/queryBind")
+    HttpResult<UnifiedUserClientVO> queryBind(@RequestBody UnifiedUserCenterDTO unifiedUserCenterDTO);
+
+    /**
+     * 添加用户绑定
+     * @param unifiedUserCenterDTO
+     * @return
+     */
+    @PostMapping("/userApp/bind")
+    HttpResult<UnifiedUserClientVO> bind(@RequestBody UnifiedUserCenterDTO unifiedUserCenterDTO);
+}

+ 4 - 5
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -2,8 +2,8 @@ package com.jzg.organization.controller;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.finance.dto.CompanySuperviseSettlementReportDto;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
 import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
 import com.jzg.commons.entity.finance.vo.*;
@@ -53,8 +53,7 @@ public class ReceivableController {
     @PostMapping("getUnauditedOrder")
     @Operation(summary = "获取未审核的订单")
     public HttpResult getUnauditedOrder(@RequestBody ReceivableQueryVo receivableQueryVo){
-        if (Objects.isNull(receivableQueryVo.getAgreementType()) || receivableQueryVo.getAgreementType().equals(""))
-        {
+        if (Objects.isNull(receivableQueryVo.getAgreementType()) || receivableQueryVo.getAgreementType().equals("")) {
             receivableQueryVo.setAgreementType("1");
         }
         InsPlyIncome auditedOrder  = receivableService.getUnauditedOrder(receivableQueryVo);
@@ -74,7 +73,7 @@ public class ReceivableController {
 
     @PostMapping("getCommissionReceivableList")
     @Operation(summary = "获取私有协议手续费列表")
-    public HttpResult getCommissionReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
+    public HttpResult<Page<InsPlyIncome>> getCommissionReceivableList(@RequestBody ReceivableQueryVo receivableQueryVo){
         receivableQueryVo.setQueryType("2");
         receivableQueryVo.setAgreementType("2");
         return HttpResult.ok(receivableService.getReceivablePage(receivableQueryVo));
@@ -349,7 +348,7 @@ public class ReceivableController {
 
     @PostMapping("companySuperviseSettlementReport")
     @Operation(summary = "保险公司结算报表")
-    public HttpResult companySuperviseSettlementReport(@RequestBody SettlementReportQueryVo settlementReportQueryVo) {
+    public HttpResult<List<CompanySuperviseSettlementReportDto>> companySuperviseSettlementReport(@RequestBody SettlementReportQueryVo settlementReportQueryVo) {
         return HttpResult.ok(receivableService.companySuperviseSettlementReport(settlementReportQueryVo));
     }
 

+ 10 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/SignInController.java

@@ -2,6 +2,7 @@ package com.jzg.organization.controller;
 
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import com.jzg.organization.entity.dto.SignInDTO;
 import com.jzg.organization.entity.vo.SignInRecordVO;
 import com.jzg.organization.entity.vo.SignInStatisticsVO;
@@ -44,6 +45,15 @@ public class SignInController extends BaseController {
         return signInService.signIn(dto);
     }
 
+    /**
+     * 更新签到规则同步状态 为已同步
+     */
+    @PostMapping("/updateSignCompleteRuleIn")
+    @Operation(summary = "用户签到", description = "更新签到规则同步状态 为已同步")
+    public HttpResult updateSignCompleteRuleIn(@RequestBody SysUserActivityCompleteInRule dto) {
+        return signInService.updateSignCompleteRuleIn(dto);
+    }
+
     /**
      * 查询签到统计信息
      */

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -42,7 +42,7 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
     /**
      * 获取车险应收列表
      * @param receivableQueryVo
-     * @return
+     * @return Page<InsPlyIncome>
      */
     Page<InsPlyIncome> getReceivablePage(Page page,@Param("receivableQueryVo") ReceivableQueryVo receivableQueryVo);
 

+ 8 - 6
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserSignInRuleMapper.java → tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserActivityCompleteInRuleMapper.java

@@ -1,7 +1,7 @@
 package com.jzg.organization.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.jzg.commons.entity.po.SysUserSignInRule;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -9,20 +9,22 @@ import java.util.List;
 /**
  * 用户签到规则完成记录Mapper
  */
-public interface SysUserSignInRuleMapper extends BaseMapper<SysUserSignInRule> {
+public interface SysUserActivityCompleteInRuleMapper extends BaseMapper<SysUserActivityCompleteInRule> {
 
     /**
      * 查询用户已完成的规则
      */
-    List<SysUserSignInRule> selectCompletedRules(@Param("tenantId") String tenantId,
+    List<SysUserActivityCompleteInRule> selectCompletedRules(@Param("tenantId") String tenantId,
                                                  @Param("userId") String userId,
-                                                 @Param("activityId") String activityId);
+                                                 @Param("activityId") String activityId,
+                                                             @Param("activityType") Integer activityType);
 
     /**
      * 查询特定规则的完成状态
      */
-    SysUserSignInRule selectByRule(@Param("tenantId") String tenantId,
+    SysUserActivityCompleteInRule selectByRule(@Param("tenantId") String tenantId,
                                    @Param("userId") String userId,
                                    @Param("activityId") String activityId,
-                                   @Param("ruleSignNum") String ruleSignNum);
+                                   @Param("ruleSignNum") String ruleSignNum,
+                                               @Param("activityType") Integer activityType);
 }

+ 29 - 3
tenant/organization/src/main/java/com/jzg/organization/service/LotteryActivityService.java

@@ -1,10 +1,11 @@
 package com.jzg.organization.service;
 
 import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.vo.LotteryActivityVO;
-import com.jzg.commons.entity.vo.LocalActivityTableVO;
-import com.jzg.commons.entity.vo.SignRuleVO;
+import com.jzg.commons.entity.dto.LotteryCounDTO;
+import com.jzg.commons.entity.dto.UnifiedUserCenterDTO;
+import com.jzg.commons.entity.vo.*;
 import com.jzg.organization.client.LotteryActivityClient;
+import com.jzg.organization.client.UnifiedUserCenterClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -22,9 +23,26 @@ import java.util.stream.Collectors;
 @Service
 public class LotteryActivityService {
 
+    @Autowired
+    private UnifiedUserCenterClient unifiedUserCenterClient;
+
     @Autowired
     private LotteryActivityClient lotteryActivityClient;
 
+    /**
+     * 查询用户绑定关系
+     */
+    public HttpResult<UnifiedUserClientVO> queryBind(UnifiedUserCenterDTO unifiedUserCenterDTO) {
+        return unifiedUserCenterClient.queryBind(unifiedUserCenterDTO);
+    }
+
+    /**
+     * 绑定用户
+     */
+    public HttpResult<UnifiedUserClientVO> bind(UnifiedUserCenterDTO unifiedUserCenterDTO) {
+        return unifiedUserCenterClient.bind(unifiedUserCenterDTO);
+    }
+
     /**
      * 根据场景查询活动列表
      */
@@ -37,6 +55,14 @@ public class LotteryActivityService {
         return result.getData();
     }
 
+    public HttpResult<LotteryCountVO> addLotteryCount(LotteryCounDTO lotteryCounDTO) {
+        HttpResult<LotteryCountVO> add = lotteryActivityClient.add(lotteryCounDTO);
+        if (add == null || add.getCode() != 200 || add.getData() == null) {
+            return HttpResult.error("添加抽奖次数失败");
+        }
+        return add;
+    }
+
     /**
      * 查询签到规则(type=7)
      */

+ 9 - 2
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -47,9 +47,10 @@ public interface ReceivableService extends IService<InsPlyIncome> {
     List<EsmInsCompany> getReceivableCompany(InvoicingVo invoicingVo);
 
     /**
-     * 获取手续费应收列表
+     * 获取私有协议手续费列表
+     *
      * @param receivableQueryVo
-     * @return
+     * @return Page<InsPlyIncome>
      */
     Page<InsPlyIncome> getReceivablePage(ReceivableQueryVo receivableQueryVo);
 
@@ -265,6 +266,12 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      */
     void exportOtherSettlementDetailJyExcel(Page page,SettlementQueryVo settlementQueryVo) throws IOException;
 
+    /**
+     * 查询保险公司结算报表
+     *
+     * @author lipf
+     * @date 2026/4/30 14:48
+     */
     List<CompanySuperviseSettlementReportDto> companySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo);
 
     Page<ReceiverSettlementReportDto> receiverSettlementReport(Page page,SettlementReportQueryVo settlementReportQueryVo);

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SignInService.java

@@ -1,6 +1,7 @@
 package com.jzg.organization.service;
 
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import com.jzg.organization.entity.dto.SignInDTO;
 import com.jzg.organization.entity.vo.SignInStatisticsVO;
 import com.jzg.organization.entity.vo.SignInVO;
@@ -39,4 +40,12 @@ public interface SignInService {
      * @return 记录列表
      */
     HttpResult<List<SignInRecordVO>> getRecords(String tenantId, String userId, Integer days);
+
+    /**
+     * 更新签到规则同步状态 为已同步
+     *
+     * @param dto 修改参数
+     * @return 修改结果
+     */
+    HttpResult updateSignCompleteRuleIn(SysUserActivityCompleteInRule dto);
 }

+ 16 - 4
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -162,6 +162,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return baseMapper.getReceivableCompany(invoicingVo);
     }
 
+    /**
+     * 获取私有协议手续费列表
+     *
+     * @param receivableQueryVo
+     * @return Page<InsPlyIncome>
+     */
     @Override
     public Page<InsPlyIncome> getReceivablePage(ReceivableQueryVo receivableQueryVo) {
         log.info("获取私有协议手续费列表。receivableQueryVo=[{}]", JSONUtil.toJsonStr(receivableQueryVo));
@@ -333,11 +339,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             AssertionUtils.isFail(Objects.isNull(insPlyIncomeInvoice), "发票数据不存在");
 
             // 实际已经收的了金额
-            BigDecimal ctualReceivedAmount = getInvoicingAmount(settlementVo.getInvoicingId());
+            BigDecimal ctualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
 
             // 剩余的金额
             BigDecimal surplusPremium = insPlyIncomeInvoice.getReceivableSupervisePremium().subtract(ctualReceivedAmount);
-
+            log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",settlementVo.getInvoicingId(), insPlyIncomeInvoice.getReceivableSupervisePremium(),ctualReceivedAmount.toString(),settlementVo.getActualReceivedAmount());
             // 校验是否超出了剩余的金额
             AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
 
@@ -371,11 +377,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                         .forEach(item -> {
                             incomeIds.add(item.getIncomeId());
                         });
-
                 // 判断是需要更新哪个字段
                 this.updateIncomeSettlementStatus(insPlyIncomeInvoice.getInvoiceType(), incomeIds);
+            }else{
+                log.info("invoiceId=[{}], 还剩[{}]钱没有结算",settlementVo.getInvoicingId(), surplusPremium.subtract(settlementVo.getActualReceivedAmount()));
             }
-
             return true;
         } catch (Exception e) {
             log.error("结算异常. settlementVo=[{}]",JSONUtil.toJsonStr(settlementVo), e);
@@ -1087,6 +1093,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Page<ExportSuperviseSettlementDetailExcelDto> superviseSettlementDetailExcel(Page page, SettlementQueryVo settlementQueryVo) {
+        log.info("superviseSettlementDetailExcel:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
         Page<ExportSuperviseSettlementDetailExcelDto> exportSuperviseSettlementDetailExcelDtos = baseMapper.getSuperviseSettlementDetailExcelDtos(page, settlementQueryVo);
         exportSuperviseSettlementDetailExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -1304,6 +1311,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ExportOtherSettlementDetailJyExcelDto.class, list, "非车险跟单费结算明细");
     }
 
+    /**
+     * 查询保险公司结算报表
+     *
+     * @date 2026/4/30 14:48
+     */
     @Override
     public List<CompanySuperviseSettlementReportDto> companySuperviseSettlementReport(SettlementReportQueryVo settlementReportQueryVo) {
         log.info("私有协议查询结算报表:settlementReportQueryVo=[{}]", JSONUtil.toJsonStr(settlementReportQueryVo));

+ 116 - 30
tenant/organization/src/main/java/com/jzg/organization/service/impl/SignInServiceImpl.java

@@ -2,22 +2,25 @@ package com.jzg.organization.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.LotteryCounDTO;
+import com.jzg.commons.entity.dto.UnifiedUserCenterDTO;
+import com.jzg.commons.entity.enums.YesNoEnum;
+import com.jzg.commons.entity.po.SysUser;
+import com.jzg.commons.entity.po.SysUserActivityCompleteInRule;
 import com.jzg.commons.entity.po.SysUserSignIn;
-import com.jzg.commons.entity.po.SysUserSignInRule;
-import com.jzg.commons.entity.vo.LotteryActivityVO;
-import com.jzg.commons.entity.vo.LocalActivityTableVO;
-import com.jzg.commons.entity.vo.SignRuleVO;
+import com.jzg.commons.entity.vo.*;
 import com.jzg.organization.entity.dto.SignInDTO;
-import com.jzg.organization.entity.vo.SignInRecordVO;
-import com.jzg.organization.entity.vo.SignInStatisticsVO;
-import com.jzg.organization.entity.vo.SignInVO;
+import com.jzg.organization.entity.vo.*;
 import com.jzg.organization.mapper.SysUserSignInMapper;
-import com.jzg.organization.mapper.SysUserSignInRuleMapper;
+import com.jzg.organization.mapper.SysUserActivityCompleteInRuleMapper;
 import com.jzg.organization.service.LotteryActivityService;
 import com.jzg.organization.service.SignInService;
+import com.jzg.organization.service.SysUserService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -28,10 +31,7 @@ import jakarta.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,7 +45,7 @@ public class SignInServiceImpl implements SignInService {
     private SysUserSignInMapper signInMapper;
 
     @Autowired
-    private SysUserSignInRuleMapper signInRuleMapper;
+    private SysUserActivityCompleteInRuleMapper sysUserActivityCompleteInRuleMapper;
 
     @Autowired
     private LotteryActivityService lotteryActivityService;
@@ -56,6 +56,33 @@ public class SignInServiceImpl implements SignInService {
     @Value("${lottery.activity.scene:3}")
     private Integer lotteryScene;
 
+    //本地生活在一账通的固定平台ID
+    private static final String CLIENT_ID = "bdsh-X9yZ1wV3uT5sR7qP9o";
+
+    private static final Integer ACTIVITY_TYPE = 7;
+    @Autowired
+    private SysUserService sysUserService;
+
+    /**
+     * 更新签到规则同步状态 为已同步
+     *
+     * @param dto 修改参数
+     * @return 修改结果
+     */
+    @Override
+    public HttpResult updateSignCompleteRuleIn(SysUserActivityCompleteInRule dto){
+        log.info("修改签到规则同步状态:dto=[{}]", JSONUtil.toJsonStr(dto));
+        UpdateWrapper<SysUserActivityCompleteInRule> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq(StrUtil.isNotBlank(dto.getTenantId()), "tenant_id", dto.getTenantId());
+        updateWrapper.eq(StrUtil.isNotBlank(dto.getUserId()), "user_id", dto.getUserId());
+        updateWrapper.eq(StrUtil.isNotBlank(dto.getActivityId()), "activity_id", dto.getActivityId());
+        updateWrapper.eq(StrUtil.isNotBlank(dto.getLocalActivityTableId()), "local_activity_table_id", dto.getLocalActivityTableId());
+        updateWrapper.eq("status", YesNoEnum.NO.getCode());
+        updateWrapper.set("status", YesNoEnum.YES.getCode());
+        sysUserActivityCompleteInRuleMapper.update(updateWrapper);
+        return HttpResult.ok("更新成功");
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult<SignInVO> signIn(SignInDTO dto) {
@@ -120,9 +147,14 @@ public class SignInServiceImpl implements SignInService {
      */
     private List<SignRuleVO> checkAndTriggerSignRules(String tenantId, String userId, Integer continuousDays) {
         List<SignRuleVO> triggeredRules = new ArrayList<>();
-
+        SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, userId));
         // 获取当前有效的活动
-        List<LotteryActivityVO> activities = lotteryActivityService.getActivitiesByScene(lotteryScene);
+        List<LotteryActivityVO> activities = null;
+        try {
+            activities = lotteryActivityService.getActivitiesByScene(lotteryScene);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
 
         for (LotteryActivityVO activity : activities) {
             // 检查活动是否有效
@@ -135,10 +167,10 @@ public class SignInServiceImpl implements SignInService {
             }
 
             // 获取用户已完成的规则
-            List<SysUserSignInRule> completedRules = signInRuleMapper.selectCompletedRules(
-                    tenantId, userId, activity.getId());
+            List<SysUserActivityCompleteInRule> completedRules = sysUserActivityCompleteInRuleMapper.selectCompletedRules(
+                    tenantId, userId, activity.getId(), ACTIVITY_TYPE);
             Set<String> completedSignNums = completedRules.stream()
-                    .map(SysUserSignInRule::getRuleSignNum)
+                    .map(SysUserActivityCompleteInRule::getRuleCompleteNum)
                     .collect(Collectors.toSet());
 
             // 遍历所有本地活动表
@@ -148,6 +180,11 @@ public class SignInServiceImpl implements SignInService {
                     continue;
                 }
 
+                // 只处理本租户的签到规则
+                if (!tenantId.equals(table.getTenantId())) {
+                    continue;
+                }
+
                 // 检查每个签到规则
                 for (SignRuleVO rule : table.getSignRules()) {
                     if (StrUtil.isBlank(rule.getSignNum())) {
@@ -160,10 +197,48 @@ public class SignInServiceImpl implements SignInService {
                     if (continuousDays >= requiredDays
                             && !completedSignNums.contains(rule.getSignNum())) {
 
-                        // 记录规则完成
-                        completeSignRule(tenantId, userId, activity.getId(),
-                                table.getId(), rule);
-
+                        // 首先查业务员是否在一账通绑定过本地生活  【没绑定过 本地存已匹配的签到记录 标记未同步
+                        UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                        unifiedUserCenterDTO.setTenantId(tenantId);
+                        unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                        unifiedUserCenterDTO.setUserId(userId);
+                        unifiedUserCenterDTO.setUserPhone(sysUser.getMobile());
+                        HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                        try {
+                            unifiedUserClientVOHttpResult = lotteryActivityService.queryBind(unifiedUserCenterDTO);
+                        } catch (Exception e) {
+                            log.error("签到抽奖,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", userId, CLIENT_ID, tenantId);
+                            log.error("签到抽奖,查询用户绑定一账通接口异常", e);
+                        }
+                        if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                            // 本地保存
+                            // 记录规则完成  标记未同步  本地生活那边绑定完晋掌柜后主动更新同步状态,提供接口给本地生活
+                            completeSignRule(tenantId, userId, activity.getId(),
+                                    table.getId(), rule, YesNoEnum.NO.getCode(), ACTIVITY_TYPE);
+                        } else {
+                            Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                    .stream()
+                                    .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                            // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                            if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                lotteryCounDTO.setAppUserId(getUserId(userClientGroupMap.get(CLIENT_ID), CLIENT_ID));
+                                lotteryCounDTO.setActivityId(activity.getId());
+                                lotteryCounDTO.setCount(Integer.parseInt(rule.getSignLotteryNum()));
+                                HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                try {
+                                    lotteryCountVOHttpResult = lotteryActivityService.addLotteryCount(lotteryCounDTO);
+                                } catch (Exception e) {
+                                    log.error("签到抽奖,远程调抽奖次数增加接口异常,userId:{},clientId:{},tenantId:{}", userId, CLIENT_ID, tenantId);
+                                    log.error("签到抽奖,远程调抽奖次数增加接口异常", e);
+                                }
+                                if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                    // 记录规则完成  标记已同步
+                                    completeSignRule(tenantId, userId, activity.getId(),
+                                            table.getId(), rule, YesNoEnum.YES.getCode(), ACTIVITY_TYPE);
+                                }
+                            }
+                        }
                         triggeredRules.add(rule);
                     }
                 }
@@ -173,31 +248,42 @@ public class SignInServiceImpl implements SignInService {
         return triggeredRules;
     }
 
+    private String getUserId(List<UnifiedUserClientVO> unifiedUserClientVOS, String clientId) {
+        return unifiedUserClientVOS.stream()
+                .filter(u -> u.getClientId().equals(clientId))
+                .map(UnifiedUserClientVO::getUserId)
+                .findFirst()
+                .orElse(null);
+    }
+
     /**
      * 记录规则完成
      */
     private void completeSignRule(String tenantId, String userId, String activityId,
-                                    String tableId, SignRuleVO rule) {
+                                    String tableId, SignRuleVO rule, Integer status, Integer activityType) {
         // 先查询是否已存在记录(防重入)
-        SysUserSignInRule exist = signInRuleMapper.selectByRule(
-                tenantId, userId, activityId, rule.getSignNum());
+        SysUserActivityCompleteInRule exist = sysUserActivityCompleteInRuleMapper.selectByRule(
+                tenantId, userId, activityId, rule.getSignNum(), activityType);
 
         if (exist != null) {
             return;
         }
 
-        SysUserSignInRule record = new SysUserSignInRule();
+        SysUserActivityCompleteInRule record = new SysUserActivityCompleteInRule();
         record.setTenantId(tenantId);
         record.setUserId(userId);
+        record.setActivityType(activityType);
         record.setActivityId(activityId);
         record.setLocalActivityTableId(tableId);
-        record.setRuleSignNum(rule.getSignNum());
+        //签到天数
+        record.setRuleCompleteNum(rule.getSignNum());
+        //抽奖次数
         record.setLotteryNum(StrUtil.isNotBlank(rule.getSignLotteryNum())
                 ? Integer.parseInt(rule.getSignLotteryNum()) : 0);
-        record.setStatus(1);
+        record.setStatus(status);
         record.setReceiveTime(LocalDateTime.now());
 
-        signInRuleMapper.insert(record);
+        sysUserActivityCompleteInRuleMapper.insert(record);
 
         log.info("签到规则完成,tenantId={}, userId={}, activityId={}, ruleSignNum={}, lotteryNum={}",
                 tenantId, userId, activityId, rule.getSignNum(), record.getLotteryNum());

+ 39 - 12
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java

@@ -1,20 +1,20 @@
 package com.jzg.organization.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.dto.SysUserJzgInfoDto;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.dto.SysDeptParam;
-import com.jzg.commons.entity.vo.ChangeDeptVo;
-import com.jzg.commons.entity.vo.DeptLeaderVo;
-import com.jzg.commons.entity.vo.SysUserVo;
+import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.util.idgen.IdGenerate;
-import com.jzg.commons.entity.vo.SysDeptVo;
 import com.jzg.organization.mapper.SysDeptMapper;
 import com.jzg.organization.service.*;
 import org.slf4j.Logger;
@@ -147,7 +147,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
     @Override
     @Transactional
-    public HttpResult deleteDept(SysDeptVo sysDeptVo) {
+    public HttpResult<String> deleteDept(SysDeptVo sysDeptVo) {
         SysDept sysDept = getById(sysDeptVo.getId());
         if (sysDept == null) {
             throw new SystemException("机构不存在");
@@ -159,7 +159,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         SysUserVo vo = new SysUserVo();
         vo.setDeptId(sysDept.getId());
         List<SysUserVo> userInfo = userService.getUserInfo(vo);
-        if (userInfo.stream().count() > 0) {
+        if ((long) userInfo.size() > 0) {
             throw new SystemException(sysDept.getName() + "机构下还有其他用户请将这些用户删除后,再进行删除");
         }
         sysDeptMapper.deleteById(sysDeptVo.getId());
@@ -168,7 +168,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
     @Override
     @Transactional
-    public HttpResult batchDeleteDept(SysDeptVo sysDeptVo) {
+    public HttpResult<String> batchDeleteDept(SysDeptVo sysDeptVo) {
         sysDeptVo.getDeptIds().forEach(id->{
             SysDeptVo vo = new SysDeptVo();
             vo.setId(id);
@@ -179,6 +179,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
     @Override
     public List<SysDeptVo> getDeptTree(String deptId, SysDeptParam param) {
+        log.info("查询部门信息:deptTid=[{}],param=[{}]",deptId, JSONUtil.toJsonStr(param));
         deptId = Objects.toString(deptId, "");
 
         String userSystemCode = Optional.ofNullable(param.getSysCode())
@@ -189,9 +190,15 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         SysSystem bySysCode = sysSystemService.getBySysCode(userSystemCode);
         SysDept sysDept = getById(deptId);
 
+        List<String> deptTids = this.obatinDeptTids(param.getUserInfo());
         List<SysDeptVo> voDept = baseMapper.selectDeptVoList(deptId, userSystemCode, param.getName())
                 .stream()
-                .map(item -> {
+                .filter(action->{
+                    if(CollUtil.isEmpty(deptTids)){
+                        return true;
+                    }
+                    return deptTids.contains(action.getId());
+                }).map(item -> {
                     SysDeptVo sysDeptVo = new SysDeptVo(item);
 
                     // 获取区域信息
@@ -212,7 +219,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
                     return sysDeptVo;
                 })
-                .collect(Collectors.toList());
+                .toList();
 
         // 按父ID分组
         Map<String, List<SysDeptVo>> deptMap = voDept.stream()
@@ -231,6 +238,28 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         return sysDeptVos;
     }
 
+    /**
+     * 根据用户信息查询用户关联的机构的序号
+     *
+     * @author lipf
+     * @date 2026/5/6 15:48
+     */
+    private List<String> obatinDeptTids(String userInfo) {
+        List<String> deptTids = new ArrayList<>();
+        if(StringUtils.isNotEmpty(userInfo)){
+            Page page = new Page();
+            SysUserInfoListVo sysUserInfoListVo =  new SysUserInfoListVo();
+            sysUserInfoListVo.setIsMember("1");
+            sysUserInfoListVo.setSalesman(userInfo);
+            Page<SysUserJzgInfoDto> userInfoList = userService.getUserInfoList(page, sysUserInfoListVo);
+            List<SysUserJzgInfoDto> records = userInfoList.getRecords();
+            if(CollUtil.isNotEmpty(records)){
+                deptTids = records.stream().map(SysUserJzgInfoDto::getDeptId).toList();
+                log.info("查询出的用户信息所在部门:[{}]", JSONUtil.toJsonStr(deptTids));
+            }
+        }
+        return deptTids;
+    }
 
 
     @Override
@@ -241,9 +270,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
         if(Objects.isNull(user)){
             throw new SystemException("用户不存在");
         }
-        depts.forEach(item->{
-            item.setLeaderId(deptLeaderVo.getLeaderId());
-        });
+        depts.forEach(item-> item.setLeaderId(deptLeaderVo.getLeaderId()));
         return this.updateBatchById(depts);
     }
 

+ 3 - 14
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -248,8 +248,7 @@
             LEFT JOIN ins_orders_risk ior1 ON ipi.order_no = ior1.order_no and ior1.risk_code = '0507'
             LEFT JOIN ins_orders_risk ior2 ON ipi.order_no = ior2.order_no and ior2.risk_code = '0510'
             LEFT JOIN ins_orders_policy iop ON ipi.order_no = iop.order_no
-        WHERE
-            1=1
+        WHERE 1=1
         AND NOT EXISTS ( SELECT 1 FROM ins_ply_income_invoice_link ipil WHERE ipil.income_id = ipi.id )
         <if test = "receivableQueryVo.agreementType != null and receivableQueryVo.agreementType == 1">
             AND ipi.agreement_type = #{receivableQueryVo.agreementType}
@@ -304,40 +303,30 @@
         <if test="receivableQueryVo.insuredName != null and receivableQueryVo.insuredName != ''">
             AND iocui.name = #{receivableQueryVo.insuredName}
         </if>
-
         <if test="receivableQueryVo.orderType != null and receivableQueryVo.orderType != ''">
             AND io.entry_status = #{receivableQueryVo.orderType}
         </if>
-
         <if test="receivableQueryVo.productName != null and receivableQueryVo.productName != ''">
             AND io.product_name = #{receivableQueryVo.productName}
         </if>
-
         <if test="receivableQueryVo.jqPolicyNo != null and receivableQueryVo.jqPolicyNo != ''">
             AND iop.jq_policy_no = #{receivableQueryVo.jqPolicyNo}
         </if>
-
         <if test="receivableQueryVo.syPolicyNo != null and receivableQueryVo.syPolicyNo != ''">
             AND iop.sy_policy_no = #{receivableQueryVo.syPolicyNo}
         </if>
-
         <if test="receivableQueryVo.jyPolicyNo != null and receivableQueryVo.jyPolicyNo != ''">
             AND iop.jy_policy_no = #{receivableQueryVo.jyPolicyNo}
         </if>
-
         <if test="receivableQueryVo.dockingPerson != null and receivableQueryVo.dockingPerson != ''">
             AND io.docking_person = #{receivableQueryVo.dockingPerson}
         </if>
-
         <if test="receivableQueryVo.jqStartDate != null and receivableQueryVo.jqStartDate != ''">
             AND ior1.start_date between #{receivableQueryVo.jqStartDate} and  #{receivableQueryVo.jqEndDate}
         </if>
-
         <if test="receivableQueryVo.syStartDate != null and receivableQueryVo.syStartDate != ''">
             AND ior2.start_date between #{receivableQueryVo.syStartDate} and  #{receivableQueryVo.syStartDate}
         </if>
-
-
     </select>
 
 
@@ -581,7 +570,7 @@
         ipiis.create_time as settlementTime -- 结算时间
         FROM
         ins_ply_income_invoice ipii
-        LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipiis.invoice_id = ipiis.id
+        LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipiis.invoice_id = ipii.id
         LEFT JOIN ins_ply_income_invoice_link ipil ON ipil.invoice_id = ipiis.invoice_id
         LEFT JOIN ins_ply_income ipi ON ipi.id = ipil.income_id
         LEFT JOIN ins_orders io ON ipi.order_no = io.id
@@ -615,7 +604,7 @@
             AND ipiis.create_time between #{settlementQueryVo.signingTimeStart} and #{settlementQueryVo.signingTimeEnd}
         </if>
         <if test="settlementQueryVo.agreementType != null and settlementQueryVo.agreementType != ''">
-            AND ipii.agreement_type = #{settlementQueryVo.agreementType}
+            AND ipi.agreement_type = #{settlementQueryVo.agreementType}
         </if>
     </select>
 

+ 6 - 4
tenant/organization/src/main/resources/mapper/SysUserSignInRuleMapper.xml → tenant/organization/src/main/resources/mapper/SysUserActivityCompleteInRuleMapper.xml

@@ -1,22 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.jzg.organization.mapper.SysUserSignInRuleMapper">
+<mapper namespace="com.jzg.organization.mapper.SysUserActivityCompleteInRuleMapper">
 
-    <select id="selectCompletedRules" resultType="com.jzg.commons.entity.po.SysUserSignInRule">
+    <select id="selectCompletedRules" resultType="com.jzg.commons.entity.po.SysUserActivityCompleteInRule">
         SELECT * FROM sys_user_sign_in_rule
         WHERE tenant_id = #{tenantId}
           AND user_id = #{userId}
           AND activity_id = #{activityId}
+          AND activity_type = #{activityType}
           AND status = 1
           AND is_delete = 0
     </select>
 
-    <select id="selectByRule" resultType="com.jzg.commons.entity.po.SysUserSignInRule">
+    <select id="selectByRule" resultType="com.jzg.commons.entity.po.SysUserActivityCompleteInRule">
         SELECT * FROM sys_user_sign_in_rule
         WHERE tenant_id = #{tenantId}
           AND user_id = #{userId}
           AND activity_id = #{activityId}
-          AND rule_sign_num = #{ruleSignNum}
+          AND activity_type = #{activityType}
+          AND rule_complete_num = #{ruleSignNum}
           AND is_delete = 0
         LIMIT 1
     </select>

+ 22 - 9
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -62,19 +62,19 @@
         suji.user_id,
         suji.work_number,
         su.username,
-        su.mobile,
+        su.mobile ,
         suji.name,
         suji.dept_id,
-        sd.name as dept_name,
+        sd.name AS dept_name,
         suji.status,
         suji.is_enable,
-        lsu.user_id as leader_id,
         lsu.name AS leader_name,
-        suji.referrer_id,
-        su.username as referrer_name,
-        -- soul.organization_id as organization_id,
-        suji.create_time as createTime,
-        suji.create_by as createBy
+        ( select  aa.mobile from sys_user aa
+        where aa.id = lsu.user_id ) AS leader_id,
+        suji.name AS referrer_name,
+        su.username as referrer_id,
+        suji.create_time AS createTime,
+        suji.create_by AS createBy
         from
         sys_user_jzg_info suji
         left join sys_user su on su.id = suji.user_id
@@ -389,7 +389,7 @@
             leader.`name` AS leaderIdName,
             sa.partner_review_time,
             pa.`name` partner_reviewer,
-            (SELECT GROUP_CONCAT(grade SEPARATOR ',' ) FROM partner_user p WHERE p.user_id = info.id) gradeList
+            pu.gradeList
         FROM
             sys_user_jzg_info info
                 LEFT JOIN sys_user u ON u.id = info.user_id
@@ -398,9 +398,22 @@
                 LEFT JOIN sys_user_jzg_info leader ON leader.id = info.leader_id
                 LEFT JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = info.id
                 LEFT JOIN sys_user_jzg_info pa ON pa.user_id = sa.partner_reviewer
+                LEFT JOIN (SELECT user_id, GROUP_CONCAT(grade SEPARATOR ',') AS gradeList FROM partner_user GROUP BY user_id ) pu ON pu.user_id = info.id
         WHERE
             sa.type_attr = 3
           AND sa.partner_status = #{partnerReviewParam.partnerStatus}
+        <if test="partnerReviewParam.name !='' and partnerReviewParam.name != null">
+            AND info.`name` like concat('%',#{partnerReviewParam.name},'%')
+        </if>
+        <if test="partnerReviewParam.leaderId !='' and partnerReviewParam.leaderId != null">
+            AND leader.`name` like concat('%',#{partnerReviewParam.leaderId},'%')
+        </if>
+        <if test="partnerReviewParam.deptId !='' and partnerReviewParam.deptId != null">
+            AND info.`dept_id` = #{partnerReviewParam.deptId}
+        </if>
+        <if test="partnerReviewParam.grade !='' and partnerReviewParam.grade != null">
+            AND FIND_IN_SET(#{partnerReviewParam.grade}, pu.gradeList)
+        </if>
     </select>
 
     <select id="isPartnerPresent" resultType="java.lang.Boolean">

Некоторые файлы не были показаны из-за большого количества измененных файлов