浏览代码

Merge branch 'sit-credit-score' into sit

# Conflicts:
#	alien-lawyer/src/main/java/shop/alien/lawyer/controller/AiAutoReview.java
lyx 22 小时之前
父节点
当前提交
a9463b2800
共有 45 个文件被更改,包括 2530 次插入25 次删除
  1. 58 0
      alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditDateRecord.java
  2. 3 0
      alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java
  3. 25 0
      alien-entity/src/main/java/shop/alien/entity/second/enums/SecondUserCreditScoreEnum.java
  4. 27 0
      alien-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditRecordListVo.java
  5. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeDiscountCouponUser.java
  6. 4 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeUser.java
  7. 107 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeUserCreditScoreInfo.java
  8. 54 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeUserLearningRecord.java
  9. 62 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeUserLearningVideo.java
  10. 79 0
      alien-entity/src/main/java/shop/alien/entity/store/StorePlatformBenefits.java
  11. 63 0
      alien-entity/src/main/java/shop/alien/entity/store/StoreVirtualCurrency.java
  12. 19 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/LifeUserLearningVideoVo.java
  13. 29 0
      alien-entity/src/main/java/shop/alien/entity/store/vo/StorePlatformBenefitsVo.java
  14. 7 0
      alien-entity/src/main/java/shop/alien/mapper/LifeUserCreditScoreInfoMapper.java
  15. 17 0
      alien-entity/src/main/java/shop/alien/mapper/LifeUserLearningRecordMapper.java
  16. 8 0
      alien-entity/src/main/java/shop/alien/mapper/LifeUserLearningVideoMapper.java
  17. 53 0
      alien-entity/src/main/java/shop/alien/mapper/StorePlatformBenefitsMapper.java
  18. 15 0
      alien-entity/src/main/java/shop/alien/mapper/StoreVirtualCurrencyMapper.java
  19. 14 0
      alien-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditDateRecordMapper.java
  20. 10 5
      alien-gateway/src/main/java/shop/alien/gateway/controller/LifeUserController.java
  21. 52 4
      alien-gateway/src/main/java/shop/alien/gateway/service/LifeUserService.java
  22. 202 0
      alien-job/src/main/java/shop/alien/job/second/SecondUserCreditJob.java
  23. 0 1
      alien-lawyer/src/main/java/shop/alien/lawyer/controller/AiAutoReview.java
  24. 27 0
      alien-second/src/main/java/shop/alien/second/controller/SecondUserCreditRecordController.java
  25. 17 0
      alien-second/src/main/java/shop/alien/second/service/SecondUserCreditRecordService.java
  26. 77 2
      alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java
  27. 44 9
      alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java
  28. 182 1
      alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditRecordServiceImpl.java
  29. 4 3
      alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditServiceImpl.java
  30. 9 0
      alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java
  31. 66 0
      alien-store/src/main/java/shop/alien/store/controller/LifeUserBenefitsController.java
  32. 84 0
      alien-store/src/main/java/shop/alien/store/controller/LifeUserCreditScoreInfoController.java
  33. 98 0
      alien-store/src/main/java/shop/alien/store/controller/LifeUserLearningRecordController.java
  34. 75 0
      alien-store/src/main/java/shop/alien/store/controller/LifeUserLearningVideoController.java
  35. 116 0
      alien-store/src/main/java/shop/alien/store/controller/StorePlatformBenefitsController.java
  36. 2 0
      alien-store/src/main/java/shop/alien/store/service/LifeMessageService.java
  37. 39 0
      alien-store/src/main/java/shop/alien/store/service/LifeUserCreditScoreInfoService.java
  38. 45 0
      alien-store/src/main/java/shop/alien/store/service/LifeUserLearningRecordService.java
  39. 35 0
      alien-store/src/main/java/shop/alien/store/service/LifeUserLearningVideoService.java
  40. 87 0
      alien-store/src/main/java/shop/alien/store/service/StorePlatformBenefitsService.java
  41. 10 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java
  42. 107 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeUserCreditScoreInfoServiceImpl.java
  43. 92 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeUserLearningRecordServiceImpl.java
  44. 71 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeUserLearningVideoServiceImpl.java
  45. 331 0
      alien-store/src/main/java/shop/alien/store/service/impl/StorePlatformBenefitsServiceImpl.java

+ 58 - 0
alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditDateRecord.java

@@ -0,0 +1,58 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户积分日期记录表
+ */
+@Data
+@JsonInclude
+@TableName("second_user_credit_date_record")
+public class SecondUserCreditDateRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("record_date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "记录日期")
+    private Date recordDate;
+
+    @TableField("total_points")
+    @ApiModelProperty(value = "当日总积分")
+    private Integer totalPoints;
+
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+}
+

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java

@@ -30,6 +30,9 @@ public class SecondUserCreditRecord implements Serializable {
     @TableField("points_type")
     private Integer pointsType;
 
+    @TableField("current_score_count")
+    private Integer currentScoreCount;
+
     @TableField("delete_flag")
     @TableLogic
     private Integer deleteFlag;

+ 25 - 0
alien-entity/src/main/java/shop/alien/entity/second/enums/SecondUserCreditScoreEnum.java

@@ -0,0 +1,25 @@
+package shop.alien.entity.second.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum SecondUserCreditScoreEnum {
+
+    BASE_SCORE(1, 300, "基础分"),
+    CERTIFICATION_SCORE(2, 200, "认证分"),
+    TRANSACTION_SCORE(3, 50, "交易成功"),
+    SUSPECTED_OF_MONEY_LAUNDERING(4, -50, "洗钱嫌疑"),
+    ABNORMAL_ACCOUNTV(5, -50, "账号异常"),
+    TRADING_FRAUD(6, -50, "交易欺诈"),
+    ABNORMAL_RELEASE(7, -50, "异常发布");
+
+    private final Integer code;
+    private final Integer score;
+    private final String description;
+
+    SecondUserCreditScoreEnum(Integer code, Integer score, String description) {
+        this.code = code;
+        this.score = score;
+        this.description = description;
+    }
+}

+ 27 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditRecordListVo.java

@@ -0,0 +1,27 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
+import shop.alien.entity.second.SecondUserCreditRecord;
+
+import java.util.List;
+
+/**
+ * 用户信用分记录列表VO
+ */
+@Data
+@JsonInclude
+public class SecondUserCreditRecordListVo {
+
+    @ApiModelProperty(value = "用户积分")
+    private Integer userPoints;
+
+    @ApiModelProperty(value = "信用分记录列表")
+    private List<SecondUserCreditRecord> recordsChange;
+
+    @ApiModelProperty(value = "日期积分记录列表")
+    private List<SecondUserCreditDateRecord> dateRecords;
+}
+

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeDiscountCouponUser.java

@@ -77,6 +77,10 @@ public class LifeDiscountCouponUser extends Model<LifeDiscountCouponUser> {
     @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     private Integer updatedUserId;
 
+    @ApiModelProperty(value = "U币ID")
+    @TableField("ub_id")
+    private Integer ubId;
+
 
     @Override
     protected Serializable pkVal() {

+ 4 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUser.java

@@ -121,4 +121,8 @@ public class LifeUser implements Serializable {
     @ApiModelProperty(value = "绑定他人邀请码")
     @TableField("bind_invite_code")
     private String bindInviteCode;
+
+    @ApiModelProperty(value = "是否被封禁(0-否  1-是)")
+    @TableField("is_banned")
+    private Integer isBanned;
 }

+ 107 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUserCreditScoreInfo.java

@@ -0,0 +1,107 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("life_user_credit_score_info")
+@ApiModel(value = "LifeUserCreditScoreInfo对象", description = "用户信用分信息")
+public class LifeUserCreditScoreInfo {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户ID")
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "职业类型")
+    @TableField("occupation_type")
+    private String occupationType;
+
+    @ApiModelProperty(value = "工作单位")
+    @TableField("work_unit")
+    private String workUnit;
+
+    @ApiModelProperty(value = "职业")
+    @TableField("occupation")
+    private String occupation;
+
+    @ApiModelProperty(value = "月收入")
+    @TableField("monthly_income")
+    private Integer monthlyIncome;
+
+    @ApiModelProperty(value = "最高学历")
+    @TableField("highest_degree")
+    private String highestDegree;
+
+    @ApiModelProperty(value = "毕业院校")
+    @TableField("graduated_institution")
+    private String graduatedInstitution;
+
+    @ApiModelProperty(value = "毕业时间")
+    @TableField("graduation_date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date graduationDate;
+
+    @ApiModelProperty(value = "所学专业")
+    @TableField("major")
+    private String major;
+
+    @ApiModelProperty(value = "房产地址")
+    @TableField("estate_address")
+    private String estateAddress;
+
+    @ApiModelProperty(value = "是否有房产 1-有 0-无")
+    @TableField("has_estate")
+    private Integer hasEstate;
+
+    @ApiModelProperty(value = "房屋类型")
+    @TableField("estate_type")
+    private String estateType;
+
+    @ApiModelProperty(value = "是否有车辆 1-有 0-无")
+    @TableField("has_car")
+    private Integer hasCar;
+
+    @ApiModelProperty(value = "房产证明")
+    @TableField("estate_imgs")
+    private String estateImgs;
+
+    @ApiModelProperty(value = "行驶证明")
+    @TableField("car_imgs")
+    private String carImgs;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+}

+ 54 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUserLearningRecord.java

@@ -0,0 +1,54 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("life_user_learning_record")
+@ApiModel(value = "LifeUserLearningRecord对象", description = "用户学习记录")
+public class LifeUserLearningRecord {
+
+    @ApiModelProperty(value = "主键id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "学习id")
+    @TableField("learning_id")
+    private Integer learningId;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+}
+

+ 62 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeUserLearningVideo.java

@@ -0,0 +1,62 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("life_user_learning_video")
+@ApiModel(value = "LifeUserLearningVideo对象", description = "学习视频")
+public class LifeUserLearningVideo {
+
+    @ApiModelProperty(value = "主键id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "简介")
+    @TableField("profile")
+    private String profile;
+
+    @ApiModelProperty(value = "奖励分数")
+    @TableField("score")
+    private Integer score;
+
+    @ApiModelProperty(value = "视频地址")
+    @TableField("video_url")
+    private String videoUrl;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+}
+

+ 79 - 0
alien-entity/src/main/java/shop/alien/entity/store/StorePlatformBenefits.java

@@ -0,0 +1,79 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 福利表
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+@Data
+@JsonInclude
+@TableName("store_platform_benefits")
+@ApiModel(value = "StorePlatformBenefits对象", description = "福利表")
+public class StorePlatformBenefits {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "类型:1=优惠券,2=U币")
+    @TableField("type")
+    private Integer type;
+
+    @ApiModelProperty(value = "优惠券类型(如\"全场通用优惠券\")")
+    @TableField("business_id")
+    private String businessId;
+
+    @ApiModelProperty(value = "优惠券使用条件(如\"满100可用\")")
+    @TableField("usage_conditions")
+    private String usageConditions;
+
+    @ApiModelProperty(value = "状态:0待审核/1审核拒绝/2审核通过")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "优惠券/U币名称")
+    @TableField(exist = false)
+    private String name;
+
+    @ApiModelProperty(value = "U币Id")
+    @TableField(exist = false)
+    private Integer virtualCurrencyId;
+
+    @ApiModelProperty(value = "UB数量")
+    @TableField(exist = false)
+    private Integer virtualCurrencyAmount;
+}
+

+ 63 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreVirtualCurrency.java

@@ -0,0 +1,63 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * U币表
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+@Data
+@JsonInclude
+@TableName("store_virtual_currency")
+@ApiModel(value = "StoreVirtualCurrency对象", description = "U币表")
+public class StoreVirtualCurrency {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "U币名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "状态:0待审核/1审核拒绝/2审核通过")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "U币数量")
+    @TableField("quantity")
+    private Integer quantity;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}
+

+ 19 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeUserLearningVideoVo.java

@@ -0,0 +1,19 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import shop.alien.entity.store.LifeUserLearningVideo;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="LifeUserLearningVideoVo对象")
+public class LifeUserLearningVideoVo extends LifeUserLearningVideo {
+
+    @ApiModelProperty(value = "是否看过  0-没看过 1-看过")
+    private String isWatch;
+
+}

+ 29 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StorePlatformBenefitsVo.java

@@ -0,0 +1,29 @@
+package shop.alien.entity.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import shop.alien.entity.store.StorePlatformBenefits;
+
+/**
+ * 福利表
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "StorePlatformBenefits对象", description = "福利表")
+public class StorePlatformBenefitsVo extends StorePlatformBenefits {
+
+    /**
+     * 是否领取
+     */
+    private Boolean claimed;
+
+    /**
+     * 数量
+     */
+    private Integer quantity;
+}
+

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserCreditScoreInfoMapper.java

@@ -0,0 +1,7 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.LifeUserCreditScoreInfo;
+
+public interface LifeUserCreditScoreInfoMapper extends BaseMapper<LifeUserCreditScoreInfo> {
+}

+ 17 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserLearningRecordMapper.java

@@ -0,0 +1,17 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.LifeUserLearningRecord;
+import shop.alien.entity.store.vo.LifeUserLearningVideoVo;
+
+import java.util.List;
+
+public interface LifeUserLearningRecordMapper extends BaseMapper<LifeUserLearningRecord> {
+
+    @Select("select video.name, video.profile, video.score, video.video_url, if(record.id is null, 0, 1) isWatch from life_user_learning_video video\n" +
+            "left join life_user_learning_record record on record.learning_id = video.id and user_id = #{userId}")
+    List<LifeUserLearningVideoVo> getListByUserId(@Param("userId") Integer userId);
+}
+

+ 8 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserLearningVideoMapper.java

@@ -0,0 +1,8 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.LifeUserLearningVideo;
+
+public interface LifeUserLearningVideoMapper extends BaseMapper<LifeUserLearningVideo> {
+}
+

+ 53 - 0
alien-entity/src/main/java/shop/alien/mapper/StorePlatformBenefitsMapper.java

@@ -0,0 +1,53 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.StorePlatformBenefits;
+import shop.alien.entity.store.vo.StorePlatformBenefitsVo;
+
+/**
+ * 福利表 Mapper 接口
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+public interface StorePlatformBenefitsMapper extends BaseMapper<StorePlatformBenefits> {
+
+    /**
+     * 分页查询用户举报信息
+     *
+     * @param page         分页对象
+     * @param queryWrapper 查询条件包装器
+     * @return 分页结果
+     */
+    @Select("<script>" +
+            " select * from ( " +
+            " select\n" +
+            "\tspb.id,\n" +
+            "\tspb.type,\n" +
+            "\tspb.business_id,\n" +
+            "\tspb.usage_conditions,\n" +
+            "\tldc.name,\n" +
+            " spb.created_time," +
+            " 0 quantity \n" +
+            "from\n" +
+            "\tstore_platform_benefits spb\n" +
+            "inner join life_discount_coupon ldc on\n" +
+            "\tspb.business_id = ldc.id and spb.delete_flag = 0 " +
+            " union all " +
+            " select spb.id, spb.type, spb.business_id, spb.usage_conditions, svc.name, spb.created_time,svc.quantity  " +
+            " from store_platform_benefits spb " +
+            " inner join store_virtual_currency svc on spb.business_id = svc.id  and spb.delete_flag = 0  ) a " +
+            " ${ew.customSqlSegment}" +
+            "</script>")
+    IPage<StorePlatformBenefitsVo> getPlatformBenefitsPage(
+            IPage<StorePlatformBenefitsVo> page,
+            @Param(Constants.WRAPPER) QueryWrapper<StorePlatformBenefitsVo> queryWrapper
+    );
+
+}
+

