Ver Fonte

Merge remote-tracking branch 'origin/master'

liub há 4 meses atrás
pai
commit
8b80b5eec0
28 ficheiros alterados com 1238 adições e 14 exclusões
  1. 6 0
      commons/pom.xml
  2. 44 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserSignIn.java
  3. 49 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserSignInRule.java
  4. 67 0
      commons/src/main/java/com/jzg/commons/entity/vo/LocalActivityTableVO.java
  5. 54 0
      commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityAwardVO.java
  6. 71 0
      commons/src/main/java/com/jzg/commons/entity/vo/LotteryActivityVO.java
  7. 20 0
      commons/src/main/java/com/jzg/commons/entity/vo/OrderRuleVO.java
  8. 20 0
      commons/src/main/java/com/jzg/commons/entity/vo/SignRuleVO.java
  9. 24 0
      commons/src/main/java/com/jzg/commons/entity/vo/UnderwritingRuleVO.java
  10. 1 1
      consoleStatistics/src/main/resources/application-dev.yml
  11. 4 3
      partner/src/main/resources/application-dev.yml
  12. 3 3
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java
  13. BIN
      tenant/insurance/quotation-bohai/中介车险业务接口文档-v1.1.2.doc
  14. 2 7
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  15. 17 0
      tenant/insurance/quotation-summary/src/test/resources/application-local.yaml
  16. 25 0
      tenant/organization/src/main/java/com/jzg/organization/client/LotteryActivityClient.java
  17. 86 0
      tenant/organization/src/main/java/com/jzg/organization/controller/SignInController.java
  18. 20 0
      tenant/organization/src/main/java/com/jzg/organization/entity/dto/SignInDTO.java
  19. 28 0
      tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInRecordVO.java
  20. 34 0
      tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInStatisticsVO.java
  21. 39 0
      tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInVO.java
  22. 41 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserSignInMapper.java
  23. 28 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserSignInRuleMapper.java
  24. 86 0
      tenant/organization/src/main/java/com/jzg/organization/service/LotteryActivityService.java
  25. 42 0
      tenant/organization/src/main/java/com/jzg/organization/service/SignInService.java
  26. 365 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SignInServiceImpl.java
  27. 38 0
      tenant/organization/src/main/resources/mapper/SysUserSignInMapper.xml
  28. 24 0
      tenant/organization/src/main/resources/mapper/SysUserSignInRuleMapper.xml

+ 6 - 0
commons/pom.xml

@@ -146,6 +146,12 @@
                 <configuration>
                     <source>14</source>
                     <target>14</target>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </path>
+                    </annotationProcessorPaths>
                 </configuration>
             </plugin>
         </plugins>

+ 44 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserSignIn.java

@@ -0,0 +1,44 @@
+package com.jzg.commons.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 用户签到记录表
+ * 支持多租户
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user_sign_in")
+public class SysUserSignIn extends BaseModel {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    @Schema(description = "租户ID")
+    private String tenantId;
+
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @Schema(description = "签到日期")
+    private LocalDate signInDate;
+
+    @Schema(description = "连续签到天数(截至当天)")
+    private Integer continuousDays;
+
+    @Schema(description = "签到时间")
+    private LocalDateTime signInTime;
+
+    @Schema(description = "备注")
+    private String remark;
+}

+ 49 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserSignInRule.java

@@ -0,0 +1,49 @@
+package com.jzg.commons.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.core.base.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户签到规则完成记录表
+ * 记录用户在某个活动期间完成了哪些签到规则,每个规则活动期间只能完成一次
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user_sign_in_rule")
+public class SysUserSignInRule extends BaseModel {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    @Schema(description = "租户ID")
+    private String tenantId;
+
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @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 Integer lotteryNum;
+
+    @Schema(description = "领取状态 0-未领取 1-已领取")
+    private Integer status;
+
+    @Schema(description = "领取时间")
+    private LocalDateTime receiveTime;
+}

+ 67 - 0
commons/src/main/java/com/jzg/commons/entity/vo/LocalActivityTableVO.java

@@ -0,0 +1,67 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 本地活动表
+ */
+@Data
+public class LocalActivityTableVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @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;
+
+    @Schema(description = "用户等级ID")
+    private String userLevelId;
+
+    @Schema(description = "奖品类型")
+    private String awardType;
+
+    @Schema(description = "转盘ID")
+    private String turntableId;
+
+    @Schema(description = "类型 6-报价 7-签到 8-出单")
+    private String type;
+
+    @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;
+}

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

