Browse Source

任务重构

sunkean 3 years ago
parent
commit
7c3682170e

+ 78 - 0
src/main/java/com/izouma/nineth/domain/MetaTaskToUserNew.java

@@ -0,0 +1,78 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.nineth.annotations.Searchable;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Transient;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel("元宇宙玩家领取任务情况-新")
+public class MetaTaskToUserNew extends BaseEntity {
+
+    @Searchable
+    @ApiModelProperty("用户id")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("领取时间")
+    @ExcelProperty("领取时间")
+    private LocalDateTime getTime;
+
+    @ApiModelProperty("完成时间")
+    @ExcelProperty("完成时间")
+    private LocalDateTime finishTime;
+
+    @Searchable
+    @ApiModelProperty("任务id")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Searchable
+    @ApiModelProperty("原子任务id")
+    @ExcelProperty("原子任务id")
+    private Long atomTaskId;
+
+    @ApiModelProperty("当前状态")
+    @ExcelProperty("当前状态")
+    @Enumerated(EnumType.STRING)
+    private MetaTaskStatus status;
+
+    @Searchable
+    @ApiModelProperty("频道id")
+    @ExcelProperty("频道id")
+    private Long channelId;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("进度")
+    private String process;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("任务详情")
+    private MetaTaskNew metaTaskNew;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("原子任务详情")
+    private MetaAtomTask metaAtomTask;
+
+    @Transient
+    @ExcelIgnore
+    @ApiModelProperty("道具详情")
+    private MetaProp metaProp;
+}

+ 2 - 0
src/main/java/com/izouma/nineth/repo/MetaAtomTaskRepo.java

@@ -16,4 +16,6 @@ public interface MetaAtomTaskRepo extends JpaRepository<MetaAtomTask, Long>, Jpa
     void softDelete(Long id);
 
     List<MetaAtomTask> findAllByDel(boolean del);
+
+    MetaAtomTask findByIdAndDel(Long id, boolean del);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/MetaPropRepo.java

@@ -16,4 +16,6 @@ public interface MetaPropRepo extends JpaRepository<MetaProp, Long>, JpaSpecific
     void softDelete(Long id);
 
     List<MetaProp> findAllByDel(boolean del);
+
+    MetaProp findByIdAndDel(Long id, boolean del);
 }

+ 5 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskBindRepo.java

@@ -4,10 +4,15 @@ import com.izouma.nineth.domain.MetaTaskBind;
 import com.izouma.nineth.enums.MetaTaskType;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 
 public interface MetaTaskBindRepo extends JpaRepository<MetaTaskBind, Long>, JpaSpecificationExecutor<MetaTaskBind> {
 
     List<MetaTaskBind> findByTaskIdAndTypeAndDel(Long taskId, MetaTaskType type, boolean del);
+
+    @Query("select m.atomTaskId from MetaTaskBind m where m.taskId = ?1 and m.type = ?2 and m.del = false order by m.atomTaskIndex asc")
+    Long findAtomTaskId(Long taskId, MetaTaskType type);
+
 }

+ 5 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskNewRepo.java