+ 15 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreVirtualCurrencyMapper.java

@@ -0,0 +1,15 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.StoreVirtualCurrency;
+
+/**
+ * U币表 Mapper 接口
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+public interface StoreVirtualCurrencyMapper extends BaseMapper<StoreVirtualCurrency> {
+
+}
+

+ 14 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditDateRecordMapper.java

@@ -0,0 +1,14 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
+
+import java.util.Date;
+
+/**
+ * 用户积分日期记录映射器
+ */
+public interface SecondUserCreditDateRecordMapper extends BaseMapper<SecondUserCreditDateRecord> {
+
+}
+

+ 10 - 5
alien-gateway/src/main/java/shop/alien/gateway/controller/LifeUserController.java

@@ -42,18 +42,23 @@ public class LifeUserController {
                                    @RequestParam(value = "macIp", required = false) String macIp,
                                    @RequestParam(value = "inviteCode", required = false) String inviteCode) {
         log.info("LifeUserController.userLogin?phoneNum={}&code={}", phoneNum, code);
+        LifeUserVo userVo = lifeUserService.userLogin(phoneNum, inviteCode, macIp);
+        if (null == userVo) {
+            return R.fail("登录失败");
+        }
+
+        if (1 == userVo.getIsBanned()) {
+            return R.fail("账号已被封禁, 无法登录");
+        }
+
         // 2025-11-04 验证码-用户端登录
         String cacheCode = baseRedisService.getString("verification_user_login_" + phoneNum);
         if (null == cacheCode) {
-            return R.fail("当验证码过期或未发送");
+            return R.fail("当验证码过期或未发送");
         }
         if (!cacheCode.trim().equals(code.trim())) {
             return R.fail("验证码错误");
         }
-        LifeUserVo userVo = lifeUserService.userLogin(phoneNum, inviteCode, macIp);
-        if (null == userVo) {
-            return R.fail("登录失败");
-        }
 
         if(StringUtils.isNotBlank(inviteCode)){
            String bindResult =  activityInviteConfigService.bindInviteCode(userVo.getId(), inviteCode);

+ 52 - 4
alien-gateway/src/main/java/shop/alien/gateway/service/LifeUserService.java

@@ -13,7 +13,12 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.second.LifeUserLog;
 import shop.alien.entity.second.SecondRiskControlRecord;
+import shop.alien.entity.second.SecondUserCredit;
+import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StoreUser;
 import shop.alien.entity.store.vo.LifeUserVo;
 import shop.alien.gateway.config.BaseRedisService;
 import shop.alien.gateway.config.RiskControlProperties;
@@ -21,6 +26,8 @@ import shop.alien.gateway.feign.SecondServiceFeign;
 import shop.alien.gateway.mapper.LifeUserLogGatewayMapper;
 import shop.alien.gateway.mapper.LifeUserGatewayMapper;
 import shop.alien.mapper.second.SecondRiskControlRecordMapper;
+import shop.alien.mapper.second.SecondUserCreditMapper;
+import shop.alien.mapper.second.SecondUserCreditRecordMapper;
 import shop.alien.util.common.JwtUtil;
 
 import java.time.LocalDateTime;
@@ -50,6 +57,12 @@ public class LifeUserService extends ServiceImpl<LifeUserGatewayMapper, LifeUser
     private final LifeUserLogTransactionService lifeUserLogTransactionService;
 
     @Autowired
+    private final SecondUserCreditMapper secondUserCreditMapper;
+
+    @Autowired
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+
+    @Autowired
     private RiskControlProperties riskControlProperties;
 
     @Value("${jwt.expiration-time}")
@@ -156,10 +169,45 @@ public class LifeUserService extends ServiceImpl<LifeUserGatewayMapper, LifeUser
                 List<LifeUserLog> lsit = lifeUserLogTransactionService.getLifeUserLogByDate(startDate, endDate, macIp);
 
                 if (lsit.size() > riskControlProperties.getAccountAbnormal().getRegCount24h() && !isViolation(startDate, endDate, macIp, user.getId())) {
-                    String detailInfo = lsit.stream()
-                            .map(row -> row.getUserId().toString())
-                            .collect(Collectors.joining(","));
-                    alienSecondFeign.recordRiskControlData(user.getId(), 2, "账号异常", macIp, detailInfo);
+
+                    for (LifeUserLog row: lsit) {
+                        List<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                                .eq(SecondUserCreditRecord::getUserId, row.getUserId())
+                                .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getCode())
+                                .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                                .le(SecondUserCreditRecord::getCreatedTime, endDate));
+
+                        if (num.size() <= 0) {
+                            LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+                            queryWrapper.eq(SecondUserCredit::getUserId, row.getUserId())
+                                    .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                            SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper);
+                            int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getScore();
+                            secondUserCredit.setUserPoints(score);
+                            secondUserCreditMapper.updateById(secondUserCredit);
+
+                            SecondUserCreditRecord record = new SecondUserCreditRecord();
+                            record.setUserId(row.getUserId());
+                            record.setPointsType(SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getCode());
+                            record.setPoints(SecondUserCreditScoreEnum.ABNORMAL_ACCOUNTV.getScore());
+                            record.setCurrentScoreCount(score);
+                            record.setCreatedTime(new Date());
+                            secondUserCreditRecordMapper.insert(record);
+
+                            // 小于100分封禁用户
+                            if (score < 100) {
+                                LifeUser user1 = new LifeUser();
+                                user1.setId(row.getUserId());
+                                user1.setIsBanned(1);
+                                lifeUserMapper.updateById(user1);
+                            }
+                        }
+                    }
+
+//                    String detailInfo = lsit.stream()
+//                            .map(row -> row.getUserId().toString())
+//                            .collect(Collectors.joining(","));
+//                    alienSecondFeign.recordRiskControlData(user.getId(), 2, "账号异常", macIp, detailInfo);
                 }
             }
             // 第一次登录,添加用户基础积分

+ 202 - 0
alien-job/src/main/java/shop/alien/job/second/SecondUserCreditJob.java