@@ -0,0 +1,54 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 抽奖活动奖品
+ */
+@Data
+public class LotteryActivityAwardVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "奖品ID")
+    private String id;
+
+    @Schema(description = "活动ID")
+    private String activityId;
+
+    @Schema(description = "奖品类型 1-现金 2-积分 5-感谢参与 6-会员")
+    private Integer awardType;
+
+    @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;
+
+    @Schema(description = "付费会员ID")
+    private Long paidMemberId;
+
+    @Schema(description = "付费会员规则ID")
+    private Long paidMemberRulesId;
+}

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

@@ -0,0 +1,71 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 抽奖活动信息
+ */
+@Data
+public class LotteryActivityVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @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;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "奖品列表")
+    private List<LotteryActivityAwardVO> lotteryActivityAwards;
+
+    @Schema(description = "本地活动表")
+    private List<LocalActivityTableVO> localActivityTables;
+}

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

@@ -0,0 +1,20 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 出单规则
+ */
+@Data
+public class OrderRuleVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "出单数量")
+    private String ordNum;
+
+    @Schema(description = "获得抽奖次数")
+    private Integer ordLotteryNum;
+}

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

@@ -0,0 +1,20 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 签到规则
+ */
+@Data
+public class SignRuleVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "签到天数")
+    private String signNum;
+
+    @Schema(description = "获得抽奖次数")
+    private String signLotteryNum;
+}

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

@@ -0,0 +1,24 @@
+package com.jzg.commons.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 核保规则
+ */
+@Data
+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;
+}

+ 1 - 1
consoleStatistics/src/main/resources/application-dev.yml

@@ -1,7 +1,7 @@
 spring:
   cloud:
     nacos:
-      server-addr: localhost:8848
+      server-addr: 192.168.5.250:8848
       username: nacos
       password: nacos
       config:

+ 4 - 3
partner/src/main/resources/application-dev.yml

@@ -1,21 +1,22 @@
 spring:
   cloud:
     nacos:
-      server-addr: 192.168.0.250:8848
+      server-addr: 192.168.5.250:8848
       username: nacos
       password: nacos
       config:
         file-extension: yaml
-        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
         group: DEFAULT_GROUP
       discovery:
-        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
   config:
     import:
       - nacos:mysql
       - nacos:redisson
 
 
+
 feign:
   client:
     jzg-org:

+ 3 - 3
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java

@@ -130,9 +130,9 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         // 车辆型号截去汉字
         String brandName = carInfoVo.getBrandName();
-        String processedName = brandName.replaceAll("[\\u4e00-\\u9fa5]", "");
+       // String processedName = brandName.replaceAll("[\\u4e00-\\u9fa5]", "");
         //查询车辆
