setName('sharingFees')->setDescription('手续费分润'); } protected function execute(Input $input, Output $output) { /* 永不超时 */ // ini_set('max_execution_time', 0); // 记录开始运行的时间 $GLOBALS['_beginTime'] = microtime(TRUE); $output->writeln('定时任务开始执行:' . date('Y-m-d H:i:s', time())); /*** 发放分红收益 ***/ $output->writeln("手续费分润:"); $feeCount = self::setSharingFees(); //存储服务费分润 $pledgeCount = self::setSharingPledge(); $output->writeln('定时任务执行结束,手续费执行:' . $feeCount . '个,服务费执行:' . $pledgeCount . '个'); } /*手续费分润 当日使用(交易、赠送扣除)的茶宝手续费和茶宝(手续费账户)分别统计一下总量。 比如茶宝手续费有1000,茶宝(手续费账户)有2000,持有A的分润10%,则分别为100和200 1)先算出所有人产品A的持有量(如300),根据持有量算出每份产品应发放茶宝和茶宝(手续费账户)的数量。 (茶宝:100/300=0.333 茶宝(手续费账户)200/300=0.666) 2)再算出持有A产品的用户,每人持有量;根据每人持有量*每份应发数量,计算出每人应发总额,发放到该用户的茶宝账户上。 3)按上述算法,以此计算持有B和持有CDE的用户 */ public static function setSharingFees(){ $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeFees)->select(); if(empty($list)) return true; $output = new Output(); $wallet = new LedgerWalletModel(); $productOrder = new ProductOrder(); $i = 0; //茶宝手续费 $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'yesterday')->where('action', 'in', [LedgerTokenChangeModel::Giveaway, LedgerTokenChangeModel::Pledge, LedgerTokenChangeModel::TransferFee])->sum('change_amount')); //冻结手续费 $frozenFee = abs(LedgerFrozenChangeModel::where('create_time', 'yesterday')->where('action', 'in', [LedgerFrozenChangeModel::Giveaway, LedgerFrozenChangeModel::Pledge, LedgerFrozenChangeModel::TransferFees])->sum('change_amount')); foreach($list as $item){ //TOKEN产品的持有量 $productHold = $productOrder::getHoldProductNum($item->product_id); //分润 $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3); //统计产品总数量 $productNum = array_sum(array_column($productHold, 'num')) ; //每份产品的分润 $tave = bcdiv($tokenFees, $productNum, 6); //冻结分润 $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3); //每份产品的分润 $fave = bcdiv($frozenFees, $productNum, 6); //$output->writeln('产品:' . $item->product_id . '茶宝分润:' . $tave . ' 手续费账户分润:' . $fave ); foreach ($productHold as $vv) { //茶宝 $tokenNum = bcmul($vv->num, $tave, 6); if($tokenNum > 0) { $wallet->changeWalletAccount($vv->user_id, Asset::TOKEN, $tokenNum , LedgerTokenChangeModel::SharingFees); $output->writeln('用户:' . $vv->user_id . '茶宝分润:' . $tokenNum ); } //手续费 $frozenNum = bcmul($vv->num, $fave, 6); if($frozenNum > 0) { $wallet->changeWalletAccount($vv->user_id, Asset::FROZEN, $frozenNum , LedgerFrozenChangeModel::SharingFees); $output->writeln('用户:' . $vv->user_id. ' 手续费账户分润:' . $frozenNum ); } $i +=1; } } return $i; } //存储服务费分润 public static function setSharingPledge(){ $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeStorage)->select(); if(empty($list)) return true; $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'yesterday')->where('action', LedgerTokenChangeModel::Pledge)->sum('change_amount')); //TOKEN const PledgeFee = 7; //存储服务费 $frozenFee = abs(LedgerFrozenChangeModel::whereTime('create_time', 'yesterday')->where('action', LedgerFrozenChangeModel::Pledge)->sum('change_amount')); //FROZEN const PledgeFee = 7; //存储服务费 $i = 0; $output = new Output(); $wallet = new LedgerWalletModel(); $productOrder = new ProductOrder(); foreach($list as $item){ //TOKEN产品的持有量 $productHold = $productOrder::getHoldProductNum($item->product_id); //统计产品总数量 $productNum = array_sum(array_column($productHold, 'num')) ; $divided = 0; //TOKEN分润 $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3); //判断最大分润:0不限制 if(!empty($item->max_fees)){ //最大分润 $divided = bcsub($item->max_fees, $item->divided_fees, 6); if($tokenFees > $divided) $tokenFees = $divided; } //每份产品的分润 $cave = bcdiv($tokenFees, $productNum, 6); //冻结分润 $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3); //判断最大分润:0不限制 if($divided > 0){ //最大分润 $divided = bcsub($divided, $tokenFees, 6); if($frozenFees > $divided) $frozenFees = $divided; } //每份产品的分润 $fave = bcdiv($frozenFees, $productNum, 6); $totalFees = 0; //用户总分润 foreach ($productHold as $vv) { //茶宝 $tokenNum = bcmul($vv->num, $cave, 6); //持有数量 * 每份产品的分润 if($tokenNum > 0) { $wallet->changeWalletAccount($vv->user_id, Asset::TOKEN, $tokenNum , LedgerTokenChangeModel::SharingFees); $output->writeln('用户:' . $vv->user_id . '茶宝分润:' . $tokenNum ); } //手续费 $frozenNum = bcmul($vv->num, $fave, 6); if($frozenNum > 0) { $wallet->changeWalletAccount($vv->user_id, Asset::FROZEN, $frozenNum , LedgerFrozenChangeModel::SharingFees); $output->writeln('用户:' . $vv->user_id. ' 手续费账户分润:' . $frozenNum ); } //用户总分润 $totalFees += bcadd($tokenNum, $frozenNum, 6); } //更新分润 if($totalFees > 0) { $item->divided_fees += $totalFees; //判断是否到最大分润 if($item->max_fees == $item->divided_fees) $item->status = 0; $item->save(); $i +=1; } } return $i; } }