BindjigouJob.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Job;
  4. use App\Utils\LogUtil;
  5. use Hyperf\AsyncQueue\Job;
  6. use Hyperf\DbConnection\Db;
  7. class BindjigouJob extends Job
  8. {
  9. //日志板块
  10. private const LOG_MODULE = 'BindjigouJob';
  11. public $params;
  12. /**
  13. * 任务执行失败后的重试次数,即最大执行次数为 $maxAttempts+1 次
  14. */
  15. protected int $maxAttempts = 2;
  16. public function __construct($params)
  17. {
  18. // 这里最好是普通数据,不要使用携带 IO 的对象,比如 PDO 对象
  19. $this->params = $params;
  20. }
  21. /**
  22. * Execute the job.
  23. *
  24. * @return void
  25. */
  26. public function handle()
  27. {
  28. //日志统一写入
  29. LogUtil::getInstance('Queues/');//设置日志存入通道
  30. LogUtil::info('开始处理', self::LOG_MODULE, __FUNCTION__, ['params' => $this->params]);
  31. // 根据参数处理具体逻辑
  32. // 通过具体参数获取模型等
  33. // 这里的逻辑会在 ConsumerProcess 进程中执行
  34. // var_dump($this->params);
  35. $res = $this->bindjigou($this->params['user_id'],$this->params['old_jigou_id'],$this->params['new_jigou_id']);
  36. LogUtil::info('处理结果', self::LOG_MODULE, __FUNCTION__,$res);
  37. LogUtil::close();
  38. }
  39. //曾经 答题贡献的分数,用户曾经都要给到新机构
  40. public function bindjigou($user_id,$old_jigou_id,$new_jigou_id){
  41. Db::beginTransaction();
  42. //用户答题记录,都改成现在的机构id
  43. $rs3 = Db::table('user_question_log')->where('user_id',$user_id)->update(['jigou_id'=>$new_jigou_id]);
  44. //重新计算老机构的分
  45. $sum_score = Db::table('user_question_log')->where('jigou_id',$old_jigou_id)->where('is_right',1)->sum('score');
  46. $rs2 = Db::table('vote_jigou')->where('id',$old_jigou_id)->update(['score'=>$sum_score]);
  47. //重新计算新机构的分
  48. $sum_score = Db::table('user_question_log')->where('jigou_id',$new_jigou_id)->where('is_right',1)->sum('score');
  49. $rs1 = Db::table('vote_jigou')->where('id',$new_jigou_id)->update(['score'=>$sum_score]);
  50. Db::commit();
  51. return true;
  52. }
  53. public function bindjigou_old($user_id,$bind_jigou_id){
  54. //机构得分记录
  55. $map = [
  56. ['user_id' , '=' , $user_id],
  57. ['is_right', '=' , 1],
  58. ['jigou_id', '<>', $bind_jigou_id],
  59. ];
  60. $jigou = Db::table('user_question_log')->where($map)->pluck('jigou_id')->toarray();
  61. if(empty($jigou)){
  62. return true;
  63. }
  64. $jigou_data = array_count_values($jigou);
  65. Db::beginTransaction();
  66. //老机构减分。循环不会太多次
  67. foreach($jigou_data as $jigou_id => $times){
  68. $rs1 = Db::table('vote_jigou')->where(['id' => $jigou_id])->decrement('score',$times);
  69. if(!$rs1){
  70. Db::rollBack();
  71. return false;
  72. }
  73. }
  74. //新机构加分
  75. $rs2 = Db::table('vote_jigou')->where(['id' => $bind_jigou_id])->increment('score',count($jigou));
  76. if(!$rs2){
  77. Db::rollBack();
  78. return false;
  79. }
  80. //用户答题记录,都改成现在的机构id
  81. $rs3 = Db::table('user_question_log')->where(['user_id' => $user_id])->update(['jigou_id'=>$bind_jigou_id]);
  82. if(!$rs3){
  83. Db::rollBack();
  84. return false;
  85. }
  86. Db::commit();
  87. return true;
  88. }
  89. }