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, array $ext) { $mall_id = $order['mall_id']; $order_id = $order['id']; $user_id = $order['user_id']; $head_user_id = CommunityHead::find() ->where(['mall_id' => $mall_id]) ->andWhere(['id' => $ext['head_id']]) // ->andWhere(['status' => StatusEnum::ENABLED]) // 有可能中途被删除 ->andWhere(['check_status' => StatusEnum::ENABLED]) ->select('user_id')->scalar(); if (empty($head_user_id)) { Yii::error("团长不存在: {$ext['head_id']}"); return false; } $params['where'] = [['order_id' => $order_id], ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_status' => $order->order_status]]; $order_detail_list = OrderDetail::lists($params); if (empty($order_detail_list)) { Yii::error("订单详情不存在: {$order_id}"); return false; } $insert_wallet = []; $insert_plugin = []; foreach ($order_detail_list as $item) { $modes = CommunityGoodsModeSetting::lists([ 'where' => [ ['item_id' => $item['goods_id']], ['enable' => StatusEnum::ENABLED], ['status' => StatusEnum::ENABLED], ] ]); $calc_commission = 0; $commission = 0; $score = 0; $hi_bei = 0; $hi_value = 0; if (!empty($modes)) { foreach ($modes as $mode) { if ($mode['is_alone'] == StatusEnum::ENABLED) { // 单独设置 if ($mode['give_num'] <= 0) continue; // 奖励为0的则不赠送 switch ($mode['commission_type']) { case 'commission': // 佣金 $commission = bcmul($mode['give_num'], $item['num'], 2); if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比 $commission = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2); } Yii::error("{$order['order_no']} commission {$commission} - {$mode['is_percent']} - {$item['goods_price']}"); break; case 'score': // 积分 $score = bcmul($mode['give_num'], $item['num'], 2); if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比 $score = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2); } break; case 'hi_bei': // 嗨呗 // 判断有没有安装这个插件 if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_HI_GO)) { $hi_bei = bcmul($mode['give_num'], $item['num'], 2); if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比 $hi_bei = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2); } } break; case 'hi_value': // 嗨值 // 判断有没有安装过这个插件 if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_HI_GO)) { $hi_value = bcmul($mode['give_num'], $item['num'], 2); if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比 $hi_value = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2); } } break; } switch ($mode['commission_type']) { case 'commission': // 默认就是这个 $commission = $commission; break; case 'score': $score = $score; break; case 'hi_bei': $hi_bei = $hi_bei; break; case 'hi_value': $hi_value = $hi_value; break; } Yii::$app->custom->logs("{$order['order_no']} {$mode['item_id']} - {$mode['commission_type']} - {$mode['is_alone']} - {$mode['give_num']} - {$item['goods_price']} - {$commission}"); } else { // 这边只有余额? if ($config['is_enable_reward'] == StatusEnum::DISABLED) { Yii::error("Community reward 未开启奖励"); continue; } // 未开启团长奖励 switch ($config['head_commission_type']) { case ConfigEnum::HEAD_COMMISSION_TYPE_FIXED: // 固定金额 $calc_commission = bcmul($config['commission'], $item['num'], 2); break; case ConfigEnum::HEAD_COMMISSION_TYPE_RATE: // 百分比 $base_amount = 0; switch ($config['calculate_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; } $calc_commission = bcmul($base_amount, bcmul($config['commission'], 0.01, 2), 2); break; } // 默认就是这个 $commission = $calc_commission; Yii::$app->custom->logs("{$order['order_no']} - {$commission}"); } } } else { // 这边只有余额? if ($config['is_enable_reward'] == StatusEnum::DISABLED) { Yii::error("Community reward 未开启奖励"); continue; } // 未开启团长奖励 switch ($config['head_commission_type']) { case ConfigEnum::HEAD_COMMISSION_TYPE_FIXED: // 固定金额 $calc_commission = bcmul($config['commission'], $item['num'], 2); break; case ConfigEnum::HEAD_COMMISSION_TYPE_RATE: // 百分比 $base_amount = 0; switch ($config['calculate_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; } $calc_commission = bcmul($base_amount, bcmul($config['commission'], 0.01, 2), 2); break; } // 默认就是这个 $commission = $calc_commission; Yii::$app->custom->logs("{$order['order_no']} - {$commission}"); } $wallet_main = [ 'mall_id' => $mall_id, 'user_id' => $head_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, 'created_at'=> time(), 'updated_at'=> time(), ]; // 添加到冻结金额 if (!empty($commission) && $commission > 0) { Yii::error("{$order['order_no']} {$item['goods_id']} -- {$commission}"); $wallet_main['wallet_type'] = UserWalletService::WALLET_TYPE_COMMISSION; $wallet_main['money'] = $commission; $wallet_main['desc'] = "用户 ({$user_id}) ,获得自提订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$commission}) 元佣金"; $insert_wallet[] = $wallet_main; $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成"; $plugin_main['commission'] = bcmul($commission, 100); $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_COMMISSION; $insert_plugin[] = $plugin_main; } if (!empty($score) && $score > 0) { Yii::error("{$order['order_no']} {$item['goods_id']} -- {$score}"); $wallet_main['wallet_type'] = UserWalletService::WALLET_TYPE_SCORE; $wallet_main['money'] = $score; $wallet_main['desc'] = "用户 ({$user_id}) ,获得自提订单 ({$order['id']}) 奖励, 奖励类型:(积分), 共奖励 ({$score}) 积分"; $insert_wallet[] = $wallet_main; $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成"; $plugin_main['commission'] = bcmul($score, 100); $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_SCORE; $insert_plugin[] = $plugin_main; } // 嗨呗/嗨值暂时不写 if (!empty($hi_bei) && $hi_bei > 0) { // $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成"; // $plugin_main['commission'] = $hi_bei; // $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_HI_BEI; // $insert_plugin[] = $plugin_main; } if (!empty($hi_value) && $hi_value > 0) { // $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成"; // $plugin_main['commission'] = $hi_value; // $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_HI_VALUE; // $insert_plugin[] = $plugin_main; } } if (!empty($insert_wallet)) { // 不为空的情况下 $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } if (!empty($higo_wallet_insert)) { // higo新增数据 } if (!empty($insert_plugin)) { Yii::error("insert_plugin: " . Json::encode($insert_plugin)); // 写入记录 Yii::$app->db->createCommand()->batchInsert(CommunityHeadCommission::tableName(), array_keys($insert_plugin[0]), $insert_plugin)->execute(); } return true; } /** * 佣金退回 * @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); } */ } }