DelayUnfrozen.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace addons\Agent\common\logic\reward;
  3. use addons\Agent\common\enums\AgentEnum;
  4. use addons\Agent\common\enums\ComputingEnum;
  5. use addons\Agent\common\models\Agent;
  6. use addons\Agent\common\models\AgentDelayLog;
  7. use common\models\common\CapitalLog;
  8. use common\models\user\DigitalLog;
  9. use common\models\user\UserDigital;
  10. use services\common\UserWalletService;
  11. /**
  12. * TODO: 渠道分红延时结算
  13. * Class DelayUnfrozen
  14. */
  15. class DelayUnfrozen
  16. {
  17. /**
  18. * 执行延时结算队列任务
  19. * @param array $data
  20. * @return true|void
  21. */
  22. public function handle(array $data)
  23. {
  24. if (empty($data) || empty($data['source_table_ids'])) return true;
  25. $capital_types = [
  26. ComputingEnum::TEAM_PRIZE,
  27. ComputingEnum::EXTRA_PRIZE,
  28. ComputingEnum::OVER_PRIZE,
  29. ComputingEnum::EQUAL_PRIZE,
  30. ComputingEnum::EXTRA_EQUAL_PRIZE_1,
  31. ComputingEnum::EXTRA_EQUAL_PRIZE_2,
  32. ComputingEnum::DRAINAGE_SUBSIDY_PRIZE,
  33. ComputingEnum::TEAM_SUBSIDY_PRIZE,
  34. ComputingEnum::AGENT_DISTRIBUTION_REWARD,
  35. ComputingEnum::MANAGE_PRIZE,
  36. ComputingEnum::DIFF_PARENT,
  37. ComputingEnum::DIFF_AREA_COMMISSION,
  38. ComputingEnum::DIFF_USER,
  39. ComputingEnum::EQUAL_UPGRADE,
  40. ];
  41. $where = [
  42. ['source_table' => 'order_detail'],
  43. ['source_table_id' => $data['source_table_ids']],
  44. ['from_type' => AgentEnum::ADDONS_NAME],
  45. ['capital_type' => $capital_types]
  46. ];
  47. //佣金
  48. $wallet_type = 'commission';
  49. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  50. $commission_list = CapitalLog::lists(['where' => array_merge($where, [['status' => CapitalLog::STATUS_WAIT_SEND]])]);
  51. if ($commission_list) {
  52. foreach ($commission_list as $item) {
  53. UserWalletService::unfrozen($item['id'], $wallet_type);
  54. try {
  55. $distribution = Agent::findOne(['user_id' => $item['user_id']]);
  56. $field = 'total_' . $wallet_type;
  57. $distribution->$field += -$item['change_num'];
  58. $distribution->save();
  59. }catch (\Exception $e){
  60. \Yii::error('延时结算代理商分红累计佣金增加失败,ID:'. $item['id'] .',USER_ID: '. $item['user_id'].',原因:'. $e->getMessage());
  61. }
  62. }
  63. }
  64. //积分
  65. $wallet_type = 'score';
  66. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  67. $score_list = CapitalLog::lists(['where' => array_merge($where, [['status' => CapitalLog::STATUS_WAIT_SEND]])]);
  68. if ($score_list) {
  69. foreach ($score_list as $item) {
  70. UserWalletService::unfrozen($item['id'], $wallet_type);
  71. try {
  72. $distribution = Agent::findOne(['user_id' => $item['user_id']]);
  73. $field = 'total_' . $wallet_type;
  74. $distribution->$field += -$item['change_num'];
  75. $distribution->save();
  76. }catch (\Exception $e){
  77. \Yii::error('延时结算代理商分红累计佣金增加失败,ID:'. $item['id'] .',USER_ID: '. $item['user_id'].',原因:'. $e->getMessage());
  78. }
  79. }
  80. }
  81. //数字币
  82. $digital_list = DigitalLog::lists(['where' => array_merge($where, [['status' => CapitalLog::STATUS_SEND], ['send_status' => DigitalLog::SEND_STATUS_FROZEN]])]);
  83. if ($digital_list) {
  84. foreach ($digital_list as $item) {
  85. UserDigital::unfrozen($item['id']);
  86. }
  87. }
  88. // 更新延时结算日志状态
  89. if (!empty($data['mall_id']) && !empty($data['order_no'])) {
  90. try {
  91. AgentDelayLog::updateAll(['status' => CapitalLog::STATUS_SEND, 'agented_at' => time()], ['mall_id' => $data['mall_id'], 'order_no' => $data['order_no'], 'status' => CapitalLog::STATUS_WAIT_SEND]);
  92. }catch (\Exception $e){
  93. return false;
  94. }
  95. }
  96. }
  97. /**
  98. * 写入延时结算任务
  99. * @param int $sec
  100. * @param array $order_detail_ids // 结算订单详情ids
  101. * @param array $logs_data // 延时结算日志数据
  102. * @return bool
  103. */
  104. public static function task(int $sec = 0, array $queue_data = [], array $logs_data = [])
  105. {
  106. if (empty($queue_data['source_table_ids'])) return true;
  107. try {
  108. // 写入延时结算日志
  109. AgentDelayLog::batchSave($logs_data);
  110. // 加入延时队列执行
  111. \Yii::$app->services->rabbitMq->delay($sec, $queue_data, self::class, 'handle');
  112. return true;
  113. }catch (\Exception $e){
  114. return true;
  115. }
  116. }
  117. }