SharingFees.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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($output);
  30. //存储服务费分润
  31. $pledgeCount = self::setSharingPledge($output);
  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($output){
  43. $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeFees)->select();
  44. if(empty($list)) return true;
  45. $wallet = new LedgerWalletModel();
  46. $productOrder = new ProductOrder();
  47. $i = 0;
  48. //茶宝手续费
  49. $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'yesterday')->where('action', 'in', [LedgerTokenChangeModel::Giveaway, LedgerTokenChangeModel::Pledge, LedgerTokenChangeModel::TransferFee])->sum('change_amount'));
  50. //冻结手续费
  51. $frozenFee = abs(LedgerFrozenChangeModel::where('create_time', 'yesterday')->where('action', 'in', [LedgerFrozenChangeModel::Giveaway, LedgerFrozenChangeModel::Pledge, LedgerFrozenChangeModel::TransferFees])->sum('change_amount'));
  52. foreach($list as $item){
  53. //TOKEN产品的持有量
  54. $productHold = $productOrder::getHoldProductNum($item->product_id);
  55. //分润
  56. $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3);
  57. //统计产品总数量
  58. $productNum = array_sum(array_column($productHold, 'num')) ;
  59. //每份产品的分润
  60. $tave = bcdiv($tokenFees, $productNum, 6);
  61. //冻结分润
  62. $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3);
  63. //每份产品的分润
  64. $fave = bcdiv($frozenFees, $productNum, 6);
  65. //$output->writeln('产品:' . $item->product_id . '茶宝分润:' . $tave . ' 手续费账户分润:' . $fave );
  66. foreach ($productHold as $vv) {
  67. //茶宝
  68. $tokenNum = bcmul($vv->num, $tave, 6);
  69. if($tokenNum > 0) {
  70. $wallet->changeWalletAccount($vv->user_id, Asset::TOKEN, $tokenNum , LedgerTokenChangeModel::SharingFees);
  71. $output->writeln('用户:' . $vv->user_id . '茶宝分润:' . $tokenNum );
  72. }
  73. //手续费
  74. $frozenNum = bcmul($vv->num, $fave, 6);
  75. if($frozenNum > 0) {
  76. $wallet->changeWalletAccount($vv->user_id, Asset::FROZEN, $frozenNum , LedgerFrozenChangeModel::SharingFees);
  77. $output->writeln('用户:' . $vv->user_id. ' 手续费账户分润:' . $frozenNum );
  78. }
  79. $i +=1;
  80. }
  81. }
  82. return $i;
  83. }
  84. //存储服务费分润
  85. public static function setSharingPledge($output){
  86. $list = SharingFeesModel::where(['status'=> SharingFeesModel::Normal])->where('type_id', SharingFeesModel::TypeStorage)->select();
  87. if(empty($list)) return true;
  88. $tokenFee = abs(LedgerTokenChangeModel::whereTime('create_time', 'yesterday')->where('action', LedgerTokenChangeModel::Pledge)->sum('change_amount')); //TOKEN const PledgeFee = 7; //存储服务费
  89. $frozenFee = abs(LedgerFrozenChangeModel::whereTime('create_time', 'yesterday')->where('action', LedgerFrozenChangeModel::Pledge)->sum('change_amount')); //FROZEN const PledgeFee = 7; //存储服务费
  90. $i = 0;
  91. $wallet = new LedgerWalletModel();
  92. $productOrder = new ProductOrder();
  93. foreach($list as $item){
  94. //TOKEN产品的持有量
  95. $productHold = $productOrder::getHoldProductNum($item->product_id);
  96. //统计产品总数量
  97. $productNum = array_sum(array_column($productHold, 'num')) ;
  98. $divided = 0;
  99. //TOKEN分润
  100. $tokenFees = bcmul($tokenFee, bcdiv($item->fees, 100, 3), 3);
  101. //判断最大分润:0不限制
  102. if(!empty($item->max_fees)){
  103. //最大分润
  104. $divided = bcsub($item->max_fees, $item->divided_fees, 6);
  105. if($tokenFees > $divided) $tokenFees = $divided;
  106. }
  107. //每份产品的分润
  108. $cave = bcdiv($tokenFees, $productNum, 6);
  109. //冻结分润
  110. $frozenFees = bcmul($frozenFee, bcdiv($item->fees, 100, 3), 3);
  111. //判断最大分润:0不限制
  112. if($divided > 0){
  113. //最大分润
  114. $divided = bcsub($divided, $tokenFees, 6);
  115. if($frozenFees > $divided) $frozenFees = $divided;
  116. }
  117. //每份产品的分润
  118. $fave = bcdiv($frozenFees, $productNum, 6);
  119. $totalFees = 0; //用户总分润
  120. foreach ($productHold as $vv) {
  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. //用户总分润
  134. $totalFees += bcadd($tokenNum, $frozenNum, 6);
  135. }
  136. //更新分润
  137. if($totalFees > 0) {
  138. $item->divided_fees += $totalFees;
  139. //判断是否到最大分润
  140. if($item->max_fees == $item->divided_fees) $item->status = 0;
  141. $item->save();
  142. $i +=1;
  143. }
  144. }
  145. return $i;
  146. }
  147. }