xudm hai 2 meses
pai
achega
a0aa0f21a8
Modificáronse 25 ficheiros con 791 adicións e 48 borrados
  1. 47 0
      src/main/java/com/xs/core/controller/task/TaskInfoController.java
  2. 3 3
      src/main/java/com/xs/core/filter/GlobalExceptionHandler.java
  3. 7 0
      src/main/java/com/xs/core/init/DatabaseInitializer.java
  4. 23 23
      src/main/java/com/xs/core/init/MessageSourceInitializer.java
  5. 21 0
      src/main/java/com/xs/core/mapper/task/TaskInfoMapper.java
  6. 16 0
      src/main/java/com/xs/core/mapper/task/UserTaskRecordMapper.java
  7. 168 0
      src/main/java/com/xs/core/model/task/entity/TaskInfo.java
  8. 86 0
      src/main/java/com/xs/core/model/task/entity/UserTaskRecord.java
  9. 19 0
      src/main/java/com/xs/core/model/task/req/TaskInfoReq.java
  10. 66 0
      src/main/java/com/xs/core/model/task/resp/TaskInfoResp.java
  11. 3 1
      src/main/java/com/xs/core/model/team/entity/InviteRewardsRule.java
  12. 2 2
      src/main/java/com/xs/core/model/team/entity/InviteTaskRewardsFetchRecord.java
  13. 31 0
      src/main/java/com/xs/core/service/Impl/task/TaskInfoServiceImpl.java
  14. 80 0
      src/main/java/com/xs/core/service/Impl/task/TaskServiceImpl.java
  15. 28 0
      src/main/java/com/xs/core/service/Impl/task/UserTaskRecordServiceImpl.java
  16. 13 15
      src/main/java/com/xs/core/service/Impl/team/TeamShareGoldCoinSettlementServiceImpl.java
  17. 27 0
      src/main/java/com/xs/core/service/task/ITaskInfoService.java
  18. 24 0
      src/main/java/com/xs/core/service/task/IUserTaskRecordService.java
  19. 23 0
      src/main/java/com/xs/core/service/task/TaskService.java
  20. 5 0
      src/main/java/com/xs/core/service/team/TeamShareService.java
  21. 1 1
      src/main/java/com/xs/core/utils/MyGenerator.java
  22. 3 3
      src/main/resources/application-dev.yml
  23. 77 0
      src/main/resources/mapper/TaskInfoMapper.xml
  24. 16 0
      src/main/resources/mapper/UserTaskRecordMapper.xml
  25. 2 0
      src/main/resources/messages/messages_zh_CN.properties

+ 47 - 0
src/main/java/com/xs/core/controller/task/TaskInfoController.java

@@ -0,0 +1,47 @@
+package com.xs.core.controller.task;
+
+import com.xs.core.common.content.UserContext;
+import com.xs.core.common.content.UserContextHolder;
+import com.xs.core.model.ResponseResult;
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+import com.xs.core.service.task.TaskService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Locale;
+
+@RestController
+@RequestMapping("/task")
+@Tag(name = "任务信息", description = "任务信息")
+@Slf4j
+public class TaskInfoController {
+    @Autowired
+    private TaskService taskService;
+
+    @Operation(description = "任务信息查询")
+    @PostMapping("/getTaskInfoList")
+    public ResponseResult<List<TaskInfoResp>> getTaskInfoList(@RequestBody TaskInfoReq req) {
+        Locale locale = LocaleContextHolder.getLocale();
+        String languageTag = locale.toLanguageTag();
+        req.setLang(languageTag);
+        List<TaskInfoResp> taskInfoList = taskService.getTaskInfoList(req);
+        return ResponseResult.success(taskInfoList);
+    }
+
+    @Operation(description = "处理任务")
+    @PostMapping("/handleTask")
+    public ResponseResult<?> handleTask(@RequestBody TaskInfoReq req) {
+        UserContext context = UserContextHolder.getContext();
+        taskService.handleTask(req, context.getId());
+        return ResponseResult.success();
+    }
+}

+ 3 - 3
src/main/java/com/xs/core/filter/GlobalExceptionHandler.java

@@ -60,16 +60,16 @@ public class GlobalExceptionHandler {
                     }
                 }
             }
