Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

finikes 2 tahun lalu
induk
melakukan
6334f10ff8

+ 1 - 1
src/main/java/com/finikes/oc/vote/LockServiceImpl.java

@@ -9,7 +9,7 @@ public class LockServiceImpl implements LockService {
 
     @Override
     public boolean lock(String resourceId, String ownerId, long time, TimeUnit unit) {
-        return false;
+        return true;
     }
 
     @Override

+ 23 - 0
src/main/java/com/finikes/oc/vote/PassportHelper.java

@@ -0,0 +1,23 @@
+package com.finikes.oc.vote;
+
+import com.finikes.oc.Passports;
+import com.finikes.oc.base.entity.Passport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Component
+public class PassportHelper {
+
+    private static HttpServletRequest httpServletRequest;
+
+    @Autowired
+    public void setHttpServletRequest(HttpServletRequest httpServletRequest) {
+        PassportHelper.httpServletRequest = httpServletRequest;
+    }
+
+    public static Passport currentPassport() {
+        return Passports.getPassport(httpServletRequest);
+    }
+}

+ 14 - 1
src/main/java/com/finikes/oc/vote/controller/VoteController.java

@@ -103,7 +103,7 @@ public class VoteController {
      * @param activityId 投票活动 ID
      * @return 接口返回对象
      */
-    @GetMapping(" votes/")
+    @GetMapping("votes/")
     public ApiResponse<List<VoteViewDto>> searchVote(@RequestParam("activityId") Integer activityId) {
         List<VoteViewDto> votes = voteService.searchVotes(activityId);
         return ApiResponse.successful(votes);
@@ -121,6 +121,19 @@ public class VoteController {
         return ApiResponse.successful();
     }
 
+    /**
+     * 代理投票
+     *
+     * @param dto 代理投票数据传输对象
+     * @return 接口返回对象
+     */
+    @PutMapping("choise/delegation")
+    public ApiResponse<Void> choiceDelegation(@RequestBody @Valid ChoiceDelegationDto dto) {
+        voteService.madeChoiceDelegation(dto);
+        return ApiResponse.successful();
+    }
+
+
     /**
      * 异常处理器
      *

+ 30 - 0
src/main/java/com/finikes/oc/vote/dto/ChoiceDelegationDto.java

@@ -0,0 +1,30 @@
+package com.finikes.oc.vote.dto;
+
+public class ChoiceDelegationDto {
+    private Integer optionId;
+    private Integer principalId;
+
+    @Override
+    public String toString() {
+        return "ChoiceDelegationDto{" +
+                "optionId=" + optionId +
+                ", principalId=" + principalId +
+                '}';
+    }
+
+    public Integer getOptionId() {
+        return optionId;
+    }
+
+    public void setOptionId(Integer optionId) {
+        this.optionId = optionId;
+    }
+
+    public Integer getPrincipalId() {
+        return principalId;
+    }
+
+    public void setPrincipalId(Integer principalId) {
+        this.principalId = principalId;
+    }
+}

+ 7 - 0
src/main/java/com/finikes/oc/vote/service/VoteService.java

@@ -62,4 +62,11 @@ public interface VoteService {
      */
     void madeChoice(ChoiceDto dto);
 
+    /**
+     * 代理投票
+     *
+     * @param dto 代理投票数据传输对象
+     */
+    void madeChoiceDelegation(ChoiceDelegationDto dto);
+
 }

+ 60 - 3
src/main/java/com/finikes/oc/vote/service/VoteServiceImpl.java

@@ -1,6 +1,8 @@
 package com.finikes.oc.vote.service;
 
+import com.finikes.oc.base.entity.Passport;
 import com.finikes.oc.vote.LockService;
+import com.finikes.oc.vote.PassportHelper;
 import com.finikes.oc.vote.dao.ChoiceDao;
 import com.finikes.oc.vote.dao.OptionDao;
 import com.finikes.oc.vote.dao.VoteActivityDao;
@@ -220,11 +222,14 @@ public class VoteServiceImpl implements VoteService {
 
     @Override
     public void madeChoice(ChoiceDto dto) {
-        int voterId = 0;
+        Passport passport = PassportHelper.currentPassport();
+        if (passport == null) {
+            throw new BusinessException("获取登录状态异常");
+        }
         // TODO 需要方法获取登录用户信息
 
         // TODO 这里需要锁住 用户ID 防止单个用户的并发调用, 锁住用户具有的房产主键已达到一房一票的需求.
-        String resourceId = "vote:" + voterId;
+        String resourceId = "vote:" + passport.getId();
         String ownerId = UUID.randomUUID().toString();
         boolean locked = lockService.lock(resourceId, ownerId, 60, TimeUnit.SECONDS);
         if (!locked) {
@@ -260,7 +265,7 @@ public class VoteServiceImpl implements VoteService {
             // TODO 检查此登录人员的房产下的绑定人员是否参与过此抽奖.
 
             Choice choice = new Choice();
-            choice.setAssigneeId(voterId);
+            choice.setAssigneeId(passport.getId());
             choice.setOptionId(dto.getOptionId());
             choice.setProxy(false);
             choice.setChooseTime(now);
@@ -270,4 +275,56 @@ public class VoteServiceImpl implements VoteService {
             lockService.unlock(resourceId, ownerId);
         }
     }
+
+    @Override
+    public void madeChoiceDelegation(ChoiceDelegationDto dto) {
+        Passport passport = PassportHelper.currentPassport();
+        if (passport == null) {
+            throw new BusinessException("获取登录状态异常");
+        }
+        String resourceId = "vote:" + passport.getId();
+        String ownerId = UUID.randomUUID().toString();
+        boolean locked = lockService.lock(resourceId, ownerId, 60, TimeUnit.SECONDS);
+        if (!locked) {
+            throw new BusinessException("请稍后再试");
+        }
+
+        try {
+            long now = System.currentTimeMillis();
+
+            Option option = optionDao.selectByPrimaryKey(dto.getOptionId());
+            if (option == null) {
+                throw new BusinessException("参与的投票不存在");
+            }
+
+            Vote vote = voteDao.selectByPrimaryKey(option.getVoteId());
+            if (vote == null) {
+                throw new BusinessException("参与的投票不存在");
+            }
+
+            VoteActivity activity = voteActivityDao.selectByPrimaryKey(vote.getActivityId());
+            if (activity == null) {
+                throw new BusinessException("参与的投票不存在");
+            }
+
+            if (now < activity.getStartTime()) {
+                throw new BusinessException("投票日期未到");
+            }
+
+            if (now > activity.getEndTime()) {
+                throw new BusinessException("投票日期已过");
+            }
+
+            Choice choice = new Choice();
+            choice.setAssigneeId(dto.getPrincipalId());
+            choice.setOptionId(dto.getOptionId());
+            choice.setAssigneeId(passport.getId());
+            choice.setProxy(true);
+            choice.setChooseTime(now);
+
+            choiceDao.insert(choice);
+        } finally {
+            lockService.unlock(resourceId, ownerId);
+        }
+    }
 }