$data['id']], ['service_status' => [ReservationServiceEnum::RESERVE_ORDER_STATUS_FINISH, ReservationServiceEnum::RESERVE_ORDER_STATUS_UNDERWRITER, ReservationServiceEnum::RESERVE_ORDER_STATUS_TALKING]] ]); if (empty($rOrder)) { return true; } // 取出技师 /** * @var $staff ReservationServiceUser */ $staff = $rOrder->getStaff()->one(); if (empty($staff)) { return true; } // 取出等级 /** * @var $level ReservationServiceLevel */ $level = $staff->getLevel()->andWhere(['mall_id' => $rOrder->mall_id])->one(); if (empty($level)) { return true; } // 取出平台订单 /** * @var $order Order */ $order = $rOrder->getOrder()->one(); // 门店/商户订单不做分佣处理 if (empty($order) || !empty($order->store_id) || !empty($order->mch_id)) { return true; } // 取出订单详情 /** * @var $orderDetails OrderDetail[] */ $orderDetails = $order->getDetail()->all(); if (empty($orderDetails)) { return true; } // 取出上级 $parent_id_arr = UserPartitionRelationship::getParentIdArr($rOrder->staff_user_id); $parent_id_arr = array_reverse($parent_id_arr); // 只需要前面两个 $reward_map = [ ReservationServiceEnum::CAPITAL_TYPE_COMMISSION_FIRST, ReservationServiceEnum::CAPITAL_TYPE_COMMISSION_SECOND, ]; $insert_wallet = []; $settlement_method = \Yii::$app->services->setting->addons->get($staff->mall_id, ReservationServiceEnum::ADDONS_NAME, 'basic.settlement_method'); $is_frozen = $settlement_method == OrderStatusEnum::ACCOMPLISH; // 如果需要确认[签收]后才发放,那么就是冻结状态 foreach ($orderDetails as $orderDetail) { if ($orderDetail->id != $rOrder->order_detail_id) continue; $commission = $rOrder->commission; // $commission = $level->item_commission; // if (empty($level->item_commission_type)) { // $commission = bcmul(bcmul($commission, $orderDetail->goods_price, 2), 0.01, 2); // } // // 判断是否有独立启用 /** * @var $goods_setting ReservationServiceGoodsSetting */ $goods_setting = ReservationServiceGoodsSetting::getOne([ ['mall_id' => $rOrder->mall_id], ['status' => StatusEnum::ENABLED], ['item_id' => $orderDetail->goods_id], ['item_type' => 'goods'], ['is_enable' => StatusEnum::ENABLED], ['commission_type' => UserWalletService::WALLET_TYPE_COMMISSION] ]); // // if (!empty($goods_setting)) { // $commission = $goods_setting->commission; // if (!empty($goods_setting->is_percent)) { // $commission = bcmul(bcmul($commission, $orderDetail->goods_price, 2), 0.01, 2); // } // } // 如果佣金小于等于0那么就不进行分佣 if (empty($commission) || $commission <= 0) continue; // 技师获得的奖励 $insert_wallet[] = $this->packData($order, $orderDetail, $commission, $rOrder->user_id, $rOrder->staff_user_id, ReservationServiceEnum::CAPITAL_TYPE_COMMISSION, UserWalletService::WALLET_TYPE_COMMISSION, "技师 [$rOrder->staff_user_id] 为用户 [$rOrder->user_id] 完成订单 [$order->order_no] 提供 [$orderDetail->goods_name] 服务获得 [$commission] " . ReservationServiceEnum::CAPITAL_TYPE_MAP[ReservationServiceEnum::CAPITAL_TYPE_COMMISSION], $is_frozen, $orderDetail->goods_price); // 享受分销提成奖励; 0关闭,1开启 if (!empty($parent_id_arr) && !empty($level->enable_distribution_commission)) { if (empty($goods_setting) || !empty($goods_setting->is_enable_distribution)) { foreach ($parent_id_arr as $key => $parent_id) { $capital_type = $reward_map[$key] ?? null; if (empty($capital_type)) break; $deep_index = $key + 1; $commission_key = "level{$deep_index}_commission"; $commission_type_key = "level{$deep_index}_commission_type"; // 获取上级 // 一级佣金 $commission_level = $level[$commission_key] ?? 0; if (empty($level[$commission_type_key])) { $commission_level = bcmul(bcmul($commission_level, $commission, 0.01), 0.01, 2); } // 是否有独立设置 if (!empty($goods_setting)) { $commission = $goods_setting->distribution_config[$deep_index]['commission'] ?? 0; if (!empty($goods_setting->distribution_config[$deep_index]['is_percent'])) { $commission = bcmul(bcmul($commission, $orderDetail->goods_price, 2), 0.01, 2); } } // 如果佣金小于等于0 那么就不进行分佣 if (empty($commission_level) || $commission_level < 0) break; $insert_wallet[] = $this->packData($order, $orderDetail, $commission_level, $rOrder->staff_user_id, $parent_id, $capital_type, UserWalletService::WALLET_TYPE_COMMISSION, "用户 [$parent_id] 推荐技师 [$rOrder->staff_user_id] 完成订单 [$order->order_no] 服务获得 [$commission_level] " . ReservationServiceEnum::CAPITAL_TYPE_MAP[$capital_type], $is_frozen, $orderDetail->goods_price); } } } } if (!empty($insert_wallet)) { $t = \Yii::$app->db->beginTransaction(); if (!$is_frozen) { // 如果是非冻结的情况下,那么累加佣金,否则不累加 $userService = new UserService(); foreach ($insert_wallet as $item) { $userService->addCommission($item['user_id'], $item['money']); } } $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); $t->commit(); } } catch (\Exception $e) { if (!empty($t)) $t->rollBack(); \Yii::error("123123123213 999 " . var_export($data, true)); \Yii::error(FormatHelper::exception($e, __METHOD__)); return false; } \Yii::error("123123123213 101010 " . var_export($data, true)); return true; } /** * @param Order $order * @param OrderDetail $orderDetail * @param string $commission * @param int $from_user_id * @param int $to_user_id * @param string $capital_type * @param string $wallet_type * @param string $desc * @param bool $is_frozen * @param $contributor_money * @return array */ protected function packData(Order $order, OrderDetail $orderDetail, string $commission, int $from_user_id, int $to_user_id, string $capital_type, string $wallet_type, string $desc, bool $is_frozen, $contributor_money) { return [ 'mall_id' => $order->mall_id, 'user_id' => $to_user_id, 'is_frozen' => $is_frozen, 'source_table' => 'order_detail', 'source_table_id' => $orderDetail->id, // 取出订单ID? 'from_type' => ReservationServiceEnum::ADDONS_NAME, 'capital_type' => $capital_type, 'contributor_name' => $orderDetail->goods_name, 'order_no' => $order->order_no, // 这里需要订单号 'money'=> $commission, 'wallet_type' => $wallet_type, 'desc' => $desc, 'contributor_id' => $from_user_id, 'contributor_money' => $contributor_money ]; } /** * 解冻 * @param array $order * @return bool */ public function unfreeze(array $order) { $t = \Yii::$app->db->beginTransaction(); try { $capital_types = [ ReservationServiceEnum::CAPITAL_TYPE_COMMISSION, ReservationServiceEnum::CAPITAL_TYPE_COMMISSION_FIRST, ReservationServiceEnum::CAPITAL_TYPE_COMMISSION_SECOND, ]; $where = [ ['source_table' => 'order_detail'], ['order_no' => $order['order_no']], ['from_type' => ReservationServiceEnum::ADDONS_NAME], ['capital_type' => $capital_types], ['status' => CapitalLog::STATUS_WAIT_SEND] ]; $params['where'] = $where; //佣金 $wallet_type = 'commission'; CapitalLog::$capitalType = "{$wallet_type}_frozen"; $commission_list = CapitalLog::lists($params); $userService = new UserService(); if (!empty($commission_list)) { // 默认会删除? foreach ($commission_list as $item) { $userService->addCommission($item['user_id'], $item['change_num']); UserWalletService::unfrozen($item['id'], $wallet_type); } } $wallet_type = 'score'; CapitalLog::$capitalType = "{$wallet_type}_frozen"; $score_list = CapitalLog::lists($params); if (!empty($score_list)) { foreach ($score_list as $item) { UserWalletService::unfrozen($item['id'], $wallet_type); } } $t->commit(); } catch (\Exception $e) { $t->rollBack(); \Yii::error(FormatHelper::exception($e, __METHOD__)); return false; } return true; } }