@@ -0,0 +1,202 @@
+package shop.alien.job.second;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
+import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.mapper.second.SecondUserCreditDateRecordMapper;
+import shop.alien.mapper.second.SecondUserCreditRecordMapper;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SecondUserCreditJob {
+
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+    private final SecondUserCreditDateRecordMapper secondUserCreditDateRecordMapper;
+
+    @XxlJob("sumUserCredit")
+    public void sumUserCredit() {
+        log.info("开始执行用户积分任务");
+        // 计算每个用户从有数据的第一天开始,逐日计算积分
+        // 如果表中已经有该用户对应日期的数据,则跳过不计算
+        // 存到数据库second_user_credit_date_record表中
+
+        try {
+            // 获取当天的开始时间(作为计算的结束日期)
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            Date todayStart = calendar.getTime();
+
+            calendar.set(Calendar.HOUR_OF_DAY, 23);
+            calendar.set(Calendar.MINUTE, 59);
+            calendar.set(Calendar.SECOND, 59);
+            calendar.set(Calendar.MILLISECOND, 999);
+            Date todayEnd = calendar.getTime();
+
+            log.info("开始处理用户积分,计算截止日期:{}", todayStart);
+
+            // 获取所有有积分记录的用户ID
+            LambdaQueryWrapper<SecondUserCreditRecord> userQuery = new LambdaQueryWrapper<>();
+            userQuery.select(SecondUserCreditRecord::getUserId)
+                    .eq(SecondUserCreditRecord::getDeleteFlag, 0)
+                    .groupBy(SecondUserCreditRecord::getUserId);
+            List<SecondUserCreditRecord> userRecords = secondUserCreditRecordMapper.selectList(userQuery);
+            Set<Integer> allUserIds = userRecords.stream()
+                    .map(SecondUserCreditRecord::getUserId)
+                    .collect(Collectors.toSet());
+
+            log.info("找到有积分记录的用户总数:{}", allUserIds.size());
+
+            int successCount = 0;
+            int skipCount = 0;
+            int failCount = 0;
+
+            // 为每个用户从有数据的第一天开始计算
+            for (Integer userId : allUserIds) {
+                try {
+                    // 查找用户最早的积分记录日期
+                    LambdaQueryWrapper<SecondUserCreditRecord> firstRecordQuery = new LambdaQueryWrapper<>();
+                    firstRecordQuery.eq(SecondUserCreditRecord::getUserId, userId)
+                            .eq(SecondUserCreditRecord::getDeleteFlag, 0)
+                            .orderByAsc(SecondUserCreditRecord::getCreatedTime)
+                            .last("LIMIT 1");
+                    SecondUserCreditRecord firstRecord = secondUserCreditRecordMapper.selectOne(firstRecordQuery);
+
+                    if (firstRecord == null || firstRecord.getCreatedTime() == null) {
+                        log.debug("用户 {} 没有找到有效的积分记录,跳过", userId);
+                        continue;
+                    }
+
+                    // 获取用户最早记录日期(作为第一天)
+                    Date firstRecordDate = firstRecord.getCreatedTime();
+                    Calendar firstCal = Calendar.getInstance();
+                    firstCal.setTime(firstRecordDate);
+                    firstCal.set(Calendar.HOUR_OF_DAY, 0);
+                    firstCal.set(Calendar.MINUTE, 0);
+                    firstCal.set(Calendar.SECOND, 0);
+                    firstCal.set(Calendar.MILLISECOND, 0);
+                    Date firstDate = firstCal.getTime();
+
+                    log.debug("用户 {} 最早记录日期:{},开始逐日计算", userId, firstDate);
+
+                    // 查询该用户已有的日期记录(避免重复计算)
+                    LambdaQueryWrapper<SecondUserCreditDateRecord> existingQuery = new LambdaQueryWrapper<>();
+                    existingQuery.eq(SecondUserCreditDateRecord::getUserId, userId)
+                            .eq(SecondUserCreditDateRecord::getDeleteFlag, 0)
+                            .ge(SecondUserCreditDateRecord::getRecordDate, firstDate)
+                            .le(SecondUserCreditDateRecord::getRecordDate, todayEnd)
+                            .orderByAsc(SecondUserCreditDateRecord::getRecordDate);
+                    List<SecondUserCreditDateRecord> existingRecords = secondUserCreditDateRecordMapper.selectList(existingQuery);
+                    
+                    // 构建已存在日期的Map(用于快速查找和判断)
+                    Map<String, Integer> existingDatesMap = new HashMap<>();
+                    for (SecondUserCreditDateRecord record : existingRecords) {
+                        Calendar cal = Calendar.getInstance();
+                        cal.setTime(record.getRecordDate());
+                        String dateStr = String.format("%d-%02d-%02d",
+                            cal.get(Calendar.YEAR),
+                            cal.get(Calendar.MONTH) + 1,
+                            cal.get(Calendar.DAY_OF_MONTH));
+                        existingDatesMap.put(dateStr, record.getTotalPoints());
+                    }
+
+                    // 查询该用户所有的积分记录(用于计算每天的总积分)
+                    LambdaQueryWrapper<SecondUserCreditRecord> allRecordsQuery = new LambdaQueryWrapper<>();
+                    allRecordsQuery.eq(SecondUserCreditRecord::getUserId, userId)
+                            .eq(SecondUserCreditRecord::getDeleteFlag, 0)
+                            .ge(SecondUserCreditRecord::getCreatedTime, firstDate)
+                            .le(SecondUserCreditRecord::getCreatedTime, todayEnd)
+                            .orderByAsc(SecondUserCreditRecord::getCreatedTime);
+                    List<SecondUserCreditRecord> allUserRecords = secondUserCreditRecordMapper.selectList(allRecordsQuery);
+
+                    // 将积分记录按日期分组
+                    Map<String, Integer> dailyPointsMap = allUserRecords.stream()
+                            .collect(Collectors.groupingBy(
+                                    record -> {
+                                        Calendar cal = Calendar.getInstance();
+                                        cal.setTime(record.getCreatedTime());
+                                        return String.format("%d-%02d-%02d",
+                                            cal.get(Calendar.YEAR),
+                                            cal.get(Calendar.MONTH) + 1,
+                                            cal.get(Calendar.DAY_OF_MONTH));
+                                    },
+                                    Collectors.summingInt(SecondUserCreditRecord::getPoints)
+                            ));
+
+                    // 从第一天开始,逐日计算到当天
+                    Calendar currentCal = Calendar.getInstance();
+                    currentCal.setTime(firstDate);
+                    Calendar endCal = Calendar.getInstance();
+                    endCal.setTime(todayEnd);
+                    endCal.set(Calendar.HOUR_OF_DAY, 23);
+                    endCal.set(Calendar.MINUTE, 59);
+                    endCal.set(Calendar.SECOND, 59);
+                    endCal.set(Calendar.MILLISECOND, 999);
+
+                    // 从第一天开始,逐日计算
+                    int accumulatedPoints = 0;
+                    
+                    while (!currentCal.after(endCal)) {
+                        Date currentDate = currentCal.getTime();
+                        String currentDateStr = String.format("%d-%02d-%02d",
+                            currentCal.get(Calendar.YEAR),
+                            currentCal.get(Calendar.MONTH) + 1,
+                            currentCal.get(Calendar.DAY_OF_MONTH));
+
+                        // 检查该日期是否已存在记录,如果存在则跳过
+                        if (existingDatesMap.containsKey(currentDateStr)) {
+                            // 已存在记录,更新累积积分为该日期的积分值,用于后续日期的计算
+                            accumulatedPoints = existingDatesMap.get(currentDateStr);
+                            skipCount++;
+                            currentCal.add(Calendar.DAY_OF_YEAR, 1);
+                            continue;
+                        }
+
+                        // 当天有积分变动,累加到总积分
+                        Integer dayPoints = dailyPointsMap.getOrDefault(currentDateStr, 0);
+                        accumulatedPoints += dayPoints;
+
+                        // 创建该日期的积分记录
+                        SecondUserCreditDateRecord dateRecord = new SecondUserCreditDateRecord();
+                        dateRecord.setUserId(userId);
+                        dateRecord.setRecordDate(currentDate);
+                        dateRecord.setTotalPoints(accumulatedPoints);
+                        dateRecord.setDeleteFlag(0);
+                        dateRecord.setCreatedTime(new Date());
+                        dateRecord.setUpdatedTime(new Date());
+
+                        secondUserCreditDateRecordMapper.insert(dateRecord);
+                        successCount++;
+
+                        log.debug("用户 {} 日期 {} 积分记录已生成,当天变动:{},累计总积分:{}",
+                                userId, currentDateStr, dayPoints, accumulatedPoints);
+
+                        // 移动到下一天
+                        currentCal.add(Calendar.DAY_OF_YEAR, 1);
+                    }
+
+                } catch (Exception e) {
+                    log.error("处理用户积分记录失败,userId={}", userId, e);
+                    failCount++;
+                }
+            }
+
+            log.info("用户积分任务执行完成,成功:{},跳过:{},失败:{}", successCount, skipCount, failCount);
+
+        } catch (Exception e) {
+            log.error("执行用户积分任务失败", e);
+            throw e;
+        }
+    }
+
+}

+ 0 - 1
alien-lawyer/src/main/java/shop/alien/lawyer/controller/AiAutoReview.java

@@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
-import shop.alien.lawyer.service.AiUserAuditTaskService;
 import shop.alien.lawyer.util.ai.AiAuthTokenUtil;
 
 import java.util.Map;

+ 27 - 0
alien-second/src/main/java/shop/alien/second/controller/SecondUserCreditRecordController.java

@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.vo.SecondUserCreditRecordListVo;
 import shop.alien.second.service.SecondUserCreditRecordService;
 
 import java.util.List;
@@ -39,6 +40,19 @@ public class SecondUserCreditRecordController {
             return R.fail("获取用户积分记录列表失败");
         }
     }
+
+    @ApiOperation("根据用户ID查询用户信用分记录")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "timeRange", value = "时间范围:1-近一周,2-近一个月,3-近一年", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/getByUserId")
+    public R<SecondUserCreditRecordListVo> getByUserId(
+            @RequestParam Integer userId,
+            @RequestParam(required = false) Integer timeRange) {
+        return secondUserPointsRecordService.getByUserId(userId, timeRange);
+    }
     
     @ApiOperation("创建积分记录")
     @ApiOperationSupport(order = 2)
@@ -57,4 +71,17 @@ public class SecondUserCreditRecordController {
             return R.fail("积分记录创建失败");
         }
     }
+
+    @ApiOperation("用户观看完学习视频后增加积分")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "learningId", value = "学习视频ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @PostMapping("/addPointsAfterWatchingVideo")
+    public R<String> addPointsAfterWatchingVideo(
+            @RequestParam Integer userId,
+            @RequestParam Integer learningId) {
+        return secondUserPointsRecordService.addPointsAfterWatchingVideo(userId, learningId);
+    }
 }

+ 17 - 0
alien-second/src/main/java/shop/alien/second/service/SecondUserCreditRecordService.java

@@ -1,7 +1,12 @@
 package shop.alien.second.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.SecondUserCredit;
 import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.vo.SecondUserCreditRecordListVo;
+
+import java.util.List;
 
 /**
  * 二手平台用户积分记录服务接口
@@ -21,4 +26,16 @@ public interface SecondUserCreditRecordService extends IService<SecondUserCredit
      * @return 是否创建成功
      */
     boolean createRecord(SecondUserCreditRecord record);
+
+    R<SecondUserCreditRecordListVo> getByUserId(Integer userId, Integer timeRange);
+
+    /**
+     * 用户观看完学习视频后增加积分
+     * @param userId 用户ID
+     * @param learningId 学习视频ID
+     * @return 操作结果
+     */
+    R<String> addPointsAfterWatchingVideo(Integer userId, Integer learningId);
+
+
 }

+ 77 - 2
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -24,6 +24,7 @@ import shop.alien.entity.SecondVideoTask;
 import shop.alien.entity.second.*;
 import shop.alien.entity.second.enums.RiskControlRuleTypeEnum;
 import shop.alien.entity.second.enums.SecondGoodsStatusEnum;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.second.vo.*;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserVo;
@@ -37,6 +38,8 @@ import shop.alien.util.common.VideoUtils;
 import shop.alien.util.common.safe.*;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -166,6 +169,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
 
     private final SecondGoodsAuditService secondGoodsAuditService;
 