-        VehicleTypeQueryRequest vehicleTypeQueryRequest = new VehicleTypeQueryRequest(parameters, processedName, orderNo);
+        VehicleTypeQueryRequest vehicleTypeQueryRequest = new VehicleTypeQueryRequest(parameters, brandName, orderNo);
         // 调用 车辆查询和车辆确认接口
         Map<String, Object> map = new HashMap<>();
         try {
@@ -207,7 +207,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
                 StringBuilder sb = new StringBuilder();
                 if (null != underwritingResponse.getData().getTrafficResultMsg()) {
-                    sb.append(String.format("交强险提示信息:%s", underwritingResponse.getData().getTrafficResultMsg()));
+                        sb.append(String.format("交强险提示信息:%s", underwritingResponse.getData().getTrafficResultMsg()));
                 }
                 if (null != underwritingResponse.getData().getBusinessResultMsg()) {
                     sb.append(String.format("商业险提示信息:%s", underwritingResponse.getData().getBusinessResultMsg()));

BIN
tenant/insurance/quotation-bohai/中介车险业务接口文档-v1.1.2.doc


+ 2 - 7
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -6,10 +6,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
         group: DEFAULT_GROUP
       discovery:
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
   config:
     import:
       - nacos:mysql
@@ -18,11 +18,6 @@ spring:
       - nacos:mongodb
       - nacos:identify
       - nacos:crawler-config
-  redis:
-    host: 192.168.5.250
-    port: 6379
-    password: 123456  # 如果没有密码,可删除此行
-    database: 0
 #百度图片识别API
 baidu:
   clientId: xG9M8tSjNvYPwSTNavM0ELlD

+ 17 - 0
tenant/insurance/quotation-summary/src/test/resources/application-local.yaml

@@ -0,0 +1,17 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        enabled: false
+      discovery:
+        enabled: false
+  config:
+    import: optional:nacos:  # 使用 optional 禁用 Nacos 配置导入检查
+
+# 禁用 Nacos 配置检查
+spring.cloud.nacos.config.import-check.enabled: false
+
+# 本地测试数据库配置(可根据实际情况修改)
+#spring.datasource.url: jdbc:mysql://localhost:3306/test_db
+#spring.datasource.username: root
+#spring.datasource.password: root

+ 25 - 0
tenant/organization/src/main/java/com/jzg/organization/client/LotteryActivityClient.java

@@ -0,0 +1,25 @@
+package com.jzg.organization.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.LotteryActivityVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 抽奖活动客户端
+ */
+@FeignClient(name = "lottery-activity", url = "http://t5936d89.natappfree.cc/jeecg-boot/")
+public interface LotteryActivityClient {
+
+    /**
+     * 查询抽奖活动规则
+     *
+     * @param scene 场景编码
+     * @return 活动列表
+     */
+    @GetMapping("/lotteryActivity/queryActivityRules")
+    HttpResult<List<LotteryActivityVO>> queryActivityRules(@RequestParam("scene") Integer scene);
+}

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

@@ -0,0 +1,86 @@
+package com.jzg.organization.controller;
+
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+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.service.SignInService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 签到控制器
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/signIn")
+@Tag(name = "签到管理", description = "用户签到相关接口")
+public class SignInController extends BaseController {
+
+    @Autowired
+    private SignInService signInService;
+
+    /**
+     * 用户签到
+     */
+    @PostMapping("/doSignIn")
+    @Operation(summary = "用户签到", description = "用户每日签到,支持多租户")
+    public HttpResult<SignInVO> signIn(@RequestBody SignInDTO dto) {
+        // 如果前端未传租户ID和用户ID,从当前登录信息获取
+        if (dto.getTenantId() == null) {
+            dto.setTenantId(getSystemCode());
+        }
+        if (dto.getUserId() == null) {
+            dto.setUserId(getUserId());
+        }
+        return signInService.signIn(dto);
+    }
+
+    /**
+     * 查询签到统计信息
+     */
+    @GetMapping("/getStatistics")
+    @Operation(summary = "查询签到统计", description = "获取用户签到统计信息,包括连续天数、累计天数等")
+    public HttpResult<SignInStatisticsVO> getStatistics(
+            @Parameter(description = "租户ID(不传则从登录信息获取)")
+            @RequestParam(required = false) String tenantId,
+            @Parameter(description = "用户ID(不传则从登录信息获取)")
+            @RequestParam(required = false) String userId) {
+        if (tenantId == null) {
+            tenantId = getSystemCode();
+        }
+        if (userId == null) {
+            userId = getUserId();
+        }
+        return signInService.getStatistics(tenantId, userId);
+    }
+
+    /**
+     * 查询签到记录列表
+     */
+    @GetMapping("/getRecords")
+    @Operation(summary = "查询签到记录", description = "获取用户最近签到记录列表")
+    public HttpResult<List<SignInRecordVO>> getRecords(
+            @Parameter(description = "租户ID(不传则从登录信息获取)")
+            @RequestParam(required = false) String tenantId,
+            @Parameter(description = "用户ID(不传则从登录信息获取)")
+            @RequestParam(required = false) String userId,
+            @Parameter(description = "查询最近天数,默认30天")
+            @RequestParam(required = false, defaultValue = "30") Integer days) {
+        if (tenantId == null) {
+            tenantId = getSystemCode();
+        }
+        if (userId == null) {
+            userId = getUserId();
+        }
+        return signInService.getRecords(tenantId, userId, days);
+    }
+}

+ 20 - 0
tenant/organization/src/main/java/com/jzg/organization/entity/dto/SignInDTO.java

@@ -0,0 +1,20 @@
+package com.jzg.organization.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 签到请求DTO
+ */
+@Data
+public class SignInDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "租户ID(不传则从登录信息获取)")
+    private String tenantId;
+
+    @Schema(description = "用户ID(不传则从登录信息获取)")
+    private String userId;
+}

