From ba6b781b146b2e941489149fb23594067cb2fa43 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期二, 30 九月 2025 13:35:03 +0800
Subject: [PATCH] 添加抽奖次数调整

---
 manager-api/src/main/java/cn/lili/controller/lmk/PrizeActivityController.java         |   15 +++++
 framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java          |    5 +
 framework/src/main/java/cn/lili/modules/lmk/mapper/ActionRecordMapper.java            |    5 +
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java        |  109 ++++++++++++++++++++++++++++++++----
 framework/src/main/resources/mapper/lmk/ActionRecordMapper.xml                        |   21 +++++++
 framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java |    6 ++
 6 files changed, 148 insertions(+), 13 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/ActionRecordMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/ActionRecordMapper.java
index c73915c..90b15b1 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/mapper/ActionRecordMapper.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/ActionRecordMapper.java
@@ -6,6 +6,9 @@
 import cn.lili.modules.lmk.domain.vo.ActionRecordVO;
 import cn.lili.modules.lmk.domain.form.ActionRecordForm;
 import cn.lili.modules.lmk.domain.query.ActionRecordQuery;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -31,4 +34,6 @@
     */
     IPage getPage(IPage page, @Param("query") ActionRecordQuery query);
 
+    BigDecimal getToDayStayTime(@Param("userId") String userId,@Param("begin") LocalDateTime begin ,@Param("end") LocalDateTime end);
+
 }
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java
index 671ffb5..5012630 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java
@@ -5,6 +5,9 @@
 import cn.lili.base.Result;
 import cn.lili.modules.lmk.domain.form.ActionRecordForm;
 import cn.lili.modules.lmk.domain.query.ActionRecordQuery;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -64,4 +67,6 @@
     Result all();
 
     Result grantSessionId();
+
+    BigDecimal getToDayStayTime(String userId , LocalDateTime begin , LocalDateTime end);
 }
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java
index e5c2a71..36ea39d 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java
@@ -19,6 +19,7 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.util.Assert;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
@@ -140,4 +141,9 @@
         }
         return Result.ok().data(IdWorker.getIdStr());
     }
+
+    @Override
+    public BigDecimal getToDayStayTime(String userId, LocalDateTime begin , LocalDateTime end) {
+       return baseMapper.getToDayStayTime(userId,begin,end);
+    }
 }
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
index b550cc6..5a03622 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
@@ -16,6 +16,8 @@
 import cn.lili.modules.lmk.domain.vo.PrizeResultVO;
 import cn.lili.modules.lmk.enums.general.*;
 import cn.lili.modules.lmk.service.*;
+import cn.lili.modules.member.entity.dos.Member;
+import cn.lili.modules.member.service.MemberService;
 import cn.lili.modules.order.order.entity.dos.Order;
 import cn.lili.modules.order.order.service.OrderService;
 import cn.lili.modules.promotion.entity.dos.Coupon;
@@ -74,6 +76,9 @@
     private final ShareActionService shareActionService;
     private final AddNumCheekService addNumCheekService;
     private final OrderService orderService;
+    private final MemberService memberService;
+    private final VideoService videoService;
+    private final VideoAuditRecordService videoAuditRecordService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -548,6 +553,37 @@
             addPrizeNumForm.setUserId(currentUser.getId());
 
         }
+        String extend = addPrizeNumForm.getExtend();
+        JSONObject jsonObject = JSONObject.parseObject(extend);
+        String shareId =null;
+        if (jsonObject != null) {
+            shareId  = jsonObject.getString("shareId");
+        }
+        Date date = new Date();
+        ShareAction shareAction =null;
+        //鍒嗕韩杩涙潵鐨勯渶瑕佹坊鍔犲垎浜殑鐢ㄦ埛
+        if (StringUtils.isNotBlank(shareId)) {
+            shareAction  = shareActionService.getById(shareId);
+            String userId = shareAction.getUserId();
+            addPrizeNumForm.setUserId(userId);
+            Date createTime = shareAction.getCreateTime();
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(createTime); // 灏咲ate璁剧疆鍒癈alendar涓�
+            calendar.add(Calendar.DAY_OF_MONTH, 1); // 鍔犱竴澶�
+            Date nextDay = calendar.getTime();
+            //鍒ゆ柇鏄惁鏄柊鐢ㄦ埛
+            if (nextDay.before(date)) {
+                //褰撳墠鍒嗕韩涓嶆槸浠婂ぉ鐨勫垎浜�
+                log.info("褰撳墠鍒嗕韩涓嶆槸浠婂ぉ鐨勫垎浜珄}",shareId);
+                return Result.ok().data(0);
+            }
+            if (currentUser.getId().equals(userId)) {
+                //鍒嗕韩鐨勭敤鎴疯嚜宸辩偣鍑讳簡
+                log.info("鐢ㄦ埛鑷繁鐐瑰嚮浜嗚嚜宸辩殑鍒嗕韩");
+                return Result.ok().data(0);
+            }
+        }
+
         String userId = addPrizeNumForm.getUserId();
         RLock lock = redissonClient.getLock(PRIZE_ADD_NUM + userId);
         try {
@@ -560,7 +596,6 @@
             if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) {
                 throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�");
             }
