| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- <?php
- /**
- * 厦门云联储网络科技有限公司
- * https://www.baokuaiyun.com
- * Copyright (c) 2023 爆块云 All rights reserved.
- */
- namespace app\models;
- use app\utils\Share\BonusPool;
- use yii\db\ActiveRecord;
- use yii\behaviors\TimestampBehavior;
- use Yii;
- /**
- * This is the model class for table "{{%share_detail}}".
- *
- * @property integer $id
- * @property integer $store_id
- * @property integer $user_id
- * @property integer $money
- * @property integer $is_send
- * @property integer $type
- * @property integer $type_id
- * @property string $desc
- * @property string $remark
- * @property integer $is_delete
- * @property integer $created_at
- * @property integer $send_time
- * @property integer $updated_at
- */
- class ShareDetail extends \yii\db\ActiveRecord
- {
- /**
- * 股东分红
- */
- const TYPE_HOLDER_PROFIT = 1;
- /**
- * 极差分红
- */
- const TYPE_RANGE_PROFIT = 2;
- /**
- * 区域分红
- */
- const TYPE_AREA_PROFIT = 3;
- /**
- * 基础分销
- */
- const TYPE_SHARE_PROFIT = 4;
- /**
- * 2+1股东分销
- */
- const TYPE_TWO_PLUS_ONE_SHARE_PROFIT = 5;
- /**
- * 2+1直推团队收益比例
- */
- const TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT = 6;
- /**
- * 极差分红(原关系)
- */
- const TYPE_RANGE_PROFIT_OLD = 7;
- /**
- * 2+1直推团队收益比例(原关系)
- */
- const TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD = 8;
- /**
- * 冻结金额
- */
- const TYPE_FROST_PROFIT = 9;
- /**
- * 极差分红_会员方式(原关系)
- */
- const TYPE_RANGE_PROFIT_OLD_USER_LEVEL = 10;
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return '{{%share_detail}}';
- }
- public function behaviors()
- {
- return [
- [
- 'class' => TimestampBehavior::class,
- 'attributes' => [
- ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
- ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
- ]
- ]
- ];
- }
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['store_id', 'user_id', 'is_send', 'type', 'type_id', 'created_at', 'updated_at', 'is_delete', 'send_time'], 'integer'],
- [['money'], 'number'],
- [['desc', 'remark'], 'string'],
- [['created_at', 'updated_at'], 'safe']
- ];
- }
- public function afterSave($insert, $changedAttributes)
- {
- parent::afterSave($insert, $changedAttributes); // TODO: Change the autogenerated stub
- $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
- ];
- // if (in_array($this->type, $share_detail_arr) && intval($this->is_send)) {
- //// $this->handleChildData($this->user_id);
- // }
- }
- public static function handleChildData($id, $parent_id = 0)
- {
- //$t = \Yii::$app->db->beginTransaction();
- // $user = User::findOne($user_id);
- // $parent_id = $user->old_parent_id;
- if (!$parent_id) {
- $share_detail = self::findOne($id);
- $parent_id = $share_detail->user_id;
- $store_id = $share_detail->store_id;
- } else {
- $user = User::findOne($parent_id);
- $store_id = $user->store_id;
- }
- $holder_level_list = ShareHolderLevel::find()->where([
- 'is_delete' => 0,
- 'status' => 1,
- 'store_id' => $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 &&
- (int)$condition->shareholder->num > 0 &&
- (bool)$condition->shareholder->independent_team
- ) {
- $current_level = $holder_level;
- break;
- }
- }
- if ($current_level == null) {
- return;
- }
- $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
- ];
- //比如滑落设置为2 ,那么就是满2个人第三个人贡献了直推佣金后,放到第一个下级下面
- //设置滑落数量时需要判断是否大于 可助力出局人数
- $shareHolderChangeOldParentSwitch = Option::get('shareHolderChangeOldParentSwitch', $store_id, 'bonus_pool', 0)['value'];
- $shareHolderChangeOldParentNumber = Option::get('shareHolderChangeOldParentNumber', $store_id, 'bonus_pool', 0)['value'];
- $shareHolderChangeChildMinNumber = Option::get('shareHolderChangeChildMinNumber', $store_id, 'bonus_pool', 0)['value'];
- /*debug_log([
- 'shareHolderChangeOldParentSwitch' => $shareHolderChangeOldParentSwitch,
- 'shareHolderChangeOldParentNumber' => $shareHolderChangeOldParentNumber,
- 'shareHolderChangeChildMinNumber' => $shareHolderChangeChildMinNumber
- ], 'user_new.log');*/
- //设置滑落数量时需要判断是否大于 可助力出局人数
- $condition = json_decode($current_level->condition, true);
- //设置滑落数量时需要判断是否大于 可助力出局人数
- // if ($condition['shareholder']['num'] > $shareHolderChangeOldParentNumber) {
- // return;
- // }
- if (!intval($shareHolderChangeOldParentSwitch) || $shareHolderChangeOldParentNumber <= 1 || $shareHolderChangeOldParentNumber <= $shareHolderChangeChildMinNumber) {
- return;
- }
- $i = 0;
- reset:
- if ($i > $shareHolderChangeOldParentNumber) {
- return;
- }
- //查询真实id
- $real_child_id = User::find()->alias('u')
- ->leftJoin(['h' => ShareHolder::tableName()], 'u.id=h.user_id')
- ->where(['u.parent_id' => $parent_id, 'u.is_delete' => 0, 'h.is_delete' => 0, 'h.status' => 1])->andWhere('h.id is not null')->select('u.id')->column();
- //查询自己下的所有历史下级
- $query = UserTreePath::find()->alias('ut')
- ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id')
- ->where(['ut.parent_id' => $parent_id])
- ->andWhere('h.id is not null')
- ->andWhere('ut.child_id != ut.parent_id')
- ->andWhere(['IN', 'ut.child_id', $real_child_id])
- ->orderBy(['ut.created_at' => SORT_ASC]);
- /*debug_log([
- 'sql' => $query->createCommand()->getRawSql()
- ], 'user_new.log');*/
- $user_child = $query->asArray()->all();
- $user_child = array_values($user_child);
- debug_log([
- 'old_parent_id' => $parent_id,
- 'user_child' => $user_child,
- 'real_child' => $real_child_id
- ], 'user_new.log');
- $old_child_id = array_column($user_child, 'child_id');
- //判断自己下级是否超过三项
- if (count($user_child) > $shareHolderChangeOldParentNumber) {
- //重新组合数据 便于遍历除前三项剩余的下级
- $data = $user_child;
- foreach ($data as $old_index => $old_item) {
- if ($old_index < $shareHolderChangeOldParentNumber) {
- unset($data[$old_index]);
- continue;
- }
- }
- $data = array_values($data);//剩余的下级开始遍历分配上级
- debug_log([
- 'data' => $data
- ], 'user_new.log');
- //判断第三项是否已经出局
- $share_holder_3 = ShareHolder::findOne(['user_id' => $user_child[$i]['child_id'], 'is_delete' => 0]);
- debug_log([
- 'share_holder_3_id' => $share_holder_3->id
- ], 'user_new.log');
- if (!$share_holder_3) {
- ++$i;
- goto reset;
- }
- //未出局
- //获取是自己发展的下级人数
- $user_child_id_arr = User::find()->where(['old_parent_id' => $user_child[$i]['child_id'], 'is_delete' => 0])
- ->select('id')->column();
- /*debug_log([
- 'user_child_id_arr' => $user_child_id_arr
- ], 'user_new.log');*/
- $shareHolderParentOutQuery= ShareHolderParentOutLog::find()
- ->where([
- 'change_type' => ShareHolderParentOutLog::CHANGE_TYPE_NORMAL,
- 'parent_user_id' => $user_child[$i]['child_id'],
- 'type' => 1,
- 'user_id' => $user_child_id_arr
- ]);
- /*debug_log([
- 'shareHolderParentOutLogSql' => $shareHolderParentOutQuery->createCommand()->getRawSql()
- ], 'user_new.log');*/
- $shareHolderParentOutLog = $shareHolderParentOutQuery->asArray()->count() ?? 0;
- /*debug_log([
- 'shareHolderParentOutLog' => $shareHolderParentOutLog
- ], 'user_new.log');*/
- foreach ($data as $d_item) {
- $user_ = User::findOne($d_item['child_id']);
- $beforeParentId = $user_->parent_id;
- $beforeOldParentId = $user_->old_parent_id;
- if ($user_) {
- //贡献了直推佣金后,放到第一个下级下面
- $share_detail = ShareDetail::find()->alias('sd')
- ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id')
- ->where(['o.user_id' => $d_item['child_id'], 'sd.type' => $share_detail_arr, 'sd.user_id' => $user_->old_parent_id])
- ->asArray()->one();
- if (!$share_detail) {
- continue;
- }
- //获取下级人数
- $user_child_count = User::find()->where(['old_parent_id' => $user_child[$i]['child_id'], 'is_delete' => 0])
- ->select('id')->count();
- /*debug_log([
- 'new_user_count' => $user_child_count
- ], 'user_new.log');*/
- if ($user_child_count >= $shareHolderChangeOldParentNumber) {
- self::handleChildData(0, $user_child[$i]['child_id']);
- ++$i;
- goto reset;
- }
- //判断下级人数是否符合滑落需求
- if (($shareHolderParentOutLog < $shareHolderChangeChildMinNumber && ($shareHolderChangeChildMinNumber + $user_child_count) >= $shareHolderChangeOldParentNumber)) {
- self::handleChildData(0, $user_child[$i]['child_id']);
- ++$i;
- goto reset;
- }
- // 2
- if ($shareHolderChangeChildMinNumber <= $shareHolderParentOutLog) {//0 < 1
- $count = $condition['shareholder']['num'] - $user_child_count;
- if ($count > 0) {
- $user_->old_parent_id = $user_child[$i]['child_id'];
- $user_->parent_id = $user_child[$i]['child_id'];
- $user_->save();
- $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(101), 1, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT);
- $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeParentId, ShareHolderParentOutLog::getConditionName(101), 0, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT);
- }
- //检测是否可以出局
- BonusPool::checkChildHolderUpdateLevel($d_item['child_id']);
- } else {
- if ($user_child_count - $condition['shareholder']['num'] >= 0) {//2 3
- //检测是否可以出局
- BonusPool::checkChildHolderUpdateLevel($d_item['child_id']);
- } else {//3 2 1
- $count = $condition['shareholder']['num'] - $shareHolderChangeChildMinNumber;
- if ($count > 0) {//2 > 2
- $user_->old_parent_id = $user_child[$i]['child_id'];
- $user_->parent_id = $user_child[$i]['child_id'];
- $user_->save();
- $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(101), 1, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT);
- $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeParentId, ShareHolderParentOutLog::getConditionName(101), 0, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT);
- //检测是否可以出局
- BonusPool::checkChildHolderUpdateLevel($d_item['child_id']);
- }
- }
- }
- $user_share_holder_ = ShareHolder::findOne(['user_id' => $user_->id, 'status' => 1, 'is_delete' => 0]);
- if (intval($user_share_holder_->is_out)) {
- ++$i;
- goto reset;
- }
- }
- }
- }
- //$t->rollBack();
- }
- }
|