|
|
@@ -4,7 +4,15 @@
|
|
4
|
4
|
namespace app\controller\api\store\merchant;
|
|
5
|
5
|
|
|
6
|
6
|
|
|
|
7
|
+use app\common\enum\CommonEnum;
|
|
|
8
|
+use app\common\enum\dividend\DividendLogEnum;
|
|
|
9
|
+use app\common\repositories\dividend\DividendLogRepository;
|
|
|
10
|
+use app\entity\data\dividend\DividendLogEntity;
|
|
|
11
|
+use think\db\exception\DataNotFoundException;
|
|
|
12
|
+use think\db\exception\DbException;
|
|
|
13
|
+use think\db\exception\ModelNotFoundException;
|
|
7
|
14
|
use think\facade\Db;
|
|
|
15
|
+use think\facade\Log;
|
|
8
|
16
|
use think\Request;
|
|
9
|
17
|
|
|
10
|
18
|
class TaskPartnerProfits
|
|
|
@@ -77,6 +85,95 @@ class TaskPartnerProfits
|
|
77
|
85
|
return $totalPv;
|
|
78
|
86
|
}
|
|
79
|
87
|
|
|
|
88
|
+ /**
|
|
|
89
|
+ * 获取周期内 所有 有效的下单人ID列表
|
|
|
90
|
+ * @param $startTime
|
|
|
91
|
+ * @param $endTime
|
|
|
92
|
+ * @param array $removeUserIdList
|
|
|
93
|
+ * @return array
|
|
|
94
|
+ */
|
|
|
95
|
+ public function getOrderUidListByTime($startTime, $endTime, array $removeUserIdList = []): array
|
|
|
96
|
+ {
|
|
|
97
|
+ $uidList = [];
|
|
|
98
|
+ try {
|
|
|
99
|
+ // 本地订单
|
|
|
100
|
+ $storeOrder = Db::name("store_order")
|
|
|
101
|
+ ->where('mer_id', '<>', CommonEnum::DESIGN_MERCHANT_ID['Repurchase']['code'])
|
|
|
102
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
103
|
+ ->whereIn('status', [0, 1, 2, 3])
|
|
|
104
|
+ ->whereBetween("pay_time", [$startTime, $endTime])
|
|
|
105
|
+ ->whereNotNull("pay_time") // 排除 pay_time 为 NULL 的订单
|
|
|
106
|
+ ->field('mer_id, status, pay_time, total_price, uid')
|
|
|
107
|
+ ->select()
|
|
|
108
|
+ ->toArray();
|
|
|
109
|
+ $storeOrderUidList = array_column($storeOrder, 'uid');
|
|
|
110
|
+ $uidList = array_merge($uidList, $storeOrderUidList);
|
|
|
111
|
+
|
|
|
112
|
+ // 话费订单 order_huafei
|
|
|
113
|
+ $orderHuafei = Db::name("order_huafei")
|
|
|
114
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
115
|
+ ->where('status', '<>', 0) // 只要不是待支付的 即算是有效活跃度
|
|
|
116
|
+ ->whereBetween("finish_time", [$startTime, $endTime])
|
|
|
117
|
+ ->field('order_huafei_id, uid, status, finish_time, amount_price')
|
|
|
118
|
+ ->select()
|
|
|
119
|
+ ->toArray();
|
|
|
120
|
+ $orderHuafeiUidList = array_column($orderHuafei, 'uid');
|
|
|
121
|
+ $uidList = array_merge($uidList, $orderHuafeiUidList);
|
|
|
122
|
+
|
|
|
123
|
+ // 三方订单
|
|
|
124
|
+ // 京东
|
|
|
125
|
+ $orderJd = Db::name("order_jd")
|
|
|
126
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
127
|
+ ->where('status', '<>', 15) // 只要不是待支付的 即算是有效活跃度
|
|
|
128
|
+ ->whereBetween("create_time", [$startTime, $endTime])
|
|
|
129
|
+ ->field('order_jd_id, uid, status, create_time, price')
|
|
|
130
|
+ ->select()
|
|
|
131
|
+ ->toArray();
|
|
|
132
|
+ $orderJdUidList = array_column($orderJd, 'uid');
|
|
|
133
|
+ $uidList = array_merge($uidList, $orderJdUidList);
|
|
|
134
|
+ // 淘宝
|
|
|
135
|
+ $orderTb = Db::name("order_tb")
|
|
|
136
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
137
|
+ // ->where('status', '<>', 15) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
|
|
|
138
|
+ ->whereBetween("create_time", [$startTime, $endTime])
|
|
|
139
|
+ ->field('order_tb_id, uid, tk_status, create_time, pay_price')
|
|
|
140
|
+ ->select()
|
|
|
141
|
+ ->toArray();
|
|
|
142
|
+ $orderTbUidList = array_column($orderTb, 'uid');
|
|
|
143
|
+ $uidList = array_merge($uidList, $orderTbUidList);
|
|
|
144
|
+ // 拼多多
|
|
|
145
|
+ $orderPdd = Db::name("order_pdd")
|
|
|
146
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
147
|
+ ->where('pin_order_status', '<>', -1) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
|
|
|
148
|
+ ->whereBetween("group_time", [strtotime($startTime), strtotime($endTime)])
|
|
|
149
|
+ ->field('order_pdd_id, uid, pin_order_status, create_time, pay_money')
|
|
|
150
|
+ ->select()
|
|
|
151
|
+ ->toArray();
|
|
|
152
|
+ $orderPddUidList = array_column($orderPdd, 'uid');
|
|
|
153
|
+ $uidList = array_merge($uidList, $orderPddUidList);
|
|
|
154
|
+ // 唯品会
|
|
|
155
|
+ $orderVip = Db::name("order_vip")
|
|
|
156
|
+ ->whereNotIn('uid', $removeUserIdList)
|
|
|
157
|
+ ->where('status', '<>', 0) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
|
|
|
158
|
+ ->whereBetween("order_time", [strtotime($startTime), strtotime($endTime)])
|
|
|
159
|
+ ->field('order_vip_id, uid, status, order_time, pay_money')
|
|
|
160
|
+ ->select()
|
|
|
161
|
+ ->toArray();
|
|
|
162
|
+ $orderVipUidList = array_column($orderVip, 'uid');
|
|
|
163
|
+ $uidList = array_merge($uidList, $orderVipUidList);
|
|
|
164
|
+ } catch (DataNotFoundException|ModelNotFoundException|DbException $e) {
|
|
|
165
|
+ Log::error('分红-获取下单用户列表失败:' . json_encode([
|
|
|
166
|
+ 'error_message' => $e->getMessage(),
|
|
|
167
|
+ 'error_file' => $e->getFile(),
|
|
|
168
|
+ 'error_line' => $e->getLine(),
|
|
|
169
|
+ 'error_code' => $e->getCode(),
|
|
|
170
|
+ 'exception_class' => get_class($e),
|
|
|
171
|
+ 'trace' => $e->getTraceAsString()
|
|
|
172
|
+ ], JSON_UNESCAPED_UNICODE));
|
|
|
173
|
+ }
|
|
|
174
|
+ return $uidList;
|
|
|
175
|
+ }
|
|
|
176
|
+
|
|
80
|
177
|
public function getRedEnvelopeByTime($startTime, $endTime, $removeUserIdList = [])
|
|
81
|
178
|
{
|
|
82
|
179
|
// 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
|
|
|
@@ -121,6 +218,7 @@ class TaskPartnerProfits
|
|
121
|
218
|
|
|
122
|
219
|
$startTime = $request->param('startTime', null);
|
|
123
|
220
|
$endTime = $request->param('endTime', null);
|
|
|
221
|
+ $remark = $request->param('remark', '');
|
|
124
|
222
|
$isTest = $request->param('isTest', 1);
|
|
125
|
223
|
$maxAllocationAmount = $request->param('maxAllocationAmount', null);
|
|
126
|
224
|
|
|
|
@@ -184,6 +282,18 @@ class TaskPartnerProfits
|
|
184
|
282
|
->select()
|
|
185
|
283
|
->toArray();//星级等级
|
|
186
|
284
|
|
|
|
285
|
+ // 组装日志信息
|
|
|
286
|
+ /** @var DividendLogEntity $dividendLogEntity */
|
|
|
287
|
+ $dividendLogEntity = DividendLogEntity::newInstance();
|
|
|
288
|
+ $dividendLogEntity->setType(DividendLogEnum::TYPE['PartnerProfit']['code'])
|
|
|
289
|
+ ->setStartTime($startTime)
|
|
|
290
|
+ ->setEndTime($endTime)
|
|
|
291
|
+ ->setPerformance($performance)
|
|
|
292
|
+ ->setAbatement(json_encode([['code' => 'redEnvelope', 'name' => '红包', 'reason' => '发放的红包金额,需要从赚取的业绩中扣除', 'number' => $redEnvelope]]))
|
|
|
293
|
+ ->setAllocated($weekRecord)
|
|
|
294
|
+ ->setRule(json_encode($starList))
|
|
|
295
|
+ ->setRemark($remark);
|
|
|
296
|
+
|
|
187
|
297
|
// 2、循环星级信息 并分组归类
|
|
188
|
298
|
$salesArr = array_column($starList, null, 'title');
|
|
189
|
299
|
|
|
|
@@ -251,6 +361,10 @@ class TaskPartnerProfits
|
|
251
|
361
|
//周总业绩(8400) * 合伙人级别的分佣比例(15%) = 可分红的佣金(1260)
|
|
252
|
362
|
// $salesArr[$key]['fs_money_nums'] = round($weekRecord * $value['profit_rate'], 2);
|
|
253
|
363
|
$salesArr[$key]['fs_money_nums'] = floor(($weekRecord * ($value['profit_rate'] / 100)) * 100) / 100;
|
|
|
364
|
+
|
|
|
365
|
+ // 日志表 记录应分配金额
|
|
|
366
|
+ $dividendLogEntity->setExpected(bcadd($dividendLogEntity->getExpected() ?: '0.00', $salesArr[$key]['fs_money_nums'], 2));
|
|
|
367
|
+
|
|
254
|
368
|
//可分红的业绩(分为两半,各50%,一部分是分给双联盟比例,一部分是小业绩比例)
|
|
255
|
369
|
//把本周的业绩(8400) * 合伙人级别的分佣比例(15%) * 0.5 = 630(可分红佣金的 50%)
|
|
256
|
370
|
// $salesArr[$key]['fs_money'] = round($salesArr[$key]['fs_money_nums'] / 2, 2);
|
|
|
@@ -298,6 +412,11 @@ class TaskPartnerProfits
|
|
298
|
412
|
}
|
|
299
|
413
|
}
|
|
300
|
414
|
|
|
|
415
|
+ // 6、记录日志
|
|
|
416
|
+ // 获取周期内所有符合条件的订单
|
|
|
417
|
+ $feeUids = $this->getOrderUidListByTime($startTime, $endTime, $removeUserIdList);
|
|
|
418
|
+
|
|
|
419
|
+
|
|
301
|
420
|
// 7、执行分红
|
|
302
|
421
|
$testRecord = [];
|
|
303
|
422
|
foreach ($salesArr as $key => $value) {
|
|
|
@@ -350,15 +469,27 @@ class TaskPartnerProfits
|
|
350
|
469
|
// }
|
|
351
|
470
|
|
|
352
|
471
|
if ($isTest == 0) {
|
|
|
472
|
+
|
|
|
473
|
+ if (!in_array($v, $feeUids)) {
|
|
|
474
|
+ $feeWaiverUids = $dividendLogEntity->getFeeWaiverUids() ?: [];
|
|
|
475
|
+ $feeWaiverUids[] = [
|
|
|
476
|
+ 'uid' => $v,
|
|
|
477
|
+ 'remark' => '周期内未完成订单任务'
|
|
|
478
|
+ ];
|
|
|
479
|
+ $dividendLogEntity->setFeeWaiverUids($feeWaiverUids);
|
|
|
480
|
+ continue;
|
|
|
481
|
+ }
|
|
|
482
|
+ $dividendLogEntity->setArrivalPoint(bcadd($dividendLogEntity->getArrivalPoint() ?: '0.00', $allAward, 2));
|
|
|
483
|
+
|
|
353
|
484
|
$userdatassss = db::name("old_user_jbp")->where("id", $v)->find();
|
|
354
|
485
|
$datas_log = [
|
|
355
|
486
|
'note' => "名称:" . $userdatassss['nick_name'] . " 用户:" . $v . " 双联盟总业绩:" . $maxValueAll . " 我的双区业绩:" . $myBill . " 小区总业绩:" . $userPvSmallNum . " 我的业绩小的:" . $myMixMoney . " 可分红佣金:" . $amount . " 可分红总佣金:" . $fsMoneyNums . " 小区业绩可分红:" . $myMixMoney . " 双区业绩可分红:" . $myWeightMoney . " 实际分得:" . $yj_90,
|
|
356
|
487
|
'create_time' => date('Y-m-d H:i:s')
|
|
357
|
488
|
];
|
|
358
|
|
- $con_data = Db::name('test_log')->insert($datas_log); //数据存到2.0数据表中
|
|
|
489
|
+ Db::name('test_log')->insert($datas_log); //数据存到2.0数据表中
|
|
359
|
490
|
|
|
360
|
491
|
# code...
|
|
361
|
|
- $res = Db::name("user")->where("uid", $v)->inc("total_amount_old", $yj_90)->save();
|
|
|
492
|
+ Db::name("user")->where("uid", $v)->inc("total_amount_old", $yj_90)->save();
|
|
362
|
493
|
|
|
363
|
494
|
Db::name("user")->where("uid", $v)->inc("amount_old", $yj_90)->save();//不用冻结金额和提现额度来限制佣金发放
|
|
364
|
495
|
Db::name("user")->where("uid", $v)->inc("brokerage_price", $yj_90)->save();
|
|
|
@@ -411,6 +542,12 @@ class TaskPartnerProfits
|
|
411
|
542
|
}
|
|
412
|
543
|
$salesArr['cs'] = $testRecord;
|
|
413
|
544
|
}
|
|
|
545
|
+ $dividendLogEntity->setResult(json_encode($salesArr, JSON_UNESCAPED_UNICODE));
|
|
|
546
|
+
|
|
|
547
|
+ /** @var DividendLogRepository $dividendLogRepository */
|
|
|
548
|
+ $dividendLogRepository = app()->make(DividendLogRepository::class);
|
|
|
549
|
+ $dividendLogRepository->createByEntity($dividendLogEntity);
|
|
|
550
|
+
|
|
414
|
551
|
return json($salesArr);
|
|
415
|
552
|
}
|
|
416
|
553
|
|