+ 28 - 0
tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInRecordVO.java

@@ -0,0 +1,28 @@
+package com.jzg.organization.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 签到记录VO
+ */
+@Data
+public class SignInRecordVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "记录ID")
+    private String id;
+
+    @Schema(description = "签到日期")
+    private LocalDate signInDate;
+
+    @Schema(description = "当日连续签到天数")
+    private Integer continuousDays;
+
+    @Schema(description = "签到时间")
+    private LocalDateTime signInTime;
+}

+ 34 - 0
tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInStatisticsVO.java

@@ -0,0 +1,34 @@
+package com.jzg.organization.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 签到统计信息VO
+ */
+@Data
+public class SignInStatisticsVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "本月累计签到天数")
+    private Integer monthTotalDays;
+
+    @Schema(description = "当前连续签到天数")
+    private Integer currentContinuousDays;
+
+    @Schema(description = "历史最高连续签到天数")
+    private Integer maxContinuousDays;
+
+    @Schema(description = "总累计签到天数")
+    private Integer totalDays;
+
+    @Schema(description = "今日是否已签到")
+    private Boolean todaySigned;
+
+    @Schema(description = "最近签到日期列表(本月)")
+    private List<LocalDate> recentSignDates;
+}

+ 39 - 0
tenant/organization/src/main/java/com/jzg/organization/entity/vo/SignInVO.java

@@ -0,0 +1,39 @@
+package com.jzg.organization.entity.vo;
+
+import com.jzg.commons.entity.vo.SignRuleVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 签到结果VO
+ */
+@Data
+public class SignInVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "是否签到成功")
+    private Boolean success;
+
+    @Schema(description = "签到日期")
+    private LocalDate signInDate;
+
+    @Schema(description = "连续签到天数")
+    private Integer continuousDays;
+
+    @Schema(description = "本次签到获得抽奖次数")
+    private Integer lotteryChance;
+
+    @Schema(description = "触发的签到规则列表")
+    private List<SignRuleVO> triggeredRules;
+
+    @Schema(description = "提示消息")
+    private String message;
+
+    @Schema(description = "签到时间")
+    private LocalDateTime signInTime;
+}

+ 41 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserSignInMapper.java

@@ -0,0 +1,41 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.SysUserSignIn;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 用户签到记录Mapper
+ */
+public interface SysUserSignInMapper extends BaseMapper<SysUserSignIn> {
+
+    /**
+     * 查询用户最新的签到记录
+     */
+    SysUserSignIn selectLatestByUser(@Param("tenantId") String tenantId,
+                                      @Param("userId") String userId);
+
+    /**
+     * 查询用户指定日期是否已签到
+     */
+    int countByDate(@Param("tenantId") String tenantId,
+                    @Param("userId") String userId,
+                    @Param("signInDate") LocalDate signInDate);
+
+    /**
+     * 查询用户的签到记录列表
+     */
+    List<SysUserSignIn> selectListByUser(@Param("tenantId") String tenantId,
+                                         @Param("userId") String userId,
+                                         @Param("startDate") LocalDate startDate,
+                                         @Param("endDate") LocalDate endDate);
+
+    /**
+     * 查询历史最高连续签到天数
+     */
+    Integer selectMaxContinuousDays(@Param("tenantId") String tenantId,
+                                    @Param("userId") String userId);
+}

+ 28 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserSignInRuleMapper.java

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

+ 86 - 0
tenant/organization/src/main/java/com/jzg/organization/service/LotteryActivityService.java