+    private final SecondUserCreditMapper secondUserCreditMapper;
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+
     /**
      * 获取商品操作记录详情(管理后台使用)
      * @param recordId 商品操作记录ID
@@ -700,7 +706,41 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 如果发布数量超过限制,记录风控数据
         if (sameCategoryCount > publishLimit) {
             // "异常发布-同类商品发布频率"
-            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getRuleType(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getDescription(), goods.getId().toString(),json);
+//            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getRuleType(), RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getDescription(), goods.getId().toString(),json);
+
+            String startDate = LocalDateTime.now().minusHours(24L).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            String endDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            List<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                    .eq(SecondUserCreditRecord::getUserId, goods.getUserId())
+                    .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.TRADING_FRAUD.getCode())
+                    .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                    .le(SecondUserCreditRecord::getCreatedTime, endDate));
+            if (num.size() <= 0) {
+                LambdaQueryWrapper<SecondUserCredit> queryWrapper1 = new LambdaQueryWrapper<>();
+                queryWrapper1.eq(SecondUserCredit::getUserId, goods.getUserId())
+                        .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper1);
+                int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.TRADING_FRAUD.getScore();
+                secondUserCredit.setUserPoints(score);
+                secondUserCreditMapper.updateById(secondUserCredit);
+
+                SecondUserCreditRecord record = new SecondUserCreditRecord();
+                record.setUserId(goods.getUserId());
+                record.setPointsType(SecondUserCreditScoreEnum.TRADING_FRAUD.getCode());
+                record.setPoints(SecondUserCreditScoreEnum.TRADING_FRAUD.getScore());
+                record.setCurrentScoreCount(score);
+                record.setCreatedTime(new Date());
+                secondUserCreditRecordMapper.insert(record);
+
+                // 小于100分封禁用户
+                if (score < 100) {
+                    LifeUser user = new LifeUser();
+                    user.setId(goods.getUserId());
+                    user.setIsBanned(1);
+                    lifeUserMapper.updateById(user);
+                }
+            }
+
             return false;
         }
         return true;
@@ -745,7 +785,42 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 如果发布数量超过限制,记录风控数据
         if (sameCategoryCount > sameCategoryLimit) {
             // "异常发布-同类商品发布频率"
-            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getRuleType(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getDescription(), goods.getId().toString(),json);
+//            riskControlService.recordRiskControlData(goods.getUserId(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getRuleType(), RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getDescription(), goods.getId().toString(),json);
+
+            String startDate = LocalDateTime.now().minusHours(24L).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            String endDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            List<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                    .eq(SecondUserCreditRecord::getUserId, goods.getUserId())
+                    .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getCode())
+                    .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                    .le(SecondUserCreditRecord::getCreatedTime, endDate));
+            if (num.size() <= 0) {
+                LambdaQueryWrapper<SecondUserCredit> queryWrapper1 = new LambdaQueryWrapper<>();
+                queryWrapper1.eq(SecondUserCredit::getUserId, goods.getUserId())
+                        .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper1);
+                int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore();
+                secondUserCredit.setUserPoints(score);
+                secondUserCreditMapper.updateById(secondUserCredit);
+
+                SecondUserCreditRecord record = new SecondUserCreditRecord();
+                record.setUserId(goods.getUserId());
+                record.setPointsType(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getCode());
+                record.setPoints(SecondUserCreditScoreEnum.ABNORMAL_RELEASE.getScore());
+                record.setCurrentScoreCount(score);
+                record.setCreatedTime(new Date());
+                secondUserCreditRecordMapper.insert(record);
+
+                // 小于100分封禁用户
+                if (score < 100) {
+                    LifeUser user = new LifeUser();
+                    user.setId(goods.getUserId());
+                    user.setIsBanned(1);
+                    lifeUserMapper.updateById(user);
+                }
+            }
+
+
             return false;
         }
         return true;

+ 44 - 9
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -21,6 +21,7 @@ import shop.alien.config.properties.RiskControlProperties;
 import shop.alien.config.redis.BaseRedisService;
 import shop.alien.entity.result.BusinessException;
 import shop.alien.entity.second.*;
+import shop.alien.entity.second.enums.SecondUserCreditScoreEnum;
 import shop.alien.entity.second.vo.SecondEntrustUserDTO;
 import shop.alien.entity.store.*;
 import shop.alien.mapper.second.SecondRiskControlRecordMapper;
@@ -37,6 +38,7 @@ import shop.alien.second.service.SecondTradeRecordService;
 import shop.alien.util.common.JwtUtil;
 
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -321,15 +323,48 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             wrapper.gt(SecondTradeRecord::getTransactionAmount, riskControlProperties.getMoneyLaundering().getAmountThreshold());
             List<SecondTradeRecord> recordList = secondTradeRecordMapper.selectList(wrapper);
             if (recordList.size() > riskControlProperties.getMoneyLaundering().getDailyCount()) {
-                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();
-                riskControlRecord.setRuleType(1);
-                riskControlRecord.setUserId(trade.getSellerId());
-                riskControlRecord.setBusinessId(String.valueOf(trade.getSellerId()));
-                riskControlRecord.setRuleName(riskControlProperties.getMoneyLaundering().getRiskType());
-                JSONArray detailInfo = new JSONArray();
-                detailInfo.addAll(recordList.stream().map(SecondTradeRecord::getId).collect(Collectors.toList()));
-                riskControlRecord.setDetailInfo(detailInfo.toJSONString());
-                secondRiskControlRecordMapper.insert(riskControlRecord);
+                String startDate = LocalDateTime.now().minusHours(24L).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                String endDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                List<SecondUserCreditRecord> num = secondUserCreditRecordMapper.selectList(new LambdaQueryWrapper<SecondUserCreditRecord>()
+                        .eq(SecondUserCreditRecord::getUserId, trade.getSellerId())
+                        .eq(SecondUserCreditRecord::getPointsType, SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getCode())
+                        .ge(SecondUserCreditRecord::getCreatedTime, startDate)
+                        .le(SecondUserCreditRecord::getCreatedTime, endDate));
+                if (num.size() <= 0) {
+                    LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.eq(SecondUserCredit::getUserId, trade.getSellerId())
+                            .orderByDesc(SecondUserCredit::getCreatedTime).last("LIMIT 1");
+                    SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper);
+                    int score = secondUserCredit.getUserPoints() + SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getScore();
+                    secondUserCredit.setUserPoints(score);
+                    secondUserCreditMapper.updateById(secondUserCredit);
+
+                    SecondUserCreditRecord record = new SecondUserCreditRecord();
+                    record.setUserId(trade.getSellerId());
+                    record.setPointsType(SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getCode());
+                    record.setPoints(SecondUserCreditScoreEnum.SUSPECTED_OF_MONEY_LAUNDERING.getScore());
+                    record.setCurrentScoreCount(score);
+                    record.setCreatedTime(new Date());
+                    secondUserCreditRecordMapper.insert(record);
+
+                    // 小于100分封禁用户
+                    if (score < 100) {
+                        LifeUser user = new LifeUser();
+                        user.setId(trade.getSellerId());
+                        user.setIsBanned(1);
+                        lifeUserMapper.updateById(user);
+                    }
+                }
+
+//                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();
+//                riskControlRecord.setRuleType(1);
+//                riskControlRecord.setUserId(trade.getSellerId());
+//                riskControlRecord.setBusinessId(String.valueOf(trade.getSellerId()));
+//                riskControlRecord.setRuleName(riskControlProperties.getMoneyLaundering().getRiskType());
+//                JSONArray detailInfo = new JSONArray();
+//                detailInfo.addAll(recordList.stream().map(SecondTradeRecord::getId).collect(Collectors.toList()));
+//                riskControlRecord.setDetailInfo(detailInfo.toJSONString());
+//                secondRiskControlRecordMapper.insert(riskControlRecord);
             }
 
             return true;

+ 182 - 1
alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditRecordServiceImpl.java

@@ -5,10 +5,21 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.SecondUserCredit;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
 import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.second.vo.SecondUserCreditRecordListVo;
+import shop.alien.entity.store.LifeUserLearningRecord;
+import shop.alien.entity.store.LifeUserLearningVideo;
+import shop.alien.mapper.LifeUserLearningRecordMapper;
+import shop.alien.mapper.LifeUserLearningVideoMapper;
+import shop.alien.mapper.second.SecondUserCreditDateRecordMapper;
+import shop.alien.mapper.second.SecondUserCreditMapper;
 import shop.alien.mapper.second.SecondUserCreditRecordMapper;
 import shop.alien.second.service.SecondUserCreditRecordService;
 
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
@@ -21,7 +32,11 @@ import java.util.List;
 public class SecondUserCreditRecordServiceImpl extends ServiceImpl<SecondUserCreditRecordMapper, SecondUserCreditRecord> implements SecondUserCreditRecordService {
     
     private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
-    
+    private final SecondUserCreditMapper secondUserCreditMapper;
+    private final SecondUserCreditDateRecordMapper secondUserCreditDateRecordMapper;
+    private final LifeUserLearningVideoMapper lifeUserLearningVideoMapper;
+    private final LifeUserLearningRecordMapper lifeUserLearningRecordMapper;
+
     /**
      * 根据用户ID获取积分记录列表
      * @param userId 用户ID
@@ -56,4 +71,170 @@ public class SecondUserCreditRecordServiceImpl extends ServiceImpl<SecondUserCre
             return false;
         }
     }
+
+    @Override
+    public R<SecondUserCreditRecordListVo> getByUserId(Integer userId, Integer timeRange) {
+        log.info("SecondUserCreditRecordServiceImpl.getByUserId, userId={}, timeRange={}", userId, timeRange);
+        LambdaQueryWrapper<SecondUserCreditRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondUserCreditRecord::getUserId, userId);
+
+        // 根据时间范围过滤
+        Date startTime = null;
+
+
+        queryWrapper.orderByDesc(SecondUserCreditRecord::getCreatedTime);
+        // 下面全部 忽略时间范围 需求变动再去添加
+        List<SecondUserCreditRecord> recordsChange = this.list(queryWrapper);
+
+        if (timeRange != null) {
+            startTime = calculateStartTime(timeRange);
+            if (startTime != null) {
+                queryWrapper.ge(SecondUserCreditRecord::getCreatedTime, startTime);
+            }
+        }
+        
+        // 查询日期积分记录,按照相同的时间范围筛选
+        LambdaQueryWrapper<SecondUserCreditDateRecord> dateRecordQueryWrapper = new LambdaQueryWrapper<>();
+        dateRecordQueryWrapper.eq(SecondUserCreditDateRecord::getUserId, userId);
+        
+        if (startTime != null) {
+            // 将开始时间转换为日期(忽略时间部分)
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(startTime);
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            Date startDate = cal.getTime();
+            dateRecordQueryWrapper.ge(SecondUserCreditDateRecord::getRecordDate, startDate);
+        }
+        
+        dateRecordQueryWrapper.orderByDesc(SecondUserCreditDateRecord::getRecordDate);
+        List<SecondUserCreditDateRecord> dateRecords = secondUserCreditDateRecordMapper.selectList(dateRecordQueryWrapper);
+        
+        // 查询用户积分
+        Integer userPoints = null;
+        SecondUserCredit secondUserCredit = this.getUserCreditByUserId(userId);
+        if (secondUserCredit != null) {
+            userPoints = secondUserCredit.getUserPoints();
+        }
+        
+        // 构建返回对象
+        SecondUserCreditRecordListVo result = new SecondUserCreditRecordListVo();
+        result.setRecordsChange(recordsChange);
+        result.setDateRecords(dateRecords);
+        result.setUserPoints(userPoints);
+        return R.data(result);
+    }
+
+    /**
+     * 根据时间范围计算开始时间
+     * @param timeRange 时间范围:1-近一周,2-近一个月,3-近一年
+     * @return 开始时间
+     */
+    private Date calculateStartTime(Integer timeRange) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        switch (timeRange) {
+            case 1: // 近一周
+                calendar.add(Calendar.DAY_OF_YEAR, -7);
+                break;
+            case 2: // 近一个月
+                calendar.add(Calendar.MONTH, -1);
+                break;
+            case 3: // 近一年
+                calendar.add(Calendar.YEAR, -1);
+                break;
+            default:
+                return null;
+        }
+
+        return calendar.getTime();
+    }
+
+    @Override
+    public R<String> addPointsAfterWatchingVideo(Integer userId, Integer learningId) {
+        log.info("用户观看完学习视频后增加积分,userId={}, learningId={}", userId, learningId);
+        
+        try {
+            // 1. 查询学习视频信息,获取奖励分数
+            LifeUserLearningVideo learningVideo = lifeUserLearningVideoMapper.selectById(learningId);
+            if (learningVideo == null) {
+                return R.fail("学习视频不存在");
+            }
+            
+            Integer score = learningVideo.getScore();
+            if (score == null || score <= 0) {
+                return R.fail("该学习视频没有奖励分数");
+            }
+            
+            // 2. 检查是否已经观看过(避免重复奖励)
+            LambdaQueryWrapper<LifeUserLearningRecord> recordQueryWrapper = new LambdaQueryWrapper<>();
+            recordQueryWrapper.eq(LifeUserLearningRecord::getUserId, userId)
+                    .eq(LifeUserLearningRecord::getLearningId, learningId)
+                    .eq(LifeUserLearningRecord::getDeleteFlag, 0);
+            long count = lifeUserLearningRecordMapper.selectCount(recordQueryWrapper);
+            if (count > 0) {
+                return R.fail("您已经观看过该视频,无法重复获得奖励");
+            }
+            
+            // 3. 查询或创建用户积分记录
+            SecondUserCredit userCredit = this.getUserCreditByUserId(userId);
+            if (userCredit == null) {
+                // 如果用户没有积分记录,先创建
+                userCredit = new SecondUserCredit();
+                userCredit.setUserId(userId);
+                userCredit.setUserPoints(0);
+                userCredit.setDeleteFlag(0);
+                userCredit.setCreatedTime(new Date());
+                userCredit.setUpdatedTime(new Date());
+                secondUserCreditMapper.insert(userCredit);
+            }
+            
+            // 4. 更新用户积分
+            secondUserCreditMapper.updatePointsByUserId(userId, score);
+            
+            // 5. 添加积分记录(pointsType = 8 表示学习视频奖励)
+            SecondUserCreditRecord creditRecord = new SecondUserCreditRecord();
+            creditRecord.setUserId(userId);
+            creditRecord.setPoints(score);
+            creditRecord.setPointsType(8); // 8-学习视频奖励
+            creditRecord.setDeleteFlag(0);
+            creditRecord.setCreatedTime(new Date());
+            creditRecord.setUpdatedTime(new Date());
+            secondUserCreditRecordMapper.insert(creditRecord);
+            
+            // 6. 添加学习记录
+            LifeUserLearningRecord learningRecord = new LifeUserLearningRecord();
+            learningRecord.setUserId(userId);
+            learningRecord.setLearningId(learningId);
+            learningRecord.setDeleteFlag(0);
+            learningRecord.setCreatedTime(new Date());
+            learningRecord.setUpdatedTime(new Date());
+            lifeUserLearningRecordMapper.insert(learningRecord);
+            
+            log.info("用户观看完学习视频后增加积分成功,userId={}, learningId={}, score={}", userId, learningId, score);
+            return R.success("观看视频成功,获得" + score + "积分");
+            
+        } catch (Exception e) {
+            log.error("用户观看完学习视频后增加积分失败,userId={}, learningId={}", userId, learningId, e);
+            return R.fail("操作失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 根据用户ID获取用户积分信息
+     * @param userId 用户ID
+     * @return 用户积分信息
+     */
+    private SecondUserCredit getUserCreditByUserId(Integer userId) {
+        LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondUserCredit::getUserId, userId)
+                .eq(SecondUserCredit::getDeleteFlag, 0);
+        return secondUserCreditMapper.selectOne(queryWrapper);
+    }
 }

+ 4 - 3
alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditServiceImpl.java

@@ -14,6 +14,7 @@ import shop.alien.entity.second.vo.SecondUserCreditVo;
 import shop.alien.mapper.second.SecondUserCreditMapper;
 import shop.alien.mapper.second.SecondUserCreditRecordMapper;
 import shop.alien.second.service.SecondGoodsService;
+import shop.alien.second.service.SecondUserCreditRecordService;
 import shop.alien.second.service.SecondUserCreditService;
 
 import java.util.Date;
@@ -27,7 +28,7 @@ import java.util.Date;
 public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMapper, SecondUserCredit> implements SecondUserCreditService {
     
     private final SecondUserCreditMapper secondUserCreditMapper;
-    private final SecondUserCreditRecordServiceImpl serviceImpl;
+    private final SecondUserCreditRecordService secondUserCreditRecordService;
     private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
 
     /**
@@ -116,7 +117,7 @@ public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMap
                     record.setUserId(userId);
                     record.setPoints(initialPoints);
                     record.setPointsType(pointsType);
-                    serviceImpl.createRecord(record);
+                    secondUserCreditRecordService.createRecord(record);
                     return true;
                 }
 
@@ -205,7 +206,7 @@ public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMap
             record.setUserId(userId);
             record.setPoints(points);
             record.setPointsType(pointsType);
-            serviceImpl.createRecord(record);
+            secondUserCreditRecordMapper.insert(record);
 
             return result > 0;
         } catch (Exception e) {

+ 9 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -114,4 +114,13 @@ public class LifeMessageController {
         log.info("LifeMessageController.getTalkedUserList");
         return R.data(lifeMessageService.getTalkedUserList());
     }
+
+    @ApiOperation("聊天用户是否已被封禁")
+    @ApiOperationSupport(order = 11)
+    @GetMapping("/isBanned")
+    public R<Boolean> isBanned(String phoneId) throws Exception {
+        log.info("LifeMessageController.isBanned");
+        return R.data(lifeMessageService.isBanned(phoneId));
+    }
+
 }

+ 66 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeUserBenefitsController.java

@@ -0,0 +1,66 @@
+package shop.alien.store.controller;
+
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.StorePlatformBenefitsVo;
+import shop.alien.store.service.StorePlatformBenefitsService;
+
+import java.util.List;
+
+@Slf4j
+@Api(tags = {"福利管理"})
+@ApiSort(10)
+@CrossOrigin
+@RestController
+@RequestMapping("/userBenefits")
+@RequiredArgsConstructor
+public class LifeUserBenefitsController {
+
+    private final StorePlatformBenefitsService benefitsService;
+
+
+    @ApiOperation("领取福利(优惠券或U币)")
+    @ApiOperationSupport(order = 7)
+    @PostMapping("/receive")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "福利ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    @Transactional
+    public R<String> receiveBenefits(@RequestParam Integer id, @RequestParam(required = false) Integer userId) {
+        log.info("StorePlatformBenefitsController.receiveBenefits - id={},userId={}", id,userId);
+        try {
+            String result = benefitsService.receiveBenefits(id,userId);
+            return R.success(result);
+        } catch (RuntimeException e) {
+            log.error("StorePlatformBenefitsController.receiveBenefits - error: {}", e.getMessage());
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("StorePlatformBenefitsController.receiveBenefits - error: ", e);
+            return R.fail("领取失败,请稍后重试");
+        }
+    }
+
+    // 查看所以福利,区分可领取和已领取
+    @ApiOperation("查看所有福利")
+    @ApiOperationSupport(order = 8)
+    @GetMapping("/list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+    })
+    public R<List<StorePlatformBenefitsVo>> listBenefits(@RequestParam Integer userId) {
+        log.info("StorePlatformBenefitsController.listBenefits - userId={}", userId);
+        try {
+            List<StorePlatformBenefitsVo> benefits = benefitsService.listBenefits(userId);
+            return R.data(benefits);
+        } catch (Exception e) {
+            log.error("StorePlatformBenefitsController.listBenefits - error: ", e);
+            return R.fail("查询失败,请稍后重试");
+        }
+    }
+}

+ 84 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeUserCreditScoreInfoController.java

@@ -0,0 +1,84 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserCreditScoreInfo;
+import shop.alien.store.service.LifeUserCreditScoreInfoService;
+
+@Api(tags = {"用户信用分信息"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/lifeUserCreditScoreInfo")
+@RequiredArgsConstructor
+public class LifeUserCreditScoreInfoController {
+
+    private final LifeUserCreditScoreInfoService lifeUserCreditScoreInfoService;
+
+    @ApiOperation("新增用户信用分信息")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody LifeUserCreditScoreInfo lifeUserCreditScoreInfo) {
+        return lifeUserCreditScoreInfoService.add(lifeUserCreditScoreInfo);
+    }
+
+    @ApiOperation("根据ID删除用户信用分信息")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Integer id) {
+        return lifeUserCreditScoreInfoService.deleteById(id);
+    }
+
+    @ApiOperation("更新用户信用分信息")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody LifeUserCreditScoreInfo lifeUserCreditScoreInfo) {
+        return lifeUserCreditScoreInfoService.update(lifeUserCreditScoreInfo);
+    }
+
+    @ApiOperation("根据ID查询用户信用分信息")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<LifeUserCreditScoreInfo> getById(@RequestParam Integer id) {
+        return lifeUserCreditScoreInfoService.getInfoById(id);
+    }
+
+    @ApiOperation("根据用户ID查询用户信用分信息")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getByUserId")
+    public R<LifeUserCreditScoreInfo> getByUserId(@RequestParam Integer userId) {
+        return lifeUserCreditScoreInfoService.getByUserId(userId);
+    }
+
+    @ApiOperation("分页查询用户信用分信息列表")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<LifeUserCreditScoreInfo>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) Integer userId) {
+        return lifeUserCreditScoreInfoService.list(pageNum, pageSize, userId);
+    }
+}

+ 98 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeUserLearningRecordController.java

@@ -0,0 +1,98 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningRecord;
+import shop.alien.entity.store.vo.LifeUserLearningVideoVo;
+import shop.alien.store.service.LifeUserLearningRecordService;
+
+import java.util.List;
+
+@Api(tags = {"用户学习记录"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/lifeUserLearningRecord")
+@RequiredArgsConstructor
+public class LifeUserLearningRecordController {
+
+    private final LifeUserLearningRecordService lifeUserLearningRecordService;
+
+    @ApiOperation("新增用户学习记录")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody LifeUserLearningRecord lifeUserLearningRecord) {
+        return lifeUserLearningRecordService.add(lifeUserLearningRecord);
+    }
+
+    @ApiOperation("根据ID删除用户学习记录")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Integer id) {
+        return lifeUserLearningRecordService.deleteById(id);
+    }
+
+    @ApiOperation("更新用户学习记录")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody LifeUserLearningRecord lifeUserLearningRecord) {
+        return lifeUserLearningRecordService.update(lifeUserLearningRecord);
+    }
+
+    @ApiOperation("根据ID查询用户学习记录")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<LifeUserLearningRecord> getById(@RequestParam Integer id) {
+        return lifeUserLearningRecordService.getInfoById(id);
+    }
+
+    @ApiOperation("根据用户ID查询用户学习记录")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getByUserId")
+    public R<LifeUserLearningRecord> getByUserId(@RequestParam Integer userId) {
+        return lifeUserLearningRecordService.getByUserId(userId);
+    }
+
+    @ApiOperation("分页查询用户学习记录列表")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<LifeUserLearningRecord>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) Integer userId) {
+        return lifeUserLearningRecordService.list(pageNum, pageSize, userId);
+    }
+
+    @ApiOperation("获取视频学习列表")
+    @ApiOperationSupport(order = 7)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getListByUserId")
+    public R<List<LifeUserLearningVideoVo>> getListByUserId(@RequestParam Integer userId) {
+        return lifeUserLearningRecordService.getListByUserId(userId);
+    }
+}
+

+ 75 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeUserLearningVideoController.java

@@ -0,0 +1,75 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningVideo;
+import shop.alien.store.service.LifeUserLearningVideoService;
+
+@Api(tags = {"学习视频"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/lifeUserLearningVideo")
+@RequiredArgsConstructor
+public class LifeUserLearningVideoController {
+
+    private final LifeUserLearningVideoService lifeUserLearningVideoService;
+
+    @ApiOperation("新增学习视频")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody LifeUserLearningVideo lifeUserLearningVideo) {
+        return lifeUserLearningVideoService.add(lifeUserLearningVideo);
+    }
+
+    @ApiOperation("根据ID删除学习视频")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Integer id) {
+        return lifeUserLearningVideoService.deleteById(id);
+    }
+
+    @ApiOperation("更新学习视频")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody LifeUserLearningVideo lifeUserLearningVideo) {
+        return lifeUserLearningVideoService.update(lifeUserLearningVideo);
+    }
+
+    @ApiOperation("根据ID查询学习视频")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<LifeUserLearningVideo> getById(@RequestParam Integer id) {
+        return lifeUserLearningVideoService.getInfoById(id);
+    }
+
+    @ApiOperation("分页查询学习视频列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "name", value = "名称", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<LifeUserLearningVideo>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) String name) {
+        return lifeUserLearningVideoService.list(pageNum, pageSize, name);
+    }
+}
+

+ 116 - 0
alien-store/src/main/java/shop/alien/store/controller/StorePlatformBenefitsController.java

@@ -0,0 +1,116 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StorePlatformBenefits;
+import shop.alien.entity.store.vo.StorePlatformBenefitsVo;
+import shop.alien.store.service.StorePlatformBenefitsService;
+
+/**
+ * 福利管理 前端控制器
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+@Slf4j
+@Api(tags = {"福利管理"})
+@ApiSort(10)
+@CrossOrigin
+@RestController
+@RequestMapping("/benefits")
+@RequiredArgsConstructor
+public class StorePlatformBenefitsController {
+
+    private final StorePlatformBenefitsService benefitsService;
+
+    @ApiOperation("分页查询福利列表")
+    @ApiOperationSupport(order = 1)
+    @GetMapping("/page")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "int", paramType = "query", defaultValue = "1"),
+            @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", defaultValue = "10"),
+            @ApiImplicitParam(name = "type", value = "类型:1=优惠券,2=U币", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态:0待审核/1审核拒绝/2审核通过", dataType = "int", paramType = "query")
+    })
+    public R<IPage<StorePlatformBenefitsVo>> getPage(
+            @RequestParam(defaultValue = "1") int pageNum,
+            @RequestParam(defaultValue = "10") int pageSize,
+            @RequestParam(required = false) Integer type,
+            @RequestParam(required = false) String name) {
+        log.info("StorePlatformBenefitsController.getPage - pageNum={}, pageSize={}, type={}, name={}", pageNum, pageSize, type, name);
+        return R.data(benefitsService.getPage(pageNum, pageSize, type, name));
+    }
+
+    @ApiOperation("根据ID查询详情")
+    @ApiOperationSupport(order = 2)
+    @GetMapping("/detail/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "path", required = true)
+    })
+    public R<StorePlatformBenefits> getDetail(@PathVariable Integer id) {
+        log.info("StorePlatformBenefitsController.getDetail - id={}", id);
+        return R.data(benefitsService.getById(id));
+    }
+
+    @ApiOperation("新增福利")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody StorePlatformBenefits benefits) {
+        log.info("StorePlatformBenefitsController.add - benefits={}", benefits);
+        int result = benefitsService.add(benefits);
+        if (result > 0) {
+            return R.success("新增成功");
+        }
+        return R.fail("新增失败");
+    }
+
+    @ApiOperation("修改福利")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody StorePlatformBenefits benefits) {
+        log.info("StorePlatformBenefitsController.update - benefits={}", benefits);
+        int result = benefitsService.update(benefits);
+        if (result > 0) {
+            return R.success("修改成功");
+        }
+        return R.fail("修改失败");
+    }
+
+    @ApiOperation("删除福利")
+    @ApiOperationSupport(order = 5)
+    @PostMapping("/delete/{id}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "path", required = true)
+    })
+    public R<String> delete(@PathVariable Integer id) {
+        log.info("StorePlatformBenefitsController.delete - id={}", id);
+        int result = benefitsService.delete(id);
+        if (result > 0) {
+            return R.success("删除成功");
+        }
+        return R.fail("删除失败");
+    }
+
+    @ApiOperation("审核福利")
+    @ApiOperationSupport(order = 6)
+    @PostMapping("/audit")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "status", value = "审核状态:1审核拒绝/2审核通过", dataType = "int", paramType = "query", required = true)
+    })
+    public R<String> audit(@RequestParam Integer id, @RequestParam Integer status) {
+        log.info("StorePlatformBenefitsController.audit - id={}, status={}", id, status);
+        int result = benefitsService.audit(id, status);
+        if (result > 0) {
+            return R.success("审核成功");
+        }
+        return R.fail("审核失败");
+    }
+
+
+}
+

+ 2 - 0
alien-store/src/main/java/shop/alien/store/service/LifeMessageService.java

@@ -30,4 +30,6 @@ public interface LifeMessageService extends IService<LifeMessage> {
     int getAllNoReadCount(String receiverId) throws Exception;
 
     List<LifeFansVo> getTalkedUserList() throws Exception;
+
+    boolean isBanned(String phoneId);
 }

+ 39 - 0
alien-store/src/main/java/shop/alien/store/service/LifeUserCreditScoreInfoService.java

@@ -0,0 +1,39 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserCreditScoreInfo;
+
+public interface LifeUserCreditScoreInfoService extends IService<LifeUserCreditScoreInfo> {
+
+    /**
+     * 新增用户信用分信息
+     */
+    R<String> add(LifeUserCreditScoreInfo lifeUserCreditScoreInfo);
+
+    /**
+     * 根据ID删除用户信用分信息
+     */
+    R<String> deleteById(Integer id);
+
+    /**
+     * 更新用户信用分信息
+     */
+    R<String> update(LifeUserCreditScoreInfo lifeUserCreditScoreInfo);
+
+    /**
+     * 根据ID查询用户信用分信息
+     */
+    R<LifeUserCreditScoreInfo> getInfoById(Integer id);
+
+    /**
+     * 根据用户ID查询用户信用分信息
+     */
+    R<LifeUserCreditScoreInfo> getByUserId(Integer userId);
+
+    /**
+     * 分页查询用户信用分信息列表
+     */
+    R<IPage<LifeUserCreditScoreInfo>> list(Integer pageNum, Integer pageSize, Integer userId);
+}

+ 45 - 0
alien-store/src/main/java/shop/alien/store/service/LifeUserLearningRecordService.java

@@ -0,0 +1,45 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningRecord;
+import shop.alien.entity.store.vo.LifeUserLearningVideoVo;
+
+import java.util.List;
+
+public interface LifeUserLearningRecordService extends IService<LifeUserLearningRecord> {
+
+    /**
+     * 新增用户学习记录
+     */
+    R<String> add(LifeUserLearningRecord lifeUserLearningRecord);
+
+    /**
+     * 根据ID删除用户学习记录
+     */
+    R<String> deleteById(Integer id);
+
+    /**
+     * 更新用户学习记录
+     */
+    R<String> update(LifeUserLearningRecord lifeUserLearningRecord);
+
+    /**
+     * 根据ID查询用户学习记录
+     */
+    R<LifeUserLearningRecord> getInfoById(Integer id);
+
+    /**
+     * 根据用户ID查询用户学习记录
+     */
+    R<LifeUserLearningRecord> getByUserId(Integer userId);
+
+    /**
+     * 分页查询用户学习记录列表
+     */
+    R<IPage<LifeUserLearningRecord>> list(Integer pageNum, Integer pageSize, Integer userId);
+
+    R<List<LifeUserLearningVideoVo>> getListByUserId(Integer userId);
+}
+

+ 35 - 0
alien-store/src/main/java/shop/alien/store/service/LifeUserLearningVideoService.java

@@ -0,0 +1,35 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningVideo;
+
+public interface LifeUserLearningVideoService extends IService<LifeUserLearningVideo> {
+
+    /**
+     * 新增学习视频
+     */
+    R<String> add(LifeUserLearningVideo lifeUserLearningVideo);
+
+    /**
+     * 根据ID删除学习视频
+     */
+    R<String> deleteById(Integer id);
+
+    /**
+     * 更新学习视频
+     */
+    R<String> update(LifeUserLearningVideo lifeUserLearningVideo);
+
+    /**
+     * 根据ID查询学习视频
+     */
+    R<LifeUserLearningVideo> getInfoById(Integer id);
+
+    /**
+     * 分页查询学习视频列表
+     */
+    R<IPage<LifeUserLearningVideo>> list(Integer pageNum, Integer pageSize, String name);
+}
+

+ 87 - 0
alien-store/src/main/java/shop/alien/store/service/StorePlatformBenefitsService.java

@@ -0,0 +1,87 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.StorePlatformBenefits;
+import shop.alien.entity.store.vo.StorePlatformBenefitsVo;
+
+import java.util.List;
+
+/**
+ * 福利表 服务类
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+public interface StorePlatformBenefitsService extends IService<StorePlatformBenefits> {
+
+    /**
+     * 分页查询福利列表
+     *
+     * @param page   页码
+     * @param size   每页条数
+     * @param type   类型:1=优惠券,2=U币
+     * @param name 状态:0待审核/1审核拒绝/2审核通过
+     * @return 分页结果
+     */
+    IPage<StorePlatformBenefitsVo> getPage(int page, int size, Integer type, String name);
+
+    /**
+     * 根据ID查询详情
+     *
+     * @param id 主键ID
+     * @return 福利详情
+     */
+    StorePlatformBenefits getById(Integer id);
+
+    /**
+     * 新增福利
+     *
+     * @param benefits 福利信息
+     * @return 新增结果
+     */
+    int add(StorePlatformBenefits benefits);
+
+    /**
+     * 修改福利
+     *
+     * @param benefits 福利信息
+     * @return 修改结果
+     */
+    int update(StorePlatformBenefits benefits);
+
+    /**
+     * 删除福利(逻辑删除)
+     *
+     * @param id 主键ID
+     * @return 删除结果
+     */
+    int delete(Integer id);
+
+    /**
+     * 审核福利
+     *
+     * @param id     主键ID
+     * @param status 审核状态:1审核拒绝/2审核通过
+     * @return 审核结果
+     */
+    int audit(Integer id, Integer status);
+
+    /**
+     * 领取福利(优惠券或U币)
+     *
+     * @param id     福利ID
+     * @param userId 用户ID
+     * @return 领取结果
+     */
+    String receiveBenefits(Integer id, Integer userId);
+
+     /**
+     * 查询用户已领取的福利列表
+     *
+     * @param userId 用户ID
+     * @return 福利列表
+     */
+    List<StorePlatformBenefitsVo> listBenefits(Integer userId);
+}
+

