IndentNumServer.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. namespace App\Servers;
  3. use App\Events\NumEvent;
  4. use App\Jobs\IndentNumJob;
  5. use App\Models\IndentNum;
  6. use App\Models\Menu;
  7. use App\Models\MenuUrl;
  8. use App\Models\Permission;
  9. use App\Models\Role;
  10. use App\Models\RolePermission;
  11. use App\Models\User;
  12. use Illuminate\Support\Facades\DB;
  13. use Illuminate\Support\Facades\Redis;
  14. /**
  15. * Redis数据缓存类
  16. */
  17. class IndentNumServer
  18. {
  19. /**
  20. * 单列对象
  21. * @var
  22. */
  23. static $server;
  24. private $key_name = 'ac_num';
  25. private $max_num;
  26. private function __construct()
  27. {
  28. $this->max_num=env('CODE_NUM_LENGTH',100);
  29. }
  30. /**
  31. * 创建对象
  32. * @return IndentNumServer
  33. */
  34. static function creatServer()
  35. {
  36. if (empty(self::$server)) {
  37. self::$server = new IndentNumServer();
  38. }
  39. return self::$server;
  40. }
  41. /**
  42. * 获取最新编号
  43. * @param $type
  44. * @param int $length
  45. * @return string
  46. */
  47. function getIndentNum($type, $length = 0)
  48. {
  49. $redis_name = $this->key_name . '_' . $type;
  50. // event(new NumEvent($type));
  51. $row=RedisDataServer::creatServer()->getData($redis_name.'_data','json');
  52. if(empty($row)){
  53. $row = IndentNum::where('type', $type)->first()->toArray();
  54. }
  55. IndentNumJob::dispatch($type)->onConnection('redis')->onQueue('indent_num');
  56. $redis_data = RedisDataServer::creatServer()->getWaitQueue($redis_name,2);
  57. $redis_num=empty($redis_data[1])?false:$redis_data[1];
  58. $row['digits'] = $length > 0 ? $length : $row['digits'];
  59. $date = date("Ymd");
  60. if (!$redis_num) {
  61. if ($row['is_date'] == 1) {
  62. $num = sprintf("%0{$row['digits']}s", $row['number'] + 1);
  63. $new_cod = $date . $num;
  64. } else {
  65. $new_cod = sprintf("%0{$row['digits']}s", $row['number'] + 1);
  66. }
  67. } else {
  68. if ($row['is_date'] == 1) {
  69. $num = sprintf("%0{$row['digits']}s", $redis_num);
  70. $new_cod = $date . $num;
  71. } else {
  72. $new_cod = sprintf("%0{$row['digits']}s", $redis_num);
  73. }
  74. }
  75. ++ $row['number'];
  76. RedisDataServer::creatServer()->setData($redis_name.'_data',$row,'json',60);
  77. IndentNum::where('id',$row['id'])->increment('number');
  78. return $row['code_str'] . $new_cod;
  79. }
  80. function getIndentNumTwo($type, $length = 0)
  81. {
  82. $redis_name = $this->key_name . '_' . $type;
  83. // event(new NumEvent($type));
  84. $row=RedisDataServer::creatServer()->getData($redis_name.'_data','json');
  85. if(empty($row)){
  86. $row = IndentNum::where('type', $type)->first()->toArray();
  87. }
  88. $redis_num=$row['number']+1;
  89. RedisDataServer::creatServer()->setData($redis_name.'_data',$row,'json',60);
  90. $row['digits'] = $length > 0 ? $length : $row['digits'];
  91. $date = date("Ymd");
  92. if (!$redis_num) {
  93. if ($row['is_date'] == 1) {
  94. $num = sprintf("%0{$row['digits']}s", $row['number'] + 1);
  95. $new_cod = $date . $num;
  96. } else {
  97. $new_cod = sprintf("%0{$row['digits']}s", $row['number'] + 1);
  98. }
  99. } else {
  100. if ($row['is_date'] == 1) {
  101. $num = sprintf("%0{$row['digits']}s", $redis_num);
  102. $new_cod = $date . $num;
  103. } else {
  104. $new_cod = sprintf("%0{$row['digits']}s", $redis_num);
  105. }
  106. }
  107. IndentNum::where('id',$row['id'])->increment('number');
  108. return $row['code_str'] . $new_cod;
  109. }
  110. /**
  111. * 验证队列的数据并自动生成
  112. * @param $type
  113. */
  114. function verifyNum($type)
  115. {
  116. $redis_name = $this->key_name . '_' . $type;
  117. $key_num = RedisDataServer::creatServer()->getQueueList($redis_name);
  118. if ($key_num <35) {
  119. //开启事务,并启动悲观锁
  120. DB::beginTransaction();
  121. $row = IndentNum::where('type', $type)->select(['id','number','max_num'])->lockForUpdate()->first();
  122. $max_num = $row->{'number'} > $row->{'max_num'} ? $row->{'number'} : $row->{'max_num'};
  123. $num_arr=range($max_num+1,$max_num+100);
  124. // $num_arr=array_reverse($num_arr);
  125. RedisDataServer::creatServer()->addQueue($redis_name,$num_arr);
  126. IndentNum::where('id',$row->{'id'})->update(['max_num'=>$max_num+100]);
  127. DB::commit();
  128. }
  129. }
  130. }