SharingFees.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace app\api\command;
  3. use think\console\Command;
  4. use think\console\Input;
  5. use think\console\Output;
  6. use fast\Asset;
  7. use app\common\model\ProductPledges;
  8. use app\common\model\ProductOrder;
  9. use app\common\model\LedgerTokenChangeModel;
  10. use app\common\model\LedgerFrozenChangeModel;
  11. use app\common\model\LedgerWalletModel;
  12. use app\common\model\Sharingfees as SharingFeesModel;
  13. use app\common\model\LedgerTeacChangeModel;
  14. class SharingFees extends Command
  15. {
  16. protected function configure()
  17. {
  18. $this->setName('sharingFees')->setDescription('手续费分润');
  19. }
  20. protected function execute(Input $input, Output $output)
  21. {
  22. /* 永不超时 */
  23. // ini_set('max_execution_time', 0);
  24. // 记录开始运行的时间
  25. $GLOBALS['_beginTime'] = microtime(TRUE);
  26. $output->writeln('定时任务开始执行:' . date('Y-m-d H:i:s', time()));
  27. /*** 发放分红收益 ***/
  28. $output->writeln("手续费分润:");
  29. $feeCount = self::setSharingFees();
  30. //存储服务费分润
  31. $pledgeCount = self::setSharingPledge();
  32. $output->writeln('定时任务执行结束,手续费执行:' . $feeCount . '个,服务费执行:' . $pledgeCount . '个');
  33. }
  34. /*手续费分润
  35. 当日使用(交易、赠送扣除)的茶宝手续费和茶宝(手续费账户)分别统计一下总量。
  36. 比如茶宝手续费有1000,茶宝(手续费账户)有2000,持有A的分润10%,则分别为100和200
  37. 1)先算出所有人产品A的持有量(如300),根据持有量算出每份产品应发放茶宝和茶宝(手续费账户)的数量。
  38. (茶宝:100/300=0.333 茶宝(手续费账户)200/300=0.666)
  39. 2)再算出持有A产品的用户,每人持有量;根据每人持有量*每份应发数量,计算出每人应发总额,发放到该用户的茶宝账户上。
  40. 3)按上述算法,以此计算持有B和持有CDE的用户
  41. */
  42. public static function setSharingFees(){
  43. $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeFees)->select();
  44. if(empty($list)) return true;
  45. $output = new Output();
  46. $wallet = new LedgerWalletModel();
  47. $productOrder = new ProductOrder();
  48. $i = 0;
  49. //茶宝手续费
  50. $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'today')->where('action', 'in', [LedgerTokenChangeModel::Giveaway, LedgerTokenChangeModel::Pledge, LedgerTokenChangeModel::TransferFee])->sum('change_amount'));
  51. //冻结手续费
  52. $frozenFee = abs(LedgerFrozenChangeModel::where('create_time', 'yesterday')->where('action', 'in', [LedgerFrozenChangeModel::Giveaway, LedgerFrozenChangeModel::Pledge, LedgerFrozenChangeModel::TransferFees])->sum('change_amount'));
  53. foreach($list as $item){
  54. //TOKEN产品的持有量
  55. $productHold = $productOrder::getHoldProductNum($item->product_id);
  56. //分润
  57. $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3);
  58. //统计产品总数量
  59. $productNum = array_sum(array_column($productHold, 'num')) ;
  60. //每份产品的分润
  61. $tave = bcdiv($tokenFees, $productNum, 6);
  62. //冻结分润
  63. $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3);
  64. //每份产品的分润
  65. $fave = bcdiv($frozenFees, $productNum, 6);
  66. //$output->writeln('产品:' . $item->product_id . '茶宝分润:' . $tave . ' 手续费账户分润:' . $fave );
  67. foreach ($productHold as $vv) {
  68. //茶宝
  69. $tokenNum = bcmul($vv->num, $tave, 6);
  70. if($tokenNum > 0) {
  71. $wallet->changeWalletAccount($vv->user_id, Asset::TOKEN, $tokenNum , LedgerTokenChangeModel::SharingFees);
  72. $output->writeln('用户:' . $vv->user_id . '茶宝分润:' . $tokenNum );
  73. }
  74. //手续费
  75. $frozenNum = bcmul($vv->num, $fave, 6);
  76. if($frozenNum > 0) {
  77. $wallet->changeWalletAccount($vv->user_id, Asset::FROZEN, $frozenNum , LedgerFrozenChangeModel::SharingFees);
  78. $output->writeln('用户:' . $vv->user_id. ' 手续费账户分润:' . $frozenNum );
  79. }
  80. $i +=1;
  81. }
  82. }
  83. return $i;
  84. }
  85. //存储服务费分润
  86. public static function setSharingPledge(){
  87. $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeStorage)->select();
  88. if(empty($list)) return true;
  89. $teacFee = abs(LedgerTeacChangeModel::whereTime('create_time', 'today')->where('action', LedgerTeacChangeModel::PledgeFee)->sum('change_amount')); //TEAC const PledgeFee = 7; //存储服务费
  90. $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'today')->where('action', LedgerTokenChangeModel::Pledge)->sum('change_amount')); //TOKEN const PledgeFee = 7; //存储服务费
  91. $frozenFee = abs(LedgerFrozenChangeModel::whereTime('create_time', 'today')->where('action', LedgerFrozenChangeModel::Pledge)->sum('change_amount')); //FROZEN const PledgeFee = 7; //存储服务费
  92. $i = 0;
  93. $output = new Output();
  94. $wallet = new LedgerWalletModel();
  95. $productOrder = new ProductOrder();
  96. foreach($list as $item){
  97. //TOKEN产品的持有量
  98. $productHold = $productOrder::getHoldProductNum($item->product_id);
  99. //统计产品总数量
  100. $productNum = array_sum(array_column($productHold, 'num')) ;
  101. //Teac分润
  102. $teacFees = bcmul($teacFee, bcdiv($item->fees, 100, 3), 3);
  103. //每份产品的分润
  104. $tave = bcdiv($teacFees, $productNum, 6);
  105. //TOKEN分润
  106. $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3);
  107. //每份产品的分润
  108. $cave = bcdiv($tokenFees, $productNum, 6);
  109. //冻结分润
  110. $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3);
  111. //每份产品的分润
  112. $fave = bcdiv($frozenFees, $productNum, 6);
  113. //$output->writeln('产品:' . $item->product_id . '茶宝分润:' . $tave . ' 手续费账户分润:' . $fave );
  114. foreach ($productHold as $vv) {
  115. //TEAC
  116. $teacNum = bcmul($vv->num, $tave, 6);
  117. if($teacNum > 0) {
  118. $wallet->changeWalletAccount($vv->user_id, Asset::TEAC, $teacNum , LedgerTokenChangeModel::SharingFees);
  119. $output->writeln('用户:' . $vv->user_id . 'TEAC分润:' . $teacNum );
  120. }
  121. //茶宝
  122. $tokenNum = bcmul($vv->num, $cave, 6);
  123. if($tokenNum > 0) {
  124. $wallet->changeWalletAccount($vv->user_id, Asset::TOKEN, $tokenNum , LedgerTokenChangeModel::SharingFees);
  125. $output->writeln('用户:' . $vv->user_id . '茶宝分润:' . $tokenNum );
  126. }
  127. //手续费
  128. $frozenNum = bcmul($vv->num, $fave, 6);
  129. if($frozenNum > 0) {
  130. $wallet->changeWalletAccount($vv->user_id, Asset::FROZEN, $frozenNum , LedgerFrozenChangeModel::SharingFees);
  131. $output->writeln('用户:' . $vv->user_id. ' 手续费账户分润:' . $frozenNum );
  132. }
  133. $i +=1;
  134. }
  135. }
  136. return $i;
  137. }
  138. }