@@ -0,0 +1,86 @@
+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.organization.client.LotteryActivityClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 抽奖活动服务
+ */
+@Slf4j
+@Service
+public class LotteryActivityService {
+
+    @Autowired
+    private LotteryActivityClient lotteryActivityClient;
+
+    /**
+     * 根据场景查询活动列表
+     */
+    public List<LotteryActivityVO> getActivitiesByScene(Integer scene) {
+        HttpResult<List<LotteryActivityVO>> result = lotteryActivityClient.queryActivityRules(scene);
+        if (result == null || result.getCode() != 200 || result.getData() == null) {
+            log.warn("查询抽奖活动规则失败,scene={}", scene);
+            return Collections.emptyList();
+        }
+        return result.getData();
+    }
+
+    /**
+     * 查询签到规则(type=7)
+     */
+    public List<SignRuleVO> getSignRules(Integer scene) {
+        List<LotteryActivityVO> activities = getActivitiesByScene(scene);
+        List<SignRuleVO> signRules = new ArrayList<>();
+
+        for (LotteryActivityVO activity : activities) {
+            if (activity.getLocalActivityTables() == null) {
+                continue;
+            }
+            for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                if ("7".equals(table.getType()) && table.getSignRules() != null) {
+                    signRules.addAll(table.getSignRules());
+                }
+            }
+        }
+        return signRules;
+    }
+
+    /**
+     * 获取指定活动的签到规则
+     */
+    public List<SignRuleVO> getSignRulesByActivity(Integer scene, String activityId) {
+        List<LotteryActivityVO> activities = getActivitiesByScene(scene);
+        return activities.stream()
+                .filter(a -> activityId.equals(a.getId()))
+                .filter(a -> a.getLocalActivityTables() != null)
+                .flatMap(a -> a.getLocalActivityTables().stream())
+                .filter(t -> "7".equals(t.getType()))
+                .filter(t -> t.getSignRules() != null)
+                .flatMap(t -> t.getSignRules().stream())
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 检查活动是否有效
+     */
+    public boolean isActivityValid(LotteryActivityVO activity) {
+        if (activity == null) {
+            return false;
+        }
+        LocalDate now = LocalDate.now();
+        return !now.isBefore(activity.getActivityStartTime())
+                && !now.isAfter(activity.getActivityEndTime());
+    }
+}

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

@@ -0,0 +1,42 @@
+package com.jzg.organization.service;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.organization.entity.dto.SignInDTO;
+import com.jzg.organization.entity.vo.SignInStatisticsVO;
+import com.jzg.organization.entity.vo.SignInVO;
+import com.jzg.organization.entity.vo.SignInRecordVO;
+
+import java.util.List;
+
+/**
+ * 签到服务接口
+ */
+public interface SignInService {
+
+    /**
+     * 用户签到
+     *
+     * @param dto 签到请求
+     * @return 签到结果
+     */
+    HttpResult<SignInVO> signIn(SignInDTO dto);
+
+    /**
+     * 查询签到统计信息
+     *
+     * @param tenantId 租户ID(可选)
+     * @param userId   用户ID(可选)
+     * @return 统计信息
+     */
+    HttpResult<SignInStatisticsVO> getStatistics(String tenantId, String userId);
+
+    /**
+     * 查询签到记录列表
+     *
+     * @param tenantId 租户ID(可选)
+     * @param userId   用户ID(可选)
+     * @param days     查询最近天数,默认30天
+     * @return 记录列表
+     */
+    HttpResult<List<SignInRecordVO>> getRecords(String tenantId, String userId, Integer days);
+}

+ 365 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SignInServiceImpl.java

