Pārlūkot izejas kodu

feat(shareProsperity): 新增贡献值功能模块

- 在API路由中添加贡献值列表接口 get_reward_list
- 创建新的控制器 app/controller/api/shareProsperity/Record.php 处理贡献值相关请求
- 在DAO层添加贡献值记录查询方法 getRewardList 和统计求和方法 getRewardSum
- 在Repository层实现贡献值分页列表和统计功能,包括个人、直推、小部门贡献值统计
- 集成用户团队关系查询,支持按部门统计贡献值数据
shichen 5 mēneši atpakaļ
vecāks
revīzija
4721b53a75

+ 88 - 0
app/common/dao/shared/SharedProsperityRewardRecordDao.php

@@ -38,4 +38,92 @@ class SharedProsperityRewardRecordDao extends BaseDao
38 38
         }
39 39
         return $entityList;
40 40
     }
41
+
42
+    /**
43
+     * 获取奖励记录分页列表
44
+     * @param int|null $userId 用户ID
45
+     * @param int|null $type 奖励类型
46
+     * @param int|null $status 状态:0=待确定 1=有效 -1=无效
47
+     * @param int|null $typeShop 类型店铺:0平台1多多进宝2唯品会3苏宁易购4网易考拉5淘宝客6京东联盟7饿了么8线上 9话费
48
+     * @param int|null $pm 0=支出 1=获得
49
+     * @param int $page 页码
50
+     * @param int $pageSize 每页数量
51
+     * @return array
52
+     */
53
+    public function getRewardList(?int $userId = null, ?int $type = null, ?int $status = null, ?int $typeShop = null, ?int $pm = null, int $page = 1, int $pageSize = 10): array
54
+    {
55
+        $list = [];
56
+        try {
57
+            /** @var SharedProsperityRewardRecord $model */
58
+            $model = $this->getModel();
59
+            $query = $model::getDB();
60
+            // 构建 where 条件
61
+            if (!is_null($userId) && $userId > 0) {
62
+                $query->where('user_id', $userId);
63
+            }
64
+            if (!is_null($type)) {
65
+                $query->where('type', $type);
66
+            }
67
+            if (!is_null($status)) {
68
+                $query->where('status', $status);
69
+            }
70
+            if (!is_null($typeShop)) {
71
+                $query->where('type_shop', $typeShop);
72
+            }
73
+            if (!is_null($pm)) {
74
+                $query->where('pm', $pm);
75
+            }
76
+            // 按创建时间倒序排列
77
+            $query->order('create_time', 'desc');
78
+            $list = $query->paginate(['page' => $page, 'list_rows' => $pageSize])
79
+                ->toArray();
80
+        } catch (\Exception $e) {
81
+            // 记录日志或忽略
82
+        }
83
+        return $list;
84
+    }
85
+
86
+    /**
87
+     * 根据条件求和奖励记录中的 number 字段
88
+     * @param int|array|null $userIds 单个用户ID或用户ID数组,为null时忽略此条件
89
+     * @param int|null $type
90
+     * @param int|null $status
91
+     * @param int|null $typeShop
92
+     * @param int|null $pm
93
+     * @return float
94
+     */
95
+    public function getRewardSum($userIds = null, ?int $type = null, ?int $status = null, ?int $typeShop = null, ?int $pm = null): float
96
+    {
97
+        try {
98
+            /** @var SharedProsperityRewardRecord $model */
99
+            $model = $this->getModel();
100
+            $query = $model::getDB();
101
+            if (!is_null($userIds)) {
102
+                if (is_array($userIds)) {
103
+                    if (empty($userIds)) {
104
+                        return 0.0;
105
+                    }
106
+                    $query->whereIn('user_id', $userIds);
107
+                } else {
108
+                    $query->where('user_id', (int) $userIds);
109
+                }
110
+            }
111
+            if (!is_null($type)) {
112
+                $query->where('type', $type);
113
+            }
114
+            if (!is_null($status)) {
115
+                $query->where('status', $status);
116
+            }
117
+            if (!is_null($typeShop)) {
118
+                $query->where('type_shop', $typeShop);
119
+            }
120
+            if (!is_null($pm)) {
121
+                $query->where('pm', $pm);
122
+            }
123
+            $sum = $query->sum('number');
124
+            return (float) $sum;
125
+        } catch (\Exception $e) {
126
+            return 0.0;
127
+        }
128
+    }
41 129
 }

+ 76 - 0
app/common/repositories/shared/SharedProsperityRewardRecordRepository.php

@@ -3,6 +3,7 @@
3 3
 namespace app\common\repositories\shared;
4 4
 
5 5
 use app\common\dao\shared\SharedProsperityRewardRecordDao;
6
+use app\common\dao\shared\SharedProsperityUserDao;
6 7
 use app\common\enum\shared\SharedProsperityRewardRecordEnum;
7 8
 use app\common\repositories\BaseRepository;
8 9
 use app\common\repositories\store\order\StoreOrderRepository;
@@ -263,4 +264,79 @@ class SharedProsperityRewardRecordRepository extends BaseRepository
263 264
 
264 265
         return $idList;
265 266
     }
