| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- <?php
- namespace addons\ReservationService\common\logic;
- use addons\ReservationService\common\enums\ReservationServiceEnum;
- use addons\ReservationService\common\models\ReservationServiceGoodsSetting;
- use addons\ReservationService\common\models\ReservationServiceLevel;
- use addons\ReservationService\common\models\ReservationServiceOrder;
- use addons\ReservationService\common\models\ReservationServiceUser;
- use addons\ReservationService\common\services\UserService;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\helpers\FormatHelper;
- use common\models\common\CapitalLog;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\user\User;
- use common\models\user\UserPartitionRelationship;
- use services\common\UserWalletService;
- class RewardLogic
- {
- public function exec(array $data)
- {
- try {
- // 取出订单
- /**
- * @var $rOrder ReservationServiceOrder
- */
- $rOrder = ReservationServiceOrder::getOne([
- ['order_id' => $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;
- }
- }
|