@@ -0,0 +1,365 @@
+package com.jzg.organization.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+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.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.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.mapper.SysUserSignInMapper;
+import com.jzg.organization.mapper.SysUserSignInRuleMapper;
+import com.jzg.organization.service.LotteryActivityService;
+import com.jzg.organization.service.SignInService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+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.stream.Collectors;
+
+/**
+ * 签到服务实现类
+ */
+@Slf4j
+@Service
+public class SignInServiceImpl implements SignInService {
+
+    @Autowired
+    private SysUserSignInMapper signInMapper;
+
+    @Autowired
+    private SysUserSignInRuleMapper signInRuleMapper;
+
+    @Autowired
+    private LotteryActivityService lotteryActivityService;
+
+    @Autowired
+    private HttpServletRequest request;
+
+    @Value("${lottery.activity.scene:3}")
+    private Integer lotteryScene;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult<SignInVO> signIn(SignInDTO dto) {
+        // 获取当前用户和租户信息
+        String tenantId = getTenantId(dto.getTenantId());
+        String userId = getUserId(dto.getUserId());
+
+        if (StrUtil.isBlank(tenantId) || StrUtil.isBlank(userId)) {
+            return HttpResult.error("用户未登录或登录信息异常");
+        }
+
+        LocalDate today = LocalDate.now();
+
+        // 检查今日是否已签到
+        int count = signInMapper.countByDate(tenantId, userId, today);
+        if (count > 0) {
+            return HttpResult.error("今日已签到,请勿重复签到");
+        }
+
+        // 计算连续签到天数
+        Integer continuousDays = calculateContinuousDays(tenantId, userId);
+
+        // 保存签到记录
+        SysUserSignIn signIn = new SysUserSignIn();
+        signIn.setTenantId(tenantId);
+        signIn.setUserId(userId);
+        signIn.setSignInDate(today);
+        signIn.setContinuousDays(continuousDays);
+        signIn.setSignInTime(LocalDateTime.now());
+        signInMapper.insert(signIn);
+
+        // 检查并触发签到规则
+        List<SignRuleVO> triggeredRules = checkAndTriggerSignRules(tenantId, userId, continuousDays);
+
+        // 统计本次获得的抽奖次数
+        int totalLotteryChance = triggeredRules.stream()
+                .filter(r -> StrUtil.isNotBlank(r.getSignLotteryNum()))
+                .mapToInt(r -> Integer.parseInt(r.getSignLotteryNum()))
+                .sum();
+
+        // 构建返回结果
+        SignInVO vo = new SignInVO();
+        vo.setSuccess(true);
+        vo.setSignInDate(today);
+        vo.setContinuousDays(continuousDays);
+        vo.setLotteryChance(totalLotteryChance);
+        vo.setTriggeredRules(triggeredRules);
+        vo.setSignInTime(LocalDateTime.now());
+
+        String message = buildSuccessMessage(continuousDays, totalLotteryChance, triggeredRules);
+        vo.setMessage(message);
+
+        log.info("用户签到成功,tenantId={}, userId={}, continuousDays={}, lotteryChance={}",
+                tenantId, userId, continuousDays, totalLotteryChance);
+
+        return HttpResult.ok(message, vo);
+    }
+
+    /**
+     * 检查并触发可完成的签到规则
+     * 每个规则在活动期间只能完成一次
+     */
+    private List<SignRuleVO> checkAndTriggerSignRules(String tenantId, String userId, Integer continuousDays) {
+        List<SignRuleVO> triggeredRules = new ArrayList<>();
+
+        // 获取当前有效的活动
+        List<LotteryActivityVO> activities = lotteryActivityService.getActivitiesByScene(lotteryScene);
+
+        for (LotteryActivityVO activity : activities) {
+            // 检查活动是否有效
+            if (!lotteryActivityService.isActivityValid(activity)) {
+                continue;
+            }
+
+            if (activity.getLocalActivityTables() == null) {
+                continue;
+            }
+
+            // 获取用户已完成的规则
+            List<SysUserSignInRule> completedRules = signInRuleMapper.selectCompletedRules(
+                    tenantId, userId, activity.getId());
+            Set<String> completedSignNums = completedRules.stream()
+                    .map(SysUserSignInRule::getRuleSignNum)
+                    .collect(Collectors.toSet());
+
+            // 遍历所有本地活动表
+            for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                // 只处理 type=7 的签到规则
+                if (!"7".equals(table.getType()) || table.getSignRules() == null) {
+                    continue;
+                }
+
+                // 检查每个签到规则
+                for (SignRuleVO rule : table.getSignRules()) {
+                    if (StrUtil.isBlank(rule.getSignNum())) {
+                        continue;
+                    }
+
+                    Integer requiredDays = Integer.parseInt(rule.getSignNum());
+
+                    // 判断是否满足条件且未完成过
+                    if (continuousDays >= requiredDays
+                            && !completedSignNums.contains(rule.getSignNum())) {
+
+                        // 记录规则完成
+                        completeSignRule(tenantId, userId, activity.getId(),
+                                table.getId(), rule);
+
+                        triggeredRules.add(rule);
+                    }
+                }
+            }
+        }
+
+        return triggeredRules;
+    }
+
+    /**
+     * 记录规则完成
+     */
+    private void completeSignRule(String tenantId, String userId, String activityId,
+                                    String tableId, SignRuleVO rule) {
+        // 先查询是否已存在记录(防重入)
+        SysUserSignInRule exist = signInRuleMapper.selectByRule(
+                tenantId, userId, activityId, rule.getSignNum());
+
+        if (exist != null) {
+            return;
+        }
+
+        SysUserSignInRule record = new SysUserSignInRule();
+        record.setTenantId(tenantId);
+        record.setUserId(userId);
+        record.setActivityId(activityId);
+        record.setLocalActivityTableId(tableId);
+        record.setRuleSignNum(rule.getSignNum());
+        record.setLotteryNum(StrUtil.isNotBlank(rule.getSignLotteryNum())
+                ? Integer.parseInt(rule.getSignLotteryNum()) : 0);
+        record.setStatus(1);
+        record.setReceiveTime(LocalDateTime.now());
+
+        signInRuleMapper.insert(record);
+
+        log.info("签到规则完成,tenantId={}, userId={}, activityId={}, ruleSignNum={}, lotteryNum={}",
+                tenantId, userId, activityId, rule.getSignNum(), record.getLotteryNum());
+    }
+
+    /**
+     * 计算连续签到天数
+     */
+    private Integer calculateContinuousDays(String tenantId, String userId) {
+        SysUserSignIn latest = signInMapper.selectLatestByUser(tenantId, userId);
+
+        if (latest == null) {
+            return 1; // 首次签到
+        }
+
+        LocalDate yesterday = LocalDate.now().minusDays(1);
+
+        // 如果上次签到是昨天,则连续天数+1
+        if (latest.getSignInDate().isEqual(yesterday)) {
+            return latest.getContinuousDays() + 1;
+        }
+
+        // 如果上次签到是今天(重复签到,理论上不会走到这里)
+        if (latest.getSignInDate().isEqual(LocalDate.now())) {
+            return latest.getContinuousDays();
+        }
+
+        // 断签了,从1开始
+        return 1;
+    }
+
+    /**
+     * 构建成功消息
+     */
+    private String buildSuccessMessage(Integer continuousDays, Integer lotteryChance, List<SignRuleVO> rules) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("签到成功!连续签到").append(continuousDays).append("天");
+
+        if (lotteryChance > 0 && CollUtil.isNotEmpty(rules)) {
+            sb.append(",恭喜完成");
+            for (int i = 0; i < rules.size(); i++) {
+                SignRuleVO rule = rules.get(i);
+                if (i > 0) {
+                    sb.append("、");
+                }
+                sb.append(rule.getSignNum()).append("天签到任务");
+            }
+            sb.append(",获得").append(lotteryChance).append("次抽奖机会");
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    public HttpResult<SignInStatisticsVO> getStatistics(String tenantId, String userId) {
+        String tId = getTenantId(tenantId);
+        String uId = getUserId(userId);
+
+        if (StrUtil.isBlank(tId) || StrUtil.isBlank(uId)) {
+            return HttpResult.error("用户未登录或登录信息异常");
+        }
+
+        LocalDate today = LocalDate.now();
+        LocalDate monthStart = today.with(TemporalAdjusters.firstDayOfMonth());
+
+        // 查询本月签到记录
+        List<SysUserSignIn> monthRecords = signInMapper.selectListByUser(tId, uId, monthStart, today);
+
+        // 查询历史最高连续天数
+        Integer maxContinuousDays = signInMapper.selectMaxContinuousDays(tId, uId);
+        if (maxContinuousDays == null) {
+            maxContinuousDays = 0;
+        }
+
+        // 查询今日是否已签到
+        int todayCount = signInMapper.countByDate(tId, uId, today);
+
+        // 计算当前连续天数
+        Integer currentContinuous = 0;
+        if (CollUtil.isNotEmpty(monthRecords)) {
+            SysUserSignIn latest = monthRecords.get(0);
+            if (latest.getSignInDate().isEqual(today) || latest.getSignInDate().isEqual(today.minusDays(1))) {
+                currentContinuous = latest.getContinuousDays();
+            }
+        }
+
+        // 查询累计签到天数
+        Integer totalDays = signInMapper.selectCount(
+                Wrappers.<SysUserSignIn>lambdaQuery()
+                        .eq(SysUserSignIn::getTenantId, tId)
+                        .eq(SysUserSignIn::getUserId, uId)
+                        .eq(SysUserSignIn::getIsDelete, 0)
+        ).intValue();
+
+        SignInStatisticsVO vo = new SignInStatisticsVO();
+        vo.setMonthTotalDays(monthRecords.size());
+        vo.setCurrentContinuousDays(currentContinuous);
+        vo.setMaxContinuousDays(maxContinuousDays);
+        vo.setTotalDays(totalDays);
+        vo.setTodaySigned(todayCount > 0);
+        vo.setRecentSignDates(monthRecords.stream()
+                .map(SysUserSignIn::getSignInDate)
+                .collect(Collectors.toList()));
+
+        return HttpResult.ok(vo);
+    }
+
+    @Override
+    public HttpResult<List<SignInRecordVO>> getRecords(String tenantId, String userId, Integer days) {
+        String tId = getTenantId(tenantId);
+        String uId = getUserId(userId);
+
+        if (StrUtil.isBlank(tId) || StrUtil.isBlank(uId)) {
+            return HttpResult.error("用户未登录或登录信息异常");
+        }
+
+        if (days == null || days <= 0) {
+            days = 30;
+        }
+
+        LocalDate endDate = LocalDate.now();
+        LocalDate startDate = endDate.minusDays(days - 1);
+
+        List<SysUserSignIn> records = signInMapper.selectListByUser(tId, uId, startDate, endDate);
+
+        if (CollUtil.isEmpty(records)) {
+            return HttpResult.ok(Collections.emptyList());
+        }
+
+        List<SignInRecordVO> voList = records.stream().map(r -> {
+            SignInRecordVO vo = new SignInRecordVO();
+            vo.setId(r.getId());
+            vo.setSignInDate(r.getSignInDate());
+            vo.setContinuousDays(r.getContinuousDays());
+            vo.setSignInTime(r.getSignInTime());
+            return vo;
+        }).collect(Collectors.toList());
+
+        return HttpResult.ok(voList);
+    }
+
+    /**
+     * 获取租户ID
+     */
+    private String getTenantId(String dtoTenantId) {
+        if (StrUtil.isNotBlank(dtoTenantId)) {
+            return dtoTenantId;
+        }
+        // 从请求头或上下文中获取
+        Object tenantObj = request.getAttribute("tenantId");
+        return tenantObj != null ? tenantObj.toString() : null;
+    }
+
+    /**
+     * 获取用户ID
+     */
+    private String getUserId(String dtoUserId) {
+        if (StrUtil.isNotBlank(dtoUserId)) {
+            return dtoUserId;
+        }
+        // 从请求头或上下文中获取
+        Object userObj = request.getAttribute("userId");
+        return userObj != null ? userObj.toString() : null;
+    }
+}

