db->beginTransaction(); try { $this->execMain($order, $config, $ext); $t->commit(); } catch (\Exception $e) { $t->rollBack(); $exception = FormatHelper::exception($e, "订单支付触发社区团购插件事件: 分润失败 {$order->id} " . Json::encode($ext) . " " . Json::encode($config)); Yii::error($exception); } } /** * @throws Exception */ public function execMain(Order $order, array $config, int $activity_id) { $mall_id = $order['mall_id']; $order_id = $order['id']; $user_id = $order['user_id']; $activity_order = AddonsBusinessActivityOrderModel::find() ->where(['mall_id' => $mall_id]) ->andWhere(['order_id' => $order_id]) ->andWhere(['activity_id' => $activity_id]) ->with(['activity']) ->one(); if (empty($activity_order)) { Yii::error("活动订单不存在: activity_id: {$activity_id}, order_id: {$order_id}"); return; } $activity = $activity_order->activity; // 取出可以订单商品ID? $activity_goods_ids = Json::decode($activity_order->goods_ids); // 取出下单时参与的商品,不管删除与否都参与进来 $goods = AddonsBusinessActivityGoodsModel::find()->where(['activity_id' => $activity_id]) ->andWhere(['id' => $activity_goods_ids]) ->asArray() ->all(); $goods = array_reduce($goods, function (&$goods, $val) { $goods[$val['goods_id']] = $val; return $goods; }); $goods_ids = array_column($goods, 'goods_id'); // 获取商品ID $params['where'] = [['order_id' => $order_id], ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_status' => $order->order_status], ['goods_id' => $goods_ids]]; $order_detail_list = OrderDetail::lists($params); if (empty($order_detail_list)) { Yii::error("订单详情不存在: {$order_id}"); return; } $insert_wallet = []; $insert_plugin = []; $config = (new SettingService())->get($order->mall_id); foreach ($order_detail_list as $item) { $merchants_commission = 0; // 招商 $merchants_commission_parent = 0; // 招商上级 $venue_commission = 0; // 场地 $venue_commission_parent = 0; // 场地上级 $g_item = $goods[$item['goods_id']] ?? null; if (!empty($g_item)) { // 存在 if ($g_item['is_alone_commission'] == StatusEnum::ENABLED) { // 这里是独立设置 $merchants_commission = bcmul($g_item['merchants_commission'], $item['num'], 2); $merchants_commission_parent = bcmul($g_item['merchants_parent_commission'], $item['num'], 2); $venue_commission = bcmul($g_item['venue_commission'], $item['num'], 2); $venue_commission_parent = bcmul($g_item['venue_parent_commission'], $item['num'], 2); if ($g_item['commission_type'] == StatusEnum::ENABLED) { // 1百分比, 2固定值 $base_amount = 0; switch ($config['payment_type']) { case ConfigEnum::CALCULATE_TYPE_PAY_AMOUNT: // 实际支付金额 $base_amount = $item['goods_price']; // 已经包含数量 break; case ConfigEnum::CALCULATE_TYPE_GOODS_PRICE: // 商品售价 // 计算商品售价 $base_amount = bcmul($item['price'], $item['num'], 2); break; case ConfigEnum::CALCULATE_TYPE_GOODS_PROFIT: // 商品利润 $base_amount = bcmul(bcsub($item['price'], $item['cost_price'], 2), $item['num'], 2); break; } $merchants_commission = bcmul($base_amount, bcmul($g_item['merchants_commission'], 0.01, 2), 2); $merchants_commission_parent = bcmul($base_amount, bcmul($g_item['merchants_parent_commission'], 0.01, 2), 2); $venue_commission = bcmul($base_amount, bcmul($g_item['venue_commission'], 0.01, 2), 2); $venue_commission_parent = bcmul($base_amount, bcmul($g_item['venue_parent_commission'], 0.01, 2), 2); } } else { // 走公共提成设置 if ($config['is_commission'] != StatusEnum::ENABLED) { Yii::error("Business Activity reward 未开启奖励"); continue; } switch ($config['commission_type']) { case ConfigEnum::BUSINESS_ACTIVITY_COMMISSION_TYPE_FIXED: // 固定金额 $merchants_commission = bcmul($config['investment_scale'], $item['num'], 2); $venue_commission = bcmul($config['site_scale'], $item['num'], 2); break; case ConfigEnum::BUSINESS_ACTIVITY_COMMISSION_TYPE_RATE: // 百分比 $base_amount = 0; switch ($config['payment_type']) { case ConfigEnum::CALCULATE_TYPE_PAY_AMOUNT: // 实际支付金额 $base_amount = $item['goods_price']; // 已经包含数量 break; case ConfigEnum::CALCULATE_TYPE_GOODS_PRICE: // 商品售价 // 计算商品售价 $base_amount = bcmul($item['price'], $item['num'], 2); break; case ConfigEnum::CALCULATE_TYPE_GOODS_PROFIT: // 商品利润 $base_amount = bcmul(bcsub($item['price'], $item['cost_price'], 2), $item['num'], 2); break; } $merchants_commission = bcmul($base_amount, bcmul($config['investment_scale'], 0.01, 2), 2); $merchants_commission_parent = bcmul($base_amount, bcmul($config['investment_scale_parent'], 0.01, 2), 2); $venue_commission = bcmul($base_amount, bcmul($config['site_scale'], 0.01, 2), 2); $venue_commission_parent = bcmul($base_amount, bcmul($config['site_scale_parent'], 0.01, 2), 2); break; } } } if (!empty($merchants_commission)) { // 如果奖励给招商人不为空 $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $activity->merchants_user_id, $merchants_commission, "用户 ({$activity->merchants_user_id}) ,[招商负责人]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$merchants_commission}) 元佣金"); $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $activity->merchants_user_id, $merchants_commission, "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[招商负责人]佣金[{$merchants_commission}]"); } // 招商负责人上级 $merchants_commission_parent_user_id = User::find() ->where(['id' => $activity->merchants_user_id])->select('parent_id')->scalar(); if (!empty($merchants_commission_parent) && !empty($merchants_commission_parent_user_id)) { // 如果奖励给招商人上级不为空 $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $merchants_commission_parent_user_id, $merchants_commission_parent, "用户 ({$merchants_commission_parent_user_id}) ,[招商负责人上级]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$merchants_commission_parent}) 元佣金"); $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $merchants_commission_parent_user_id, $merchants_commission_parent, "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[招商负责人上级]佣金[{$merchants_commission_parent}]"); } // 场地负责人 if (!empty($venue_commission)) { // 如果奖励给场地负则人不为空 $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $activity->venue_user_id, $venue_commission, "用户 ({$activity->venue_user_id}) ,[场地负责人]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$venue_commission}) 元佣金"); // 用户[xxx]通过招商活动[xxx]下单,单号为[xxx]共支付[xxx],获得佣金[xxx] $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $activity->venue_user_id, $venue_commission, "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[场地负责人]佣金[{$venue_commission}]"); } // 场地负责人上级 $venue_commission_parent_user_id = User::find() ->where(['id' => $activity->venue_user_id])->select('parent_id')->scalar(); if (!empty($venue_commission_parent) && !empty($venue_commission_parent_user_id)) { // 如果奖励给场地负则人上级不为空 $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $venue_commission_parent_user_id, $venue_commission_parent, "用户 ({$venue_commission_parent_user_id}) ,[场地负责人上级]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$venue_commission_parent}) 元佣金"); // 用户[xxx]通过招商活动[xxx]下单,单号为[xxx]共支付[xxx],获得佣金[xxx] $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $venue_commission_parent_user_id, $venue_commission_parent, "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[场地负责人上级]佣金[{$venue_commission_parent}]"); } } if (!empty($insert_wallet)) { // 不为空的情况下 $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); Yii::$app->db->createCommand()->batchInsert(AddonsBusinessActivityCommissionModel::tableName(), array_keys($insert_plugin[0]), $insert_plugin)->execute(); } } /** * @param AddonsBusinessActivityModel $activity * @param Order $order * @param array $item * @param int $user_id * @param $merchants_commission * @param $desc * @return array */ protected function genInsertWallet(AddonsBusinessActivityModel $activity, Order $order, array $item, int $user_id, $merchants_commission, $desc): array { return [ 'mall_id' => $activity->mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'source_table' => OrderDetail::tableName(), 'source_table_id' => $item['id'], // 取出订单ID? 'from_type' => BusinessActivityEnum::ADDONS_NAME, 'capital_type' => BusinessActivityEnum::BUSINESS_ACTIVITY_PRIZE, 'contributor_name' => '', 'order_no' => $order['order_no'], // 这里需要订单号 'wallet_type' => UserWalletService::WALLET_TYPE_COMMISSION, 'money' => $merchants_commission, 'desc' => $desc, ]; } /** * @param AddonsBusinessActivityModel $activity * @param Order $order * @param array $item * @param int $user_id * @param $merchants_commission * @param $desc * @return array */ protected function genInsertPlugin(AddonsBusinessActivityModel $activity, Order $order, array $item, int $user_id, $merchants_commission, $desc): array { return [ 'mall_id' => $activity->mall_id, 'user_id' => $user_id, 'commission' => bcmul($merchants_commission, 100), 'intro' => $desc, 'order_id' => $order->id, 'order_detail_id' => $item['id'], 'activity_id' => $activity->id, 'order_no' => $order->order_no, 'created_at' => time(), 'updated_at' => time(), ]; } /** * 佣金退回 * @param array $commission_list * @param array $score_list * @return void */ public function refund(array $commission_list, array $score_list) { /* $t = Yii::$app->db->beginTransaction(); try { $order_no = !empty($commission_list) ? $commission_list[0]['order_no'] : $score_list[0]['order_no']; if (empty($order_no)) throw new \Exception('没有订单编号'); $order = Order::find()->where(['order_no' => $order_no])->one(); if (empty($order)) throw new \Exception('订单不存在'); // 获取团长信息 if ($order->shipping_type == OrderStatusEnum::SHIPMENTS && !empty($order->extra_info)) { // 如果是自提订单 $ext = Json::decode($order->extra_info); if (empty($ext['head_id'])) { throw new \Exception("OrderPaidRewardListener 非站点自提订单: {$order->id}"); } } $insert_wallet = []; $insert_plugin = []; $wallet_main = [ 'mall_id' => $order->mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'source_table' => OrderDetail::tableName(), 'source_table_id' => $item['id'], // 取出订单ID? 'from_type' => CommunityEnum::ADDONS_NAME, 'capital_type' => CommunityEnum::COMMUNITY_PICKUP_PRIZE, 'contributor_name' => '', 'order_no' => $order['order_no'], // 这里需要订单号 ]; $plugin_main = [ 'mall_id' => $mall_id, 'user_id' => $head_user_id, // 获奖用户 - 团长用户ID 'head_id' => $ext['head_id'], 'order_id' => $order['id'], 'buyer_user_id' => $user_id, 'is_inflow' => StatusEnum::DISABLED, // 非流入 ]; // order_no if (!empty($commission_list)) { foreach ($commission_list as $item) { } } if (!empty($score_list)) { foreach ($score_list as $item) { } } $t->commit(); } catch (\Exception $e) { $t->rollBack(); $exception = FormatHelper::exception($e, "社区团购退回佣金失败"); \Yii::error($exception); } */ } }