-            Date date = new Date();
             //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔�
             if (date.after(activity.getEndTime())) {
                 throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�");
@@ -595,8 +630,6 @@
                     break;
                 }
             }
-            String extend = addPrizeNumForm.getExtend();
-            JSONObject jsonObject = JSONObject.parseObject(extend);
             LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery();
             AddNumCheek addNumCheek = null;
             String orderSn = null;
@@ -604,9 +637,8 @@
             String ruleValue = null;
             switch (actionEnum) {
                 case SHARE_GOODS_VIDEO:
-                    String shareId = jsonObject.getString("shareId");
-                    ShareAction shareAction = shareActionService.getById(shareId);
                     if (shareAction == null) {
+                        log.info("褰撳墠鐢ㄦ埛娌℃湁鍒嗕韩{}",userId);
                         return Result.ok().data(0);
                     }
                     if (addFlag) {
@@ -615,17 +647,32 @@
                     }
                     break;
                 case SHARE_USER_REGISTRY:
-                    String memberId = jsonObject.getString("memberId");
+                    if (shareAction == null) {
+                        log.info("褰撳墠鐢ㄦ埛娌℃湁鍒嗕韩{}",userId);
+                        return Result.ok().data(0);
+                    }
+                    Member member = memberService.getById(shareAction.getUserId());
+                    Date createTime = member.getCreateTime();
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(createTime); // 灏咲ate璁剧疆鍒癈alendar涓�
+                    calendar.add(Calendar.DAY_OF_MONTH, 1); // 鍔犱竴澶�
+                    Date nextDay = calendar.getTime();
+                    //鍒ゆ柇鏄惁鏄柊鐢ㄦ埛
+                    if (nextDay.before(date)) {
+                        //褰撳墠鐢ㄦ埛涓嶆槸鏂扮敤鎴�
+                        log.info("褰撳墠鐢ㄦ埛涓嶆槸鏂扮敤鎴穥}",currentUser.getId());
+                        return Result.ok().data(0);
+                    }
                     query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_REGISTRY.name())
-                            .eq(AddNumCheek::getCheckNo, memberId);
+                            .eq(AddNumCheek::getCheckNo, currentUser.getId());
                     if (addNumCheekService.getOne(query) != null) {
-                        log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}", memberId);
+                        log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}", currentUser.getId());
                         return Result.ok().data(0);
                     }
                     addNumCheek = new AddNumCheek();
                     addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name());
                     addNumCheek.setUserId(userId);
-                    addNumCheek.setCheckNo(memberId);
+                    addNumCheek.setCheckNo(currentUser.getId());
                     addNumCheekService.save(addNumCheek);
                     break;
                 case SHARE_USER_SHOPPING:
@@ -649,11 +696,18 @@
                     addNumCheekService.save(addNumCheek);
                     break;
                 case USER_STAY_TIME:
-                    //todo 閫氳繃鐢ㄦ埛琛屼负鍒嗘瀽鑾峰彇鏁版嵁杩涜鍒ゆ柇
-                    ruleValue = addPrizeRule.getRuleValue();
-
                     if (addFlag) {
                         log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}", userId);
+                        return Result.ok().data(0);
+                    }
+                    ruleValue = addPrizeRule.getRuleValue();
+                    LocalDate now = LocalDate.now();
+                    LocalDateTime begin = LocalDateTime.of(now, LocalTime.MIN);
+                    LocalDateTime end = LocalDateTime.of(now, LocalTime.MAX);
+                    BigDecimal toDayStayTime = actionRecordService.getToDayStayTime(currentUser.getId(), begin, end);
+                    BigDecimal divide = toDayStayTime.divide(new BigDecimal(60), 2, RoundingMode.HALF_UP);
+                    if (divide.compareTo(new BigDecimal(ruleValue)) < 0) {
+                        log.info("褰撳墠鐢ㄦ埛鍋滅暀鏃堕棿涓嶈冻鏃犳硶澧炲姞娆℃暟");
                         return Result.ok().data(0);
                     }
                     break;
@@ -707,7 +761,36 @@
                 case USER_SCAN_STORE:
                     break;
                 case USER_PUBLISH_EXAMINE:
