| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <?php
- /**
- * 冻结基金
- */
- namespace addons\DoubleCopy\console\controllers;
- use addons\DoubleCopy\common\enums\DoubleCopyEnum;
- use addons\DoubleCopy\common\logic\DoubleCopyLogic;
- use addons\DoubleCopy\common\models\DoubleCopyCommission;
- use addons\DoubleCopy\common\models\DoubleCopyFrozenFundClearLog;
- use addons\DoubleCopy\common\models\DoubleCopyLevel;
- use addons\DoubleCopy\common\models\DoubleCopyUser;
- use addons\DoubleCopy\common\services\FrozenFundService;
- use common\enums\StatusEnum;
- use common\helpers\ArrayHelper;
- use common\helpers\FormatHelper;
- use common\models\mall\Mall;
- use common\models\user\UserPartitionRelationship;
- use DateTime;
- use Exception;
- use RuntimeException;
- use yii\console\Controller;
- use yii\console\ExitCode;
- use Yii;
- class FrozenFundController extends Controller
- {
- /**
- * 冻结基金每月清零
- * @return void
- */
- public function actionClear()
- {
- try {
- $mall_list = Mall::getEnableMallList(true);
- foreach ($mall_list as $mall){
- $mall_id = $mall['id'];
- //is_open_frozen_fund_clear
- //frozen_fund_clear_time
- //frozen_fund_clear_time_show
- // 获取基础配置
- $config = Yii::$app->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);
- }
- }
- }
- }
- }
- }
|