-            return ResponseResult.failed("response.validation.failed");
+            return ResponseResult.failed("response.validation.failed", null);
         } else if (e instanceof ConstraintViolationException) {
             return ResponseResult.badRequest(e.getMessage());
         } else if (e instanceof BusinessException) {
             //增加自定义内容响应
             return ResponseResult.failed(e.getMessage());
         } else if (e instanceof MissingServletRequestPartException) {
-            return ResponseResult.failed("response.expected.file.missing");
+            return ResponseResult.failed("response.expected.file.missing", null);
         } else if (e instanceof NoResourceFoundException) {
-            return ResponseResult.failed("request.api.not.exists");
+            return ResponseResult.failed("request.api.not.exists", null);
         } else {
             log.error("请求:{} 异常,异常信息:{}", request.getRequestURI(), ExceptionUtil.stacktraceToString(e));
             return ResponseResult.serverError(null);

+ 7 - 0
src/main/java/com/xs/core/init/DatabaseInitializer.java

@@ -1,8 +1,11 @@
 package com.xs.core.init;
 
+import com.xs.core.common.validation.CheckUtils;
+import com.xs.core.model.ResponseResult;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
+import org.springframework.context.MessageSource;
 import org.springframework.stereotype.Component;
 
 import javax.sql.DataSource;
@@ -13,9 +16,13 @@ import java.sql.Connection;
 @Slf4j
 public class DatabaseInitializer implements CommandLineRunner {
     private final DataSource dataSource;
+    private final MessageSource messageSource;
 
     @Override
     public void run(String... args) throws Exception {
+        ResponseResult.setMessageSource(messageSource);
+        CheckUtils.setMessageSource(messageSource);
+        log.info("MessageSource initialized successfully.");
         try (Connection connection = dataSource.getConnection()) {
             // 执行一个简单的查询来初始化连接
             connection.createStatement().execute("SELECT 1 from dual");

+ 23 - 23
src/main/java/com/xs/core/init/MessageSourceInitializer.java

@@ -1,23 +1,23 @@
-package com.xs.core.init;
-
-import com.xs.core.common.validation.CheckUtils;
-import com.xs.core.model.ResponseResult;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.context.MessageSource;
-import org.springframework.stereotype.Component;
-
-@Component
-@AllArgsConstructor
-@Slf4j
-public class MessageSourceInitializer implements CommandLineRunner {
-    private final MessageSource messageSource;
-
-    @Override
-    public void run(String... args) throws Exception {
-        ResponseResult.setMessageSource(messageSource);
-        CheckUtils.setMessageSource(messageSource);
-        log.info("MessageSource initialized successfully.");
-    }
-}
+//package com.xs.core.init;
+//
+//import com.xs.core.common.validation.CheckUtils;
+//import com.xs.core.model.ResponseResult;
+//import lombok.AllArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.boot.CommandLineRunner;
+//import org.springframework.context.MessageSource;
+//import org.springframework.stereotype.Component;
+//
+//@Component
+//@AllArgsConstructor
+//@Slf4j
+//public class MessageSourceInitializer implements CommandLineRunner {
+//    private final MessageSource messageSource;
+//
+//    @Override
+//    public void run(String... args) throws Exception {
+//        ResponseResult.setMessageSource(messageSource);
+//        CheckUtils.setMessageSource(messageSource);
+//        log.info("MessageSource initialized successfully.");
+//    }
+//}

+ 21 - 0
src/main/java/com/xs/core/mapper/task/TaskInfoMapper.java

@@ -0,0 +1,21 @@
+package com.xs.core.mapper.task;
+
+import com.xs.core.model.task.entity.TaskInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 任务信息表 Mapper 接口
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface TaskInfoMapper extends BaseMapper<TaskInfo> {
+
+    List<TaskInfoResp> getTaskInfoList(String categoryCode, String userLang, Long userId);
+}

+ 16 - 0
src/main/java/com/xs/core/mapper/task/UserTaskRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xs.core.mapper.task;
+
+import com.xs.core.model.task.entity.UserTaskRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户任务完成记录表 Mapper 接口
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface UserTaskRecordMapper extends BaseMapper<UserTaskRecord> {
+
+}

+ 168 - 0
src/main/java/com/xs/core/model/task/entity/TaskInfo.java

@@ -0,0 +1,168 @@
+package com.xs.core.model.task.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 任务信息表
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Getter
+@Setter
+@TableName("b_task_info")
+public class TaskInfo extends Model<TaskInfo> {
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 任务名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 名称日文
+     */
+    @TableField("name_ja")
+    private String nameJa;
+
+    /**
+     * 名称韩文
+     */
+    @TableField("name_ko")
+    private String nameKo;
+
+    /**
+     * 名称泰语
+     */
+    @TableField("name_th")
+    private String nameTh;
+
+    /**
+     * 名称越南语
+     */
+    @TableField("name_vi")
+    private String nameVi;
+
+    /**
+     * 名称俄语
+     */
+    @TableField("name_ru")
+    private String nameRu;
+
+    /**
+     * 名称英文
+     */
+    @TableField("name_en")
+    private String nameEn;
+
+    /**
+     * 名称葡萄牙语
+     */
+    @TableField("name_pt")
+    private String namePt;
+
+    /**
+     * 名称波斯语
+     */
+    @TableField("name_fa")
+    private String nameFa;
+
+    /**
+     * 名称西班牙语
+     */
+    @TableField("name_es")
+    private String nameEs;
+
+    /**
+     * 任务说明
+     */
+    @TableField("instruction")
+    private String instruction;
+
+    /**
+     * 任务图标
+     */
+    @TableField("task_icon")
+    private String taskIcon;
+
+    /**
+     * 任务链接
+     */
+    @TableField("task_link")
+    private String taskLink;
+
+    /**
+     * 任务分类编码
+     */
+    @TableField("category_code")
+    private String categoryCode;
+
+    /**
+     * 1开启0关闭
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 金币数量
+     */
+    @TableField("gold_coin")
+    private Integer goldCoin;
+
+    /**
+     * 排序
+     */
+    @TableField("sort_num")
+    private Integer sortNum;
+
+    /**
+     * 逻辑删除 0 未删除 1 已删除
+     */
+    @TableField("is_deleted")
+    private Integer isDeleted;
+
+    /**
+     * 创建人
+     */
+    @TableField("create_by")
+    private String createBy;
+
+    /**
+     * 更新人
+     */
+    @TableField("update_by")
+    private String updateBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("updated_time")
+    private LocalDateTime updatedTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 86 - 0
src/main/java/com/xs/core/model/task/entity/UserTaskRecord.java

@@ -0,0 +1,86 @@
+package com.xs.core.model.task.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 用户任务完成记录表
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Getter
+@Setter
+@TableName("b_user_task_record")
+public class UserTaskRecord extends Model<UserTaskRecord> {
+
+    /**
+     * 记录ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 任务ID
+     */
+    @TableField("task_id")
+    private String taskId;
+
+    /**
+     * 任务状态: 0-未开始, 1-进行中, 2-待领取 3-已领取
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 任务开始时间
+     */
+    @TableField("start_time")
+    private LocalDateTime startTime;
+
+    /**
+     * 任务完成时间
+     */
+    @TableField("complete_time")
+    private LocalDateTime completeTime;
+
+    /**
+     * 奖励金币数量
+     */
+    @TableField("reward_amount")
+    private Integer rewardAmount;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+}

+ 19 - 0
src/main/java/com/xs/core/model/task/req/TaskInfoReq.java

@@ -0,0 +1,19 @@
+package com.xs.core.model.task.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Schema(description = "任务信息查询请求参数")
+public class TaskInfoReq implements Serializable {
+    @Schema(description = "任务分类编码")
+    private String categoryCode;
+
+    @Schema(description = "语言,不需要传,后台自动获取")
+    private String lang;
+
+    @Schema(description = "任务id,开始任务和完成任务时传递,其他情况不需要传递")
+    private String taskId;
+}

+ 66 - 0
src/main/java/com/xs/core/model/task/resp/TaskInfoResp.java

@@ -0,0 +1,66 @@
+package com.xs.core.model.task.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Schema(description = "任务信息响应参数")
+public class TaskInfoResp implements Serializable {
+    /**
+     * id
+     */
+    @Schema(description = "任务id")
+    private Long id;
+
+    /**
+     * 任务名称
+     */
+    @Schema(description = "任务名称")
+    private String name;
+
+    /**
+     * 任务说明
+     */
+    @Schema(description = "任务说明")
+    private String instruction;
+
+    /**
+     * 任务图标
+     */
+    @Schema(description = "任务图标")
+    private String taskIcon;
+
+    /**
+     * 任务链接
+     */
+    @Schema(description = "任务链接")
+    private String taskLink;
+
+    /**
+     * 任务分类编码
+     */
+    @Schema(description = "任务分类编码")
+    private String categoryCode;
+
+    /**
+     * 金币数量
+     */
+    @Schema(description = "金币数量")
+    private Integer goldCoin;
+
+    /**
+     * 排序
+     */
+    @Schema(description = "排序")
+    private Integer sortNum;
+
+    /**
+     * 任务状态: 0-未开始, 1-进行中, 2-已完成, 3-已失败
+     */
+    @Schema(description = "任务状态: 0-未开始, 1-进行中, 2-已完成, 3-已失败")
+    private Integer userTaskStatus;
+
+}

+ 3 - 1
src/main/java/com/xs/core/model/team/entity/InviteRewardsRule.java

@@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
+
 import lombok.Getter;
 import lombok.Setter;
 
@@ -27,7 +29,7 @@ public class InviteRewardsRule extends Model<InviteRewardsRule> {
      * 主键
      */
     @TableId(value = "id", type = IdType.ASSIGN_ID)
-    private Long id;
+    private String id;
 
     /**
      * 奖励名称

+ 2 - 2
src/main/java/com/xs/core/model/team/entity/InviteTaskRewardsFetchRecord.java

@@ -37,7 +37,7 @@ public class InviteTaskRewardsFetchRecord extends Model<InviteTaskRewardsFetchRe
      * 主键
      */
     @TableId(value = "id", type = IdType.ASSIGN_ID)
-    private Long id;
+    private String id;
 
     /**
      * 领取人id
@@ -49,7 +49,7 @@ public class InviteTaskRewardsFetchRecord extends Model<InviteTaskRewardsFetchRe
      * 规则id
      */
     @TableField("rule_id")
-    private Long ruleId;
+    private String ruleId;
 
     /**
      * 奖励层级

+ 31 - 0
src/main/java/com/xs/core/service/Impl/task/TaskInfoServiceImpl.java

@@ -0,0 +1,31 @@
+package com.xs.core.service.Impl.task;
+
+import com.xs.core.common.content.UserContext;
+import com.xs.core.common.content.UserContextHolder;
+import com.xs.core.model.task.entity.TaskInfo;
+import com.xs.core.mapper.task.TaskInfoMapper;
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+import com.xs.core.service.task.ITaskInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 任务信息表 服务实现类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Service
+public class TaskInfoServiceImpl extends ServiceImpl<TaskInfoMapper, TaskInfo> implements ITaskInfoService {
+
+    @Override
+    public List<TaskInfoResp> getTaskInfoList(TaskInfoReq req, Long userId) {
+        // 获取任务列表
+        return getBaseMapper().getTaskInfoList(req.getCategoryCode(), req.getLang(), userId);
+    }
+}

+ 80 - 0
src/main/java/com/xs/core/service/Impl/task/TaskServiceImpl.java

@@ -0,0 +1,80 @@
+package com.xs.core.service.Impl.task;
+
+import cn.hutool.core.util.ObjUtil;
+import com.xs.core.common.content.UserContext;
+import com.xs.core.common.content.UserContextHolder;
+import com.xs.core.common.enums.CoinTransactionCategoryEnum;
+import com.xs.core.common.enums.CoinTransactionTypeEnum;
+import com.xs.core.common.validation.CheckUtils;
+import com.xs.core.model.task.entity.TaskInfo;
+import com.xs.core.model.task.entity.UserTaskRecord;
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+import com.xs.core.service.task.ITaskInfoService;
+import com.xs.core.service.task.IUserTaskRecordService;
+import com.xs.core.service.task.TaskService;
+import com.xs.core.service.wallet.IUserWalletService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class TaskServiceImpl implements TaskService {
+    @Autowired
+    private ITaskInfoService taskInfoService;
+
+    @Autowired
+    private IUserTaskRecordService taskRecordService;
+
+    @Autowired
+    private IUserWalletService walletService;
+
+
+    @Override
+    public List<TaskInfoResp> getTaskInfoList(TaskInfoReq req) {
+        UserContext context = UserContextHolder.getContext();
+        // 获取任务列表
+        return taskInfoService.getTaskInfoList(req, context.getId());
+    }
+
+    @Override
+    @Transactional
+    public void handleTask(TaskInfoReq req, Long userId) {
+        CheckUtils.throwIfNull(req, "error.task.handle.id.is.null");
+        TaskInfo taskInfo = taskInfoService.getById(req.getTaskId());
+        CheckUtils.throwIfNull(taskInfo, "error.task.handle.not.exist");
+        //查询处理记录
+        UserTaskRecord record = taskRecordService.getByTaskId(req.getTaskId(), userId);
+        if (ObjUtil.isNull(record)) {
+            //说明任务还没开始 添加任务记录
+            UserTaskRecord newRecord = new UserTaskRecord();
+            newRecord.setTaskId(req.getTaskId());
+            newRecord.setUserId(userId);
+            newRecord.setStatus(1);
+            newRecord.setCreateTime(LocalDateTime.now());
+            newRecord.setStartTime(LocalDateTime.now());
+            newRecord.setRewardAmount(taskInfo.getGoldCoin());
+            taskRecordService.save(record);
+        } else {
+            //说明任务已经开始 根据任务状态进行处理
+            Integer status = record.getStatus();
+            if (status == 1) {
+                //说明任务已经已经开始 进入下一步
+                record.setStatus(2);
+                record.setUpdateTime(LocalDateTime.now());
+                taskRecordService.updateById(record);
+            } else if (status == 2) {
+                //说明任务已经完成 领取奖励
+                record.setStatus(3);
+                record.setUpdateTime(LocalDateTime.now());
+                taskRecordService.updateById(record);
+                //领取奖励
+                walletService.coinTransaction(CoinTransactionTypeEnum.ADD, CoinTransactionCategoryEnum.TASK_REWARDS, "任务奖励", "任务奖励", new BigDecimal(record.getRewardAmount()), userId);
+            }
+        }
+    }
+}

+ 28 - 0
src/main/java/com/xs/core/service/Impl/task/UserTaskRecordServiceImpl.java

@@ -0,0 +1,28 @@
+package com.xs.core.service.Impl.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xs.core.model.task.entity.UserTaskRecord;
+import com.xs.core.mapper.task.UserTaskRecordMapper;
+import com.xs.core.service.task.IUserTaskRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户任务完成记录表 服务实现类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+@Service
+public class UserTaskRecordServiceImpl extends ServiceImpl<UserTaskRecordMapper, UserTaskRecord> implements IUserTaskRecordService {
+
+    @Override
+    public UserTaskRecord getByTaskId(String taskId, Long userId) {
+        LambdaQueryWrapper<UserTaskRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserTaskRecord::getTaskId, taskId);
+        queryWrapper.eq(UserTaskRecord::getUserId, userId);
+        return getOne(queryWrapper);
+    }
+}

+ 13 - 15
src/main/java/com/xs/core/service/Impl/team/TeamShareGoldCoinSettlementServiceImpl.java

@@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xs.core.common.enums.CoinTransactionCategoryEnum;
 import com.xs.core.common.enums.CoinTransactionTypeEnum;
-import com.xs.core.common.exception.BusinessException;
 import com.xs.core.common.validation.CheckUtils;
 import com.xs.core.model.coin.msg.TeamShareMessage;
 import com.xs.core.model.team.entity.*;
@@ -29,7 +28,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 
 
 @Service
@@ -172,19 +170,6 @@ public class TeamShareGoldCoinSettlementServiceImpl implements TeamShareService
         return teamInviteRewardRecordService.getTeamInviteRewardRecordList(id);
     }
 
-    @Override
-    public TeamInviteAvailableRewardsResp getTeamInviteAvailableRewardsRules(Long id) {
-        //获取团队邀请奖励规则
-        List<InviteRewardsRule> allRules = inviteRewardsRuleService.getAllByOrderByRewardsLevelAsc();
-        InviteTaskRewardsFetchRecord userRewards = inviteRewardsFetchRecordService.getLastByUserId(id);
-        //查询用户邀请的人数
-        Long inviterCount = userService.queryInviterCount(id);
-        List<InviteRewardsRule> collect = allRules.stream()
-                .filter(rule -> rule.getRewardsLevel() > (ObjUtil.isNotNull(userRewards.getRewardsLevel()) ? userRewards.getRewardsLevel() : 0))
-                .toList();
-        return new TeamInviteAvailableRewardsResp(inviterCount, collect);
-    }
-
     @Override
     @Transactional
     public void claimTeamInviteReward(Long id) {
@@ -211,6 +196,19 @@ public class TeamShareGoldCoinSettlementServiceImpl implements TeamShareService
         }
     }
 
+    @Override
+    public TeamInviteAvailableRewardsResp getTeamInviteAvailableRewardsRules(Long id) {
+        //获取团队邀请奖励规则
+        List<InviteRewardsRule> allRules = inviteRewardsRuleService.getAllByOrderByRewardsLevelAsc();
+        InviteTaskRewardsFetchRecord userRewards = inviteRewardsFetchRecordService.getLastByUserId(id);
+        //查询用户邀请的人数
+        Long inviterCount = userService.queryInviterCount(id);
+        List<InviteRewardsRule> collect = allRules.stream()
+                .filter(rule -> rule.getRewardsLevel() > (ObjUtil.isNotNull(userRewards) ? userRewards.getRewardsLevel() : 0))
+                .toList();
+        return new TeamInviteAvailableRewardsResp(inviterCount, collect);
+    }
+
     @Override
     @Transactional
     public void claimTeamInviteTaskReward(Long id, String ruleId) {

+ 27 - 0
src/main/java/com/xs/core/service/task/ITaskInfoService.java

@@ -0,0 +1,27 @@
+package com.xs.core.service.task;
+
+import com.xs.core.model.task.entity.TaskInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 任务信息表 服务类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface ITaskInfoService extends IService<TaskInfo> {
+
+    /**
+     * 获取任务信息列表
+     *
+     * @param req 请求参数
+     */
+    List<TaskInfoResp> getTaskInfoList(TaskInfoReq req, Long userId);
+
+}

+ 24 - 0
src/main/java/com/xs/core/service/task/IUserTaskRecordService.java

@@ -0,0 +1,24 @@
+package com.xs.core.service.task;
+
+import com.xs.core.model.task.entity.UserTaskRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户任务完成记录表 服务类
+ * </p>
+ *
+ * @author xudm
+ * @since 2024-12-23
+ */
+public interface IUserTaskRecordService extends IService<UserTaskRecord> {
+
+    /**
+     * 根据任务id和用户id查询用户任务完成记录
+     *
+     * @param taskId
+     * @param userId
+     * @return
+     */
+    UserTaskRecord getByTaskId(String taskId, Long userId);
+}

+ 23 - 0
src/main/java/com/xs/core/service/task/TaskService.java

@@ -0,0 +1,23 @@
+package com.xs.core.service.task;
+
+import com.xs.core.model.task.req.TaskInfoReq;
+import com.xs.core.model.task.resp.TaskInfoResp;
+
+import java.util.List;
+
+public interface TaskService {
+    /**
+     * 获取任务信息列表
+     *
+     * @param req 请求参数
+     */
+    List<TaskInfoResp> getTaskInfoList(TaskInfoReq req);
+
+    /**
+     * 处理任务
+     *
+     * @param req 请求参数
+     * @param id  任务id
+     */
+    void handleTask(TaskInfoReq req, Long id);
+}

+ 5 - 0
src/main/java/com/xs/core/service/team/TeamShareService.java

@@ -63,6 +63,11 @@ public interface TeamShareService {
      */
     void claimTeamInviteReward(Long id);
 
+    /**
+     * 获取团队邀请任务可领取奖励
+     *
+     * @param id 用户id
+     */
     TeamInviteAvailableRewardsResp getTeamInviteAvailableRewardsRules(Long id);
 
     /**

+ 1 - 1
src/main/java/com/xs/core/utils/MyGenerator.java

@@ -57,7 +57,7 @@ public class MyGenerator {
 
     public static void main(String[] args) {
         // 项目名 例如app  web
-        generatorByBusinessModule("team", new String[]{"b_invite_rewards_rule", "b_invite_task_rewards_fetch_record"});
+        generatorByBusinessModule("task", new String[]{"b_user_task_record", "b_task_info"});
     }
 
     /**

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

@@ -1,7 +1,7 @@
 spring:
   data:
     redis:
-      host: 192.168.241.131
+      host: 192.168.241.132
       port: 6379
       password: xudm5200
       database: 6
@@ -17,7 +17,7 @@ spring:
           min-idle: 2
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://192.168.241.131:3306/continew?useUnicode=true&characterEncoding=utf-8&useSSL=false
+    url: jdbc:mysql://192.168.241.132:3306/continew?useUnicode=true&characterEncoding=utf-8&useSSL=false
     username: continew
     password: continew123456
     hikari:
@@ -38,7 +38,7 @@ spring:
       initialization-fail-timeout: 60000
   rabbitmq:
     virtual-host: /
-    host: 192.168.241.131
+    host: 192.168.241.132
     port: 5672
     username: admin
     password: admin

+ 77 - 0
src/main/resources/mapper/TaskInfoMapper.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xs.core.mapper.task.TaskInfoMapper">
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xs.core.model.task.entity.TaskInfo">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="name_ja" property="nameJa"/>
+        <result column="name_ko" property="nameKo"/>
+        <result column="name_th" property="nameTh"/>
+        <result column="name_vi" property="nameVi"/>
+        <result column="name_ru" property="nameRu"/>
+        <result column="name_en" property="nameEn"/>
+        <result column="name_pt" property="namePt"/>
+        <result column="name_fa" property="nameFa"/>
+        <result column="name_es" property="nameEs"/>
+        <result column="instruction" property="instruction"/>
+        <result column="task_icon" property="taskIcon"/>
+        <result column="task_link" property="taskLink"/>
+        <result column="category_code" property="categoryCode"/>
+        <result column="status" property="status"/>
+        <result column="gold_coin" property="goldCoin"/>
+        <result column="sort_num" property="sortNum"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="create_by" property="createBy"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="updated_time" property="updatedTime"/>
+    </resultMap>
+
+    <resultMap id="TaskInfoRespResultMap" type="com.xs.core.model.task.resp.TaskInfoResp">
+        <result column="id" property="id"/>
+        <result column="task_name" property="name"/>
+        <result column="instruction" property="instruction"/>
+        <result column="task_icon" property="taskIcon"/>
+        <result column="task_link" property="taskLink"/>
+        <result column="category_code" property="categoryCode"/>
+        <result column="gold_coin" property="goldCoin"/>
+        <result column="sort_num" property="sortNum"/>
+        <result column="user_task_status" property="userTaskStatus"/>
+    </resultMap>
+
+    <select id="getTaskInfoList" resultMap="TaskInfoRespResultMap">
+        SELECT
+        ti.id,
+        <choose>
+            <when test="userLang == 'ja'">ti.name_ja</when>
+            <when test="userLang == 'ko'">ti.name_ko</when>
+            <when test="userLang == 'th'">ti.name_th</when>
+            <when test="userLang == 'vi'">ti.name_vi</when>
+            <when test="userLang == 'ru'">ti.name_ru</when>
+            <when test="userLang == 'en'">ti.name_en</when>
+            <when test="userLang == 'pt'">ti.name_pt</when>
+            <when test="userLang == 'fa'">ti.name_fa</when>
+            <when test="userLang == 'es'">ti.name_es</when>
+            <otherwise>ti.name</otherwise>
+        </choose>
+        AS task_name,
+        ti.instruction,
+        ti.task_icon,
+        ti.task_link,
+        ti.category_code,
+        ti.gold_coin,
+        ti.sort_num,
+        COALESCE(utr.status, 0) AS user_task_status
+        FROM
+        b_task_info ti
+        LEFT JOIN
+        b_user_task_record utr ON ti.id = utr.task_id AND utr.user_id = #{userId}
+        <where>
+            <if test="categoryCode != null and categoryCode != ''">
+                AND ti.category_code = #{categoryCode}
+            </if>
+        </where>
+        ORDER BY ti.sort_num
+    </select>
+</mapper>

+ 16 - 0
src/main/resources/mapper/UserTaskRecordMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xs.core.mapper.task.UserTaskRecordMapper">
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xs.core.model.task.entity.UserTaskRecord">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="task_id" property="taskId"/>
+        <result column="status" property="status"/>
+        <result column="start_time" property="startTime"/>
+        <result column="complete_time" property="completeTime"/>
+        <result column="reward_amount" property="rewardAmount"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+</mapper>

+ 2 - 0
src/main/resources/messages/messages_zh_CN.properties

@@ -31,4 +31,6 @@ error.team.invite.reward.task.claim.exists=该等级的邀请奖励已领取
 error.team.invite.reward.task.claim.previous.not.claim=上一等级的邀请奖励未领取
 error.team.invite.reward.task.claim.not.enough=当前邀请任务未完成,邀请好友数不足
 error.team.invite.reward.task.claim.not.found=邀请奖励规则不存在
+error.task.handle.id.is.null=任务id不能为空
+error.task.handle.not.exist=任务不存在