@@ -7,10 +7,15 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.List;
 
 public interface MetaTaskNewRepo extends JpaRepository<MetaTaskNew, Long>, JpaSpecificationExecutor<MetaTaskNew> {
     @Query("update MetaTaskNew t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    MetaTaskNew findByIdAndDel(Long id, boolean del);
+
+    List<MetaTaskNew> findAllByDel(boolean del);
 }

+ 14 - 0
src/main/java/com/izouma/nineth/repo/MetaTaskToUserNewRepo.java

@@ -0,0 +1,14 @@
+package com.izouma.nineth.repo;
+
+
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface MetaTaskToUserNewRepo extends JpaRepository<MetaTaskToUserNew, Long>, JpaSpecificationExecutor<MetaTaskToUserNew> {
+
+    MetaTaskToUserNew findByUserIdAndTaskIdAndAtomTaskIdAndDel(Long userId, Long taskId, Long atomTaskId, boolean del);
+
+    MetaTaskToUserNew findByUserIdAndTaskIdAndDel(Long userId, Long taskId, boolean del);
+
+}

+ 172 - 0
src/main/java/com/izouma/nineth/service/MetaTaskToUserNewService.java

@@ -0,0 +1,172 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.domain.MetaAtomTask;
+import com.izouma.nineth.domain.MetaProp;
+import com.izouma.nineth.domain.MetaTaskNew;
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.MetaAwardTypeEnum;
+import com.izouma.nineth.enums.MetaTaskStatus;
+import com.izouma.nineth.enums.MetaTaskType;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.*;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class MetaTaskToUserNewService {
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    private MetaAtomTaskRepo metaAtomTaskRepo;
+
+    private MetaTaskNewRepo metaTaskNewRepo;
+
+    private MetaPropRepo metaPropRepo;
+
+    private MetaTaskBindRepo metaTaskBindRepo;
+
+
+    public Page<MetaTaskToUserNew> all(PageQuery pageQuery) {
+        return metaTaskToUserNewRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaTaskToUserNew.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    @Transactional
+    public MetaRestResult<Void> autoReceiveTask() {
+        Long userId = SecurityUtils.getAuthenticatedUser().getId();
+        List<MetaTaskNew> metaTaskNews = metaTaskNewRepo.findAllByDel(false);
+        AtomicBoolean exist = new AtomicBoolean(false);
+        metaTaskNews.forEach(metaTaskNew -> {
+            MetaTaskToUserNew metaTaskToUserNew = metaTaskToUserNewRepo.findByUserIdAndTaskIdAndDel(userId, metaTaskNew.getId(), false);
+            if (Objects.isNull(metaTaskToUserNew)) {
+                exist.set(true);
+                metaTaskToUserNew = new MetaTaskToUserNew();
+                metaTaskToUserNew.setUserId(userId);
+                metaTaskToUserNew.setTaskId(metaTaskNew.getId());
+                // 设置主动领取第一个索引的基础任务
+                if (MetaTaskType.MAIN_LINE.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.NODE);
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                if (MetaTaskType.BRANCH_LINE.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.BRANCH_LINE);
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                if (MetaTaskType.DAILY.equals(metaTaskNew.getType())) {
+                    Long atomTaskId = metaTaskBindRepo.findAtomTaskId(metaTaskNew.getId(), MetaTaskType.DAILY);
+                    if (Objects.nonNull(atomTaskId)) {
+                        metaTaskToUserNew.setAtomTaskId(atomTaskId);
+                    }
+                }
+                MetaRestResult<MetaTaskToUserNew> result = receiveTask(metaTaskToUserNew);
+                if (Constants.MetaRestCode.success != result.getCode()) {
+                    throw new BusinessException(result.getMessage());
+                }
+            }
+        });
+        if (exist.get()) {
+            return MetaRestResult.returnSuccess("主动任务领取成功");
+        }
+        return MetaRestResult.returnSuccess("玩家主动领取任务已经全部领取");
+    }
+
+
+    @Transactional
+    public MetaRestResult<MetaTaskToUserNew> receiveTask(MetaTaskToUserNew metaTaskToUserNew) {
+        if (Objects.isNull(metaTaskToUserNew.getUserId())) {
+            return MetaRestResult.returnError("Illegal parameter : userId can not be null");
+        }
+        if (Objects.isNull(metaTaskToUserNew.getTaskId())) {
+            return MetaRestResult.returnError("Illegal parameter : taskId can not be null");
+        }
+        if (Objects.isNull(metaTaskToUserNew.getAtomTaskId())) {
+            return MetaRestResult.returnError("Illegal parameter : atomTaskId can not be null");
+        }
+        MetaTaskNew metaTaskNew = metaTaskNewRepo.findByIdAndDel(metaTaskToUserNew.getTaskId(), false);
+        if (Objects.isNull(metaTaskNew)) {
+            return MetaRestResult.returnError("任务不存在");
+        }
+        if (!metaTaskNew.isPublish()) {
+            return MetaRestResult.returnError("status error : task has not been published");
+        }
+        if (metaTaskNew.isFinish()) {
+            return MetaRestResult.returnError("status error : task has been finished");
+        }
+        if (StringUtils.isBlank(metaTaskNew.getName())) {
+            return MetaRestResult.returnError(String.format("任务[%S]缺少任务名称", metaTaskToUserNew.getTaskId()));
+        }
+        if (Objects.isNull(metaTaskNew.getDetail())) {
+            return MetaRestResult.returnError(String.format("任务[%S]缺少任务详情", metaTaskToUserNew.getTaskId()));
+        }
+        if (Objects.isNull(metaTaskNew.getType())) {
+            return MetaRestResult.returnError(String.format("任务[%S]缺少任务类型", metaTaskToUserNew.getTaskId()));
+        }
+        MetaAtomTask metaAtomTask = metaAtomTaskRepo.findByIdAndDel(metaTaskToUserNew.getAtomTaskId(), false);
+        if (Objects.isNull(metaAtomTask)) {
+            return MetaRestResult.returnError("基础任务不存在");
+        }
+        if (StringUtils.isBlank(metaAtomTask.getName())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少任务名称", metaTaskToUserNew.getAtomTaskId()));
+        }
+        if (Objects.isNull(metaAtomTask.getDetail())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少任务详情", metaTaskToUserNew.getAtomTaskId()));
+        }
+        if (Objects.isNull(metaAtomTask.getTargetType())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少目标", metaTaskToUserNew.getAtomTaskId()));
+        }
+        if (StringUtils.isBlank(metaAtomTask.getTargetConfig())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少目标配置", metaTaskToUserNew.getAtomTaskId()));
+        }
+        if (Objects.isNull(metaAtomTask.getAwardType())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少奖励类型", metaTaskToUserNew.getAtomTaskId()));
+        }
+        if (StringUtils.isBlank(metaAtomTask.getAwardConfig())) {
+            return MetaRestResult.returnError(String.format("基础任务[%S]缺少奖励配置", metaTaskToUserNew.getAtomTaskId()));
+        }
+
+        // 判断当前玩家是否领取过任务
+        MetaTaskToUserNew dbMetaTaskToUserNew = metaTaskToUserNewRepo.findByUserIdAndTaskIdAndAtomTaskIdAndDel(metaTaskToUserNew.getUserId(), metaTaskToUserNew.getTaskId(), metaTaskToUserNew.getAtomTaskId(), false);
+        if (Objects.nonNull(dbMetaTaskToUserNew)) {
+            return MetaRestResult.returnError(String.format("当前用户已在[%S]领取过该任务", dbMetaTaskToUserNew.getGetTime()));
+        }
+        metaTaskToUserNew.setGetTime(LocalDateTime.now());
+        metaTaskToUserNew.setStatus(MetaTaskStatus.PROGRESS);
+        metaTaskToUserNew.setChannelId(metaTaskNew.getChannelId());
+        if (MetaAwardTypeEnum.META_PROP.equals(metaAtomTask.getAwardType())) {
+            MetaProp metaProp = metaPropRepo.findByIdAndDel(Long.parseLong(metaAtomTask.getAwardConfig()), false);
+            if (Objects.isNull(metaProp)) {
+                return MetaRestResult.returnError(String.format("基础任务[%S]奖励配置的道具不存在", metaTaskToUserNew.getAtomTaskId()));
+            }
+            metaTaskToUserNew.setMetaProp(metaProp);
+        }
+
+        metaTaskToUserNew.setMetaTaskNew(metaTaskNew);
+        metaTaskToUserNew.setMetaAtomTask(metaAtomTask);
+        MetaTaskToUserNew save = metaTaskToUserNewRepo.save(metaTaskToUserNew);
+        setProgress(save);
+        return MetaRestResult.returnSuccess(save);
+    }
+
+    private void setProgress(MetaTaskToUserNew metaTaskToUserNew) {
+        // TODO
+    }
+}

+ 49 - 0
src/main/java/com/izouma/nineth/web/MetaTaskToUserNewController.java

@@ -0,0 +1,49 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.MetaTaskToUserNew;
+import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.repo.MetaTaskToUserNewRepo;
+import com.izouma.nineth.service.MetaTaskToUserNewService;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/metaTaskToUserNew")
+@AllArgsConstructor
+public class MetaTaskToUserNewController {
+
+    private MetaTaskToUserNewService metaTaskToUserNewService;
+
+    private MetaTaskToUserNewRepo metaTaskToUserNewRepo;
+
+    @PostMapping("/all")
+    public Page<MetaTaskToUserNew> all(@RequestBody PageQuery pageQuery) {
+        return metaTaskToUserNewService.all(pageQuery);
+    }
+
+    @PostMapping("/autoReceiveTask")
+    public MetaRestResult<Void> autoReceiveTask() {
+        return metaTaskToUserNewService.autoReceiveTask();
+    }
+
+
+    @PostMapping("/receiveTask")
+    public MetaRestResult<MetaTaskToUserNew> receiveTask(@RequestBody MetaTaskToUserNew metaTaskToUserNew) {
+        return metaTaskToUserNewService.receiveTask(metaTaskToUserNew);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<MetaTaskToUserNew> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+}