From e41a2c93c1d366da245ffe2ecc0c9d4457e4457d Mon Sep 17 00:00:00 2001
From: phpcjl <phpcjl@gmail.com>
Date: 星期五, 13 十二月 2024 18:21:21 +0800
Subject: [PATCH] 用户积分统计

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java |   40 ++++++++++++
 ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml                  |   35 +++++++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java          |    3 +
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java    |   71 ++++++++++++++++++++---
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java               |    9 +++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java            |    3 +
 6 files changed, 147 insertions(+), 14 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
index 45c943c..d954b30 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
@@ -69,4 +69,13 @@
     private String phone;
 
 
+    @ApiModelProperty(value = "开始时间")
+    @TableField(exist = false)
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @TableField(exist = false)
+    private LocalDateTime endTime;
+
+
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
index 85e22b0..a496d51 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -1,31 +1,44 @@
 package com.ruoyi.account.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.api.model.AppUser;
 import com.ruoyi.account.api.model.UserPoint;
+import com.ruoyi.account.mapper.UserPointMapper;
 import com.ruoyi.account.service.AppUserService;
 import com.ruoyi.account.service.UserPointService;
 import com.ruoyi.account.vo.UserPointDetailVO;
 import com.ruoyi.account.vo.UserPointStatistics;
 import com.ruoyi.account.vo.UserPointVO;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.model.LoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import io.swagger.models.auth.In;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.YearMonth;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -43,6 +56,8 @@
     private UserPointService userPointService;
     @Resource
     private AppUserService appUserService;
+    @Resource
+    private TokenService tokenService;
 
 
     /**
@@ -110,17 +125,51 @@
      * 积分统计
      */
     @GetMapping("/statistics")
+    @ApiOperation(value = "积分统计", tags = "管理后台-财务统计-用户积分统计")
     public R<UserPointStatistics> statistics(UserPoint userPoint) {
-        List<AppUser> appUserList = appUserService.list();
-        Integer totalPoint = 0;
-        Integer consumePoint = 0;
-        Integer sharePoint = 0;
-        List<UserPoint> userPointList = userPointService.list();
-        UserPointStatistics userPointStatistics = new UserPointStatistics();
-        userPointStatistics.setTotalPoint(totalPoint);
-        userPointStatistics.setConsumePoint(consumePoint);
-        userPointStatistics.setSharePoint(sharePoint);
-        return null;
+        return R.ok(userPointService.getStatistics(userPoint));
     }
+
+    /**
+     * 变更记录
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "积分变更记录", tags = "管理后台-财务统计-用户积分统计")
+    public R<Page<UserPoint>> list(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("大小") Integer pageSize, UserPoint userPoint) {
+        List<String> userIds = appUserService.listObjs(new LambdaQueryWrapper<AppUser>()
+                .select(AppUser::getId)
+                .eq(AppUser::getPhone, userPoint.getPhone())
+                .like(AppUser::getName, userPoint.getUserName()), String::valueOf);
+
+        Page<UserPoint> page = userPointService.page(Page.of(pageNum, pageSize), new LambdaQueryWrapper<UserPoint>()
+                .in(!CollectionUtils.isEmpty(userIds), UserPoint::getAppUserId, userIds)
+                .eq(UserPoint::getType, userPoint.getType())
+                .between(UserPoint::getCreateTime, userPoint.getStartTime(), userPoint.getEndTime())
+                .orderByDesc(UserPoint::getCreateTime));
+        return R.ok(page);
+    }
+
+    /**
+     * 导出
+     */
+    @GetMapping("/export")
+    @ApiOperation(value = "积分变更记录导出", tags = "管理后台-财务统计-用户积分统计")
+    public void export(HttpServletResponse response, UserPoint userPoint) {
+        List<String> userIds = appUserService.listObjs(new LambdaQueryWrapper<AppUser>()
+                .select(AppUser::getId)
+                .eq(AppUser::getPhone, userPoint.getPhone())
+                .like(AppUser::getName, userPoint.getUserName()), String::valueOf);
+
+        List<UserPoint> userPointList = userPointService.list(new LambdaQueryWrapper<UserPoint>()
+                .in(!CollectionUtils.isEmpty(userIds), UserPoint::getAppUserId, userIds)
+                .eq(UserPoint::getType, userPoint.getType())
+                .between(UserPoint::getCreateTime, userPoint.getStartTime(), userPoint.getEndTime())
+                .orderByDesc(UserPoint::getCreateTime));
+
+        ExcelUtil<UserPoint> util = new ExcelUtil<UserPoint>(UserPoint.class);
+        util.exportExcel(response, userPointList, "用户积分统计");
+    }
+
+
 }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java