+ 10 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java

@@ -506,4 +506,14 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
         }
     }
 
+    @Override
+    public boolean isBanned(String phoneId) {
+        if (phoneId.startsWith("store_")) {
+            return false;
+        }
+        LambdaQueryWrapper<LifeUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(LifeUser::getUserPhone, phoneId.split("_")[1]);
+        return lifeUserMapper.selectOne(wrapper).getIsBanned() == 1;
+    }
+
 }

+ 107 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserCreditScoreInfoServiceImpl.java

@@ -0,0 +1,107 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.SecondUserCreditRecord;
+import shop.alien.entity.store.LifeUserCreditScoreInfo;
+import shop.alien.mapper.LifeUserCreditScoreInfoMapper;
+import shop.alien.mapper.second.SecondUserCreditRecordMapper;
+import shop.alien.store.service.LifeUserCreditScoreInfoService;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.Objects;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LifeUserCreditScoreInfoServiceImpl extends ServiceImpl<LifeUserCreditScoreInfoMapper, LifeUserCreditScoreInfo> implements LifeUserCreditScoreInfoService {
+
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
+    private final LifeUserCreditScoreInfoMapper lifeUserCreditScoreInfoMapper;
+
+    @Override
+    public R<String> add(LifeUserCreditScoreInfo lifeUserCreditScoreInfo) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.add, param={}", lifeUserCreditScoreInfo);
+        Integer userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+
+        LambdaQueryWrapper<LifeUserCreditScoreInfo> queryWrapperInfo = new LambdaQueryWrapper<>();
+        queryWrapperInfo.eq(LifeUserCreditScoreInfo::getUserId, userId);
+        LifeUserCreditScoreInfo existingInfo = lifeUserCreditScoreInfoMapper.selectOne(queryWrapperInfo);
+        if (null == existingInfo) {
+            lifeUserCreditScoreInfo.setUserId(userId);
+            this.save(lifeUserCreditScoreInfo);
+        } else {
+            lifeUserCreditScoreInfo.setId(existingInfo.getId());
+            this.updateById(lifeUserCreditScoreInfo);
+        }
+
+        LambdaQueryWrapper<SecondUserCreditRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SecondUserCreditRecord::getUserId, userId);
+        queryWrapper.eq(SecondUserCreditRecord::getPointsType, 9);
+        SecondUserCreditRecord existingPoints = secondUserCreditRecordMapper.selectOne(queryWrapper);
+        if (null == existingPoints) {
+            SecondUserCreditRecord record = new SecondUserCreditRecord();
+            record.setUserId(userId);
+            record.setPoints(50);
+            record.setPointsType(9);
+            secondUserCreditRecordMapper.insert(record);
+        }
+
+        return R.success("新增成功");
+    }
+
+    @Override
+    public R<String> deleteById(Integer id) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        if (result) {
+            return R.success("删除成功");
+        }
+        return R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(LifeUserCreditScoreInfo lifeUserCreditScoreInfo) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.update, param={}", lifeUserCreditScoreInfo);
+        boolean result = this.updateById(lifeUserCreditScoreInfo);
+        if (result) {
+            return R.success("更新成功");
+        }
+        return R.fail("更新失败");
+    }
+
+    @Override
+    public R<LifeUserCreditScoreInfo> getInfoById(Integer id) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.getInfoById, id={}", id);
+        LifeUserCreditScoreInfo result = this.getById(id);
+        return R.data(result);
+    }
+
+    @Override
+    public R<LifeUserCreditScoreInfo> getByUserId(Integer userId) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.getByUserId, userId={}", userId);
+        LambdaQueryWrapper<LifeUserCreditScoreInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeUserCreditScoreInfo::getUserId, userId);
+        LifeUserCreditScoreInfo result = this.getOne(queryWrapper);
+        return R.data(result);
+    }
+
+    @Override
+    public R<IPage<LifeUserCreditScoreInfo>> list(Integer pageNum, Integer pageSize, Integer userId) {
+        log.info("LifeUserCreditScoreInfoServiceImpl.list, pageNum={}, pageSize={}, userId={}", pageNum, pageSize, userId);
+        Page<LifeUserCreditScoreInfo> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<LifeUserCreditScoreInfo> queryWrapper = new LambdaQueryWrapper<>();
+        if (userId != null) {
+            queryWrapper.eq(LifeUserCreditScoreInfo::getUserId, userId);
+        }
+        queryWrapper.orderByDesc(LifeUserCreditScoreInfo::getCreatedTime);
+        IPage<LifeUserCreditScoreInfo> result = this.page(page, queryWrapper);
+        return R.data(result);
+    }
+}