+ 38 - 0
tenant/organization/src/main/resources/mapper/SysUserSignInMapper.xml

@@ -0,0 +1,38 @@
+<?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.SysUserSignInMapper">
+
+    <select id="selectLatestByUser" resultType="com.jzg.commons.entity.po.SysUserSignIn">
+        SELECT * FROM sys_user_sign_in
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND is_delete = 0
+        ORDER BY sign_in_date DESC
+        LIMIT 1
+    </select>
+
+    <select id="countByDate" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM sys_user_sign_in
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND sign_in_date = #{signInDate}
+          AND is_delete = 0
+    </select>
+
+    <select id="selectListByUser" resultType="com.jzg.commons.entity.po.SysUserSignIn">
+        SELECT * FROM sys_user_sign_in
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND sign_in_date BETWEEN #{startDate} AND #{endDate}
+          AND is_delete = 0
+        ORDER BY sign_in_date DESC
+    </select>
+
+    <select id="selectMaxContinuousDays" resultType="java.lang.Integer">
+        SELECT MAX(continuous_days) FROM sys_user_sign_in
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND is_delete = 0
+    </select>
+
+</mapper>

+ 24 - 0
tenant/organization/src/main/resources/mapper/SysUserSignInRuleMapper.xml

@@ -0,0 +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">
+
+    <select id="selectCompletedRules" resultType="com.jzg.commons.entity.po.SysUserSignInRule">
+        SELECT * FROM sys_user_sign_in_rule
+        WHERE tenant_id = #{tenantId}
+          AND user_id = #{userId}
+          AND activity_id = #{activityId}
+          AND status = 1
+          AND is_delete = 0
+    </select>
+
+    <select id="selectByRule" resultType="com.jzg.commons.entity.po.SysUserSignInRule">
+        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 is_delete = 0
+        LIMIT 1
+    </select>
+
+</mapper>