| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- <?php
- namespace common\logic\statistics;
- use addons\Agent\common\logic\reward\TeamAchievement;
- use common\enums\EventNameEnum;
- use common\enums\PayTypeEnum;
- use common\enums\RefundTypeEnum;
- use common\events\statistics\StatisticsOrderFinishEvent;
- use common\events\statistics\StatisticsOrderPayEvent;
- use common\events\statistics\StatisticsUserRegister;
- use common\helpers\FormatHelper;
- use common\models\base\User;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderRefund;
- use common\models\statistics\UserStatisticsTotal;
- use common\models\statistics\UserTeamStatistics;
- use common\models\user\User as UserUser;
- use common\models\user\UserActionRecord;
- use common\models\user\UserPartitionRelationship;
- use common\models\user\UserTeamAchievementOrder;
- use common\services\mall\AchievementService;
- use common\services\mall\order\UserOrderRelationsService;
- use Yii;
- use yii\base\Exception;
- /**
- * 用户数据统计
- * @Author lun
- * @DateTime 2021-11-16 19:07:32
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- class Statistics
- {
- /**
- * 订单创建统计
- * @Author: lun
- * @DateTime: 2021/11/20 0020 15:47
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param null $params
- */
- public function order_create($params = null)
- {
- $logsMsg = '统计 order_create 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 订单创建统计处理
- Yii::$app->db->close();
- $t = Yii::$app->db->beginTransaction();
- try {
- if (empty($params)) throw new Exception('参数为空');
- $order_ids = $params['order_ids'];
- $orders = Order::lists([
- 'where' => [['id' => $order_ids]],
- 'with' => ['detail'],
- ]);
- if (empty($orders)) throw new Exception('订单查询为空');
- $goods_price = 0;
- $region_statistics = [];
- foreach ($orders as $order) {
- $goods_price += $order['goods_price'];
- $region_statistics[] = ['mall_id' => $order['mall_id'], 'province_id' => 2, 'city_id' => 3, 'order' => $order['pay_money']];
- foreach ($order['detail'] as $order_detail) {
- $goods_id = $order_detail['goods_id'];
- if (isset($goods_statistics[$goods_id])) {
- $goods_statistics[$goods_id]['sales_num'] += $order_detail['num'];
- } else {
- $goods_statistics[$goods_id]['sales_num'] = $order_detail['num'];
- $goods_statistics[$goods_id]['goods_id'] = $goods_id;
- $goods_statistics[$goods_id]['order_num'] = 1;
- }
- }
- }
- $data = ['order_num' => count($orders), 'order_money' => $goods_price];
- Yii::$app->services->statistics->user->set($orders[0]['mall_id'], $orders[0]['user_id'], $data); // 每日数据统计
- UserStatisticsTotal::setUserStatisticsTotal($orders[0]['mall_id'], $orders[0]['user_id'], $data); // 总数据统计
- Yii::$app->services->statistics->goods->set($orders[0]['mall_id'], $goods_statistics); //商品下单数统计
- //地区下单金额统计
- foreach ($region_statistics as $region) {
- if ($region['province_id'] && $region['city_id']) {
- Yii::$app->services->statistics->region->set($region);
- }
- }
- // 用户行为操作 - 订单创建
- $res = UserActionRecord::setData($orders[0]['mall_id'], $orders[0]['user_id'], ['last_create_order_at' => $orders[0]['created_at']]);
- if ($res == false) throw new Exception(UserActionRecord::getStaticError());
- $t->commit();
- $logsMsg = '统计 order_create 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-订单创建");
- $logsMsg = '统计 order_create 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 订单支付统计
- * @Author: lun
- * @DateTime: 2021/11/16 0016 10:51
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param null $params
- */
- public function order_pay($params = null)
- {
- $logsMsg = '统计 order_pay 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 订单支付统计处理
- Yii::$app->db->close();
- $t = Yii::$app->db->beginTransaction();
- try {
- if (empty($params)) throw new Exception('参数为空');
- $order = Order::getOne([['id' => $params['id']]], true, ['detail']);
- if (empty($order)) throw new Exception('订单查询为空');
- $payArr = $userAloneArr = [];
- $payGoodsNum = 0;
- // 循环订单详情
- foreach ($order['detail'] as $detail) {
- $payGoodsNum += $detail['num'];
- $payArr[] = ['goods_id' => $detail['goods_id'], 'pay_money' => $detail['goods_price']];
- $userAloneArr[] = ['mall_id' => $detail['mall_id'], 'goods_id' => $detail['goods_id'], 'money' => $detail['goods_price'], 'buy_num' => $detail['num'], 'user_id' => $detail['user_id']];
- }
- // 初始化数据
- $data = [
- 'pay_num' => 1,
- 'pay_money' => $order['pay_money'] - $order['shipping_money'],
- 'original_order_money' => $order['original_goods_price'],
- 'pay_goods_num' => $payGoodsNum,
- 'balance_pay' => $order['payment_type'] == PayTypeEnum::BALANCE ? $order['pay_money'] : 0,
- 'wechat_pay' => $order['payment_type'] == PayTypeEnum::WECHAT ? $order['pay_money'] : 0,
- 'ali_pay' => $order['payment_type'] == PayTypeEnum::ALI ? $order['pay_money'] : 0,
- ];
- // 每日数据统计
- Yii::$app->services->statistics->goods->set($order['mall_id'], $payArr);
- Yii::$app->services->statistics->user->set($order['mall_id'], $order['user_id'], $data);
- Yii::$app->services->statistics->region->set(['mall_id' => $order['mall_id'], 'province_id' => $order['province'], 'city_id' => $order['city'], 'pay' => $order['pay_money']]);
- Yii::$app->services->statistics->alone->set($order['mall_id'], $userAloneArr);
- // 用户总数据统计
- UserStatisticsTotal::setUserStatisticsTotal($order['mall_id'], $order['user_id'], $data);
- // 用户行为操作 - 支付
- UserActionRecord::setData($order['mall_id'], $order['user_id'], ['last_pay_at' => $order['pay_time']]);
- // 添加用户团队订单数据
- $this->addUserTeamAchievementOrder($order, 1);
- // 用户上级数据维护
- $parent_data = ['user_id' => $order['user_id'], 'pay_money' => $data['pay_money'], 'original_order_money' => $data['original_order_money']];
- UserTeamStatisticsLogic::incBatchParentDataByUid($parent_data);
- // 保存统计数据
- $achievementService = new AchievementService([]);
- $achievementService->mall_id = $order['mall_id'];
- $statisticsBaseData = [
- 'user_id' => $order['user_id'],
- 'date' => date('Ymd', $order['created_at']),
- ];
- // 得到上级user_id
- $userOrderRelationsService = new UserOrderRelationsService([]);
- $userOrderRelationsService->mall_id = $order['mall_id'];
- $userOrderRelations = $userOrderRelationsService->getUserOrderRelations($order['id']);
- if ($userOrderRelations['is_find']) {
- $statisticsBaseData['parents_user_ids'] = $userOrderRelations['user_ids'];
- }
- $achievementService->saveAchievementStatisticsData(
- EventNameEnum::ORDER_PAY,
- $statisticsBaseData,
- $order
- );
- $t->commit();
- // 触发订单完成事件,事务提交完成后触发
- $event = new StatisticsOrderPayEvent($order['mall_id']);
- Yii::$app->services->events->dispatch($event, ['mall_id' => $order['mall_id'], 'id' => $order['id']], $event->listeners);
- $logsMsg = '统计 order_pay 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-订单支付");
- $logsMsg = '统计 order_pay 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 订单完成相关统计
- * @Author: lun
- * @DateTime: 2021/12/10 0010 14:31
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param null $params
- */
- public function order_finish($params = null)
- {
- $logsMsg = '统计 order_finish 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 订单完成统计处理
- Yii::$app->db->close();
- $t = Yii::$app->db->beginTransaction();
- try {
- if (empty($params)) throw new Exception('参数为空');
- $order = Order::getOne([['id' => $params['id']]], true, ['detail']);
- if (empty($order)) throw new Exception('订单查询为空');
- $details = $order['detail'];
- $num = 0;
- $sellingPrice = 0; // 商品售价
- foreach ($details as $detail) {
- $num += $detail['num'];
- $sellingPrice += $detail['original_goods_price'];
- }
- // 初始化数据
- $data = [
- 'finish_order_num' => 1,
- 'finish_order_money' => $order['pay_money'] - $order['shipping_money'],
- 'finish_goods_num' => $num,
- 'finish_selling_price' => $sellingPrice,
- ];
- // 每日数据统计
- Yii::$app->services->statistics->user->set($order['mall_id'], $order['user_id'], $data);
- // 用户总数据统计
- UserStatisticsTotal::setUserStatisticsTotal($order['mall_id'], $order['user_id'], $data);
- // 用户上级数据维护
- $parent_data = ['user_id' => $order['user_id'], 'pay_money' => $data['finish_order_money'], 'selling_price' => $sellingPrice];
- UserTeamStatisticsLogic::incBatchParentFinishOrderByUid($parent_data);
- // 添加用户团队订单数据
- $this->addUserTeamAchievementOrder($order, 2);
- // 保存统计数据
- $achievementService = new AchievementService([]);
- $achievementService->mall_id = $order['mall_id'];
- $statisticsBaseData = [
- 'date' => date('Ymd', $order['finish_time']),
- 'user_id' => $order['user_id']
- ];
- // 得到上级user_id
- $userOrderRelationsService = new UserOrderRelationsService([]);
- $userOrderRelationsService->mall_id = $order['mall_id'];
- $userOrderRelations = $userOrderRelationsService->getUserOrderRelations($order['id']);
- if ($userOrderRelations['is_find']) {
- $statisticsBaseData['parents_user_ids'] = $userOrderRelations['user_ids'];
- }
- $achievementService->saveAchievementStatisticsData(
- EventNameEnum::ORDER_FINISH,
- $statisticsBaseData,
- $order
- );
- $t->commit();
- // 触发订单完成事件,事务提交完成后触发
- $event = new StatisticsOrderFinishEvent($order['mall_id']);
- Yii::$app->services->events->dispatch($event, ['mall_id' => $order['mall_id'], 'id' => $order['id']], $event->listeners);
- $logsMsg = '统计 order_finish 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-订单完成");
- $logsMsg = '统计 order_finish 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 订单关闭统计
- * @Author: lun
- * @DateTime: 2021/11/20 0020 16:09
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param null $params
- */
- public function order_close($params = null)
- {
- $logsMsg = '统计 order_close 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 订单关闭统计处理
- Yii::$app->db->close();
- $t = Yii::$app->db->beginTransaction();
- try {
- if (empty($params)) throw new Exception('参数为空');
- $order = Order::getOne([['id' => $params['id']]], true, ['detail']);
- if (empty($order)) throw new Exception('订单查询为空');
- $details = $order['detail'];
- $num = 0;
- foreach ($details as $detail) {
- $num += $detail['num'];
- }
- // 初始化数据
- $data = ['cancel_order_num' => 1, 'cancel_order_money' => $order['pay_money'], 'cancel_goods_num' => $num];
- // 每日数据统计
- Yii::$app->services->statistics->user->set($order['mall_id'], $order['user_id'], $data);
- // 用户总数据统计
- UserStatisticsTotal::setUserStatisticsTotal($order['mall_id'], $order['user_id'], $data);
- $t->commit();
- $logsMsg = '统计 order_close 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-订单关闭");
- $logsMsg = '统计 order_close 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 售后订单数据统计
- * @Author: lun
- * @DateTime: 2021/11/20 0020 15:50
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $params
- */
- public function order_refund($params)
- {
- $logsMsg = '统计 order_refund 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 订单售后统计处理
- Yii::$app->db->close();
- $t = Yii::$app->db->beginTransaction();
- try {
- // 查询订单
- $refund = OrderRefund::findOne(['id' => $params['id']]);
- if (empty($refund)) throw new \yii\db\Exception('售后订单查询失败');
- // 数据处理
- switch ($params['type']) {
- case RefundTypeEnum::EVENT_APPLY:
- $statistics = ['refund_order_num' => 1];
- break;
- case RefundTypeEnum::EVENT_FINISH:
- $order_detail_id = $refund['order_detail_id'];
- $OrderDetail = OrderDetail::findOne(['id' => $order_detail_id]);
- $goods_num = empty($OrderDetail) ? 0 : $OrderDetail->num;
- in_array($refund['type'], [RefundTypeEnum::MONEY, RefundTypeEnum::MONEY_AND_PRODUCT]) && $statistics = ['refund_order_money' => $refund['reality_refund_price'], 'refund_goods_num' => $goods_num];
- break;
- }
- if (!empty($statistics)) {
- // 用户数据统计
- Yii::$app->services->statistics->user->set($refund['mall_id'], $refund['user_id'], $statistics);
- // 用户总数据统计
- UserStatisticsTotal::setUserStatisticsTotal($refund['mall_id'], $refund['user_id'], $statistics);
- }
- $t->commit();
- $logsMsg = '统计 order_refund 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-订单创建");
- $logsMsg = '统计 order_refund 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 用户注册
- * @Author: lun
- * @DateTime: 2021/11/25 0025 17:21
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $params
- */
- public function user_register($params)
- {
- $logsMsg = '统计 user_register 进入';
- Yii::$app->custom->logs($logsMsg, $params);
- // 不做统计处理
- if (isset($params['is_statistics']) && $params['is_statistics'] === 0) return true;
- // 注册事件处理
- Yii::$app->db->close();
- $user_id = $params['user_id'];
- $user = User::findOne(['id' => $user_id]);
- if (empty($user)) throw new \Exception('查无此用户');
- //初始化新增的用户
- UserTeamStatistics::setUserTeamStatistics($user->mall_id, $user_id, []);
- $t = Yii::$app->db->beginTransaction();
- try {
- /** 团队数据处理start **/
- // 1、获取该用户的所有上级
- // $user_ids = UserRelationship::getParentIdArr($user_id);// 返回的数组是最高层级处于第一位
- $user_ids = UserPartitionRelationship::getParentIdArr($user_id);
- if (empty($user_ids)) throw new \Exception('该用户无上级');
- $user_ids = array_reverse($user_ids); // 数组倒叙
- foreach ($user_ids as $deep => $uid) {
- $data = [];
- // 2、给上级所有user_team_total字段+1
- $data['user_team_total'] = 1;
- // 3、给间推上级团队人数user_direct_total字段+1
- $deep == 0 && $data['user_direct_total'] = 1;
- // 4、给间间推上级团队人数user_indirect_total字段+1
- $deep == 1 && $data['user_indirect_total'] = 1;
- // 5、保存数据
- $res = UserTeamStatistics::setUserTeamStatistics($user->mall_id, $uid, $data);
- if ($res == false) throw new \Exception(UserTeamStatistics::getStaticError());
- }
- /** 团队数据处理end **/
- $t->commit();
- // 触发注册事件,事务提交完成后触发
- $event = new StatisticsUserRegister($user->mall_id);
- Yii::$app->services->events->dispatch($event, ['mall_id' => $user->mall_id, 'user_id' => $user_id], $event->listeners);
- $logsMsg = '统计 user_register 结束';
- Yii::$app->custom->logs($logsMsg);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "数据统计-用户注册");
- $logsMsg = '统计 user_register 异常';
- Yii::$app->custom->logs($logsMsg, $exception);
- return false;
- }
- }
- /**
- * 添加团队订单
- *
- * @param array $order
- * @param integer $status
- * @return void
- */
- public function addUserTeamAchievementOrder(array $order, int $status)
- {
- // 下单人
- $user_id = $from_user_id = $order['user_id'];
- $superior_users = [];
- $time = time();
- // 查询上级团队
- $level = 0;
- while ($user_id && !empty($info = UserUser::getUserParents($user_id))) {
- $info['parent_id'] && $info['parent_id'] > 0 && $superior_users[] = ['superior_level' => $level + 1, 'superior_user_id' => $info['parent_id']];
- $info['second_parent_id'] && $info['second_parent_id'] > 0 && $superior_users[] = ['superior_level' => $level + 2, 'superior_user_id' => $info['second_parent_id']];
- $info['third_parent_id'] && $info['third_parent_id'] > 0 && $superior_users[] = ['superior_level' => $level + 3, 'superior_user_id' => $info['third_parent_id']];
- $user_id = $info['third_parent_id'];
- $level = $level + 3;
- }
- $team_orders = [];
- foreach ($superior_users as $item) {
- $team_orders[] = [
- 'mall_id' => $order['mall_id'],
- 'order_id' => $order['id'],
- 'user_id' => $from_user_id,
- 'superior_user_id' => $item['superior_user_id'],
- 'superior_level' => $item['superior_level'],
- 'status' => $status,
- 'created_at' => $time,
- ];
- }
- $team_orders && UserTeamAchievementOrder::batchInsertData($team_orders);
- }
- }
|