+ 92 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserLearningRecordServiceImpl.java

@@ -0,0 +1,92 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningRecord;
+import shop.alien.entity.store.LifeUserLearningVideo;
+import shop.alien.entity.store.vo.LifeUserLearningVideoVo;
+import shop.alien.mapper.LifeUserLearningRecordMapper;
+import shop.alien.mapper.LifeUserLearningVideoMapper;
+import shop.alien.store.service.LifeUserLearningRecordService;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LifeUserLearningRecordServiceImpl extends ServiceImpl<LifeUserLearningRecordMapper, LifeUserLearningRecord> implements LifeUserLearningRecordService {
+
+    private final LifeUserLearningRecordMapper lifeUserLearningRecordMapper;
+    private final LifeUserLearningVideoMapper lifeUserLearningVideoMapper;
+
+    @Override
+    public R<String> add(LifeUserLearningRecord lifeUserLearningRecord) {
+        log.info("LifeUserLearningRecordServiceImpl.add, param={}", lifeUserLearningRecord);
+        boolean result = this.save(lifeUserLearningRecord);
+        if (result) {
+            return R.success("新增成功");
+        }
+        return R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Integer id) {
+        log.info("LifeUserLearningRecordServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        if (result) {
+            return R.success("删除成功");
+        }
+        return R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(LifeUserLearningRecord lifeUserLearningRecord) {
+        log.info("LifeUserLearningRecordServiceImpl.update, param={}", lifeUserLearningRecord);
+        boolean result = this.updateById(lifeUserLearningRecord);
+        if (result) {
+            return R.success("更新成功");
+        }
+        return R.fail("更新失败");
+    }
+
+    @Override
+    public R<LifeUserLearningRecord> getInfoById(Integer id) {
+        log.info("LifeUserLearningRecordServiceImpl.getInfoById, id={}", id);
+        LifeUserLearningRecord result = this.getById(id);
+        return R.data(result);
+    }
+
+    @Override
+    public R<LifeUserLearningRecord> getByUserId(Integer userId) {
+        log.info("LifeUserLearningRecordServiceImpl.getByUserId, userId={}", userId);
+        LambdaQueryWrapper<LifeUserLearningRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeUserLearningRecord::getUserId, userId);
+        LifeUserLearningRecord result = this.getOne(queryWrapper);
+        return R.data(result);
+    }
+
+    @Override
+    public R<IPage<LifeUserLearningRecord>> list(Integer pageNum, Integer pageSize, Integer userId) {
+        log.info("LifeUserLearningRecordServiceImpl.list, pageNum={}, pageSize={}, userId={}", pageNum, pageSize, userId);
+        Page<LifeUserLearningRecord> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<LifeUserLearningRecord> queryWrapper = new LambdaQueryWrapper<>();
+        if (userId != null) {
+            queryWrapper.eq(LifeUserLearningRecord::getUserId, userId);
+        }
+        queryWrapper.orderByDesc(LifeUserLearningRecord::getCreatedTime);
+        IPage<LifeUserLearningRecord> result = this.page(page, queryWrapper);
+        return R.data(result);
+    }
+
+    @Override
+    public R<List<LifeUserLearningVideoVo>> getListByUserId(Integer userId) {
+        return R.data(lifeUserLearningRecordMapper.getListByUserId(userId));
+    }
+}
+