-
+                    String videoId = jsonObject.getString("videoId");
+                    query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_PUBLISH_EXAMINE.name())
+                            .eq(AddNumCheek::getCheckNo, videoId);
+                    if (addNumCheekService.getOne(query) != null) {
+                        log.info("褰撳墠瑙嗛瀹℃牳宸茬粡鍙戞斁杩囦簡----------------->{}", videoId);
+                        return Result.ok().data(0);
+                    }
+                    Video video = videoService.getById(videoId);
+                    if (video == null) {
+                        log.info("褰撳墠瑙嗛涓嶅瓨鍦▄}",videoId);
+                        return Result.ok().data(0);
+                    }
+                    String status = video.getStatus();
+                    if (!"1".equals(status)) {
+                        log.info("褰撳墠瑙嗛娌℃湁瀹℃牳閫氳繃{}",videoId);
+                        return Result.ok().data(0);
+                    }
+                    LambdaQueryWrapper<VideoAuditRecord> eq = Wrappers.<VideoAuditRecord>lambdaQuery()
+                            .eq(VideoAuditRecord::getVideoId, videoId)
+                            .eq(VideoAuditRecord::getAuditSuccess, true);
+                    List<VideoAuditRecord> list = videoAuditRecordService.list(eq);
+                    if (list.isEmpty()) {
+                        log.info("褰撳墠瑙嗛娌℃湁瀹℃牳閫氳繃{}",videoId);
+                        return Result.ok().data(0);
+                    }
+                    addNumCheek = new AddNumCheek();
+                    addNumCheek.setType(PrizeUserActionEnum.USER_PUBLISH_EXAMINE.name());
+                    addNumCheek.setUserId(userId);
+                    addNumCheek.setCheckNo(videoId);
+                    addNumCheekService.save(addNumCheek);
                     break;
                 default:
                     return Result.ok().data(0);
diff --git a/framework/src/main/resources/mapper/lmk/ActionRecordMapper.xml b/framework/src/main/resources/mapper/lmk/ActionRecordMapper.xml
index 19b542e..12fd549 100644
--- a/framework/src/main/resources/mapper/lmk/ActionRecordMapper.xml
+++ b/framework/src/main/resources/mapper/lmk/ActionRecordMapper.xml
@@ -65,4 +65,25 @@
             LAR.delete_flag = 0
     </select>
 
+    <select id="getToDayStayTime" resultType="decimal">
+        SELECT SUM(t.stay_seconds)
+        FROM (SELECT user_id,
+                     page_code,
+                     session_id,
+                     MIN(CASE WHEN page_status = 'JOIN' THEN start_time END)  AS enter_time,
+                     MIN(CASE WHEN page_status = 'LEAVE' THEN start_time END) AS leave_time,
+                     TIMESTAMPDIFF(SECOND, MIN(CASE WHEN page_status = 'JOIN' THEN start_time END),
+                                           MIN(CASE WHEN page_status = 'LEAVE' THEN start_time END)
+                     )                                                        AS stay_seconds
+              FROM lmk_action_record
+              WHERE action_type = 'PAGE'
+                AND page_status IN ('JOIN', 'LEAVE')
+                AND user_id = #{userId}
+                AND create_time BETWEEN #{begin} AND #{end}
+              GROUP BY user_id, page_code, session_id
+              HAVING enter_time IS NOT NULL
+                 AND leave_time IS NOT NULL
+              ORDER BY user_id, session_id, enter_time) t
+    </select>
+
 </mapper>
diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/PrizeActivityController.java b/manager-api/src/main/java/cn/lili/controller/lmk/PrizeActivityController.java
index 4448ec2..d65c86d 100644
--- a/manager-api/src/main/java/cn/lili/controller/lmk/PrizeActivityController.java
+++ b/manager-api/src/main/java/cn/lili/controller/lmk/PrizeActivityController.java
@@ -5,10 +5,12 @@
 import cn.lili.cache.Cache;
 import cn.lili.common.security.context.UserContext;
 import cn.lili.modules.lmk.domain.form.ActivityRefPrizeForm;
+import cn.lili.modules.lmk.domain.form.AddPrizeNumForm;
 import cn.lili.modules.lmk.domain.form.PrizeActivityForm;
 import cn.lili.modules.lmk.domain.query.PrizeActivityQuery;
 import cn.lili.modules.lmk.service.ActivityRefPrizeService;
 import cn.lili.modules.lmk.service.PrizeActivityService;
+import cn.lili.modules.lmk.service.PrizeService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -35,6 +37,8 @@
     private final PrizeActivityService prizeActivityService;
 
     private final ActivityRefPrizeService activityRefPrizeService;
+
+    private final PrizeService prizeService;
 
 
 
@@ -78,4 +82,15 @@
     public Result publishPrizeActivity(@PathVariable("id") String id){
         return prizeActivityService.publishPrizeActivity(id);
     }
+
+    /**
+     * 澧炲姞鎶藉娆℃暟
+     *
+     * @param addPrizeNumForm
+     * @return
+     */
+    @PostMapping("/addPrizeNum")
+    public Result addPrizeNum( @RequestBody AddPrizeNumForm addPrizeNumForm) {
+        return prizeService.addPrizeNum(addPrizeNumForm);
+    }
 }

--
Gitblit v1.8.0