| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php
- namespace app\api\command;
- use think\console\Command;
- use think\console\Input;
- use think\console\Output;
- use fast\Asset;
- use app\common\model\ProductPledges;
- use app\common\model\ProductOrder;
- use app\common\model\LedgerTokenChangeModel;
- use app\common\model\LedgerFrozenChangeModel;
- use app\common\model\LedgerWalletModel;
- use app\common\model\Sharingfees as SharingFeesModel;
- use app\common\model\LedgerTeacChangeModel;
- class SharingFees extends Command
- {
- protected function configure()
- {
- $this->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', 'today')->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 = 20;//abs(LedgerTokenChangeModel::whereTime('create_time', 'today')->where('action', LedgerTokenChangeModel::Pledge)->sum('change_amount')); //TOKEN const PledgeFee = 7; //存储服务费
- $frozenFee = 30;//abs(LedgerFrozenChangeModel::whereTime('create_time', 'today')->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;
- }
- }
|