267
+
268
+
269
+    /**
270
+     * 获取奖励记录分页列表,并返回统计数据
271
+     * @param int $userId 用户ID
272
+     * @param int $status 前端传入的状态:1=有效,0=待确定
273
+     * @param int $page 页码
274
+     * @param int $pageSize 每页数量,默认10
275
+     * @return array
276
+     */
277
+    public function getRewardList($userId, $status, $page, $pageSize = 10)
278
+    {
279
+        $type = SharedProsperityRewardRecordEnum::TYPE['PV']['code'];
280
+        if ($status == 1) {
281
+            $statusCode = SharedProsperityRewardRecordEnum::STATUS['VALID']['code'];
282
+        } else {
283
+            $statusCode = SharedProsperityRewardRecordEnum::STATUS['PENDING']['code'];
284
+        }
285
+        $pm = 1; // 只查询获得(收入)
286
+        // 获取分页列表
287
+        $list = $this->dao->getRewardList($userId, $type, $statusCode, null, $pm, $page, $pageSize);
288
+
289
+        // 计算统计数据
290
+        $stats = $this->calculateRewardStats($userId);
291
+
292
+        return [
293
+            'list' => $list,
294
+            'stats' => $stats,
295
+        ];
296
+    }
297
+
298
+    /**
299
+     * 计算奖励统计数据
300
+     * @param int $userId
301
+     * @return array
302
+     */
303
+    private function calculateRewardStats(int $userId): array
304
+    {
305
+        $type = SharedProsperityRewardRecordEnum::TYPE['PV']['code'];
306
+        $pm = 1; // 获得
307
+
308
+        // 1. 我的贡献值(有效)
309
+        $myContribution = $this->dao->getRewardSum($userId, $type, SharedProsperityRewardRecordEnum::STATUS['VALID']['code'], null, $pm);
310
+        // 2. 未生效贡献值(待确定)
311
+        $pendingContribution = $this->dao->getRewardSum($userId, $type, SharedProsperityRewardRecordEnum::STATUS['PENDING']['code'], null, $pm);
312
+
313
+        // 获取直推用户ID列表
314
+        /** @var SharedProsperityUserDao $sharedProsperityUserDao */
315
+        $sharedProsperityUserDao = app()->make(SharedProsperityUserDao::class);
316
+        $directUserIds = array_column($sharedProsperityUserDao->getDirectByUserId($userId), 'user_id');
317
+
318
+        // 3. 直推贡献值(直推用户的有效贡献总和)
319
+        $directContribution = 0;
320
+        if (!empty($directUserIds)) {
321
+            $directContribution = $this->dao->getRewardSum($directUserIds, $type, SharedProsperityRewardRecordEnum::STATUS['VALID']['code'], null, $pm);
322
+        }
323
+
324
+        // 4. 小部门贡献值(需要区分大部门和小部门)
325
+        // 获取团队划分
326
+        /** @var SharedProsperityUserRepository $sharedProsperityUserRepository */
327
+        $sharedProsperityUserRepository = app()->make(SharedProsperityUserRepository::class);
328
+        $teamData = $sharedProsperityUserRepository->getTeam($userId);
329
+        $smallDepartmentUserIds = array_column($teamData['small_department'] ?? [], 'user_id');
330
+        $smallDepartmentContribution = 0;
331
+        if (!empty($smallDepartmentUserIds)) {
332
+            $smallDepartmentContribution = $this->dao->getRewardSum($smallDepartmentUserIds, $type, SharedProsperityRewardRecordEnum::STATUS['VALID']['code'], null, $pm);
333
+        }
334
+
335
+        return [
336
+            'my_contribution' => (float) $myContribution,
337
+            'pending_contribution' => (float) $pendingContribution,
338
+            'direct_contribution' => (float) $directContribution,
339
+            'small_department_contribution' => (float) $smallDepartmentContribution,
340
+        ];
341
+    }
266 342
 }

+ 25 - 0
app/controller/api/shareProsperity/Record.php

@@ -0,0 +1,25 @@
1
+<?php
2
+
3
+namespace app\controller\api\shareProsperity;
4
+
5
+use crmeb\basic\BaseController;
6
+use app\common\repositories\shared\SharedProsperityRewardRecordRepository;
7
+
8
+class Record extends BaseController
9
+{
10
+    /**
11
+     * @return mixed
12
+     * @author 史晨
13
+     * @date 2026/2/9 15:52
14
+     * 贡献值列表
15
+     */
16
+    public function list()
17
+    {
18
+        $userId = $this->request->uid();
19
+        $data = request()->only(['status', 'page']);
20
+        /** @var SharedProsperityRewardRecordRepository $repository */
21
+        $repository = app()->make(SharedProsperityRewardRecordRepository::class);
22
+        $list = $repository->getRewardList($userId, $data['status'], $data['page']);
23
+        return app('json')->success($list);
24
+    }
25
+}

+ 2 - 0
route/api.php

@@ -359,6 +359,8 @@ Route::group('api/', function () {
359 359
         Route::group('shareProsperity', function () {
360 360
             // 部门
361 361
             Route::get('get_share_prosperity_team_list', 'Team/list');
362
+            // 贡献值
363
+            Route::get('get_reward_list', 'Record/list');
362 364
         })->prefix('api.shareProsperity.');
363 365
 
364 366
         //购物车