index addb4f1..1bfbcff 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java
@@ -16,4 +16,7 @@
 public interface UserPointMapper extends BaseMapper<UserPoint> {
 
     List<UserPoint> findLatestUserPointByTypeForUser(Long userId);
+
+    List<UserPoint> findLatestChangeByType(UserPoint userPoint);
+
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
index a274f27..ce68846 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.account.api.model.UserPoint;
 import com.ruoyi.account.vo.UserPointDetailVO;
+import com.ruoyi.account.vo.UserPointStatistics;
 import com.ruoyi.account.vo.UserPointVO;
 
 import java.math.BigDecimal;
@@ -25,4 +26,6 @@
     List<UserPointDetailVO> getUserPointDetail(Long userId, LocalDateTime startTime, LocalDateTime endTime, Integer type);
 
     void transferPoint(BigDecimal point, String phone);
+
+    UserPointStatistics getStatistics(UserPoint userPoint);
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
index bc08986..c4da661 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -12,6 +12,7 @@
 import com.ruoyi.account.service.UserPointService;
 import com.ruoyi.account.service.VipSettingService;
 import com.ruoyi.account.vo.UserPointDetailVO;
+import com.ruoyi.account.vo.UserPointStatistics;
 import com.ruoyi.account.vo.UserPointVO;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.PhoneNumberValidator;
@@ -51,6 +52,8 @@
     private VipSettingService vipSettingService;
     @Resource
     private PointSettingService pointSettingService;
+    @Resource
+    private UserPointMapper userPointMapper;
 
     @Override
     public UserPointVO getUserPoint(Long userId) {
@@ -121,8 +124,9 @@
         }
         Integer buyPointOpen = pointSetting.getBuyPointOpen();
 
-        List<UserPoint> userPointList = list(new LambdaQueryWrapper<UserPoint>()
-                .eq(UserPoint::getAppUserId, userid));
+        UserPoint userPoint = new UserPoint();
+        userPoint.setAppUserId(userid);
+        List<UserPoint> userPointList = userPointMapper.findLatestChangeByType(userPoint);
         Map<Integer, Integer> userBalanceMap = userPointList.stream()
                 .collect(Collectors.toMap(UserPoint::getType, UserPoint::getBalance));
 
@@ -155,4 +159,36 @@
     private int getAdjustedPoint(Map<Integer, Integer> userBalanceMap, int pointTypeCode, boolean isOpen) {
         return isOpen ? 0 : Optional.ofNullable(userBalanceMap.get(pointTypeCode)).orElse(0);
     }
+
+    @Override
+    public UserPointStatistics getStatistics(UserPoint userPoint) {
+        LoginUser loginUser = tokenService.getLoginUser();
+        userPoint.setAppUserId(loginUser.getUserid());
+        List<UserPoint> userPointList =  userPointMapper.findLatestChangeByType(userPoint);
+        Map<Integer, Integer> userBalanceMap = userPointList.stream()
+                .collect(Collectors.toMap(UserPoint::getType, UserPoint::getBalance));
+
+        Integer consumePoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.CONSUME.getCode())).orElse(0);
+        Integer sharePoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.COMMISSION_RETURN.getCode())).orElse(0);
+        Integer pullNewPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.NEW_USER_REFERRAL.getCode())).orElse(0);
+        Integer registerPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.REGISTRATION.getCode())).orElse(0);
+        Integer workPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.WORK_PERFORMANCE.getCode())).orElse(0);
+        Integer shopAchievementPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.TECHNICIAN_PERFORMANCE.getCode())).orElse(0);
+        Integer exchangeGoodsPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.EXCHANGE_GOODS.getCode())).orElse(0);
+        Integer storeAchievementPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.STORE_PERFORMANCE.getCode())).orElse(0);
+        Integer storeCommissionPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.STORE_COMMISSION_RETURN.getCode())).orElse(0);
+        Integer transferPoint = Optional.ofNullable(userBalanceMap.get(PointChangeType.TRANSFER_POINTS.getCode())).orElse(0);
+        Integer totalPoint = consumePoint + sharePoint + pullNewPoint + registerPoint + workPoint + shopAchievementPoint + exchangeGoodsPoint + storeAchievementPoint + storeCommissionPoint + transferPoint;
+
+
+        UserPointStatistics userPointStatistics = new UserPointStatistics();
+        userPointStatistics.setTotalPoint(totalPoint);
+        userPointStatistics.setConsumePoint(consumePoint);
+        userPointStatistics.setSharePoint(sharePoint);
+        userPointStatistics.setPullNewPoint(pullNewPoint);
+        userPointStatistics.setRegisterPoint(registerPoint);
+        userPointStatistics.setWorkPoint(workPoint);
+        userPointStatistics.setShopAchievementPoint(shopAchievementPoint);
+        return userPointStatistics;
+    }
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml
index 9f38579..bb07244 100644
--- a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml
+++ b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml
@@ -22,10 +22,43 @@
             t1.*
         FROM
             t_user_point t1
-                INNER JOIN ( SELECT type, MAX( create_time ) AS max_create_time FROM t_user_point WHERE app_user_id = 1864118151377129473 GROUP BY type ) t2 ON t1.type = t2.type
+                INNER JOIN ( SELECT type, MAX( create_time ) AS max_create_time FROM t_user_point WHERE app_user_id = #{userId} GROUP BY type ) t2 ON t1.type = t2.type
                 AND t1.create_time = t2.max_create_time
         WHERE
             t1.app_user_id = #{userId}
     </select>
+    <select id="findLatestChangeByType" resultType="com.ruoyi.account.api.model.UserPoint">
+        SELECT
+            id,
+            type,
+            historical_point,
+            variable_point,
+            balance,
+            create_time,
+            app_user_id,
+            object_id
+        FROM (
+                 SELECT
+                     id,
+                     type,
+                     historical_point,
+                     variable_point,
+                     balance,
+                     create_time,
+                     app_user_id,
+                     object_id,
+                     ROW_NUMBER() OVER (PARTITION BY type ORDER BY create_time DESC) AS rn
+                 FROM
+                     t_user_point
+             ) AS subquery
+        WHERE
+            rn = 1
+        <if test="type != null">
+            AND type = #{type}
+        </if>
+        <if test="appUserId != null">
+            AND app_user_id = #{appUserId}
+        </if>
+    </select>
 
 </mapper>

--
Gitblit v1.7.1