'ID', 'mall_id' => 'Mall ID', 'user_id' => 'User ID', 'children_order_pay_profit' => 'Children Order Pay Profit', 'team_order_pay_profit' => 'Team Order Pay Profit', 'children_order_finish_profit' => 'Children Order Finish Profit', 'team_order_finish_profit' => 'Team Order Finish Profit', 'created_at' => 'Created At', 'updated_at' => 'Updated At', ]; } public static function setData(array $data) { try { $model = self::findOne(['user_id' => $data['user_id']]); if (empty($model)) { $model = new self(); $model->loadDefaultValues(); } if (!$model->load($data, '') || !$model->save()) { throw new \Exception($model->getErrorMessage()); } return $model; } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } public static function calculatePerformance($params) { try { $mall_id = $params['mall_id']; $user_id = $params['user_id']; $order_id = $params['order_id']; $is_virtual = $params['is_virtual']; // $type = $params['type'] ?? 0; //获取订单信息 $order = Order::getOne([ ['mall_id' => $mall_id], ['user_id' => $user_id], ['id' => $order_id], // ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]] ], true, ['detail']); //查无订单,则中止 if (empty($order)) return true; // 判断是否开启 $config = Yii::$app->services->setting->mall->get($mall_id, 'order'); $achievementGoodsIds = []; // 判断是否开启订单业绩商品:如果开启,则获取指定商品ID。不开则获取所有商品ID if (!empty($config['is_designated_achievement_goods'])) { $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true); } $children_order_pay_profit = 0; $team_order_pay_profit = 0; $children_order_finish_profit = 0; $team_order_finish_profit = 0; $children_order_pay_achievement = 0; $team_order_pay_achievement = 0; $children_order_finish_achievement = 0; $team_order_finish_achievement = 0; $achievement_sum = 0; $pay_money = 0; $original_goods_price = 0; $children_order_pay_goods_achievement = 0; $team_order_pay_goods_achievement = 0; $children_order_finish_goods_achievement = 0; $team_order_finish_goods_achievement = 0; foreach ($order['detail'] as $key => $value) { // 判断是否开启订单业绩商品 if (!empty($config['is_designated_achievement_goods']) && !in_array($value['goods_id'], $achievementGoodsIds)) { // 如果开启了订单业绩商品 并且 当前商品不在订单业绩商品列表中则跳过 continue; } $performance = $value['goods_price'] - bcmul($value['cost_price'], $value['num'], 2); $pay_money += $value['goods_price'] ?? 0; $original_goods_price += $value['original_goods_price'] ?? 0; if ($performance > 0 || $pay_money > 0 || $original_goods_price > 0) { $achievement_sum += $performance; //记录累加日志 $log_data = [ 'mall_id' => $mall_id, 'goods_id' => $value['goods_id'], 'order_detail_id' => $value['id'], 'order_id' => $order_id, 'status' => StatusEnum::ENABLED, ]; UserTeamProfitStatisticsLog::setData($log_data); } } //利润业绩为0,实付金额为0,则不需要累计数据 if ($achievement_sum <= 0 && $pay_money <= 0 && $original_goods_price <= 0) return true; //数据累计 /* 如果订单是虚拟订单时。订单在次方法之前已经将订单状态改为完成。此处数据统计永远无法统计订单支付数据。 所以需要修改订单为虚拟订单时。需要统计支付数据此参数为支付时使用 */ if ($is_virtual) { $children_order_pay_profit += $achievement_sum; $team_order_pay_profit += $achievement_sum; $children_order_pay_achievement += $pay_money; $team_order_pay_achievement += $pay_money; $children_order_pay_goods_achievement += $original_goods_price; $team_order_pay_goods_achievement += $original_goods_price; } else { if ($order['order_status'] == OrderStatusEnum::ACCOMPLISH) { $children_order_finish_profit += $achievement_sum; $team_order_finish_profit += $achievement_sum; $children_order_finish_achievement += $pay_money; $team_order_finish_achievement += $pay_money; $children_order_finish_goods_achievement += $original_goods_price; $team_order_finish_goods_achievement += $original_goods_price; //用作累计历史订单数据,正常下单累计数据是type = 0 // if ($type == 1) { // $children_order_pay_profit += $achievement_sum; // $team_order_pay_profit += $achievement_sum; // } } else { $children_order_pay_profit += $achievement_sum; $team_order_pay_profit += $achievement_sum; $children_order_pay_achievement += $pay_money; $team_order_pay_achievement += $pay_money; $children_order_pay_goods_achievement += $original_goods_price; $team_order_pay_goods_achievement += $original_goods_price; } } //获取上级数据 $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr[] = $user_id; //获取当前用户的订单利润数据 $list = self::lists([ 'where' => [ ['mall_id' => $mall_id], ['user_id' => $parent_id_arr] ], 'index' => 'user_id', ], false); //用户订单利润数据操作 foreach ($parent_id_arr as $key => $value) { $item = $list[$value]; if (empty($item)) { $item = new UserTeamProfitStatistics(); $item->loadDefaultValues(); $item->mall_id = $mall_id; $item->user_id = $value; $item->team_order_pay_profit = 0; $item->team_order_finish_profit = 0; $item->children_order_pay_profit = 0; $item->children_order_finish_profit = 0; $item->team_order_pay_achievement = 0; $item->team_order_finish_achievement = 0; $item->children_order_pay_achievement = 0; $item->children_order_finish_achievement = 0; $item->children_order_pay_goods_achievement = 0; $item->team_order_pay_goods_achievement = 0; $item->children_order_finish_goods_achievement = 0; $item->team_order_finish_goods_achievement = 0; } //订单正常累加 $item->team_order_pay_profit += $team_order_pay_profit; $item->team_order_finish_profit += $team_order_finish_profit; $item->team_order_pay_achievement += $team_order_pay_achievement; $item->team_order_finish_achievement += $team_order_finish_achievement; $item->team_order_pay_goods_achievement += $team_order_pay_goods_achievement; $item->team_order_finish_goods_achievement += $team_order_finish_goods_achievement; if ($value != $user_id) { $item->children_order_pay_profit += $children_order_pay_profit; $item->children_order_finish_profit += $children_order_finish_profit; $item->children_order_pay_achievement += $children_order_pay_achievement; $item->children_order_finish_achievement += $children_order_finish_achievement; $item->children_order_pay_goods_achievement += $children_order_pay_goods_achievement; $item->children_order_finish_goods_achievement += $children_order_finish_goods_achievement; } if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$value.',order_id:'. $order_id); } // if ($type != 1) { //再次执行会员升级任务 \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['id' => $order_id], \common\listeners\user\UserUpgradeListener::class, 'handleSync'); // } return true; } catch (\Exception $e) { throw new Exception('统计用户订单利润失败:'. $e->getMessage()); } } public static function calculatePerformanceRefund($params) { try { $mall_id = $params['mall_id']; $user_id = $params['user_id']; $refund_id = $params['refund_id']; $refund_data = OrderRefund::getOne([ ['mall_id' => $mall_id], ['user_id' => $user_id], ['id' => $refund_id], ], true, ['orderDetail']); if (empty($refund_data)) throw new Exception('查无此售后订单'); if ($refund_data['type'] == RefundTypeEnum::EXCHANGE_GOODS) { return true; } $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $parent_id_arr[] = $user_id; //查找该商品是否已增加利润业绩 $log_data = UserTeamProfitStatisticsLog::getOne([ ['mall_id' => $mall_id], ['goods_id' => $refund_data['orderDetail']['goods_id']], ['order_detail_id' => $refund_data['orderDetail']['id']], ['status' => StatusEnum::ENABLED], ], true); if (empty($log_data)) throw new Exception('该售后商品未曾为用户增加利润业绩'); //获取订单详情数据 $list = self::lists([ 'where' => [ ['mall_id' => $mall_id], ['user_id' => $parent_id_arr] ], ], false); $achievement_sum = $refund_data['orderDetail']['goods_price'] - bcmul($refund_data['orderDetail']['cost_price'], $refund_data['orderDetail']['num'], 2); $pay_money = $refund_data['orderDetail']['goods_price']; $original_goods_price = $refund_data['orderDetail']['original_goods_price']; if ($achievement_sum <= 0 && $pay_money <= 0) return true; foreach ($list as $key => $value) { if ($value['user_id'] != $user_id) { $value->children_order_pay_profit -= $achievement_sum; $value->children_order_pay_achievement -= $pay_money; } $value->team_order_pay_profit -= $achievement_sum; $value->team_order_pay_achievement -= $pay_money; $value->team_order_pay_goods_achievement -= $original_goods_price; if (!$value->save()) var_dump('售后扣减业绩失败:user_id:'. $user_id.',refund_id:'.$refund_id); } } catch (\Exception $e) { throw new Exception($e->getMessage()); } } //数据迁移累计历史订单利润 public static function cumulativeOrderProfit($params) { try { $type = $params['type'] ?? 0; //获取商城id $mall_list = Mall::getEnableMallList(true); if(!empty($mall_list)){ foreach ($mall_list as $mall){ // var_dump('商城:'. $mall['id']); self::orderProfit(['mall_id' => $mall['id'], 'type' => $type]); } } return true; } catch (\Exception $e) { throw new Exception(); } } //处理历史订单数据 public static function orderProfit($params) { try { // 判断是否开启 $config = Yii::$app->services->setting->mall->get($params['mall_id'], 'order'); $achievementGoodsIds = []; if (!empty($config['is_designated_achievement_goods'])) { $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true); } // 重置用户团队业绩数据 UserTeamProfitStatisticsLog::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]); UserTeamProfitStatistics::updateAll([ 'children_order_pay_profit' => 0, 'team_order_pay_profit' => 0, 'children_order_finish_profit' => 0, 'team_order_finish_profit' => 0, 'children_order_pay_achievement' => 0, 'team_order_pay_achievement' => 0, 'children_order_finish_achievement' => 0, 'team_order_finish_achievement' => 0 ], ['mall_id' => $params['mall_id']] ); // 查询数据更新统计 $orderDetailModel = OrderDetail::find() ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]) ->andWhere(['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]]) ->select('id, user_id, mall_id, order_status, goods_price, cost_price, num'); if (!empty($config['is_designated_achievement_goods'])) { $orderDetailModel->andWhere(['goods_id' => $achievementGoodsIds]); } foreach ($orderDetailModel->asArray()->batch(1000) as $orderDetails) { foreach ($orderDetails as $orderDetail) { $children_order_pay_profit = 0; // 下级支付订单业绩 (不包含自己) $team_order_pay_profit = 0; // 团队支付订单业绩(包含自己) $children_order_finish_profit = 0; // 下级完成订单业绩 (不包含自己) $team_order_finish_profit = 0; // 团队完成订单业绩(包含自己) $children_order_pay_achievement = 0; // 下级支付订单业绩(实付金额) (不包含自己) $team_order_pay_achievement = 0; // 团队支付订单业绩(实付金额) (包含自己) $children_order_finish_achievement = 0; // 下级完成订单业绩(实付金额) (不包含自己) $team_order_finish_achievement = 0; // 团队完成订单业绩(实付金额) (包含自己) // 获取当前订单价对应的业绩 $achievementMoney = bcsub($orderDetail['goods_price'], $orderDetail['cost_price'] * $orderDetail['num'], 2); $pay_money = $orderDetail['goods_price']; if ($achievementMoney > 0) { // 如果大于0进行累加计算 $children_order_pay_profit = $achievementMoney; $team_order_pay_profit = $achievementMoney; if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) { $children_order_finish_profit = $achievementMoney; $team_order_finish_profit = $achievementMoney; } } //实付金额 if ($pay_money > 0) { $children_order_pay_achievement = $pay_money; $team_order_pay_achievement = $pay_money; if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) { $children_order_finish_achievement = $pay_money; $team_order_finish_achievement = $pay_money; } } // 获取用户上级 $parent_id_arr = UserPartitionRelationship::getParentIdArr($orderDetail['user_id']); if (empty($parent_id_arr)) { $parent_id_arr = []; } $parent_id_arr[] = $orderDetail['user_id']; $userTeamList = self::find() ->where(['user_id' => $parent_id_arr, 'mall_id' => $params['mall_id']]) ->indexBy('user_id') ->all(); foreach ($parent_id_arr as $user_id) { $userTeamModel = $userTeamList[$user_id] ?? null; if (empty($userTeamModel)) { // 如果没有则创建 $userTeamModel = new UserTeamProfitStatistics(); $userTeamModel->loadDefaultValues(); $userTeamModel->mall_id = $params['mall_id']; $userTeamModel->user_id = $user_id; //商品利润 $userTeamModel->team_order_pay_profit = 0; $userTeamModel->team_order_finish_profit = 0; $userTeamModel->children_order_pay_profit = 0; $userTeamModel->children_order_finish_profit = 0; //实付金额 $userTeamModel->team_order_pay_achievement = 0; $userTeamModel->team_order_finish_achievement = 0; $userTeamModel->children_order_pay_achievement = 0; $userTeamModel->children_order_finish_achievement = 0; } //商品利润 $userTeamModel->team_order_pay_profit += $team_order_pay_profit; $userTeamModel->team_order_finish_profit += $team_order_finish_profit; //实付金额 $userTeamModel->team_order_pay_achievement += $team_order_pay_achievement; $userTeamModel->team_order_finish_achievement += $team_order_finish_achievement; if ($user_id != $orderDetail['user_id']) { // 如果不是自己那么就是追加到父级的业绩中 //商品利润 $userTeamModel->children_order_pay_profit += $children_order_pay_profit; $userTeamModel->children_order_finish_profit += $children_order_finish_profit; //实付金额 $userTeamModel->children_order_pay_achievement += $children_order_pay_achievement; $userTeamModel->children_order_finish_achievement += $children_order_finish_achievement; } if (!$userTeamModel->save()) { var_dump("团队业绩统计失败"); } } } } return true; } catch (\Exception $e) { print_r($e->getMessage());exit; throw new Exception($e->getMessage()); } } //数据迁移累计历史订单业绩 public static function cumulativeOrderAchievement($params) { try { $type = $params['type'] ?? 0; //获取商城id $mall_list = Mall::getEnableMallList(true); if(!empty($mall_list)){ foreach ($mall_list as $mall){ // var_dump('商城:'. $mall['id']); self::orderAchievement(['mall_id' => $mall['id'], 'type' => $type]); } } return true; } catch (\Exception $e) { throw new Exception(); } } //处理历史订单实付金额数据 public static function orderAchievement($params) { try { // 判断是否开启 $config = Yii::$app->services->setting->mall->get($params['mall_id'], 'order'); $achievementGoodsIds = []; if (!empty($config['is_designated_achievement_goods'])) { $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true); } // 重置用户团队业绩数据 UserTeamProfitStatisticsLog::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]); UserTeamProfitStatistics::updateAll([ 'children_order_pay_achievement' => 0, 'team_order_pay_achievement' => 0, 'children_order_finish_achievement' => 0, 'team_order_finish_achievement' => 0 ], ['mall_id' => $params['mall_id']] ); // 查询数据更新统计 $orderDetailModel = OrderDetail::find() ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]) ->andWhere(['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]]) ->select('id, user_id, mall_id, order_status, goods_price, cost_price, num'); if (!empty($config['is_designated_achievement_goods'])) { $orderDetailModel->andWhere(['goods_id' => $achievementGoodsIds]); } foreach ($orderDetailModel->asArray()->batch(1000) as $orderDetails) { foreach ($orderDetails as $orderDetail) { $children_order_pay_achievement = 0; // 下级支付订单业绩(实付金额) (不包含自己) $team_order_pay_achievement = 0; // 团队支付订单业绩(实付金额) (包含自己) $children_order_finish_achievement = 0; // 下级完成订单业绩(实付金额) (不包含自己) $team_order_finish_achievement = 0; // 团队完成订单业绩(实付金额) (包含自己) // 获取当前订单价对应的业绩 $pay_money = $orderDetail['goods_price']; //实付金额 if ($pay_money > 0) { $children_order_pay_achievement = $pay_money; $team_order_pay_achievement = $pay_money; if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) { $children_order_finish_achievement = $pay_money; $team_order_finish_achievement = $pay_money; } } // 获取用户上级 $parent_id_arr = UserPartitionRelationship::getParentIdArr($orderDetail['user_id']); if (empty($parent_id_arr)) { $parent_id_arr = []; } $parent_id_arr[] = $orderDetail['user_id']; $userTeamList = self::find() ->where(['user_id' => $parent_id_arr, 'mall_id' => $params['mall_id']]) ->indexBy('user_id') ->all(); foreach ($parent_id_arr as $user_id) { $userTeamModel = $userTeamList[$user_id] ?? null; if (empty($userTeamModel)) { // 如果没有则创建 $userTeamModel = new UserTeamProfitStatistics(); $userTeamModel->loadDefaultValues(); $userTeamModel->mall_id = $params['mall_id']; $userTeamModel->user_id = $user_id; //商品利润 $userTeamModel->team_order_pay_profit = 0; $userTeamModel->team_order_finish_profit = 0; $userTeamModel->children_order_pay_profit = 0; $userTeamModel->children_order_finish_profit = 0; //实付金额 $userTeamModel->team_order_pay_achievement = 0; $userTeamModel->team_order_finish_achievement = 0; $userTeamModel->children_order_pay_achievement = 0; $userTeamModel->children_order_finish_achievement = 0; } //实付金额 $userTeamModel->team_order_pay_achievement += $team_order_pay_achievement; $userTeamModel->team_order_finish_achievement += $team_order_finish_achievement; if ($user_id != $orderDetail['user_id']) { // 如果不是自己那么就是追加到父级的业绩中 //实付金额 $userTeamModel->children_order_pay_achievement += $children_order_pay_achievement; $userTeamModel->children_order_finish_achievement += $children_order_finish_achievement; } if (!$userTeamModel->save()) { var_dump("团队业绩统计失败"); } } } } return true; } catch (\Exception $e) { print_r($e->getMessage());exit; throw new Exception($e->getMessage()); } } public static function getTeamInfo($mall_id, $user_id) { $data = [ 'is_show' => 0, 'team_performance' => 0, 'big_market_performance' => 0, 'small_market_performance' => 0 ]; if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_STOCKHOLDER) == true) { $setting = \addons\Stockholder\common\services\BackendService::getSetting($mall_id); $data['is_show'] = (int)($setting['is_show_performance'] ?? 0); if ($data['is_show']) { $statistics = self::getOne([['user_id' => $user_id]], true); $settlement_method = (int)($setting['settlement_method'] ?? 0); $is_include_yourself = (int)($setting['is_include_yourself'] ?? 0); //获取直推用户id $direct_child_ids = UserPartitionRelationship::getChildIdArr($user_id, 1); $child_team_data = UserTeamProfitStatistics::lists([ 'where' => [ ['user_id' => $direct_child_ids], ], 'select' => 'id,user_id,team_order_pay_profit,team_order_finish_profit', ]); switch ($settlement_method) { case 0: $data['team_performance'] = $statistics['children_order_finish_profit']; if (!empty($child_team_data)) { $big_market_performance_arr = array_column($child_team_data, 'team_order_finish_profit'); $data['big_market_performance'] = max($big_market_performance_arr); } break; case 1: $data['team_performance'] = $statistics['children_order_pay_profit']; if (!empty($child_team_data)) { $big_market_performance_arr = array_column($child_team_data, 'team_order_pay_profit'); $data['big_market_performance'] = max($big_market_performance_arr); } break; } if ($data['big_market_performance'] > 0) { $data['small_market_performance'] = bcsub($data['team_performance'], $data['big_market_performance'], 2); } switch ($settlement_method) { case 0: if (!empty($is_include_yourself)) $data['team_performance'] = $statistics['team_order_finish_profit']; break; case 1: if (!empty($is_include_yourself)) $data['team_performance'] = $statistics['team_order_pay_profit']; break; } } } return $data; } public static function userChangeRelationship($params) { try { $user_id = $params['user_id']; $new_all_tree = $params['new_all_tree']; $old_all_tree = $params['old_all_tree']; //获取当前用户的业绩 $user_data = UserTeamProfitStatistics::getOne([ ['user_id' => $user_id], ]); if (!empty($new_all_tree)) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id); //获取当前用户的订单利润数据 $user_list = self::lists([ 'where' => [ ['mall_id' => $user_data['mall_id']], ['user_id' => $parent_id_arr] ], 'index' => 'user_id', ], false); //用户订单利润数据操作 foreach ($parent_id_arr as $user) { $item = $user_list[$user]; if (empty($item)) { $item = new UserTeamProfitStatistics(); $item->loadDefaultValues(); $item->mall_id = $user_data['mall_id']; $item->user_id = $user; $item->team_order_pay_profit = 0; $item->team_order_finish_profit = 0; $item->children_order_pay_profit = 0; $item->children_order_finish_profit = 0; } //订单正常累加 $item->team_order_pay_profit += $user_data->team_order_pay_profit; $item->team_order_finish_profit += $user_data->team_order_finish_profit; $item->children_order_pay_profit += $user_data->children_order_pay_profit; $item->children_order_finish_profit += $user_data->children_order_finish_profit; if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$user); } } if (!empty($old_all_tree)) { $old_tree = explode(',', $old_all_tree); //获取用户数据 $old_user = User::lists([ 'where' => [ ['base64_code' => $old_tree], ['status' => StatusEnum::ENABLED], ], 'index' => 'id', 'select' => 'id,mall_id,mobile' ]); if (!empty($old_ids)) { $old_ids = array_column($old_user, 'id'); //获取当前用户的订单利润数据 $user_list = self::lists([ 'where' => [ ['mall_id' => $user_data['mall_id']], ['user_id' => $old_ids] ], 'index' => 'user_id', ], false); //用户订单利润数据操作 foreach ($old_ids as $old_user_id) { $item = $user_list[$old_user_id]; if (empty($item)) { $item = new UserTeamProfitStatistics(); $item->loadDefaultValues(); $item->mall_id = $user_data['mall_id']; $item->user_id = $old_user_id; $item->team_order_pay_profit = 0; $item->team_order_finish_profit = 0; $item->children_order_pay_profit = 0; $item->children_order_finish_profit = 0; } //订单正常累加 $item->team_order_pay_profit -= $user_data->team_order_pay_profit; $item->team_order_finish_profit -= $user_data->team_order_finish_profit; $item->children_order_pay_profit -= $user_data->children_order_pay_profit; $item->children_order_finish_profit -= $user_data->children_order_finish_profit; if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$old_user_id); } } } } catch (\Throwable $th) { //throw $th; } } }