+ 71 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserLearningVideoServiceImpl.java

@@ -0,0 +1,71 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.LifeUserLearningVideo;
+import shop.alien.mapper.LifeUserLearningVideoMapper;
+import shop.alien.store.service.LifeUserLearningVideoService;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LifeUserLearningVideoServiceImpl extends ServiceImpl<LifeUserLearningVideoMapper, LifeUserLearningVideo> implements LifeUserLearningVideoService {
+
+    @Override
+    public R<String> add(LifeUserLearningVideo lifeUserLearningVideo) {
+        log.info("LifeUserLearningVideoServiceImpl.add, param={}", lifeUserLearningVideo);
+        boolean result = this.save(lifeUserLearningVideo);
+        if (result) {
+            return R.success("新增成功");
+        }
+        return R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Integer id) {
+        log.info("LifeUserLearningVideoServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        if (result) {
+            return R.success("删除成功");
+        }
+        return R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(LifeUserLearningVideo lifeUserLearningVideo) {
+        log.info("LifeUserLearningVideoServiceImpl.update, param={}", lifeUserLearningVideo);
+        boolean result = this.updateById(lifeUserLearningVideo);
+        if (result) {
+            return R.success("更新成功");
+        }
+        return R.fail("更新失败");
+    }
+
+    @Override
+    public R<LifeUserLearningVideo> getInfoById(Integer id) {
+        log.info("LifeUserLearningVideoServiceImpl.getInfoById, id={}", id);
+        LifeUserLearningVideo result = this.getById(id);
+        return R.data(result);
+    }
+
+    @Override
+    public R<IPage<LifeUserLearningVideo>> list(Integer pageNum, Integer pageSize, String name) {
+        log.info("LifeUserLearningVideoServiceImpl.list, pageNum={}, pageSize={}, name={}", pageNum, pageSize, name);
+        Page<LifeUserLearningVideo> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<LifeUserLearningVideo> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(name)) {
+            queryWrapper.like(LifeUserLearningVideo::getName, name);
+        }
+        queryWrapper.orderByDesc(LifeUserLearningVideo::getCreatedTime);
+        IPage<LifeUserLearningVideo> result = this.page(page, queryWrapper);
+        return R.data(result);
+    }
+}
+

+ 331 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StorePlatformBenefitsServiceImpl.java

