1, 'num' => 2, 'pay_price' => 100], ['id' => 2, 'num' => 3, 'pay_price' => 100]]; public static function getOrderLevelProfit($store_id, array $goodsList) { $levels = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'status' => 1])->select(['id'])->asArray()->all(); $profit = []; foreach ($levels as $level) { foreach ($goodsList as $goods) { $chainLevel = GoodsChainLevel::find()->where(['goods_id' => $goods['id']])->asArray()->one(); if ($chainLevel && (bool)$chainLevel['is_open'] && $chainLevelValue = \json_decode($chainLevel['value'], true)) { if (isset($chainLevelValue[$level['id']])) { if ($chainLevel['type'] == 1) { // 固定金额 $profit[$level['id']]['direct'] += $chainLevelValue[$level['id']][0] * $goods['num']; $profit[$level['id']]['indirect'] += $chainLevelValue[$level['id']][1] * $goods['num']; } else { // 百分比 $profit[$level['id']]['direct'] += ($chainLevelValue[$level['id']][0] * $goods['pay_price'] / 100); $profit[$level['id']]['indirect'] += ($chainLevelValue[$level['id']][1] * $goods['pay_price'] / 100); } } else { $profit[$level['id']]['direct'] += 0; $profit[$level['id']]['indirect'] += 0; } } else { $profit[$level['id']]['direct'] += 0; $profit[$level['id']]['indirect'] += 0; } } } return $profit; } public static function checkFrost($user_id) { $parent = ShareHolderOutLog::findOne(['parent_user_id' => $user_id]); if (!$parent) { return false; } $is = ShareHolderOutLog::findOne(['parent_user_id' => $user_id, 'status' => 0]); return $is ? false : true; } /** * 在发放 链动极差佣金的时候,判断一下购买人的升级产品金额和获得佣金人的升级产品金额,如果获得佣金人的购物金额小于了购买人购物金额, * 按照获得佣金人购买升级产品的金额进行返佣。 * @param $base_price * @param $parent_user_id * @return int|mixed */ public static function getBasePrice($base_price, $parent_user_id, $store_id, $order_id) { $shareHolderProfitSwitch = Option::get('shareHolderProfitSwitch', $store_id, 'bonus_pool', 0)['value']; //当购买低价格产品成为代理后,再推荐高价格代理时,代理可以获取到高价格产品佣金*佣金折扣比例作为分红基数 $shareHolderHighProfit = Option::get('shareHolderHighProfit', $store_id, 'bonus_pool', 0)['value']; //如果未开启 则系统中的参数比例判定为0 if (!intval($shareHolderProfitSwitch)) { $shareHolderHighProfit = 0; } //获取父级购买的升级最高价产品金额 与当前订单中的最高价商品进行比对 确认是否是小推大 $order_log = ShareHolderProfitGoodsLog::find()->alias('l')->where(['l.user_id' => $parent_user_id, 'l.is_switch' => 1]) ->leftJoin(['o' => Order::tableName()], 'l.order_id = o.id')->andWhere(['o.is_sale' => 1]) ->orderBy('l.goods_price desc')->select('l.order_id, l.goods_id, l.goods_price')->asArray()->one(); if ($order_log) { //父级购买的升级最高价产品金额 $old_price = $order_log['goods_price']; } else { /** * 如果没有记录就获取父级首次升级成为股东的订单记录 * 获取该订单中最高金额的产品与当前订单中的最高金额商品进行比较 * 如果小于当前订单中的商品金额 * 就表示满足小推大条件 **/ $level_log = ShareHolderLevelLog::find()->where(['AND', ['user_id' => $parent_user_id], ['>', 'order_id', 0]]) ->orderBy('id ASC')->select('order_id')->asArray()->one(); if (!$level_log) { return $base_price; } $old_order_detail_arr = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id') ->where(['od.order_id' => $level_log['order_id'], 'od.is_delete' => 0]) ->select('od.goods_info, od.attr, g.share_holder_profit_switch, g.share_holder_high_profit, g.id, od.total_price, od.num')->asArray()->all(); $old_price = 0; /** * 判断原来的商品是否开启分红 或者 开启独立链动 (防止下单多个大额商品但是非股东分红产品,容易对比失败) * 因为原来下单时候没有将GoodsChainLevel添加在订单详情表商品信息中的 所以可能会有问题 * 假如一个商品原来没有设置分红也没有开启独立链动 后来才开启独立链动的 从订单详情商品信息中查询不到GoodsChainLevel * 可能会使用后来添加的独立链动 就判定$open为true了 **/ foreach ($old_order_detail_arr as $order_detail_item) { $open = false; $old_goods_info = json_decode($order_detail_item['goods_info'], true); if (!empty($old_goods_info)) { //原订单商品开启分红 if ($old_goods_info['rate'] > 0) { $open = true; } else { //未开启分红但是订单信息中存储的有商品独立链动数据 if (!empty($old_goods_info['goods_chain_level'])) { $goodsChainLevel = $old_goods_info['goods_chain_level']; if (intval($goodsChainLevel['is_open'])) { if (!empty($goodsChainLevel['value'])) { $open = true; } } } else { //异常情况 假设没有存储商品独立链动数据 就只能使用最新的独立链动数据 来确认是否满足小推大条件 $goodsChainLevel = GoodsChainLevel::findOne(['goods_id' => $order_detail_item['id']]); if (!empty($goodsChainLevel)) { if (intval($goodsChainLevel->is_open)) { $chainLevelValue = json_decode($goodsChainLevel->value, true); if (!empty($chainLevelValue)) { $open = true; } } } } } } //如果满足条件 就选出金额最大的一个商品单价 if ($open) { $old_price_ = bcdiv($order_detail_item['total_price'], $order_detail_item['num'], 2); if ($old_price_ > $old_price) { $old_price = $old_price_; } } } } //获取当前订单中的信息 $order_detail_arr = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'od.goods_id = g.id') ->where(['od.order_id' => $order_id, 'od.is_delete' => 0]) ->select('od.goods_info, od.attr, g.share_holder_profit_switch, g.share_holder_high_profit, g.id, od.total_price, od.num')->asArray()->all(); $new_price = 0; foreach ($order_detail_arr as $order_detail_item) { //获取当前订单中的商品分红 $goods = Goods::findOne($order_detail_item['id']); $open = false; if ($goods->rate > 0) { $open = true; } else { //如果没开启分红就判断是否开启独立链动 $goodsChainLevel = GoodsChainLevel::findOne(['goods_id' => $order_detail_item['id']]); if (!empty($goodsChainLevel)) { if (intval($goodsChainLevel->is_open)) { $chainLevelValue = json_decode($goodsChainLevel->value, true); if (!empty($chainLevelValue)) { $open = true; } } } } if ($open) { //如果开启就判断当前订单商品是否开启独立的小推大开关以及设置比例 $goods_info = json_decode($order_detail_item['goods_info'], true); $is_use_goods_profit = 0; if (isset($goods_info['share_holder_profit_switch']) && intval($goods_info['share_holder_profit_switch']) && isset($goods_info['share_holder_high_profit']) && floatval($goods_info['share_holder_high_profit']) > 0 ) { $is_use_goods_profit = 1; } $new_price_ = bcdiv($order_detail_item['total_price'], $order_detail_item['num'], 2); //选出金额最大的 如果开启独立的小推大 就使用独立小推大比例否则就使用系统默认的小推大比例 if ($new_price_ > $new_price) { $new_price = $new_price_; if ($is_use_goods_profit) { $shareHolderHighProfit = floatval($goods_info['share_holder_high_profit']); } else { $shareHolderHighProfit = Option::get('shareHolderHighProfit', $store_id, 'bonus_pool', 0)['value']; $shareHolderProfitSwitch = Option::get('shareHolderProfitSwitch', $store_id, 'bonus_pool', 0)['value']; if (!intval($shareHolderProfitSwitch)) { $shareHolderHighProfit = 0; } } } } } //判断小推大是否成立 if ($old_price < $new_price) { if ($shareHolderHighProfit <= 0) { return $base_price; } $base_price *= ($shareHolderHighProfit / 100); } return $base_price; } // 获取商品等级佣金 public static function getProfitByOrder($chainLevelValue, $level_id, $back, $is_direct = false, $shareHolderProfit = 0, $isFrost = false, $other_params = []) { if ($isFrost && $shareHolderProfit <= 0) { $back = 0; } if (!$chainLevelValue) { return $back; } if (!isset($chainLevelValue[$level_id])) { return $back; } if ($is_direct) { $basePrice = isset($chainLevelValue[$level_id]['direct']) ? $chainLevelValue[$level_id]['direct'] : 0; } else { $basePrice = isset($chainLevelValue[$level_id]['indirect']) ? $chainLevelValue[$level_id]['indirect'] : 0; } if ($basePrice > 0) { if ($other_params) { $basePrice = self::getBasePrice($basePrice, $other_params['parent_id'], $other_params['store_id'], $other_params['order_id']); } if ($isFrost) { return $shareHolderProfit > 0 ? \round(($shareHolderProfit / 100) * $basePrice, 2) : 0; } return $shareHolderProfit > 0 ? \round(((100 - $shareHolderProfit) / 100) * $basePrice, 2) : $basePrice; } return $back; } /** * 级差分红 * @param $order_id * @param $is_send 0 添加未发放 1 发放佣金 * @param $order_type */ public static function levelShare($order_id, $order_type = 0) { if ($order_type == 0) { $order = Order::findOne($order_id); } \Yii::warning('---------------- 级差分红计算开始 -------------------'); // 判断是否开启奖金池 $setting = [ 'cycle' => Option::get('cycle', $order->store_id, 'bonus_pool', 0)['value'], // 'is_open_share' => Option::get('is_open_share', $order->store_id, 'bonus_pool', 0)['value'], // 'is_open_range' => Option::get('is_open_range', $order->store_id, 'bonus_pool', 0)['value'], 'team_num' => Option::get('team_num', $order->store_id, 'bonus_pool', 0)['value'] ]; // if (!$setting['is_open_range']) { // \Yii::warning('---------------- 未开启级差分红 -------------------'); // return; // } self::oldLevelShare($order); $base_price = $order->profit; $user_parent = OldUserTreePath::find()->alias('ut') ->where(['ut.child_id' => $order->user_id]) // ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id') // ->andWhere('h.id is not null') ->andWhere('ut.child_id != ut.parent_id') // ->andWhere(['h.is_delete' => 0, 'h.status' => 1]) ->orderBy(['ut.parent_level' => SORT_DESC]) ->asArray() ->select(['ut.*']) ->all(); // 已分销比例 $share_num = 0; $level_id = 0; $shareHolderProfit = Option::get('shareHolderProfit', $order->store_id, 'bonus_pool', 0)['value']; //冻结层级(等级) $shareHolderLevel = Option::get('shareHolderLevel', $order->store_id, 'bonus_pool', 0)['value']; //冻结团队佣金(层数) $shareHolderNumber = Option::get('shareHolderNumber', $order->store_id, 'bonus_pool', [])['value']; if (is_string($shareHolderNumber)) { if (strpos($shareHolderNumber, ',') !== false) { $shareHolderNumber = explode(',', $shareHolderNumber); } else { $shareHolderNumber = []; } } if ($shareHolderLevel > 0 && is_array($shareHolderNumber) && count($shareHolderNumber) == 2) { $shareHolderNumber = range($shareHolderNumber[0], $shareHolderNumber[1]); } else { $shareHolderNumber = []; } $t = \Yii::$app->db->beginTransaction(); $level_price = $order->pay_price - $order->express_price; $user = User::findOne($order->user_id); if ($order->level_price_json) { $level_price_arr = json_decode($order->level_price_json, true); if (!empty($level_price_arr)) { if (isset($level_price_arr['member' . $user->level])) { $level_price = $level_price_arr['member' . $user->level]; } } } foreach($user_parent as $val) { $shareHolder = ShareHolder::findOne(['user_id' => $val['parent_id'], 'is_delete' => 0, 'status' => 1]); if (!$shareHolder) { continue; } $level = ShareHolderLevel::findOne(['id' => $shareHolder->level_id, 'is_delete' => 0]); if ($level) { $teamParent = User::findOne($val['parent_id']); if (!empty($level_price_arr) && intval($level->range_rate_type) === 1) { if ($level_price_arr['member' . $teamParent->level] > 0 && $level_price > $level_price_arr['member' . $teamParent->level] && $level->is_user_level_range_rate == 1) { $equal_price = sprintf("%.2f", ($level_price - $level_price_arr['member' . $teamParent->level])); $level_price = $level_price_arr['member' . $teamParent->level]; $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL, 'user_id' => $val['parent_id']]); if (!$detail) { $detail = new ShareDetail(); $detail->store_id = $order->store_id; $detail->type_id = $order_id; $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL; $detail->user_id = $val['parent_id']; $detail->desc = '订单号:' . $order->order_no . '极差分红_会员(原关系)'; } $detail->money = $equal_price; $detail->is_send = 0; if (!$detail->save()) { $t->rollBack(); \Yii::warning(['---------------- 极差分红_会员分红奖励计算入库失败 -------------------', $detail->errors]); return; } } continue; } if ($level_id == $level->id) { // 同级别奖励 //计算冻结后金额 $equal_price = round($base_price * $level->equal_rate / 100, 2); if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $equal_price = round(((100 - $shareHolderProfit) / 100) * $base_price * $level->equal_rate / 100, 2); } } else { $equal_price = round(((100 - $shareHolderProfit) / 100) * $base_price * $level->equal_rate / 100, 2); } } if ($equal_price > 0) { $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD, 'user_id' => $val['parent_id']]); if (!$detail) { $detail = new ShareDetail(); $detail->store_id = $order->store_id; $detail->type_id = $order_id; $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD; $detail->user_id = $val['parent_id']; $detail->desc = '订单号:' . $order->order_no . '同等级奖励分红(原关系)'; } $detail->money = $equal_price; $detail->is_send = 0; if (!$detail->save()) { $t->rollBack(); \Yii::warning(['---------------- 同等级分红奖励计算入库失败 -------------------', $detail->errors]); return; } } //计算冻结金额 if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { $open = false; if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $open = true; } } else { $open = true; } if ($open) { $frost_price = round(($shareHolderProfit / 100) * $base_price * $level->equal_rate / 100, 2); if ($frost_price > 0) { $model = new ShareHolderFrostLog(); $model->parent_user_id = $val['parent_id']; $model->child_user_id = $order->user_id; $model->amount = $frost_price; $model->status = 0; $model->order_id = $order_id; if (!$model->save()) { $t->rollBack(); \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]); return; }; } } } // 链动直推团队收益奖励(同等级) // $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value']; // $remark = '链动直推团队同等级收益奖励分红'; // $team_price = round($base_price * $level->equal_rate / 100, 2); // $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD; // $setShareDetail = self::setShareDetail(null, $order, $team_price, $teamParent, $min_team_price, $remark, $type); // if (!$setShareDetail) { // $t->rollBack(); // \Yii::error([__METHOD__, '递归分红失败,回滚']); // return; // } // if ($teamParent && $teamParent->old_parent_id > 0) { // $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]); // $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]); // // if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) { // $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]); // if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) { // //计算冻结后金额 // $team_price = round(round($base_price * $level->equal_rate / 100, 2) * $teamShareHolderLevel->team_reward_rate / 100, 2); // // if ($team_price > 0) { // $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, 'user_id' => $teamParent->old_parent_id]); // if (!$detail) { // $detail = new ShareDetail(); // $detail->store_id = $order->store_id; // $detail->type_id = $order_id; // $detail->type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD; // $detail->user_id = $teamParent->old_parent_id; // $detail->desc = '订单号:' . $order->order_no . '链动直推团队同等级收益奖励分红'; // } // $detail->money = $team_price; // $detail->is_send = 0; // if (!$detail->save()) { // $t->rollBack(); // return; // } // } // } // } // } // } $level_id = 0; } if ($level->range_rate >= $share_num) { $range_rate = $level->range_rate - $share_num; $share_num = $level->range_rate; $price = round($base_price * $range_rate / 100, 2); if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2); } } else { $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2); } } if ($price > 0) { $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_RANGE_PROFIT_OLD, 'user_id' => $val['parent_id']]); if (!$detail) { $old_range_name = Option::get('old_range_name', $order->store_id, 'bonus_pool', '')['value']; $detail = new ShareDetail(); $detail->store_id = $order->store_id; $detail->type_id = $order_id; $detail->type = ShareDetail::TYPE_RANGE_PROFIT_OLD; $detail->user_id = $val['parent_id']; $detail->desc = '订单号:'.$order->order_no. ($old_range_name ?: '级差分红(原关系)');//////////// } $level_id = $level->id; $detail->money = $price; $detail->is_send = 0; if (!$detail->save()) { $t->rollBack(); \Yii::warning(['---------------- 级差分红计算入库失败 -------------------', $detail->errors]); return; } } if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { $open = false; if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $open = true; } } else { $open = true; } if ($open) { $frost_price = round(round($base_price * $range_rate / 100, 2) * ($shareHolderProfit / 100), 2); if ($frost_price > 0) { $model = new ShareHolderFrostLog(); $model->parent_user_id = $val['parent_id']; $model->child_user_id = $order->user_id; $model->amount = $frost_price; $model->status = 0; $model->order_id = $order->id; if (!$model->save()) { $t->rollBack(); \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]); return; }; } } } // 链动直推团队收益奖励 // $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value']; // $direct_range_name = Option::get('old_add_holder_name', $order->store_id, 'bonus_pool', '')['value']; // $remark = $direct_range_name ? $direct_range_name : '链动直推团队级差收益奖励分红'; // $team_price = round($base_price * $range_rate / 100, 2); // $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD; // $setShareDetail = self::setShareDetail(null, $order, $team_price, $teamParent, $min_team_price, $remark, $type); // if (!$setShareDetail) { // $t->rollBack(); // \Yii::error([__METHOD__, '递归分红失败,回滚']); // return; // } // if ($teamParent && $teamParent->old_parent_id > 0) { // $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]); // $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]); // if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) { // $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]); // if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) { // $team_price = round(round($base_price * $range_rate / 100, 2) * $teamShareHolderLevel->team_reward_rate / 100, 2); // // if ($team_price > 0) { // $detail = ShareDetail::findOne(['type_id' => $order_id, 'type' => ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, 'user_id' => $teamParent->old_parent_id]); // if (!$detail) { // $detail = new ShareDetail(); // $detail->store_id = $order->store_id; // $detail->type_id = $order_id; // $detail->type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD; // $detail->user_id = $teamParent->old_parent_id; // $detail->desc = '订单号:' . $order->order_no . '链动直推团队级差收益奖励分红'; // } // $detail->money = $team_price; // $detail->is_send = 0; // if (!$detail->save()) { // $t->rollBack(); // return; // } // } // } // } // } // } } } } $t->commit(); \Yii::warning('---------------- 级差分红计算结束 -------------------'); } // 链动关系级差分红 public static function oldLevelShare($order) { $base_price = $order->chain_profit; $user_parent = UserTreePath::find()->alias('ut') ->where(['ut.child_id' => $order->user_id]) ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id') ->andWhere('h.id is not null') ->andWhere('ut.child_id != ut.parent_id') ->andWhere(['h.is_delete' => 0, 'h.status' => 1]) ->orderBy(['ut.parent_level' => SORT_DESC]) ->asArray() ->select(['ut.*', 'h.level_id']) ->all(); $share_num = 0; $level_id = 0; $shareHolderTeamRewardPlatformBears = Option::get('shareHolderTeamRewardPlatformBears', $order->store_id, 'bonus_pool', 1)['value']; $shareHolderProfit = Option::get('shareHolderProfit', $order->store_id, 'bonus_pool', 0)['value']; //冻结层级(等级) $shareHolderLevel = Option::get('shareHolderLevel', $order->store_id, 'bonus_pool', 0)['value']; //冻结团队佣金(层数)//得到层数如 3-8层冻结佣金 $shareHolderNumber = Option::get('shareHolderNumber', $order->store_id, 'bonus_pool', [])['value']; if (is_string($shareHolderNumber)) { if (strpos($shareHolderNumber, ',') !== false) { $shareHolderNumber = explode(',', $shareHolderNumber); } else { $shareHolderNumber = []; } } if (is_array($shareHolderNumber) && count($shareHolderNumber) == 2) { $shareHolderNumber = range($shareHolderNumber[0], $shareHolderNumber[1]); } else { $shareHolderNumber = []; } $chainLevelValue = \json_decode($order->chain_level_value, true); $shareHolderJiandian = Option::get('shareHolderJiandian', $order->store_id, 'bonus_pool', 0)['value']; $t = \Yii::$app->db->beginTransaction(); $ii = 0; // 层级 foreach($user_parent as $index => $val) { $ii++; if ($shareHolderJiandian > 0 && $ii > 1) { if ($ii != $shareHolderJiandian) { continue; } $shareHolder = ShareHolder::findOne(['user_id' => $val['parent_id'], 'is_delete' => 0, 'status' => 1]); if (!$shareHolder) { $t->commit(); return; } if ($shareHolder->is_out == 0) { $t->commit(); return; } } $base_price = self::getBasePrice($base_price, $val['parent_id'], $order->store_id, $order->id); $level = ShareHolderLevel::findOne(['id' => $val['level_id'], 'is_delete' => 0]); if ($level) { $teamParent = User::findOne($val['parent_id']); //检测是否复购 $order_d = OrderDetail::find()->alias('od')->where(['o.store_id' => $order->store_id, 'o.is_pay' => 1, 'o.user_id' => $order->user_id]) ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id') ->leftJoin(['g' => Goods::tableName()], 'g.id = od.goods_id') ->andWhere(['<', 'order_id', $order->id])->select('od.id') ->orderBy('od.id desc')->asArray()->one(); $old_range_rate = $level->old_range_rate; if ($order_d && $level->old_repeat_range_rate > 0) { $old_range_rate = $level->old_repeat_range_rate; } if ($old_range_rate >= $share_num) { $range_rate = $old_range_rate - $share_num; $share_num = $old_range_rate; $price = round($base_price * $range_rate / 100, 2); $params = [ 'parent_id' => $val['parent_id'], 'store_id' => $order->store_id, 'order_id' => $order->id ]; $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, 0, false, $params); if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2); $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, $shareHolderProfit, false, $params); } } else { $price = round(((100 - $shareHolderProfit) / 100) * $base_price * $range_rate / 100, 2); $price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $price, $index == 0, $shareHolderProfit, false, $params); } } $detail = null; if ($price > 0) { $fuGouSetting = FuGou::getSetting($order->store_id); $isFugou = $fuGouSetting['fugou_switch'] > 0 && FuGou::isFugou($val['parent_id'], $order->store_id, $fuGouSetting); $fugou = false; if ($isFugou) { $fugouOpen = true; $fugouRand = \range($fuGouSetting['fugou_freeze_rand'][0], $fuGouSetting['fugou_freeze_rand'][1]); if ($fuGouSetting['fugou_freeze_level'] > 0) { if ( (int)$fuGouSetting['fugou_freeze_level'] === (int)$level['id'] && false === \in_array($val['parent_level'], $fugouRand) ) { // 如果选了指定等级并且没在范围内, 就不冻结 $fugouOpen = false; } } if ($fugouOpen) { $fugou = true; $frostLog = new ShareHolderFugouFrostLog(); $frostLog->user_id = $val['parent_id']; $frostLog->amount = $price; $frostLog->status = 0; $frostLog->order_id = $order->id; $frostLog->save(); } } $detail = ShareDetail::findOne(['type_id' => $order->id, 'type' => ShareDetail::TYPE_RANGE_PROFIT, 'user_id' => $val['parent_id']]); if (!$detail) { $range_name = Option::get('range_name', $order->store_id, 'bonus_pool', '')['value']; $detail = new ShareDetail(); $detail->store_id = $order->store_id; $detail->type_id = $order->id; $detail->type = ShareDetail::TYPE_RANGE_PROFIT; $detail->user_id = $val['parent_id']; $detail->desc = '订单号:'.$order->order_no. ($range_name ?: '级差分红');///////////////// } $detail->is_fugou = $fugou ? 1 : 0; $detail->money = $price; $detail->is_send = 0; if (!$detail->save()) { $t->rollBack(); \Yii::warning(['---------------- (原关系)级差分红计算入库失败 -------------------', $detail->errors]); return; } } if ($shareHolderProfit > 0 && !static::checkFrost($val['parent_id'])) { $open = false; if ($shareHolderLevel > 0 && !empty($shareHolderNumber)) { if ((int)$shareHolderLevel === (int)$level['id'] && in_array($val['parent_level'], $shareHolderNumber)) { $open = true; } } else { $open = true; } if ($open) { $frost_price = round(round($base_price * $range_rate / 100, 2) * ($shareHolderProfit / 100), 2); $frost_price = self::getProfitByOrder($chainLevelValue, $val['level_id'], $frost_price, $index == 0, $shareHolderProfit, true, $params); if ($frost_price > 0) { $model = new ShareHolderFrostLog(); $model->parent_user_id = $val['parent_id']; $model->child_user_id = $order->user_id; $model->amount = $frost_price; $model->status = 0; $model->order_id = $order->id; if (!$model->save()) { $t->rollBack(); \Yii::warning(['---------------- 级差分红发放冻结佣金失败 -------------------', $model->errors]); return; }; } } } // 链动直推团队收益奖励 $min_team_price = Option::get('shareHolderPriceMin', $order->store_id, 'bonus_pool', 0)['value']; $shareHolderPriceLevel = Option::get('shareHolderPriceLevel', $order->store_id, 'bonus_pool', 0)['value']; $direct_range_name = Option::get('direct_range_name', $order->store_id, 'bonus_pool', '')['value']; $remark = $direct_range_name ? $direct_range_name : '链动直推团队级差收益奖励分红'; $team_price = $price; $type = ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT; // 判断当前直推层级是否在后台设置的直推团队收益发放层级之内 // if ($shareHolderPriceLevel == 0 || $ii <= (int)$shareHolderPriceLevel) { $setShareDetail = self::setShareDetail($shareHolderTeamRewardPlatformBears ? null : $detail, $order, $team_price, $teamParent, $min_team_price, $remark, $type); if (!$setShareDetail) { $t->rollBack(); \Yii::error([__METHOD__, '递归分红失败,回滚']); return; } // } } } } $t->commit(); } public static function setJiandian($teamParent, $level, $currentLevel = 1) { // 递归获取上级信息 if ($level == $currentLevel) { return $teamParent; } if ($teamParent->old_parent_id == 0) { return null; } $teamParent = User::findOne($teamParent->old_parent_id); return self::setJiandian($teamParent, $level, $currentLevel + 1); } // 链动直推团队收益奖励 public static function setShareDetail($shareDetail = null, $order, $team_price, $teamParent, $min_team_price = 10, $remark = '', $type = 0) { $shareHolderPriceLevel = Option::get('shareHolderPriceLevel', $order->store_id, 'bonus_pool', 0)['value']; $detailCount = ShareDetail::find()->where(['type_id' => $order->id, 'type' => $type])->count() ?: 0; if ($shareHolderPriceLevel > 0 && $detailCount >= $shareHolderPriceLevel) { return true; } if ($teamParent && $teamParent->old_parent_id > 0) { $teamShareHolderSelf = ShareHolder::findOne(['user_id' => $teamParent->id, 'is_delete' => 0, 'status' => 1]); $teamShareHolder = ShareHolder::findOne(['user_id' => $teamParent->old_parent_id, 'is_delete' => 0, 'status' => 1]); if ($teamShareHolder && $teamShareHolder->is_out == 1 && $teamShareHolderSelf->is_out == 1) { $teamShareHolderUser = User::findOne($teamShareHolder->user_id); if ($teamShareHolderUser->parent_id > 0) { return true; } // \Yii::error(['--setShareDetail--', $teamShareHolder]); // if ($teamShareHolder) { $teamShareHolderLevel = ShareHolderLevel::findOne(['id' => $teamShareHolder->level_id, 'is_delete' => 0]); // \Yii::error(['--setShareDetail--', $teamShareHolderLevel]); if ($teamShareHolderLevel && $teamShareHolderLevel->team_reward_rate > 0) { $team_price = round($team_price * $teamShareHolderLevel->team_reward_rate / 100, 2); //小于最小分红金额,退出 if ($team_price <= $min_team_price) { return true; } if ($team_price > 0) { $detail = ShareDetail::findOne(['type_id' => $order->id, 'type' => $type, 'user_id' => $teamParent->old_parent_id]); if (!$detail) { $detail = new ShareDetail(); $detail->store_id = $order->store_id; $detail->type_id = $order->id; $detail->type = $type; $detail->user_id = $teamParent->old_parent_id; $detail->desc = '订单号:' . $order->order_no . $remark; } $detail->money = $team_price; $detail->is_send = 0; if (!$detail->save()) { \Yii::error([__METHOD__, array_shift($detail->getFirstErrors())]); return false; } if($shareDetail){ $shareDetail->money -= $detail->money; $shareDetail->desc .= '-[感恩上级:¥' . $detail->money . '('. $detail->id . ')]'; if (!$shareDetail->save()) { \Yii::error([__METHOD__, array_shift($shareDetail->getFirstErrors())]); return false; } $shareDetail = $detail; } } } $teamParent = User::findOne($teamParent['old_parent_id']); return self::setShareDetail($shareDetail, $order, $team_price, $teamParent, $min_team_price, $remark, $type); } } return true; } public static function sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL) { $money = $share_detail->money; $point = round($money * $shareHolderRewardPointRate / 100, 2); $money -= $point; $integral = $point * $STORE_INTEGRAL; $user->updateCounters(['total_price' => $money, 'price' => $money]); $share_detail->desc .= '{[积分占比:'. $shareHolderRewardPointRate .'%][发放佣金:¥'. $money .'][发放积分:'. $integral .'('. $point .'*'. $STORE_INTEGRAL .')]}'; AccountLog::saveLog($user->id, $integral, AccountLog::TYPE_INTEGRAL, AccountLog::LOG_TYPE_INCOME, 0, 0, $share_detail->desc); } /** * 发放级差分红 */ public static function sendRange($order_id) { \Yii::warning(['------------ 发放级差分红开始, 订单id:' . $order_id .'-------------']); $list = ShareDetail::find()->where(['type_id' => $order_id, 'is_fugou' => 0, 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_send' => 0, 'is_delete' => 0])->all(); if ($list) { $t = \Yii::$app->db->beginTransaction(); $store_id = $list[0]['store_id']; $STORE_INTEGRAL = Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'gift', Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'store', 100)['value'])['value']; $shareHolderRewardPointRate = Option::get('shareHolderRewardPointRate', $store_id, 'bonus_pool', 0)['value']; foreach ($list as $share_detail) { /** * @var $share_detail ShareDetail */ $user = User::findOne($share_detail->user_id); if($shareHolderRewardPointRate && in_array($share_detail->type, [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT])){ self::sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL); }else{ $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]); } $share_detail->is_send = 1; $share_detail->send_time = time(); if (!$share_detail->save()) { $t->rollBack(); \Yii::warning(['------------ 发放级差分红状态更改失败:-------------', $share_detail->errors]); return; } } $t->commit(); \Yii::warning(['------------ 发放级差分红成功, 订单id:' . $order_id .'-------------']); } } /** * 发放2+1股东团队分红 */ public static function sendTwoPlusOneTeamLevelShare($order_id) { \Yii::warning(['------------ 发放2+1团队分红开始, 订单id:' . $order_id .'-------------']); $list = ShareDetail::find()->where(['type_id' => $order_id, 'type' => [ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_send' => 0, 'is_delete' => 0])->all(); if ($list) { $t = \Yii::$app->db->beginTransaction(); $store_id = $list[0]['store_id']; $STORE_INTEGRAL = Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'gift', Option::get(OptionSetting::STORE_INTEGRAL, $store_id, 'store', 100)['value'])['value']; $shareHolderRewardPointRate = Option::get('shareHolderRewardPointRate', $store_id, 'bonus_pool', 0)['value']; foreach ($list as $share_detail) { /** * @var $share_detail ShareDetail */ $user = User::findOne($share_detail->user_id); if($shareHolderRewardPointRate && in_array($share_detail->type, [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT])){ self::sendRangePoint($user, $share_detail, $shareHolderRewardPointRate, $STORE_INTEGRAL); }else{ $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]); } $share_detail->is_send = 1; $share_detail->send_time = time(); if (!$share_detail->save()) { $t->rollBack(); \Yii::warning(['------------ 发放2+1团队分红状态更改失败:-------------', $share_detail->errors]); return; } } $t->commit(); \Yii::warning(['------------ 发放2+1团队分红成功, 订单id:' . $order_id .'-------------']); } } /** * 发放区域分红 */ public static function sendArea($order_id) { \Yii::warning(['------------ 发放代理分红开始, 订单id:' . $order_id .'-------------']); $list = ShareDetail::find()->where(['type_id' => $order_id, 'type' => ShareDetail::TYPE_AREA_PROFIT, 'is_send' => 0, 'is_delete' => 0])->all(); if ($list) { $t = \Yii::$app->db->beginTransaction(); foreach ($list as $share_detail) { /** * @var $share_detail ShareDetail */ $user = User::findOne($share_detail->user_id); $user->updateCounters(['total_price' => $share_detail->money, 'price' => $share_detail->money]); $share_detail->is_send = 1; $share_detail->send_time = time(); if (!$share_detail->save()) { $t->rollBack(); \Yii::warning(['------------ 发放代理分红状态更改失败:-------------', $share_detail->errors]); return; } } $t->commit(); \Yii::warning(['------------ 发放代理分红成功, 订单id:' . $order_id .'-------------']); } } public static function poolUserMoney($pool_level, $user_ids) { $store_id = $pool_level->store_id; $pool_level_id = $pool_level->id; $pool_level_money = $pool_level->money; $dividends_method = Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']; //分红方式 0平均分红 1团队业绩加权分红 if($dividends_method){ $pay_price_all = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id AND b.order_type=0') ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'b.order_id = sco.id AND b.order_type=6') ->andWhere(['pool_level_id' => $pool_level_id]) ->andWhere(['or', ['in', 'o.user_id', $user_ids], ['in', 'sco.user_id', $user_ids]]) ->select('SUM(o.pay_price) o_pay_price, SUM(sco.pay_price) sco_pay_price') ->asArray()->one(); $money_all_order = 0; if($pay_price_all){ $money_all_order = array_sum($pay_price_all); } $res = []; foreach ($user_ids as $uid) { if($money_all_order == 0){ $res[$uid] = 0; continue; } $pay_price_all_user = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id AND b.order_type=0') ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'b.order_id = sco.id AND b.order_type=6') ->andWhere(['pool_level_id' => $pool_level_id]) ->andWhere(['or', ['o.user_id' => $uid], ['sco.user_id' => $uid]]) ->select('SUM(o.pay_price) o_pay_price, SUM(sco.pay_price) sco_pay_price') ->asArray()->one(); $money_all_order_user = 0; if($pay_price_all_user){ $money_all_order_user = array_sum($pay_price_all_user); } $res[$uid] = round($pool_level_money * ($money_all_order_user / $money_all_order), 2); } return $res; } return null; } /** * 股东分红,发放奖金池 * @param $bool_id 奖金池ID */ public static function poolShare($id) { $t = \Yii::$app->db->beginTransaction(); try { $pool_level = BonusPoolLevel::findOne($id); $price = $pool_level->money; $shareHolderLevel = $pool_level->level_id; $high_level_join_average = Option::get('high_level_join_average', $pool_level->store_id, 'bonus_pool', 0)['value']; if (intval($high_level_join_average)) { $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $pool_level->level_id]); $shareHolderLevel = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0]) ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column(); } // 获取所有对应等级的股东 $holder = ShareHolder::find()->where([ 'store_id' => get_store_id(), 'level_id' => $shareHolderLevel, 'is_delete' => 0, 'status' => 1 ])->asArray()->all(); $holder_count = count($holder); if ($holder_count < 1) { $t->rollBack(); return [ 'code' => 1, 'msg' => '没有可发放的股东' ]; } $user_ids = []; foreach ($holder as $item) { $bonus_pool = \app\models\BonusPool::findOne($pool_level->pool_id); $pay_price_arr = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id') ->where(['o.user_id' => $item['user_id']]) ->andWhere(['and', ['>=', 'b.created_at', $bonus_pool->start_time], ['<', 'b.created_at', $bonus_pool->end_time]]) ->select('o.pay_price')->groupBy('o.id')->column(); $pay_price = array_sum($pay_price_arr); // //判断是否达标 $dividends_condition = Option::get('dividends_condition', get_store_id(), 'bonus_pool', 0)['value']; if ($dividends_condition <= $pay_price) { $user_ids = array_merge($user_ids, [$item['user_id']]); } } $holder_count = count($user_ids); if ($holder_count < 1) { $t->rollBack(); return [ 'code' => 1, 'msg' => '没有可发放的股东' ]; } $share_price = round($price / $holder_count, 2); // $user_ids = array_column($holder, 'user_id'); $pool_level->user_id = Json::encode($user_ids); if (!$pool_level->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '发放失败1' ]; } $dividends_method = intval(Option::get('dividends_method', $pool_level->store_id, 'bonus_pool', 0)['value']); //分红方式 0平均分红 1团队业绩加权分红 $poolUserMoney = self::poolUserMoney($pool_level, $user_ids); if ($dividends_method === BonusPoolLevel::SHARE_TYPE_WEIGHT) { if (empty($poolUserMoney)) { $user_ids = []; $pool_level->user_id = Json::encode([]); } else { $user_ids_ = []; foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) { if ($poolUserItem > 0) { $user_ids_[] = $poolUserIndex; } } $user_ids = $user_ids_; $pool_level->user_id = Json::encode($user_ids); } } foreach ($user_ids as $val_2) { $user = User::findOne($val_2); if ($user) { if($poolUserMoney){ $share_price = $poolUserMoney[$val_2] ?: 0; } $user->updateCounters(['total_price' => $share_price, 'price' => $share_price]); $holder_name = Option::get('holder_name', get_store_id(), 'bonus_pool', '')['value']; $detail = new ShareDetail(); $detail->store_id = get_store_id(); $detail->type_id = $pool_level->id; $detail->type = ShareDetail::TYPE_HOLDER_PROFIT; $detail->user_id = $val_2; $detail->desc = date('Y-m-d H:i:s', time()) . ($holder_name ?: '股东分红'); $detail->is_send = 1; $detail->send_time = time(); $detail->money = $share_price; if (!$detail->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '发放失败2' ]; } } } $pool_level->share_type = $dividends_method; $pool_level->is_send = 1; $pool_level->send_time = time(); if (!$pool_level->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '发放失败4' ]; } } catch (\Exception $e) { $t->commit(); return [ 'code' => 1, 'line' => $e->getLine(), 'msg' => $e->getMessage(), 'file' => $e->getFile(), ]; } $t->commit(); return [ 'code' => 0, 'msg' => '发放成功' ]; } /** * 增加奖金池 * @param $order_id * @param $order_type */ public static function poolPush($order_id, $order_type = 0) { \Yii::warning(['---------------- 奖金池增加开始 -------------------']); if(isset($order_id->id)){ $order = $order_id; }else{ if ($order_type == 6) { $order = \app\plugins\scanCodePay\models\Order::findOne($order_id); }else{ $order = Order::findOne($order_id); } } $order_id = $order->id; // 判断是否开启奖金池 $setting = [ 'cycle' => Option::get('cycle', $order->store_id, 'bonus_pool', 0)['value'], // 'is_open_share' => Option::get('is_open_share', $order->store_id, 'bonus_pool', 0)['value'], // 'is_open_range' => Option::get('is_open_range', $order->store_id, 'bonus_pool', 0)['value'], 'team_num' => Option::get('team_num', $order->store_id, 'bonus_pool', 0)['value'] ]; if (!$setting['cycle'] > 0) {// || !$setting['is_open_share'] \Yii::warning('---------------- 未开启股东分红 -------------------'); return; } $t = \Yii::$app->db->beginTransaction(); $tool = ModelsBonusPool::find()->where([ 'and', [ '<', 'start_time', time() ], [ '>=', 'end_time', time() ] ])->andWhere(['store_id' => $order->store_id])->orderBy(['id' => SORT_DESC])->one(); // 如果没有奖金池,重新创建奖金池 if (!$tool) { // 获取最后一个奖金池的结束时间 // $last_tool = ModelsBonusPool::find()->where([ // 'store_id' => $order->store_id // ])->orderBy(['id' => SORT_DESC]) // ->one(); if (false && isset($last_tool) && $last_tool) { $start_time = $last_tool->end_time; } else { $start_time = strtotime(date('Y-m-d', time())); } $tool = new ModelsBonusPool(); $tool->store_id = $order->store_id; $tool->start_time = $start_time; $end_time = $start_time + ($setting['cycle'] * 24 * 3600); $tool->end_time = $end_time; if (!$tool->save()) { $t->rollBack(); \Yii::warning('---------------- 创建奖金池失败 -------------------'); return; } } // 根据会员等级,添加奖金池佣金 $bonus_pool_level = ShareHolderLevel::find() ->where([ 'store_id' => $order->store_id, 'is_delete' => 0 ])->all(); if($order_type == 6){ $rate = Option::get('face_rate', $order->store_id, 'store')['value']; $rate_type = Option::get('face_rate_type', $order->store_id, 'store')['value']; $base_price = $rate_type == 0 ? (($order->total_price + $order->take_price) * $rate / 100) : $rate; }else{ $base_price = $order->profit; } foreach($bonus_pool_level as $level) { $level_model = BonusPoolLevel::findOne(['pool_id' => $tool->id, 'level_id' => $level->id]); $price = round($base_price * $level->holder_rate / 100, 2); if ($price <= 0) { continue; } if (!$level_model) { $level_model = new BonusPoolLevel(); $level_model->store_id = $order->store_id; $level_model->pool_id = $tool->id; $level_model->level_id = $level->id; $level_model->money = $price; $level_model->user_id = '[]'; $level_model->is_send = 0; $level_model->send_time = 0; } else { $BonusPoolDetail = BonusPoolDetail::findOne(['order_id' => $order_id, 'pool_level_id' => $level_model->id, 'order_type' => $order_type]); if ($BonusPoolDetail) { continue; } $level_model->money += $price; } if (!$level_model->save()) { $t->rollBack(); \Yii::warning(['---------------- 创建等级奖金池失败 -------------------', $level_model->errors]); return; } else { $level_log = new BonusPoolDetail(); $level_log->store_id = $order->store_id; $level_log->order_id = $order_id; $level_log->order_type = (int)$order_type; $level_log->money = $price; $level_log->pool_level_id = $level_model->id; $level_log->desc = '订单号:'.$order->order_no.'追加'; if (!$level_log->save()) { $t->rollBack(); \Yii::warning(['---------------- 奖金池订单入库失败 -------------------', $level_log->errors]); return; } } } $t->commit(); \Yii::warning(['---------------- 奖金池增加成功 -------------------', $base_price]); } public static function ShareHolderLevelJob($store_id = 1, $type = 0, $user_id = 0){ if(!cache_lock(['ShareHolderLevelJob', $store_id, $type, $user_id], 30)){ \queue_push(new \app\jobs\ShareHolderLevelJob(['store_id' => $store_id, 'type' => $type, 'user_id' => $user_id]), 30); } } /** * @return array|void */ public static function checkLevel($store_id = 1, $type = 0, $user_id = 0) { \Yii::warning('----------------- HANDLE SHARE HOLDER LEVEL START -----------------' . time()); $query = ShareHolder::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id]); if($user_id){ // $query->andWhere(['!=', 'user_id', $user_id]); $queryUserTree = OldUserTreePath::find()->where(['child_id' => $user_id])->select('parent_id'); $query->andWhere([ 'user_id' => $queryUserTree, ]); } $share_holder = $query->select('store_id, user_id, level_id')->asArray()->all(); if (empty($share_holder)) { \Yii::warning('可处理数据为空'); return; } foreach ($share_holder as $share) { $current_level_id = $share['level_id']; $level = ShareHolderLevel::findOne($current_level_id)->level; $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $share['store_id'], 'is_delete' => 0, 'status' => 1])->andWhere(['>', 'level', $level])->orderBy('level desc')->all(); // \Yii::warning(['用户' . $share['user_id'] . '可升等级', ShareHolderLevel::find()->where(['store_id' => $share['store_id'], 'is_delete' => 0, 'status' => 1])->andWhere(['>', 'level', $level])->orderBy('level desc')->asArray()->all()]); foreach ($share_holder_level as $value) { $is_level = true; /** * @var $value ShareHolderLevel */ //TODO 股东人数以及金额 $condition = Json::decode($value->condition); // 团队人数 $man = $condition['man']; if ((bool)$man['is_open']) { $share_user_parent_tree = OldUserTreePath::findOne(['parent_id' => $share['user_id']]);//获取当前购买用户的当前等级 foreach ($man['value'] as $m) { // $man_data = User::find()->childs($share['user_id'], false, $m['level'])->where(['store_id' => $value->store_id])->asArray()->all(); $man_data = OldUserTreePath::find()->where([ 'parent_id' => $share['user_id'] ])->andWhere([ '!=', 'child_id', $share['user_id'] ])->andWhere([ 'AND', [ '>', 'child_level', $share_user_parent_tree->parent_level ], [ '<=', 'child_level', ($share_user_parent_tree->parent_level + (int)$m['level']) ] ])->asArray()->all(); if (count($man_data) < $m['count']) { $msg = '团队人数:' . $m['level'] . '级团队人数未达到' . $m['count']; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; continue; } else { if (isset($m['money'])) { //消费达到$m['money']以上允许升级 $child_id = array_column($man_data, 'child_id'); $pay_price = Order::find()->where( [ 'store_id' => $value->store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $child_id ]) ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price'); if ($m['money'] > $pay_price) { $msg = '团队人数:' . $m['level'] . '级团队人数下单金额未达到' . $m['money']; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; continue; } } } } if (!$is_level) { continue; } } // 团队消费金额 $team_order = $condition['order']; if ((bool)$team_order['is_open']) { $share_user_parent_tree = OldUserTreePath::findOne(['parent_id' => $share['user_id']]);//获取当前购买用户的当前等级 foreach ($team_order['value'] as $o) { $man_data = OldUserTreePath::find()->where([ 'parent_id' => $share['user_id'] ])->andWhere([ '!=', 'child_id', $share['user_id'] ])->andWhere([ 'AND', [ '>=', 'child_level', $share_user_parent_tree->parent_level ], [ '<=', 'child_level', ($share_user_parent_tree->parent_level + ($o['level'] ?: 0)) ] ])->asArray()->all(); // if (count($man_data) < 1) { // $msg = '团队金额:' . $o['level'] . '级团队人数为空'; // \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); // $is_level = false; // break; // } // $man_user_id = array_column($man_data, 'id'); $man_user_id = []; $man_user_id[] = $share['user_id']; foreach($man_data as $val) { $man_user_id[] = $val['child_id']; } $order_money = Order::find()->where( [ 'store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM ]) ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]) ->andWhere(['in', 'user_id', $man_user_id])->sum('pay_price'); if ($order_money < $o['count']) { $msg = '团队金额:' . $o['level'] . '级团队消费金额未达到' . $o['count'].'|'.$order_money; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; continue; } } if (!$is_level) { continue; } } // 自身消费金额 $self = $condition['self']; if ((bool)$self['is_open']) { // 兼容老版本 if (!isset($self['value']['order_number'])) { $self_price = $self['value']; $self['value'] = []; $self['value']['order_number'] = 0; $self['value']['price'] = $self_price; } if ($self['value']['order_number'] == 1) { $order = Order::find()->where( [ 'store_id' => $value->store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $share['user_id'] ]) ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]) ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one(); if (!$order) { $msg = '您在本商城单笔消费未达到' . $self['value']['price'] . '元'; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } } else{ $order_money = Order::find()->where( [ 'store_id' => $value->store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $share['user_id'] ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price'); if ($order_money < $self['value']['price']) { $msg = '您在本商城消费未达到' . $self['value']['price'] . '元'; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } } } // 自身充值金额 $recharge = $condition['recharge']; if ((bool)$recharge['is_open']) { $recharge_money = ReOrder::find()->where(['store_id' => $value->store_id, 'user_id' => $share['user_id'], 'is_pay' => 1])->sum('pay_price'); if ($recharge_money < $recharge['value']) { $msg = '您在本商城充值未达到' . $recharge['value'] . '元'; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } } // 购买指定商品 $goods = $condition['goods']; $shareholder = $condition['shareholder']; if ((bool)$shareholder['is_open'] && (bool)$shareholder['independent_team'] === false) { $goods['is_open'] = false; //'u.parent_id' => $parent_user->id, //// 'h.level_id' => $user_holder_level_id, //// 'h.status' => 1, //// 'h.is_delete' => 0 $user_ids = User::find()->alias('u') ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id') ->where([ 'u.old_parent_id' => $share['user_id'], 'h.level_id' => $shareholder['to_level_id'], 'h.status' => 1, 'h.is_delete' => 0 ]) ->limit($shareholder['num']) ->select('u.id') ->column(); if (count($user_ids) < $shareholder['num']) { $is_level = false; } } if ((bool)$goods['is_open']) { // 查找该用户是否买过此商品 $goods_model = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id') ->where( [ 'o.store_id' => $value->store_id, 'o.user_id' => $share['user_id'], 'o.is_delete' => 0, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM ]) ->andWhere(['or', ['o.is_pay' => 1], ['o.pay_type' => 2]]) ->andWhere(['od.goods_id' => $goods['value']['id']])->one(); if (!$goods_model) { $msg = '未购买过指定商品, 商品id' . (is_array($goods['value']['id']) ? implode(',', $goods['value']['id']) : $goods['value']['id']); \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } // 是否过了售后期 $pay_time = $goods_model->pay_time; if (time() < ($pay_time + $goods['day'] * 24 * 3600)) { $msg = '购买过的指定商品未过售后期, 商品id' . (is_array($goods['value']['id']) ? implode(',', $goods['value']['id']) : $goods['value']['id']); \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } } // 累计佣金金额 $amount_total = $condition['amount_total']; if ((bool)$amount_total['is_open']) { $user = User::findOne($share['user_id']); if ($user->total_price < $amount_total['value']) { $msg = '您在本商城的佣金未达到' . $amount_total['value'] . '元'; \Yii::warning(['---------- USER ID: ' . $share['user_id'] . '判断用户是否可以晋升 '. $value->name, $msg]); $is_level = false; } if (!$is_level) { continue; } } if (($is_level) && ( (bool)$goods['is_open'] || (bool)$team_order['is_open'] || (bool)$man['is_open'] || (bool)$self['is_open'] || (bool)$recharge['is_open'] || (bool)$amount_total['is_open'] || ( (bool)$shareholder['is_open']) && (bool)$shareholder['independent_team'] === false ) ) { $t = \Yii::$app->db->beginTransaction(); $holderSave = 0; try { $holder = ShareHolder::findOne(['status' => 1, 'is_delete' => 0, 'store_id' => $value->store_id, 'user_id' => $share['user_id']]); if ($holder) { //添加股东升级记录 //查询等级(旧) $before_level = ShareHolderLevel::findOne($holder->level_id); //查询等级(新) $after_level = ShareHolderLevel::findOne($value->id); //添加股东升级记录 $level_log = new ShareHolderLevelLog(); $level_log->before_level = $before_level->level; $level_log->after_level = $after_level->level; $level_log->user_id = $share['user_id']; $level_log->store_id = $value->store_id; $level_log->desc = $type ? '后台修改数据使其达到升级条件' : "用户达到升级条件"; if (!$level_log->save()) { throw new Exception('等级更新失败'); } $holder->level_id = $value->id; if (!$holder->save()) { $t->rollBack(); \Yii::warning(['------------ 等级更新失败 ------------', $holder->errors]); } else { $user_info = User::findOne($share['user_id']); if (!empty($value->member_level) && $value->member_level > $user_info->level){ $user_info->level = $value->member_level; if (!$user_info->save()) { $t->rollBack(); \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级更新失败 ------------', $user_info->errors]); }else{ \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级 ------------', [ '之前等级' . $user_info->level, '之后等级' . $value->member_level, ]]); $holderSave = 1; } } \Yii::warning(['------------ 等级更新成功 ------------', [ '之前等级' . $current_level_id, '之后等级' . $value->id, ]]); } } $t->commit(); } catch (\Throwable $e) { $t->rollBack(); \Yii::warning(['------------ 等级更新失败 ------------', $e->getMessage()]); } if($user_id && $holder && $holderSave){ return self::checkLevel($store_id, $type, $holder['user_id']); } } BonusPool::checkChildHolderUpdateLevel($share['user_id'], $value->id, $type); } } \Yii::warning('----------------- HANDLE SHARE HOLDER LEVEL END -----------------' . time()); } // 获取指定等级的上级 public static function getParentByLevel($user_id, ShareHolderLevel $level) { if ($user_id == 0) { return 0; } $user = User::findOne($user_id); $parentHolder = ShareHolder::find()->alias('sh') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'sh.level_id = shl.id') ->where(['sh.user_id' => $user->parent_id]) ->andWhere(['>=', 'shl.level', $level->level]) ->select('sh.user_id') ->orderBy('shl.level ASC') ->one(); if ($parentHolder) { return $parentHolder->user_id; } return static::getParentByLevel($user->parent_id, $level); } /** * 检查下级股东升级 * @param int $user_id * @return void * @author Syan mzsongyan@gmail.com * @date 2022-07-28 */ public static function checkChildHolderUpdateLevel($user_id, $user_holder_level_id = 0, $type = 0) { debug_log('检查下级股东升级=' . $user_id, 'team.log'); $user = User::findOne($user_id); if (!$user) { return; } $holder_level_list = ShareHolderLevel::find()->where([ 'is_delete' => 0, 'status' => 1, 'store_id' => $user->store_id, ])->all(); // 找出符合条件的等级 $current_level = null; // foreach ($holder_level_list as $holder_level) { // $condition = json_decode($holder_level->condition); // if ((bool)$condition->shareholder->is_open === false || (bool)$condition->shareholder->num == 0) { // continue; // } // if ($condition->shareholder->to_level_id == $user_holder_level_id) { // $current_level = $holder_level; // } // } foreach ($holder_level_list as $holder_level) { $condition = json_decode($holder_level->condition); if ((bool)$condition->shareholder->is_open && (int)$condition->shareholder->num > 0 && (bool)$condition->shareholder->independent_team ) { $current_level = $holder_level; break; } } if ($current_level == null) { return; } // 升级代理后直接改当前用户parent_id为链动关系往上的老板等级的用户 // $parent_id = static::getParentByLevel($user_id, $current_level); // $user->parent_id = $parent_id; // $user->save(); $parent_user = User::findOne($user->parent_id); if (!$parent_user) { return; } $parent_holder = ShareHolder::findOne(['status' => 1, 'is_delete' => 0, 'is_out' => 0, 'store_id' => $user->store_id, 'user_id' => $parent_user->id]); if (!$parent_holder) { return; } $parent_holder_level = ShareHolderLevel::findOne($parent_holder->level_id); if (!$parent_holder_level) { return; } if ($parent_holder_level->level >= $current_level->level) { return; } $condition = json_decode($current_level->condition); // 查找父级的直属下级股东 $user_ids = User::find()->alias('u') ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id') ->where([ 'u.old_parent_id' => $parent_user->id, // 'h.level_id' => $user_holder_level_id, 'h.status' => 1, 'h.is_delete' => 0, ]) ->andWhere(['>=', 'h.level_id', $condition->shareholder->to_level_id]) ->limit($condition->shareholder->num)//感觉不用加这个 下面有数组截取 但是不加怕查询太慢 ->orderBy('h.created_at ASC') ->select('u.id') ->column(); //去重父级的直属下级股东以及滑落记录 两个数组 满足条件人数以及等级条件上级就出局 //查询滑落记录 $slippedUserLog = ShareHolderSlippedLog::getSlippedUserLog($parent_user->id); //查询滑落记录的达到条件的股东 $slippedUserLog = User::find()->alias('u') ->leftJoin(['h' => ShareHolder::tableName()], 'h.user_id = u.id') ->where([ 'u.id' => $slippedUserLog, // 'h.level_id' => $user_holder_level_id, 'h.status' => 1, 'h.is_delete' => 0, ]) ->andWhere(['>=', 'h.level_id', $condition->shareholder->to_level_id]) ->orderBy('h.created_at ASC') ->limit($condition->shareholder->num)//感觉不用加这个 下面有数组截取 但是不加怕查询太慢 ->select('u.id') ->column(); debug_log($slippedUserLog, 'slipped.log'); debug_log($user_ids, 'slipped.log'); //将滑落记录跟下级记录合并 再去重 if (!empty($slippedUserLog)) { $user_ids = array_values(array_unique(array_merge($user_ids, $slippedUserLog))); } $old_user_ids = $user_ids; //截取数组 $user_ids = array_slice($user_ids, 0, $condition->shareholder->num); //得截取一下 怕合并后人数太多 得改动下级的上级ID $other_user_ids = array_slice($old_user_ids, $condition->shareholder->num); //判断是否满足条件 if (count($user_ids) >= $condition->shareholder->num) { $t = \Yii::$app->db->beginTransaction(); try { //添加股东升级记录 //查询股东等级(旧) $before_level = $parent_holder_level; //查询股东等级(新) $after_level = $current_level; //添加股东升级记录 $level_log = new ShareHolderLevelLog(); $level_log->before_level = $before_level->level; $level_log->after_level = $after_level->level; $level_log->user_id = $parent_holder->user_id; $level_log->store_id = $user->store_id; $level_log->desc = $type ? "后台修改使下级助力出局升级" : "下级助力出局升级"; if (!$level_log->save()) { throw new Exception('股东等级更新失败'); } $parent_holder->level_id = $current_level->id; //将出局的标记为出局状态 $parent_holder->is_out = 1; if (!$parent_holder->save()) { throw new Exception('等级更新失败'); } // 更改出局状态表 $out_log = ShareHolderOutLog::findOne(['child_user_id' => $parent_user->id]); if ($out_log) { ShareHolderOutLog::updateAll(['status' => 1], ['child_user_id' => $parent_user->id]); // $out_log->status = 1; // $out_log->save(); } static::sendFrostMoney($parent_user->id, $parent_user->store_id); // 升级对应等级的会员等级 if ($current_level->member_level > $parent_user->level) { $parent_user->level = $current_level->member_level; if (!$parent_user->save()) { throw new Exception('股东升级到对应的等级后,升级绑定的会员等级失败'); } } // if ($parent_user->parent_id > 0) { // 出局独立团队 // if ((bool)$condition->shareholder->independent_team) { $parent_user_old_parent_id = $parent_user->parent_id; $parent_user->parent_id = 0; if (!$parent_user->save()) { throw new Exception('出局独立团队失败'); } self::addShareHolderParentOutLog($parent_user, $parent_user_old_parent_id, '链动出局'); foreach ($user_ids as $user_item_id) { $user_item = User::findOne($user_item_id); if ($user_item) { $shareHolder = ShareHolder::findOne(['user_id' => $user_item_id, 'is_delete' => 0]); if ($shareHolder && intval($shareHolder->is_out)) { continue; } $beforeParentId = $user_item->parent_id; $user_item->parent_id = $parent_user_old_parent_id; if (!$user_item->save()) { throw new Exception('助力出局的股东改变关系失败'); } $desc = $type ? "后台修改数据使股东上级出局" : "股东上级出局"; self::addShareHolderParentOutLog($user_item, $beforeParentId, $desc); //记录出局关系 $out = new ShareHolderOutLog(); $out->parent_user_id = $parent_user->id; $out->child_user_id = $user_item->id; $out->save(); } } foreach ($other_user_ids as $other_user_id) { $other_user_item = User::findOne($other_user_id); if ($other_user_item) { //判断滑落 $share_detail_arr = [ ShareDetail::TYPE_HOLDER_PROFIT, ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL ]; $share_detail = ShareDetail::find()->alias('sd') ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id') ->where(['o.user_id' => $other_user_id, 'sd.type' => $share_detail_arr, 'sd.user_id' => $parent_user->id]) ->asArray()->one(); if ($share_detail) { ShareDetail::handleChildData($share_detail['id']); } } } // } // } $t->commit(); } catch (\Throwable $e) { debug_log($e->getMessage(), 'team.log'); $t->rollBack(); } } } //上级关系变化 public static function addShareHolderParentOutLog($user, $beforeParentId, $desc = '', $type = 0, $change_type = ShareHolderParentOutLog::CHANGE_TYPE_NORMAL) { if($type == 0){ $parent_id = $user->parent_id; } if($type == 1){ $parent_id = $user->old_parent_id; } if($beforeParentId == $parent_id){ \Yii::error('$beforeParentId == $parent_id'); return [ 'code' => 0, 'msg' => 'ok,$beforeParentId == $parent_id', ]; } // if($type == 0){ // $shareHolder = ShareHolder::findOne(['user_id' => $user->id, 'is_delete' => 0, 'status' => 1]); // if(!$shareHolder){ // \Yii::error('!$shareHolder'); // return [ // 'code' => 0, // 'msg' => 'ok,!$shareHolder', // ]; // } // } $parent_out_log = new ShareHolderParentOutLog(); $parent_out_log->user_id = $user->id; $parent_out_log->old_parent_user_id = $beforeParentId; $parent_out_log->parent_user_id = $parent_id; $parent_out_log->store_id = $user->store_id; $parent_out_log->desc = $desc; $parent_out_log->type = $type; $parent_out_log->change_type = $change_type; if (!$parent_out_log->save()) { \Yii::error($parent_out_log->getFirstErrors()); return [ 'code' => 1, 'msg' => 'ShareHolderParentOutLog保存失败' . array_shift($parent_out_log->getFirstErrors()), ]; } return [ 'code' => 0, 'msg' => 'ok', ]; } // 检查普通用户充值金额是否达到成为股东的条件 public static function generalUserRecharge($user_id, $store_id) { //查找股东是否存在或被拒绝或审核中 $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id, 'status' => 1]); if ($shareHolder) { return; } $user = User::findOne($user_id); if (!$user) { return; } // 获取所有等级消费金额条件 $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all(); $upgrade_level = 0; $member_level = 0; foreach ($share_holder_level as $holder_level) { $condition = Json::decode($holder_level->condition); $recharge = $condition['recharge']; if ((bool)$recharge['is_open']) { $recharge_money = ReOrder::find()->where(['store_id' => $store_id, 'user_id' => $user_id, 'is_pay' => 1])->sum('pay_price'); if ($recharge_money >= $recharge['value']) { $upgrade_level = $holder_level->id; $member_level = $holder_level->member_level; break; } } } if ($upgrade_level > 0) { $t = \Yii::$app->db->beginTransaction(); try { $saas_user = SaasUser::findOne(['mobile' => $user->binding]); $model = new ShareHolder(); $model->level_id = $upgrade_level; $model->store_id = $store_id; $model->user_id = $user_id; $model->name = $saas_user->name; $model->address = ''; $model->mobile = $saas_user->mobile; $model->province = 0; $model->city = 0; $model->district = 0; $model->province_name = ''; $model->city_name = ''; $model->district_name = ''; $model->status = 1; $model->audit_time = time(); if (!$model->save()) { throw new \Exception(json_encode($model->errors)); } self::checkChildHolderUpdateLevel($user_id, $upgrade_level); self::checkLevel($store_id, 0, $user_id); if ($member_level > (int)$user->level) { $user->level = $member_level; } $user->is_holder = 1; if (!$user->save()) { throw new \Exception(json_encode($user->errors)); } $level_log = new ShareHolderLevelLog(); $level_log->before_level = 0; $level_log->after_level = $upgrade_level; $level_log->user_id = $user_id; $level_log->store_id = $store_id; $level_log->order_id = 0; $level_log->desc = "用户累计充值升级为股东"; if (!$level_log->save()) { throw new Exception('等级更新失败'); } $t->commit(); } catch (\Throwable $e) { $t->rollBack(); } } } // 检查普通用户消费金额是否达到成为股东的条件 public static function generalUserConsume($user_id, $store_id) { \Yii::warning(['----------------- 检查普通用户消费金额是否达到成为股东的条件 --------' . $user_id, $store_id]); //查找股东是否存在或被拒绝或审核中 $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $store_id, 'status' => 1]); if ($shareHolder) { return; } $user = User::findOne($user_id); if (!$user) { return; } // 获取所有等级消费金额条件 $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all(); $upgrade_level = 0; $member_level = 0; $order_id = 0; foreach ($share_holder_level as $holder_level) { $condition = Json::decode($holder_level->condition); $self = $condition['self']; if ((bool)$self['is_open']) { // 兼容老版本 if (!isset($self['value']['order_number'])) { $self_price = $self['value']; $self['value'] = []; $self['value']['order_number'] = 0; $self['value']['price'] = $self_price; } if ($self['value']['order_number'] == 1) { $order = Order::find()->where( [ 'store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id ]) ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]) ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one(); if ($order) { $upgrade_level = $holder_level->id; $member_level = $holder_level->member_level; $order_id = $order->id; break; } } else{ $order_money = Order::find()->where( [ 'store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price'); if ($order_money >= $self['value']['price']) { $upgrade_level = $holder_level->id; $member_level = $holder_level->member_level; break; } } } } if ($upgrade_level > 0) { $t = \Yii::$app->db->beginTransaction(); try { $saas_user = SaasUser::findOne(['mobile' => $user->binding]); $model = new ShareHolder(); $model->level_id = $upgrade_level; $model->store_id = $store_id; $model->user_id = $user_id; $model->name = $saas_user->name; $model->address = ''; $model->mobile = $saas_user->mobile; $model->province = 0; $model->city = 0; $model->district = 0; $model->province_name = ''; $model->city_name = ''; $model->district_name = ''; $model->status = 1; $model->audit_time = time(); if (!$model->save()) { throw new \Exception(json_encode($model->errors)); } self::checkChildHolderUpdateLevel($user_id, $upgrade_level); self::checkLevel($store_id, 0, $user_id); if ($member_level > (int)$user->level) { $user->level = $member_level; } $user->is_holder = 1; if (!$user->save()) { throw new \Exception(json_encode($user->errors)); } $level_log = new ShareHolderLevelLog(); $level_log->before_level = 0; $level_log->after_level = $upgrade_level; $level_log->user_id = $user_id; $level_log->store_id = $store_id; $level_log->order_id = $order_id; $level_log->desc = "用户消费升级为股东"; if (!$level_log->save()) { throw new Exception('等级更新失败'); } $t->commit(); } catch (\Throwable $e) { \Yii::error($e); $t->rollBack(); } } } public static function handleGoods($store_id = 1) { // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制开始 --------' . microtime(true)]); $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $store_id])->orderBy('level desc')->all(); foreach ($share_holder_level as $value) { /** * @var $value ShareHolderLevel */ $condition = Json::decode($value->condition); // 购买指定商品 $goods = $condition['goods']; if ((bool)$goods['is_open'] && !empty($goods['value']['id'])) { // 查找买过此商品订单 $order_model = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.store_id' => $value->store_id, 'o.is_delete' => 0, 'o.is_pay' => 1]) ->andWhere(['od.goods_id' => $goods['value']['id']])->select('o.id order_id'); if ($goods['value']['is_send']) { $order_ids = (clone $order_model)->andWhere(['o.trade_status' => 0])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if (!empty($order_id)) { \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动发货机制--------' . microtime(true), $goods['value']['is_send'], count($order_id), implode(',', $order_id)]); Order::updateAll(['trade_status' => Order::ORDER_FLOW_SEND, 'send_time' => time()], ['AND', ['in', 'id', $order_id], ['trade_status' => 0]]); } } if ($goods['value']['is_confirm']) { // //如果是代理配送 且上门安装,用户没有对商品确认收货则不可确认收货 // $order_detail = OrderDetail::findAll(['order_id' => $order_id]); $is_can_confirm = true; // foreach ($order_detail as $detail) { // $is_can_confirm_sub = (AgentGoodsInstallLog::findOne(['order_detail_id' => $detail->id, 'status' => [0, 1], 'is_need_install' => 1])); // if ($is_can_confirm_sub) { // $is_can_confirm = false; // } // } $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_SEND])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if ($is_can_confirm && !empty($order_id)) { \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动收货机制--------' . microtime(true), $goods['value']['is_confirm'], count($order_id), implode(',', $order_id)]); Order::updateAll(['trade_status' => Order::ORDER_FLOW_CONFIRM, 'confirm_time' => time()], ['and', ['in', 'id', $order_id], ['trade_status' => Order::ORDER_FLOW_SEND]]); } } $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_CONFIRM, 'o.is_sale' => 0])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if (!empty($order_id)) { $after_sale_time = (int)$goods['value']['day']; $order_event = new OrderEvent(); \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动售后机制--------' . microtime(true), $goods['value']['day'], count($order_id), implode(',', $order_id)]); $order_event->orderSend(1, $order_id, $value->store_id, $after_sale_time); } } } // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制结束 --------' . microtime(true)]); } //股东会员等级 商品订单自动确认机制 public static function handleOrderAuto($order) { try { if(is_numeric($order)){ $order = PtActivityOrder::findOne($order); } if(!$order || $order->is_sale || !$order->user_id || !$order->is_pay){ return; } $share_holder_level = ShareHolderLevel::find()->where(['is_delete' => 0, 'status' => 1, 'store_id' => $order->store_id])->orderBy('level desc')->all(); foreach ($share_holder_level as $value) { /** * @var $value ShareHolderLevel */ $condition = Json::decode($value->condition); // 购买指定商品 $goods = $condition['goods']; if ((bool)$goods['is_open'] && !empty($goods['value']['id'])) { // 查找买过此商品订单 $order_model = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.id' => $order->id, 'o.is_delete' => 0, 'o.is_pay' => 1]) ->andWhere(['od.goods_id' => $goods['value']['id']])->select('o.id order_id'); if ($goods['value']['is_send']) { $order_ids = (clone $order_model)->andWhere(['o.trade_status' => 0])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if (!empty($order_id) && $order->trade_status == 0) { \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动发货机制--------' . microtime(true), $goods['value']['is_send'], count($order_id), implode(',', $order_id)]); // Order::updateAll(['trade_status' => Order::ORDER_FLOW_SEND, 'send_time' => time()], ['AND', ['in', 'id', $order_id], ['trade_status' => 0]]); $order->trade_status = Order::ORDER_FLOW_SEND; $order->send_time = time(); $order->save(); } } if ($goods['value']['is_confirm']) { // //如果是代理配送 且上门安装,用户没有对商品确认收货则不可确认收货 // $order_detail = OrderDetail::findAll(['order_id' => $order_id]); $is_can_confirm = true; // foreach ($order_detail as $detail) { // $is_can_confirm_sub = (AgentGoodsInstallLog::findOne(['order_detail_id' => $detail->id, 'status' => [0, 1], 'is_need_install' => 1])); // if ($is_can_confirm_sub) { // $is_can_confirm = false; // } // } $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_SEND])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if ($is_can_confirm && !empty($order_id) && $order->trade_status == Order::ORDER_FLOW_SEND) { \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动收货机制--------' . microtime(true), $goods['value']['is_confirm'], count($order_id), implode(',', $order_id)]); // Order::updateAll(['trade_status' => Order::ORDER_FLOW_CONFIRM, 'confirm_time' => time()], ['and', ['in', 'id', $order_id], ['trade_status' => Order::ORDER_FLOW_SEND]]); $order->trade_status = Order::ORDER_FLOW_CONFIRM; $order->confirm_time = time(); $order->save(); } } $order_ids = (clone $order_model)->andWhere(['o.trade_status' => Order::ORDER_FLOW_CONFIRM, 'o.is_sale' => 0])->asArray()->all(); $order_id = array_column($order_ids, 'order_id'); if (!empty($order_id)) { $after_sale_time = (int)$goods['value']['day']; // $order_event = new OrderEvent(); \Yii::warning(['----------------- 股东会员等级 ' . $value->name . ' 商品订单自动售后机制--------' . microtime(true), $goods['value']['day'], count($order_id), implode(',', $order_id)]); // $order_event->orderSend(1, $order_id, $value->store_id, $after_sale_time); $delay = $after_sale_time * 86400; $order_ = Order::findOne($order->id); $order_->future_sales_time = bcadd(time(), $delay); $order_->save(); if ($delay == 0) { $delay = 60; } \queue_push(new \app\jobs\order\NoAfterSalesOrderJob(['store_id' => $order->store_id, 'order_id' => $order->id]), $delay); } } } } catch (\Exception $e) { \Yii::error($e); debug_log($e->getMessage(), __CLASS__ . '.log'); } // \Yii::warning(['----------------- 股东会员等级 商品订单自动确认机制结束 --------' . microtime(true)]); } /** * 检查是否可以申请股东 * @param $store_id * @param $user_id * @return array */ public static function checkApply($store_id, $user_id) { $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => $store_id, 'is_delete' => 0, 'status' => 1]); if (!$share_level) { return [ 'code' => 1, 'msg' => '未找到相应等级' ]; } //TODO 股东人数以及金额 $condition = Json::decode($share_level->condition); // 团队人数 $man = $condition['man']; if ((bool)$man['is_open']) { foreach ((array)$man['value'] as $m) { $man_data = User::find()->childs($user_id, false, $m['level'])->where(['store_id' => $store_id])->asArray()->all(); if (count($man_data) < $m['count']) { return [ 'code' => 1, 'msg' => '团队人数:' . $m['level'] . '级团队人数未达到' . $m['count'] ]; } else { if (isset($m['money'])) { //消费达到$m['money']以上允许升级 $man_user_id = array_column($man_data, 'id'); $pay_price = Order::find()->where( [ 'store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $man_user_id ]) ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->sum('pay_price'); if ($m['money'] > $pay_price) { return [ 'code' => 1, 'msg' => '团队金额:' . $m['level'] . '级团队消费金额未达到' . $m['money'] ]; } } } } } // 团队消费金额 $order = $condition['order']; if ((bool)$order['is_open']) { foreach ($order['value'] as $o) { $man_data = User::find()->childs($user_id, false, $o['level'])->where(['store_id' => $store_id])->select('id')->asArray()->all(); if (count($man_data) < 1) { return [ 'code' => 1, 'msg' => '团队金额:' . $o['level'] . '级团队人数为空' ]; } $man_user_id = array_column($man_data, 'id'); $order_money = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM])->andWhere(['in', 'user_id', $man_user_id])->sum('pay_price'); if ($order_money < $o['count']) { return [ 'code' => 1, 'msg' => '团队金额:' . $o['level'] . '级团队消费金额未达到' . $o['count'] ]; } } } // 自身消费金额 $self = $condition['self']; if ((bool)$self['is_open']) { // 兼容老版本 if (!isset($self['value']['order_number'])) { $self_price = $self['value']; $self['value'] = []; $self['value']['order_number'] = 0; $self['value']['price'] = $self_price; } if ($self['value']['order_number'] == 1) { //单笔 $order = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id]) ->andWhere(['>=' , 'pay_price', $self['value']['price']])->one(); if (!$order) { return [ 'code' => 1, 'msg' => '您在本商城单笔消费未达到' . $self['value']['price'] . '元' ]; } } else{ //多笔 $order_money = Order::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'user_id' => $user_id])->sum('pay_price'); if ($order_money < $self['value']['price']) { return [ 'code' => 1, 'msg' => '您在本商城消费未达到' . $self['value']['price'] . '元' ]; } } } // 自身充值金额 $recharge = $condition['recharge']; if ((bool)$recharge['is_open']) { $recharge_money = ReOrder::find()->where(['store_id' => $store_id, 'user_id' => $user_id, 'is_pay' => 1])->sum('pay_price'); if ($recharge_money < $recharge['value']) { return [ 'code' => 1, 'msg' => '您在本商城充值未达到' . $recharge['value'] . '元' ]; } } // 购买指定商品 $goods = $condition['goods']; if ((bool)$goods['is_open']) { // 查找该用户是否买过此商品 $order_goods = Order::find()->alias('o')->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id')->where(['o.store_id' => $store_id, 'o.user_id' => $user_id, 'o.is_delete' => 0, 'o.is_pay' => 1, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM]) ->andWhere(['od.goods_id' => $goods['value']['id']])->one(); if (!$order_goods) { return [ 'code' => 1, 'msg' => '您未购买过指定商品' ]; } // 是否过了售后期 $pay_time = $order_goods->pay_time; if (time() < ($pay_time + $goods['day'] * 24 * 3600)) { return [ 'code' => 1, 'msg' => '购买过的指定商品未过售后期' ]; } } return [ 'code' => 0, 'msg' => 'success' ]; } // 用户自己购买指定商品成为股东(已经是股东) public static function userSelfBuyGoods2ShareHolder($order_id, $pay_up = 0) { if ($pay_up) { debug_log(['pay_up' => $pay_up, 'order_id' => $order_id->id, 'userSelfBuyGoods2ShareHolder'], 'userAuto2ShareHolder.log'); } $t = \Yii::$app->db->beginTransaction(); try { if (!$order_id) { throw new \Exception("订单id为空"); } if(isset($order_id->id)){ $order = $order_id; }else{ $order = Order::findOne($order_id); } $order_id = $order->id; $user_id = $order->user_id; $user = User::findOne($user_id); $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id, 'status' => 1]); if ($shareHolder) { $level = ShareHolderLevel::findOne($shareHolder->level_id)->level; //查找最高等级 $shareHolderLevelList = ShareHolderLevel::find() ->where(['store_id' => $order->store_id, 'status' => 1, 'is_delete' => 0]) ->andWhere(['>', 'level', $level]) ->select('condition, id, level, member_level') ->orderBy(['level' => SORT_DESC])->asArray()->all(); if (empty($shareHolderLevelList)) { throw new \Exception("等级为空"); } $level_id = 0; $member_level = 0; if ($pay_up) { debug_log(['shareHolderLevelList' => $shareHolderLevelList], 'userAuto2ShareHolder.log'); } foreach ($shareHolderLevelList as $item) { $condition = json_decode($item['condition'], true); if ((int)$condition['goods']['is_open'] === 1 && !empty($condition['goods']['value']['id'])) { if($pay_up && ($condition['goods']['pay_up'] != 1)){ continue; } if($order->share_hold_pay_up == 1){ continue; } $order_detail = OrderDetail::find()->where(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']])->select('goods_id')->one(); if (!empty($order_detail)) { $level_id = $item['id']; $member_level = $item['member_level']; break; } } } if ($level_id > 0) { $old_level_id = $shareHolder->level_id; $shareHolder->level_id = $level_id; if ((int)$member_level > (int)$user->level) { $user->level = $member_level; $user->save(); } $shareHolder->save(); if($pay_up){ $order->share_hold_pay_up = 1; $order->save(); } self::checkChildHolderUpdateLevel($user_id, $level_id); self::checkLevel($order->store_id, 0, $user_id); $level_log = new ShareHolderLevelLog(); $level_log->before_level = $old_level_id; $level_log->after_level = $level_id; $level_log->user_id = $user_id; $level_log->store_id = $order->store_id; $level_log->order_id = $order->id; $level_log->desc = "用户购买指定商品升级更高等级股东"; if (!$level_log->save()) { throw new Exception('等级更新失败'); } } } $t->commit(); } catch (\Exception $e) { $t->rollBack(); debug_log($e->getMessage(), 'userSelfBuyGoods2ShareHolder.log'); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //用户购买指定商品成为股东 public static function userAuto2ShareHolder($order_id, $pay_up = 0) { if ($pay_up) { debug_log(['pay_up' => $pay_up, 'order_id' => $order_id->id, 'userAuto2ShareHolder'], 'userAuto2ShareHolder.log'); } $t = \Yii::$app->db->beginTransaction(); try { if (!$order_id) { throw new \Exception("订单id为空"); } if(isset($order_id->id)){ $order = $order_id; }else{ $order = Order::findOne($order_id); } $order_id = $order->id; $user_id = $order->user_id; $user = User::findOne($user_id); $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id, 'status' => 1]); if (empty($shareHolder)) { //查找最高等级 $shareHolderLevelList = ShareHolderLevel::find()->where(['store_id' => $order->store_id, 'status' => 1, 'is_delete' => 0])->select('condition, id, level, member_level, store_id')->asArray()->all(); $id = []; $num = 0; if ($pay_up) { debug_log(['shareHolderLevelList' => $shareHolderLevelList, 'store_id' => $order->store_id], 'userAuto2ShareHolder.log'); } foreach ($shareHolderLevelList as $item) { $condition = json_decode($item['condition'], true); if ((int)$condition['goods']['is_open'] === 1 && !empty($condition['goods']['value']['id'])) { if($pay_up && ($condition['goods']['pay_up'] != 1)){ continue; } if($order->share_hold_pay_up == 1){ continue; } //给首次升级成功股东的产品购买记录修改成标识为升级产品。 会在链动列表展示 升级产品 并在链动小推大逻辑中使用到。 $ShareHolderProfitGoodsLog = ShareHolderProfitGoodsLog::findOne(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']]); if (!empty($ShareHolderProfitGoodsLog)) { $ShareHolderProfitGoodsLog->is_switch = 1; $ShareHolderProfitGoodsLog->save(); } $order_detail = OrderDetail::find()->where(['order_id' => $order_id, 'goods_id' => $condition['goods']['value']['id']])->select('goods_id')->one(); if (!empty($order_detail)) { $id[$num]['id'] = $item['id']; $id[$num]['level'] = $item['level']; $id[$num]['id'] = $item['id']; $id[$num]['member_level'] = $item['member_level']; $num++; } } } $last_names = array_column($id, 'level'); array_multisort($last_names, SORT_DESC, $id); //查找用户是否存在或被拒绝或审核中 $shareHolder = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0, 'store_id' => $order->store_id]); //不存在 if (empty($shareHolder) && empty($user->is_holder)) { $last_names = array_column($id, 'level'); array_multisort($last_names, SORT_DESC, $id); if (!empty($id)) { $saas_user = SaasUser::findOne(['mobile' => $user->binding]); $model = new ShareHolder(); $model->level_id = $id[0]['id']; $model->store_id = $order->store_id; $model->user_id = $user_id; $model->name = $saas_user->name; $model->address = ''; $model->mobile = $saas_user->mobile; $model->province = 0; $model->city = 0; $model->district = 0; $model->province_name = ''; $model->city_name = ''; $model->district_name = ''; $model->status = 1; $model->audit_time = time(); $result = $model->save(); if (!$result) { throw new \Exception(json_encode($model->errors)); } if($pay_up){ $order->share_hold_pay_up = 1; $order->save(); } self::checkChildHolderUpdateLevel($user_id, $id[0]['id']); self::checkLevel($order->store_id, 0, $model->user_id); if ((int)$id[0]['member_level'] > (int)$user->level) { $user->level = $id[0]['member_level']; } $user->is_holder = 1; $result = $user->save(); if (!$result) { throw new \Exception(json_encode($user->errors)); } } } if (!empty($id) && !empty($shareHolder) && in_array($shareHolder->status, [0, 2])) { $shareHolder->level_id = $id[0]['id']; $shareHolder->status = 1; $result = $shareHolder->save(); if (!$result) { throw new \Exception(json_encode($shareHolder->errors)); } self::checkLevel($order->store_id, 0, $shareHolder->user_id); // self::checkChildHolderUpdateLevel($user->id, $shareHolder->level_id); $user->level = $id[0]['member_level']; $user->is_holder = 1; $result = $user->save(); if (!$result) { throw new \Exception(json_encode($user->errors)); } } //添加股东升级记录 if (!empty($id)) { //添加股东升级记录 $level_log = new ShareHolderLevelLog(); $level_log->before_level = 0; $level_log->after_level = $id[0]['level']; $level_log->user_id = $user_id; $level_log->store_id = $order->store_id; $level_log->order_id = $order->id; $level_log->desc = "用户购买指定商品升级为股东"; if (!$level_log->save()) { throw new Exception('等级更新失败'); } } } $t->commit(); } catch (\Exception $e) { \Yii::error($e); $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage(), 'line' => $e->getLine(), ]; } } public static function sendFrostMoney($child_id, $store_id) { $parent_log = ShareHolderOutLog::findOne(['child_user_id' => $child_id]); if (!$parent_log) { return; } $count = ShareHolderOutLog::find()->where([ 'parent_user_id' => $parent_log->parent_user_id, 'status' => 0, ])->count(); if ($count > 0) { return; } $shareHolderFrostSendCond = Option::get('shareHolderFrostSendCond', $store_id, 'bonus_pool', 0)['value']; if($shareHolderFrostSendCond){ $child_data = ShareHolderOutLog::find()->where([ 'parent_user_id' => $parent_log->parent_user_id, 'status' => 1, ])->asArray()->all(); foreach($child_data as $child){ $child_out = ShareHolderOutLog::findOne(['parent_user_id' => $child_id, 'status' => 1]); if (!$child_out) { return; } $count = ShareHolderOutLog::find()->where([ 'parent_user_id' => $child['child_user_id'], 'status' => 0, ])->count(); if ($count > 0) { return; } } } $t = \Yii::$app->db->beginTransaction(); try { $frost_log_amout = ShareHolderFrostLog::find()->where([ 'parent_user_id' => $parent_log->parent_user_id, 'status' => 0, ])->sum('amount'); ShareHolderFrostLog::updateAll([ 'status' => 1, 'updated_at' => time(), ], [ 'parent_user_id' => $parent_log->parent_user_id, 'status' => 0, ]); $detail = new ShareDetail(); $detail->store_id = $store_id; $detail->type_id = 0; $detail->type = ShareDetail::TYPE_FROST_PROFIT; $detail->user_id = $parent_log->parent_user_id; $detail->desc = '冻结佣金释放'; $detail->money = $frost_log_amout; $detail->is_send = 1; $detail->save(); $user = User::findOne($parent_log->parent_user_id); $user->updateCounters(['total_price' => $frost_log_amout, 'price' => $frost_log_amout]); $t->commit(); } catch (\Exception $e) { $t->rollBack(); } } public static function getShareHolderLevelOption($store_id) { try { $list = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0])->asArray()->all(); $new_list = []; foreach ($list as $item) { if ($item['condition']) { $condition = json_decode($item['condition'], true); if ($condition['goods']['is_open'] == 1 && count($condition['goods']['value']['id']) > 0) { $new_list[] = [ 'goods_ids' => $condition['goods']['value']['id'], 'day' => (int)$condition['goods']['value']['day'], ]; } } } return $new_list; } catch (\Throwable $e) { return []; } } // 取消订单后删除股东分红记录 public static function cancelOrderShareDetail($order_id) { try { ShareDetail::updateAll(['is_delete' => 1], ['type_id' => $order_id]); } catch (\Throwable $e) { // Todo } } public static function userSlide($order) { $t = \Yii::$app->db->beginTransaction(); try { $list = ShareDetail::find()->where(['type_id' => $order->id, 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'is_delete' => 0])->all(); if ($list) { foreach ($list as $share_detail) { $handle_child_data_order_id = cache()->get('handle_child_data_order_id' . $order->id); if (!$handle_child_data_order_id) { ShareDetail::handleChildData($share_detail->id); cache()->set('handle_child_data_order_id' . $order->id, 1); } } } $t->commit(); } catch (\Exception $e) { $t->rollBack(); } } }