From 3f45e8fdfa31d7b764d60a7c0cb5dd11944ed418 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期一, 21 九月 2026 23:38:59 +0800
Subject: [PATCH] bug:统计数据修正

---
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/HuiminCardServiceImpl.java |  111 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 103 insertions(+), 8 deletions(-)

diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/HuiminCardServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/HuiminCardServiceImpl.java
index cff2ff1..ad750f5 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/HuiminCardServiceImpl.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/HuiminCardServiceImpl.java
@@ -1,20 +1,28 @@
 package com.dsh.activity.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.dsh.activity.entity.BenefitsVideoClassification;
 import com.dsh.activity.entity.THuiminCard;
-import com.dsh.activity.mapper.BenefitsVideoClassificationMapper;
+import com.dsh.activity.entity.TPayHuimin;
+import com.dsh.activity.entity.TStudent;
+import com.dsh.activity.enums.HuiminCardPaymentStatusEnum;
+import com.dsh.activity.enums.HuiminCardPaymentTypeEnum;
+import com.dsh.activity.enums.HuiminCardRefundStatusEnum;
+import com.dsh.activity.enums.HuiminCardTypeEnum;
+import com.dsh.activity.feignclient.account.StudentClient;
 import com.dsh.activity.mapper.HuiminCardMapper;
-import com.dsh.activity.model.BenefitsVedioChangeStateVO;
-import com.dsh.activity.model.QueryBenefitsVedioVO;
-import com.dsh.activity.model.TQueryBenefitsVO;
-import com.dsh.activity.model.response.HuiminCardVO;
 import com.dsh.activity.model.response.MyHuiminCardVO;
 import com.dsh.activity.service.HuiminCardService;
-import com.dsh.activity.service.IBenefitsVideoClassificationService;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.dsh.activity.service.PayHuiminService;
+import com.dsh.activity.util.UUIDUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -24,13 +32,100 @@
 @Service
 public class HuiminCardServiceImpl extends ServiceImpl<HuiminCardMapper, THuiminCard> implements HuiminCardService {
 
+    private static final int ANNUAL_CARD_VALID_DAYS = 365;
+    private static final int YEAR_END_MONTH = Calendar.DECEMBER;
+    private static final int YEAR_END_DAY = 31;
+    private static final int DAY_END_HOUR = 23;
+    private static final int DAY_END_MINUTE = 59;
+    private static final int DAY_END_SECOND = 59;
+
+    @Resource
+    private PayHuiminService payHuiminService;
+    @Resource
+    private StudentClient studentClient;
+
     @Override
     public List<THuiminCard> getHuiminAgreementAndList(Integer pageNo, Integer pageSize, Integer storeId) {
         return this.baseMapper.getHuiminAgreementAndList(pageNo,pageSize,storeId);
+    }
+    @Override
+    public List<THuiminCard> getHuiminAgreementAndListNolimit(Integer storeId) {
+        return this.baseMapper.getHuiminAgreementAndListNolimit(storeId);
     }
 
     @Override
     public List<MyHuiminCardVO> getMyHuiminCardList(Integer pageNo, Integer pageSize,Integer appUserId) {
         return this.baseMapper.getMyHuiminCardList(pageNo,pageSize,appUserId);
     }
+
+    /**
+     * 为指定绑定人员录入赠送的玩湃惠民卡订单。
+     * 业务流程:参数校验 → 校验卡及人员 → 计算有效期 → 保存赠送订单。
+     *
+     * @param studentId 绑定人员ID,不可为空
+     * @param cardId    玩湃惠民卡ID,不可为空
+     * @throws IllegalArgumentException 惠民卡或绑定人员不存在时抛出
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void recordGiftHuiminCard(Integer studentId, Integer cardId) {
+        // STEP 1: 校验录入所需的基础参数。
+        if (studentId == null || cardId == null) {
+            throw new IllegalArgumentException("绑定人员和惠民卡不能为空");
+        }
+
+        // STEP 2: 查询并校验惠民卡和绑定人员,确保订单关联数据有效。
+        THuiminCard huiminCard = this.getById(cardId);
+        if (huiminCard == null) {
+            throw new IllegalArgumentException("玩湃惠民卡不存在");
+        }
+        List<TStudent> students = studentClient.getStudentByIds(String.valueOf(studentId));
+        if (CollUtil.isEmpty(students) || students.get(0).getAppUserId() == null) {
+            throw new IllegalArgumentException("绑定人员不存在或未关联用户");
+        }
+
+        // STEP 3: 按卡类型计算赠送卡的有效期。
+        Date currentTime = new Date();
+        TPayHuimin giftOrder = new TPayHuimin();
+        giftOrder.setSalesMoney(huiminCard.getSalesMoney());
+        giftOrder.setAppUserId(students.get(0).getAppUserId());
+        giftOrder.setStudentId(String.valueOf(studentId));
+        giftOrder.setEndTime(calculateEndTime(huiminCard.getHuiMinType(), currentTime));
+
+        // STEP 4: 以赠送类型保存已支付订单,保留卡面金额但不参与售卖金额统计。
+        giftOrder.setInsertTime(currentTime);
+        giftOrder.setPaymentTime(currentTime);
+        giftOrder.setPaymentType(HuiminCardPaymentTypeEnum.GIFT.getCode());
+        giftOrder.setStatus(HuiminCardPaymentStatusEnum.PAID.getCode());
+        giftOrder.setRefundStatus(HuiminCardRefundStatusEnum.PENDING_REFUND.getCode());
+        giftOrder.setCardId(huiminCard.getId());
+        giftOrder.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
+        payHuiminService.save(giftOrder);
+    }
+
+    /**
+     * 根据惠民卡类型计算有效期。
+     *
+     * @param cardType    惠民卡类型
+     * @param currentTime 当前时间
+     * @return 有效期结束时间;未知类型时返回 null
+     */
+    private Date calculateEndTime(Integer cardType, Date currentTime) {
+        if (HuiminCardTypeEnum.ANNUAL_CARD.matches(cardType)) {
+            LocalDateTime expirationTime = LocalDateTime.now().plusDays(ANNUAL_CARD_VALID_DAYS);
+            return Date.from(expirationTime.atZone(ZoneId.systemDefault()).toInstant());
+        }
+        if (HuiminCardTypeEnum.CURRENT_YEAR_CARD.matches(cardType)) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(currentTime);
+            calendar.set(Calendar.MONTH, YEAR_END_MONTH);
+            calendar.set(Calendar.DAY_OF_MONTH, YEAR_END_DAY);
+            calendar.set(Calendar.HOUR_OF_DAY, DAY_END_HOUR);
+            calendar.set(Calendar.MINUTE, DAY_END_MINUTE);
+            calendar.set(Calendar.SECOND, DAY_END_SECOND);
+            calendar.set(Calendar.MILLISECOND, 0);
+            return calendar.getTime();
+        }
+        return null;
+    }
 }

--
Gitblit v1.7.1