@@ -0,0 +1,331 @@
+package shop.alien.store.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.LifeDiscountCoupon;
+import shop.alien.entity.store.LifeDiscountCouponUser;
+import shop.alien.entity.store.StorePlatformBenefits;
+import shop.alien.entity.store.StoreVirtualCurrency;
+import shop.alien.entity.store.vo.StorePlatformBenefitsVo;
+import shop.alien.mapper.*;
+import shop.alien.store.service.StorePlatformBenefitsService;
+import shop.alien.util.common.JwtUtil;
+import shop.alien.util.common.constant.DiscountCouponEnum;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 福利表 服务实现类
+ *
+ * @author ssk
+ * @since 2025-12-18
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StorePlatformBenefitsServiceImpl extends ServiceImpl<StorePlatformBenefitsMapper, StorePlatformBenefits> implements StorePlatformBenefitsService {
+
+    private final StorePlatformBenefitsMapper benefitsMapper;
+
+    private final StoreVirtualCurrencyMapper virtualCurrencyMapper;
+
+    private final LifeCouponMapper lifeCouponMapper;
+    private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
+    private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
+
+
+    @Override
+    public IPage<StorePlatformBenefitsVo> getPage(int page, int size, Integer type, String name) {
+        log.info("StorePlatformBenefitsServiceImpl.getPage - page={}, size={}, type={}, name={}", page, size, type, name);
+
+        IPage<StorePlatformBenefitsVo> pageRequest = new Page<>(page, size);
+        QueryWrapper<StorePlatformBenefitsVo> queryWrapper = new QueryWrapper<>();
+
+        // 动态查询条件
+        if (type != null) {
+            queryWrapper.eq("type", type);
+        }
+        if (name != null && !name.isEmpty()) {
+            queryWrapper.eq("name", name);
+        }
+
+        // 按创建时间倒序
+        queryWrapper.orderByDesc("created_time");
+
+        return benefitsMapper.getPlatformBenefitsPage(pageRequest, queryWrapper);
+    }
+
+    @Override
+    public StorePlatformBenefits getById(Integer id) {
+        log.info("StorePlatformBenefitsServiceImpl.getById - id={}", id);
+        return benefitsMapper.selectById(id);
+    }
+
+    @Override
+    public int add(StorePlatformBenefits benefits) {
+        log.info("StorePlatformBenefitsServiceImpl.add - benefits={}", benefits);
+        JSONObject data = JwtUtil.getCurrentUserInfo();
+        Integer userId = null;
+        if (data != null) {
+            userId = data.getInteger("userId");
+            log.info("获取用户ID:userId={}", userId);
+        }
+        if (benefits.getType() == 2) {
+            StoreVirtualCurrency virtualCurrency = new StoreVirtualCurrency();
+            virtualCurrency.setName(benefits.getName());
+            virtualCurrency.setStatus(0);
+            virtualCurrency.setCreatedTime(new Date());
+            virtualCurrency.setCreatedUserId(userId);
+            virtualCurrency.setQuantity(benefits.getVirtualCurrencyAmount());
+            virtualCurrencyMapper.insert(virtualCurrency);
+
+            benefits.setBusinessId(virtualCurrency.getId().toString());
+        }
+
+        benefits.setCreatedTime(new Date());
+        benefits.setDeleteFlag(0);
+        benefits.setCreatedUserId(userId);
+        // 默认待审核
+        if (benefits.getStatus() == null) {
+            benefits.setStatus(0);
+        }
+        return benefitsMapper.insert(benefits);
+    }
+
+    @Override
+    public int update(StorePlatformBenefits benefits) {
+        log.info("StorePlatformBenefitsServiceImpl.update - benefits={}", benefits);
+        JSONObject data = JwtUtil.getCurrentUserInfo();
+        Integer userId = null;
+        if (data != null) {
+            userId = data.getInteger("userId");
+            log.info("获取用户ID:userId={}", userId);
+        }
+
+        if (benefits.getType() == 2) {
+            StoreVirtualCurrency virtualCurrency = new StoreVirtualCurrency();
+            virtualCurrency.setId(benefits.getVirtualCurrencyId());
+            virtualCurrency.setName(benefits.getName());
+            virtualCurrency.setUpdatedTime(new Date());
+            virtualCurrency.setUpdatedUserId(userId);
+            virtualCurrency.setQuantity(benefits.getVirtualCurrencyAmount());
+            virtualCurrencyMapper.updateById(virtualCurrency);
+        }
+
+        benefits.setUpdatedUserId(userId);
+        benefits.setUpdatedTime(new Date());
+        return benefitsMapper.updateById(benefits);
+    }
+
+    @Override
+    public int delete(Integer id) {
+        log.info("StorePlatformBenefitsServiceImpl.delete - id={}", id);
+        StorePlatformBenefits benefits = new StorePlatformBenefits();
+        benefits.setId(id);
+        benefits.setDeleteFlag(1);
+        benefits.setUpdatedTime(new Date());
+        UpdateWrapper<StorePlatformBenefits> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", id).set("delete_flag", 1).set("updated_time", new Date());
+        return benefitsMapper.update(null, updateWrapper);
+    }
+
+    @Override
+    public int audit(Integer id, Integer status) {
+        log.info("StorePlatformBenefitsServiceImpl.audit - id={}, status={}", id, status);
+        StorePlatformBenefits benefits = new StorePlatformBenefits();
+        benefits.setId(id);
+        benefits.setStatus(status);
+        benefits.setUpdatedTime(new Date());
+        return benefitsMapper.updateById(benefits);
+    }
+
+    @Override
+    public String receiveBenefits(Integer id, Integer userId) {
+        log.info("StorePlatformBenefitsServiceImpl.receiveBenefits - id={},userId={}", id,userId);
+
+        // 获取当前用户信息
+        JSONObject data = JwtUtil.getCurrentUserInfo();
+        Integer userId1 = null;
+        if (data != null) {
+            userId1 = data.getInteger("userId");
+            log.info("获取用户ID:userId={}", userId1);
+        }
+        if (userId1 == null) {
+            throw new RuntimeException("用户未登录");
+        }
+        
+        // 查询福利信息
+        StorePlatformBenefits benefits = benefitsMapper.selectById(id);
+        if (benefits == null) {
+            throw new RuntimeException("福利不存在");
+        }
+        
+        // 检查福利状态:必须是审核通过(status=2)
+//        if (benefits.getStatus() == null || benefits.getStatus() != 2) {
+//            throw new RuntimeException("福利未审核通过,无法领取");
+//        }
+        
+        // 检查删除标记
+        if (benefits.getDeleteFlag() != null && benefits.getDeleteFlag() == 1) {
+            throw new RuntimeException("福利已删除");
+        }
+        
+        // 检查类型并处理
+        if (benefits.getType() == null) {
+            throw new RuntimeException("福利类型不存在");
+        }
+        
+        if (benefits.getType() == 1) {
+            // 类型1:优惠券
+            return receiveCoupon(benefits, userId, id);
+        } else if (benefits.getType() == 2) {
+            // 类型2:U币
+            return receiveVirtualCurrency(benefits, userId, id);
+        } else {
+            throw new RuntimeException("不支持的福利类型");
+        }
+    }
+
+    @Override
+    public List<StorePlatformBenefitsVo> listBenefits(Integer userId) {
+        // 查询用户已领取的优惠券记录
+        QueryWrapper<LifeDiscountCouponUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        List<LifeDiscountCouponUser> lifeDiscountCouponUsers = lifeDiscountCouponUserMapper.selectList(queryWrapper);
+        List<Integer> couponIdList = lifeDiscountCouponUsers.stream().filter(x -> x.getCouponId() != null).map(LifeDiscountCouponUser::getCouponId).collect(Collectors.toList());
+        List<Integer> ubIdList = lifeDiscountCouponUsers.stream().filter(x -> x.getUbId() != null).map(LifeDiscountCouponUser::getUbId).collect(Collectors.toList());
+        couponIdList.addAll(ubIdList);
+        List<StorePlatformBenefits> storePlatformBenefits = super.list();
+        List<StorePlatformBenefitsVo> result = new ArrayList<>();
+        for (StorePlatformBenefits storePlatformBenefit : storePlatformBenefits) {
+            StorePlatformBenefitsVo  storePlatformBenefitVo = new StorePlatformBenefitsVo();
+            cn.hutool.core.bean.BeanUtil.copyProperties(storePlatformBenefit, storePlatformBenefitVo);
+            if (couponIdList.contains(storePlatformBenefitVo.getId())) {
+                storePlatformBenefitVo.setClaimed(true);
+            } else {
+                storePlatformBenefitVo.setClaimed(false);
+            }
+            result.add(storePlatformBenefitVo);
+        }
+        return result;
+    }
+
+    /**
+     * 领取优惠券
+     */
+    private String receiveCoupon(StorePlatformBenefits benefits, Integer userId, Integer benefitsId) {
+        log.info("StorePlatformBenefitsServiceImpl.receiveCoupon - benefitsId={}, userId={}", benefitsId, userId);
+        
+        // 通过 business_id 获取优惠券信息
+        if (benefits.getBusinessId() == null || benefits.getBusinessId().isEmpty()) {
+            throw new RuntimeException("优惠券信息不存在");
+        }
+
+        LifeDiscountCoupon lifeDiscountCoupon = lifeDiscountCouponMapper.selectById(benefits.getBusinessId());
+        if (lifeDiscountCoupon == null) {
+            throw new RuntimeException("优惠券不存在");
+        }
+        
+        // 检查优惠券删除标记
+        if (lifeDiscountCoupon.getDeleteFlag() != null && lifeDiscountCoupon.getDeleteFlag() == 1) {
+            throw new RuntimeException("优惠券已删除");
+        }
+        
+        // 检查库存
+        if (lifeDiscountCoupon.getSingleQty() == null || lifeDiscountCoupon.getSingleQty() <= 0) {
+            throw new RuntimeException("优惠券库存不足");
+        }
+        
+        // 更新库存:减1
+        lifeDiscountCoupon.setSingleQty(lifeDiscountCoupon.getSingleQty() - 1);
+        lifeDiscountCoupon.setUpdatedTime(new Date());
+        int updateResult = lifeDiscountCouponMapper.updateById(lifeDiscountCoupon);
+
+        // 把优惠券记录插入到用户优惠券表中
+        LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
+        // 设置该优惠券记录的优惠券 ID
+        lifeDiscountCouponUser.setCouponId(lifeDiscountCoupon.getId());
+        // 设置该优惠券记录的用户 ID 为当前用户 ID
+        lifeDiscountCouponUser.setUserId(userId);
+        // 设置该优惠券的领取时间为当前时间
+        lifeDiscountCouponUser.setReceiveTime(new Date());
+        // 设置该优惠券的过期时间为优惠券本身的结束日期
+        lifeDiscountCouponUser.setExpirationTime(lifeDiscountCoupon.getEndDate());
+        // 设置该优惠券的状态为待使用
+        lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
+        lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
+
+        if (updateResult > 0) {
+            log.info("用户领取优惠券成功 - userId={}, benefitsId={}, couponId={}", userId, benefitsId, benefits.getBusinessId());
+            return "领取成功";
+        } else {
+            throw new RuntimeException("领取失败,请稍后重试");
+        }
+    }
+    
+    /**
+     * 领取U币
+     */
+    private String receiveVirtualCurrency(StorePlatformBenefits benefits, Integer userId, Integer benefitsId) {
+        log.info("StorePlatformBenefitsServiceImpl.receiveVirtualCurrency - benefitsId={}, userId={}", benefitsId, userId);
+        
+        // 通过 business_id 获取U币信息
+        if (benefits.getBusinessId() == null || benefits.getBusinessId().isEmpty()) {
+            throw new RuntimeException("U币信息不存在");
+        }
+        
+        Integer virtualCurrencyId;
+        try {
+            virtualCurrencyId = Integer.parseInt(benefits.getBusinessId());
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("U币ID格式错误");
+        }
+        
+        StoreVirtualCurrency virtualCurrency = virtualCurrencyMapper.selectById(virtualCurrencyId);
+        if (virtualCurrency == null) {
+            throw new RuntimeException("U币不存在");
+        }
+        
+        // 检查U币删除标记
+        if (virtualCurrency.getDeleteFlag() != null && virtualCurrency.getDeleteFlag() == 1) {
+            throw new RuntimeException("U币已删除");
+        }
+        
+        // 检查U币状态:必须是审核通过(status=2)
+        if (virtualCurrency.getStatus() == null || virtualCurrency.getStatus() != 2) {
+            throw new RuntimeException("U币未审核通过,无法领取");
+        }
+
+        // 插入用户U币记录(假设表名为 store_user_virtual_currency)
+        // 把优惠券记录插入到用户优惠券表中
+        LifeDiscountCouponUser lifeDiscountCouponUser = new LifeDiscountCouponUser();
+        // 设置该优惠券记录的优惠券 ID
+        lifeDiscountCouponUser.setUbId(benefits.getId());
+        // 设置该优惠券记录的用户 ID 为当前用户 ID
+        lifeDiscountCouponUser.setUserId(userId);
+        // 设置该优惠券的领取时间为当前时间
+        lifeDiscountCouponUser.setReceiveTime(new Date());
+        // 设置该优惠券的过期时间为优惠券本身的结束日期
+        // 设置2099年12月31日为过期时间
+        java.time.LocalDate expirationTime = java.time.LocalDate.of(2099, 12, 31);
+        lifeDiscountCouponUser.setExpirationTime(expirationTime);
+        // 设置该优惠券的状态为待使用
+        lifeDiscountCouponUser.setStatus(Integer.parseInt(DiscountCouponEnum.WAITING_USED.getValue()));
+        lifeDiscountCouponUserMapper.insert(lifeDiscountCouponUser);
+        
+        // U币领取成功(目前只验证,不创建记录表,后续可根据业务需求添加用户U币记录表)
+        log.info("用户领取U币成功 - userId={}, benefitsId={}, virtualCurrencyId={}", userId, benefitsId, virtualCurrencyId);
+        return "领取成功";
+    }
+}
+