CommissionIncrController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace console\controllers;
  3. use common\enums\RedisKeyEnum;
  4. use common\enums\StatusEnum;
  5. use common\helpers\LockHelper;
  6. use common\models\common\CommissionIncrementLog;
  7. use common\models\mall\Mall;
  8. use common\models\user\UserWallet;
  9. use services\common\UserWalletService;
  10. use yii\console\Controller;
  11. use yii\console\ExitCode;
  12. class CommissionIncrController extends Controller
  13. {
  14. /**
  15. * 收益增值服务
  16. * @desc 每天0点执行一次
  17. * @return int
  18. */
  19. public function actionIndex()
  20. {
  21. try{
  22. echo '增值服务,start:';
  23. \Yii::$app->db->close();
  24. $lock_key = RedisKeyEnum::suffix('lock_commission_incr_');
  25. $identification = uniqid();
  26. if (!LockHelper::lock($lock_key, $identification, 300, 10)) throw new \Exception('收益增值服务进入处理阶段,当前访问过多');
  27. $mall_list = Mall::getEnableMallList(true);
  28. $mall_ids = array_column($mall_list, 'id');
  29. if (empty($mall_ids)) {
  30. echo '没有可用商城,不做处理 ... ' . PHP_EOL;
  31. return ExitCode::UNSPECIFIED_ERROR;
  32. }
  33. $today_start_time = strtotime(date('Y-m-d'));
  34. foreach ($mall_ids as $mall_id) {
  35. $exist = CommissionIncrementLog::find()->where(['mall_id' => $mall_id, 'wallet_type' => 'commission','status' => StatusEnum::ENABLED])->andWhere(['>', 'created_at', $today_start_time])->one();
  36. if($exist) continue;
  37. //查询商城设置
  38. $setting = \Yii::$app->services->setting->mall->get($mall_id, 'withdraw_income');
  39. $is_enable_income_increment = $setting['is_enable_income_increment'] ?? 0;
  40. $income_increment = $setting['income_increment'] ?? 0;
  41. //添加记录
  42. $incr_log = CommissionIncrementLog::setData([
  43. 'mall_id' => $mall_id,
  44. 'wallet_type' => 'commission',
  45. 'enable' => $is_enable_income_increment,
  46. 'radio' => $income_increment,
  47. ]);
  48. if(!$is_enable_income_increment || !$income_increment){
  49. continue;
  50. }
  51. //执行增值服务
  52. $incr_log_id = $incr_log->id;
  53. $this->increment($mall_id,$income_increment, $incr_log_id);
  54. }
  55. LockHelper::uLock($lock_key,$identification);
  56. return ExitCode::OK;
  57. }catch (\Exception $e){
  58. return ExitCode::UNSPECIFIED_ERROR;
  59. }
  60. }
  61. private function increment($mall_id,$radio, $incr_log_id)
  62. {
  63. //查询所有用户
  64. $query = UserWallet::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->andWhere(['>', 'commission', 0]);;
  65. $total = $total_user_num = 0;
  66. foreach ($query->batch(200) as $list) {
  67. $insert_wallet = [];
  68. foreach ($list as $item) {
  69. $user_commission = $item['commission'] ?? 0;
  70. $incr = bcmul($user_commission, $radio / 100, 2);
  71. //除以365
  72. $incr = bcdiv($incr, 365, 2);
  73. if ($incr < 0.01) continue;
  74. $insert_wallet[] = [
  75. 'is_frozen' => false,
  76. 'user_id' => $item['user_id'],
  77. 'mall_id' => $mall_id,
  78. 'order_id' => 0,
  79. 'wallet_type' => 'commission',
  80. 'money' => $incr,
  81. 'source_table' => CommissionIncrementLog::tableName(),
  82. 'source_table_id' => $incr_log_id,
  83. 'from_type' => 'PromotionCenter',
  84. 'capital_type' => 'day_increment',
  85. 'order_no' => '',
  86. 'desc' => '用户当前持有的收益增值',
  87. ];
  88. $total = bcadd($total, $incr, 2);
  89. $total_user_num++;
  90. }
  91. if($insert_wallet){
  92. $res = UserWalletService::batchHandle($insert_wallet);
  93. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  94. }
  95. }
  96. CommissionIncrementLog::updateAll(['send_num' => $total, 'send_user_num' => $total_user_num], ['id' => $incr_log_id]);
  97. }
  98. }