'ID', 'mall_id' => '商城ID', 'user_id' => '用户ID', 'pay_team_performance' => '总团队利润业绩[订单支付]', 'accomplish_team_performance' => '总团队利润业绩[订单完成]', 'pay_big_market_performance' => '大市场利润业绩[订单支付]', 'accomplish_big_market_performance' => '大市场利润业绩[订单完成]', 'pay_user_performance' => '用户利润业绩[订单支付]', 'accomplish_user_performance' => '用户利润业绩[订单完成]', 'status' => '状态[-1删除; 0禁用; 1正常]', 'created_at' => '创建时间', 'updated_at' => '更新时间', ]; } /** * @Description: 保存数据 * @Author: zsan * @DateTime 2024-04-11 10:21:30 * @param array $data * @return bool|self */ public static function setData(array $data) { try { $model = self::findOne(['user_id' => $data['user_id'], 'status' => StatusEnum::ENABLED]); 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) { $mall_id= $params['mall_id']; $uid = $params['user_id']; $order_id = $params['order_id']; try { // 判断是否开启 $config = Yii::$app->services->setting->mall->get($mall_id, 'order'); $achievementGoodsIds = []; if (!empty($config['is_designated_achievement_goods'])) { $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true); if (empty($achievementGoodsIds)) { $achievementGoodsIds = true; } } $parent_id_arr = UserPartitionRelationship::getParentIdArr($uid); $parent_id_arr[] = $uid; foreach ($parent_id_arr as $user_id) { $user_id_arr = UserPartitionRelationship::getChildIdArr($user_id); $pay_team_performance = 0; $accomplish_team_performance = 0; if (!empty($user_id_arr)) { $pay_team_performance = self::computeGoodsPerformance($user_id_arr, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds); $accomplish_team_performance = self::computeGoodsPerformance($user_id_arr, ['order_status' => OrderStatusEnum::ACCOMPLISH], $achievementGoodsIds); } $pay_user_performance = self::computeGoodsPerformance($user_id, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds); $accomplish_user_performance = self::computeGoodsPerformance($user_id, ['order_status' => [OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds); $direct_user_id_arr = UserPartitionRelationship::getChildIdArr($user_id, 1); $pay_big_market_performance = 0; $accomplish_big_market_performance = 0; if (!empty($direct_user_id_arr)) { $pay_performance_arr = []; $accomplish_performance_arr = []; foreach ($direct_user_id_arr as $id) { $child_id_arr = UserPartitionRelationship::getChildIdArr($id); $child_id_arr[] = $id; $pay_performance_arr[] = self::computeGoodsPerformance($child_id_arr, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds); $accomplish_performance_arr[] = self::computeGoodsPerformance($child_id_arr, ['order_status' => [OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds); } $pay_big_market_performance = max($pay_performance_arr); $accomplish_big_market_performance = max($accomplish_performance_arr); } if (self::setData([ 'mall_id' => $mall_id, 'user_id' => $user_id, 'pay_team_performance' => $pay_team_performance > 0 ? $pay_team_performance : 0, 'accomplish_team_performance' => $accomplish_team_performance > 0 ? $accomplish_team_performance : 0, 'pay_big_market_performance' => $pay_big_market_performance > 0 ? $pay_big_market_performance : 0, 'accomplish_big_market_performance' => $accomplish_big_market_performance > 0 ? $accomplish_big_market_performance : 0, 'pay_user_performance' => $pay_user_performance > 0 ? $pay_user_performance : 0, 'accomplish_user_performance' => $accomplish_user_performance > 0 ? $accomplish_user_performance : 0, ]) === false) { throw new \Exception(self::getStaticError()); } } //再次执行会员升级任务 \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) { \Yii::error(__METHOD__ . ' ' . json_encode(['msg' => $e->getMessage(), 'line' => $e->getLine()])); self::setStaticError($e->getMessage()); return false; } } public static function computeGoodsPerformance($user_id, $andwhere, $achievementGoodsIds = []) { $data = OrderDetail::find() ->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if ($achievementGoodsIds === true) return 0; if (!empty($achievementGoodsIds)) { $data->andWhere(['goods_id' => $achievementGoodsIds]); } $data = (array)$data->andWhere($andwhere) ->select('goods_price,cost_price,num') ->asArray() ->all(); $goods_performance = 0; foreach ($data as $value) { $performance = $value['goods_price'] - bcmul($value['cost_price'], $value['num'], 2); if ($performance > 0) $goods_performance += $performance; } return $goods_performance; } 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 = UserTeamPerformanceStatistics::getOne([['user_id' => $user_id], ['status' => StatusEnum::ENABLED]], true); $settlement_method = (int)($setting['settlement_method'] ?? 0); $is_include_yourself = (int)($setting['is_include_yourself'] ?? 0); switch ($settlement_method) { case 0: $data['team_performance'] = $statistics['accomplish_team_performance']; $data['big_market_performance'] = $statistics['accomplish_big_market_performance']; break; case 1: $data['team_performance'] = $statistics['pay_team_performance']; $data['big_market_performance'] = $statistics['pay_big_market_performance']; 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['accomplish_user_performance']; break; case 1: if (!empty($is_include_yourself)) $data['team_performance'] += $statistics['pay_user_performance']; break; } } } return $data; } }