services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic',true); $is_open_frozen_fund_clear = $config['is_open_frozen_fund_clear'] ?? StatusEnum::DISABLED; if(!$is_open_frozen_fund_clear) continue; $frozen_fund_clear_date = $config['frozen_fund_clear_date'] ?? 0; if(!$frozen_fund_clear_date) continue; $frozen_fund_clear_time = $config['frozen_fund_clear_time'] ?? ''; $frozen_fund_clear_time = $frozen_fund_clear_date.' '.$frozen_fund_clear_time; if ($is_open_frozen_fund_clear == StatusEnum::ENABLED && $frozen_fund_clear_time) { $date_time = date('Y-m-', time()).$frozen_fund_clear_time; $date_timestamp = strtotime($date_time); if(time() >= $date_timestamp){ $this->frozenFundClear($mall_id,$config); } } } }catch (\Exception $e){ } } private function frozenFundClear($mall_id,$config) { //判断该月是否清零过 $month_begin_time = strtotime(date('Y-m-01', time())); $exists = DoubleCopyFrozenFundClearLog::find()->where(['mall_id' => $mall_id,'status' => StatusEnum::ENABLED])->andWhere(['>=','created_at',$month_begin_time])->one(); if($exists) return true; $query = DoubleCopyUser::find()->where(['mall_id' => $mall_id]); if($config['reward_currency'] == 'commission'){ $field = 'frozen_fund'; }else{ $field = 'frozen_fund_score'; } $users = $query->andWhere(['>',$field,0])->all(); foreach($users as $user){ echo $user->user_id."\n"; $check = DoubleCopyFrozenFundClearLog::find()->where(['mall_id' => $mall_id])->andWhere(['user_id' => $user->user_id])->andWhere(['>=','created_at',$month_begin_time])->one(); if($check) continue; //事务:处理,清零冻结基金,写入清零记录表,冻结基金清零为0 $trans = Yii::$app->db->beginTransaction(); try{ $clear_num = $user->$field; if($clear_num <= 0 ) throw new \Exception('冻结基金<=0'); $user->$field = 0; $res = $user->save(); if(!$res) throw new \Exception('更新二二复制user '.$field.' 失败'); $result = DoubleCopyFrozenFundClearLog::setData([ 'mall_id' => $mall_id, 'user_id' => $user->user_id, 'clear_num' => $clear_num, 'reward_currency' => $config['reward_currency'] ]); if(!$result) throw new \Exception('写入二二复制frozen_fund_clear_log 失败:'.DoubleCopyFrozenFundClearLog::getStaticError()); DoubleCopyCommission::updateAll(['settlement_type' => -1, 'updated_at' => time()], ['user_id' => $user->user_id, 'capital_type' => DoubleCopyEnum::FREEZE_FUND, 'settlement_type' => [0,2],'reward_currency' => $config['reward_currency']]); $res = DoubleCopyCommission::setData([ 'mall_id' => $mall_id, 'user_id' => $user->user_id, 'settlement_type' => 1, 'capital_type' => DoubleCopyEnum::FREEZE_FUND, 'is_frozen' => 1, 'money' => -$clear_num, 'goods_name' => "用户({$user->user_id})未达到当月业绩要求,冻结基金额度清零", ]); if(!$res) throw new \Exception('写入二二复制commission 失败:'.DoubleCopyCommission::getStaticError()); $trans->commit(); }catch(\Exception $e){ //事务回滚 $trans->rollBack(); $exception = FormatHelper::exception($e,'frozenFundClear err:'.$e->getMessage().' user_id:'.$user->user_id); Yii::error($exception); continue; } } return true; } /** * 如果一个月的期限没达成解冻条件则冻结基金转给直推上级 * * @return void */ public function actionFreezeFundMonthlyLimited() { // 必须次月初1号执行 if (date('d') != 1) { return; } $mall_list = Mall::getEnableMallList(true); $frozenFundService = new FrozenFundService(); foreach ($mall_list as $mall){ $mall_id = $mall['id']; $frozenFundService->mall_id = $mall_id; // 获取基础配置 $config = Yii::$app->services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic', true); // 是否开启每月时间期限功能 if (empty($config['is_freeze_fund_monthly_limited'])) { continue; } $doubleCopyUserFind = DoubleCopyUser::find(); DoubleCopyUser::paramPack([ 'where' => [ [ 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'is_thaw' => StatusEnum::DISABLED, ], ['>=', 'level', 2], ['>', 'upgrade_boss_at', 0], ], ], $doubleCopyUserFind); $levelList = DoubleCopyLevel::lists([ 'with' => [ 'setting' => function ($query) { $query->select('level_id, is_thaw'); } ], 'where' => [ [ 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, ], ['>=', 'level', 2] ], 'index' => 'level', 'select' => 'id, level' ]); // 找到所有大于老板等级并且未解冻的 foreach ($doubleCopyUserFind->batch(1000) as $doubleCopyUsers) { foreach ($doubleCopyUsers as $doubleCopyUser) { // 检查这个等级是否开启了额外解冻条件 if (empty($levelList[$doubleCopyUser->level]['setting']['is_thaw'])) { continue; } // 是否到了该验证的时间(当月成为的老板以上等级,则次月不判断) $upgradeBossAt = date('Y-m-1', strtotime('+1 month', $doubleCopyUser['upgrade_boss_at'])); if (!$frozenFundService->isMoreThanOneMonth($upgradeBossAt, date('Y-m-d'))) { continue; } $parentIdArr = array_reverse(UserPartitionRelationship::getParentIdArr($doubleCopyUser['user_id'])); // 找到上级的二二复制用户 $doubleCopyUsers = DoubleCopyUser::lists([ 'where' => [ [ 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'user_id' => $parentIdArr ], ], 'index' => 'user_id' ], false); // 找到上级是代理的用户 $parentDoubleCopyUser = null; foreach ($parentIdArr as $parentId) { if (isset($doubleCopyUsers[$parentId])) { $parentDoubleCopyUser = $doubleCopyUsers[$parentId]; break; } } $logData = [ 'double_copy_user' => ArrayHelper::toArray($doubleCopyUser), 'parent_double_copy_user' => $parentDoubleCopyUser ? ArrayHelper::toArray($parentDoubleCopyUser) : [], 'mall_id' => $mall_id ]; try { Yii::$app->custom->logs('【二二复制】开始处理冻结基金', $logData); // 没有上级则直接失效冻结基金 if (empty($parentDoubleCopyUser)) { $frozenFundService->clearFrozenFundByDoubleCopyUser($doubleCopyUser); } else { // 有上级则解冻给上级 $frozenFundService->unfreezeHandleToParent($doubleCopyUser, $parentDoubleCopyUser); } }catch (Exception $e) { Yii::$app->custom->logs('处理每月期限限制数据异常', $logData); } } } } } }