|
|
@@ -2,53 +2,195 @@
|
|
2
|
2
|
|
|
3
|
3
|
namespace app\common\utils;
|
|
4
|
4
|
|
|
|
5
|
+use app\common\dao\profit\ProductPvDao;
|
|
|
6
|
+use app\common\dao\store\order\StoreCartDao;
|
|
5
|
7
|
use app\common\dao\store\order\StoreOrderDao;
|
|
|
8
|
+use app\common\dao\user\UserDao;
|
|
6
|
9
|
|
|
7
|
10
|
/**
|
|
8
|
|
- * 业绩计算
|
|
|
11
|
+ * PV业绩计算工具类
|
|
|
12
|
+ *
|
|
|
13
|
+ * 用于计算用户的业绩(PV)值,基于订单和购物车数据进行统计
|
|
|
14
|
+ * PV值根据商品配置的PV系数和购买数量计算得出
|
|
9
|
15
|
*/
|
|
10
|
16
|
class Pv
|
|
11
|
17
|
{
|
|
12
|
|
- public $pv = [];
|
|
|
18
|
+ /**
|
|
|
19
|
+ * 商户ID,默认为496
|
|
|
20
|
+ * @var int
|
|
|
21
|
+ */
|
|
|
22
|
+ private $merId = 496;
|
|
|
23
|
+
|
|
|
24
|
+ /**
|
|
|
25
|
+ * 订单状态数组,包含有效的订单状态值
|
|
|
26
|
+ * 0,1,2,3 可能代表:待付款、已付款、已发货、已完成等状态
|
|
|
27
|
+ * @var array
|
|
|
28
|
+ */
|
|
|
29
|
+ private $status = [0, 1, 2, 3];
|
|
|
30
|
+
|
|
|
31
|
+ /**
|
|
|
32
|
+ * 需要排除的测试用户ID列表
|
|
|
33
|
+ * 在计算业绩时需要过滤掉的测试用户
|
|
|
34
|
+ * @var array
|
|
|
35
|
+ */
|
|
|
36
|
+ private $removeUserIdList;
|
|
|
37
|
+
|
|
|
38
|
+ /**
|
|
|
39
|
+ * 订单数据访问对象
|
|
|
40
|
+ * @var StoreOrderDao
|
|
|
41
|
+ */
|
|
13
|
42
|
public $storeOrderDao;
|
|
|
43
|
+
|
|
|
44
|
+ /**
|
|
|
45
|
+ * 购物车数据访问对象
|
|
|
46
|
+ * @var StoreCartDao
|
|
|
47
|
+ */
|
|
|
48
|
+ public $cartDao;
|
|
|
49
|
+
|
|
|
50
|
+ /**
|
|
|
51
|
+ * 用户数据访问对象
|
|
|
52
|
+ * @var UserDao
|
|
|
53
|
+ */
|
|
|
54
|
+ public $userDao;
|
|
|
55
|
+
|
|
|
56
|
+ public $pvDao;
|
|
|
57
|
+
|
|
|
58
|
+ /**
|
|
|
59
|
+ * 构造函数
|
|
|
60
|
+ * 初始化数据访问对象和测试用户列表
|
|
|
61
|
+ */
|
|
14
|
62
|
public function __construct()
|
|
15
|
63
|
{
|
|
16
|
|
- $this->pv = $this->getPvConfig();
|
|
17
|
64
|
$this->storeOrderDao = new StoreOrderDao();
|
|
|
65
|
+ $this->cartDao = new StoreCartDao();
|
|
|
66
|
+ $this->userDao = new UserDao();
|
|
|
67
|
+ $this->pvDao = new ProductPvDao();
|
|
|
68
|
+ $this->removeUserIdList = $this->getRemoveUserIdList();
|
|
18
|
69
|
}
|
|
19
|
70
|
|
|
20
|
|
- public function getPvConfig()
|
|
|
71
|
+ /**
|
|
|
72
|
+ * 获取商品PV配置
|
|
|
73
|
+ *
|
|
|
74
|
+ * 返回商品ID到PV系数的映射数组
|
|
|
75
|
+ * PV系数表示每个商品对应的业绩值
|
|
|
76
|
+ *
|
|
|
77
|
+ * @return int[] 商品PV配置数组,格式:[商品ID => PV系数]
|
|
|
78
|
+ */
|
|
|
79
|
+ public function getPvConfig(): array
|
|
21
|
80
|
{
|
|
22
|
|
- return [
|
|
23
|
|
- 1 => 2,
|
|
24
|
|
- 2 => 3
|
|
25
|
|
- ];
|
|
|
81
|
+ return $this->pvDao->getData();
|
|
26
|
82
|
}
|
|
27
|
83
|
|
|
28
|
|
- // 计算业绩
|
|
29
|
|
- public function countPv($userId = 0,$startTime = 0,$endTime = 0)
|
|
|
84
|
+ /**
|
|
|
85
|
+ * 计算用户业绩(PV)
|
|
|
86
|
+ *
|
|
|
87
|
+ * 根据用户ID和时间范围计算业绩值
|
|
|
88
|
+ * 流程:获取订单数据 → 获取购物车数据 → 统计商品数量 → 计算PV总值
|
|
|
89
|
+ *
|
|
|
90
|
+ * @param array $userId 用户ID数组,默认为空数组
|
|
|
91
|
+ * @param int $startTime 开始时间戳,0表示无限制
|
|
|
92
|
+ * @param int $endTime 结束时间戳,0表示无限制
|
|
|
93
|
+ * @return void 直接输出计算结果(使用dd函数)
|
|
|
94
|
+ */
|
|
|
95
|
+ public function countPv($userId = [], $startTime = 0, $endTime = 0): void
|
|
30
|
96
|
{
|
|
31
|
|
- $orderData = $this->storeOrderDao->getDataForPv($userId = 0,$startTime = 0,$endTime = 0);
|
|
|
97
|
+ // 测试用户id(硬编码,实际应该使用传入的参数)
|
|
|
98
|
+ // $userId = [1592];
|
|
|
99
|
+
|
|
|
100
|
+ // 时间范围示例(注释掉的代码)
|
|
|
101
|
+ // $startTime = '2025-9-8';
|
|
|
102
|
+ // $endTime = '2025-9-11';
|
|
|
103
|
+
|
|
|
104
|
+ // 获取订单数据(过滤掉测试用户)
|
|
|
105
|
+ $orderData = $this->storeOrderDao->getDataForPv(
|
|
|
106
|
+ $userId,
|
|
|
107
|
+ $startTime,
|
|
|
108
|
+ $endTime,
|
|
|
109
|
+ $this->merId,
|
|
|
110
|
+ $this->status,
|
|
|
111
|
+ $this->removeUserIdList
|
|
|
112
|
+ );
|
|
|
113
|
+
|
|
|
114
|
+ // 提取所有购物车ID
|
|
|
115
|
+ $cartIds = array_column($orderData, 'cart_id');
|
|
32
|
116
|
|
|
33
|
|
-
|
|
34
|
|
-
|
|
35
|
|
- $cartData = $this->getCartData();
|
|
|
117
|
+ // 根据购物车ID获取购物车数据
|
|
|
118
|
+ $cartData = $this->cartDao->getDataByIds($cartIds);
|
|
|
119
|
+
|
|
|
120
|
+ // 统计每个商品的出现次数
|
|
|
121
|
+ $productCount = $this->countProductIds($cartData);
|
|
|
122
|
+
|
|
|
123
|
+ // 根据商品数量和PV配置计算总PV值
|
|
|
124
|
+ $pv = $this->countResult($productCount);
|
|
|
125
|
+
|
|
|
126
|
+ // 输出计算结果(调试用)
|
|
|
127
|
+ dd($pv);
|
|
36
|
128
|
}
|
|
37
|
129
|
|
|
38
|
|
- // 获取订单数据
|
|
39
|
|
- public function getOrderData($userId,$startTime,$endTime){
|
|
|
130
|
+ /**
|
|
|
131
|
+ * 获取需要排除的测试用户ID列表
|
|
|
132
|
+ *
|
|
|
133
|
+ * 从用户DAO获取标记为测试用户的ID列表
|
|
|
134
|
+ * 这些用户在计算业绩时会被排除
|
|
|
135
|
+ *
|
|
|
136
|
+ * @return array 测试用户ID数组
|
|
|
137
|
+ */
|
|
|
138
|
+ private function getRemoveUserIdList(): array
|
|
|
139
|
+ {
|
|
|
140
|
+ return $this->userDao->getTestUser();
|
|
|
141
|
+ }
|
|
40
|
142
|
|
|
41
|
|
- dd($this->storeOrderDao::getModel()::getDB());
|
|
|
143
|
+ /**
|
|
|
144
|
+ * 统计购物车数据中商品ID的出现次数
|
|
|
145
|
+ *
|
|
|
146
|
+ * 遍历购物车数据,统计每个商品ID的购买次数
|
|
|
147
|
+ *
|
|
|
148
|
+ * @param array $cartData 购物车数据数组,包含商品信息
|
|
|
149
|
+ * @return array 商品ID统计结果,格式:[商品ID => 购买次数]
|
|
|
150
|
+ */
|
|
|
151
|
+ private function countProductIds(array $cartData): array
|
|
|
152
|
+ {
|
|
|
153
|
+ $productIdCounts = [];
|
|
|
154
|
+
|
|
|
155
|
+ foreach ($cartData as $cartItem) {
|
|
|
156
|
+ $productId = $cartItem['product_id'];
|
|
|
157
|
+
|
|
|
158
|
+ if (isset($productIdCounts[$productId])) {
|
|
|
159
|
+ // 如果商品已存在,增加计数
|
|
|
160
|
+ $productIdCounts[$productId]++;
|
|
|
161
|
+ } else {
|
|
|
162
|
+ // 如果商品不存在,初始化计数为1
|
|
|
163
|
+ $productIdCounts[$productId] = 1;
|
|
|
164
|
+ }
|
|
|
165
|
+ }
|
|
42
|
166
|
|
|
43
|
|
- return [
|
|
44
|
|
- 1=>[],
|
|
45
|
|
- 2=>[]
|
|
46
|
|
- ];
|
|
|
167
|
+ return $productIdCounts;
|
|
47
|
168
|
}
|
|
48
|
169
|
|
|
49
|
|
- public function getCartData(){
|
|
50
|
|
- return [
|
|
51
|
|
-
|
|
52
|
|
- ];
|
|
|
170
|
+ /**
|
|
|
171
|
+ * 计算最终PV结果
|
|
|
172
|
+ *
|
|
|
173
|
+ * 根据商品购买次数和PV配置计算总业绩值
|
|
|
174
|
+ * 公式:总PV = Σ(商品购买次数 × 商品PV系数)
|
|
|
175
|
+ *
|
|
|
176
|
+ * @param array $productCount 商品购买次数数组,格式:[商品ID => 购买次数]
|
|
|
177
|
+ * @return float|int 总PV值
|
|
|
178
|
+ */
|
|
|
179
|
+ private function countResult(array $productCount)
|
|
|
180
|
+ {
|
|
|
181
|
+ // 获取PV配置
|
|
|
182
|
+ $pvConfig = $this->getPvConfig();
|
|
|
183
|
+ $totalPv = 0;
|
|
|
184
|
+
|
|
|
185
|
+ // 遍历每个商品计算PV贡献
|
|
|
186
|
+ foreach ($productCount as $productId => $count) {
|
|
|
187
|
+ if (isset($pvConfig[$productId])) {
|
|
|
188
|
+ // 如果商品有配置PV系数,计算该商品的PV贡献
|
|
|
189
|
+ $totalPv += $count * $pvConfig[$productId];
|
|
|
190
|
+ }
|
|
|
191
|
+ // 如果没有配置PV系数的商品,不计入业绩
|
|
|
192
|
+ }
|
|
|
193
|
+
|
|
|
194
|
+ return $totalPv;
|
|
53
|
195
|
}
|
|
54
|
196
|
}
|