ReceiveRecordController.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\Exceptions\Exception;
  5. use App\Logistic;
  6. use App\ReceiveRecord;
  7. use App\Services\LogisticService;
  8. use App\Warehouse;
  9. use Firebase\JWT\JWT;
  10. use Illuminate\Database\Eloquent\Builder;
  11. use Illuminate\Database\QueryException;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Auth;
  14. use Illuminate\Support\Facades\Cache;
  15. use Illuminate\Support\Facades\Gate;
  16. use Oursdreams\Export\Export;
  17. class ReceiveRecordController extends Controller
  18. {
  19. use AsyncResponse;
  20. private function query(Request $request, Builder $builder):Builder
  21. {
  22. $timeSt = $request->input("record_at_start");
  23. $timeEn = $request->input("record_at_end");
  24. $logisticNumber = $request->input("logistic_number");
  25. $delayed = $request->input("delayed");
  26. if ($timeSt && $timeEn){
  27. $builder->whereBetween("record_at",[$timeSt, $timeEn]);
  28. }else{
  29. if ($timeSt)$builder->where("record_at",'>=',$timeSt);
  30. if ($timeEn)$builder->where("record_at",'<=',$timeEn);
  31. }
  32. if ($logisticNumber!==null){
  33. mb_regex_encoding('utf-8');
  34. $par = array_unique(preg_split('/[,, ]+/u', $logisticNumber));
  35. if (count($par)!=1) $builder->whereIn("logistic_number",$par);
  36. else $builder->where("logistic_number",'like',$par[0]."%");
  37. }
  38. if ($delayed!==null)$builder->where("delayed",$delayed);
  39. return $builder;
  40. }
  41. public function index(Request $request)
  42. {
  43. if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
  44. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"])->orderByDesc("record_at");
  45. $records = $this->query($request,$records);
  46. $records = $records->paginate($request->input("paginate",50),['*'],'page',$request->input("page",1));
  47. $status = ReceiveRecord::DELAYED;
  48. $paginateParams = $request->input();
  49. return view("rejected.receiveRecord",compact("records","status","paginateParams"));
  50. }
  51. public function export(Request $request)
  52. {
  53. if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
  54. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"]);
  55. if ($request->input("checkAllSign",false)){
  56. $records = $this->query($request,$records);
  57. }else{
  58. $numbers = explode(",",$request->input("data",""));
  59. $records->whereIn("logistic_number",$numbers);
  60. }
  61. $list = [];
  62. foreach ($records->get() as $item){
  63. $list[] = [
  64. $item->warehouse->name ?? "未知",
  65. $item->logistic_number,
  66. $item->logistic->name ?? '未知',
  67. $item->record_at,
  68. ReceiveRecord::DELAYED[$item->delayed],
  69. ];
  70. }
  71. return Export::make(["仓库","快递单号","快递公司","记录时间","延时标记"],$list,"退件记录");
  72. }
  73. public function record()
  74. {
  75. if(!Gate::allows('退货管理-退件记录')){ return redirect(url('denied')); }
  76. $warehouses = Warehouse::query()->select("id","name")->get();
  77. $privateKey = file_get_contents(base_path().'/private.pem');
  78. $jwtToken = app("UserService")->getJWTToken(Auth::user(),$privateKey);
  79. return view("rejected.record",compact("warehouses","jwtToken"));
  80. }
  81. public function receive()
  82. {
  83. $jwtToken = \request()->header("jwtToken");
  84. if (!$jwtToken)$this->error("非法请求");
  85. $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
  86. return file_get_contents(base_path().'/public.pem');
  87. });
  88. $payload = JWT::decode($jwtToken, $publicKey, ['RS256']);
  89. $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
  90. if (!$user)$this->error("登录过期");
  91. Auth::setUser($user);
  92. $this->gate("退货管理-退件记录");
  93. $logisticNumber = \request("logisticNumber");
  94. $warehouse = \request("warehouse");
  95. if (!$logisticNumber || !$warehouse)$this->error("非法单号");
  96. /** @var LogisticService $service */
  97. $service = app("LogisticService");
  98. $name = $service->assertExpressCompany($logisticNumber);
  99. if ($name){
  100. $logistic = Logistic::query()->select("id","name")->where("name","like","%{$name}%")->first();
  101. $logisticId = $logistic ? $logistic->id : 0;
  102. } else $logisticId = 0;
  103. try {
  104. $dateTime = now()->toDateTimeString();
  105. ReceiveRecord::query()->create([
  106. "logistic_number" => $logisticNumber,
  107. "logistic_id" => $logisticId,
  108. "record_at" => $dateTime,
  109. "warehouse_id" => $warehouse,
  110. ]);
  111. $this->success(["recordAt"=>$dateTime,"logistic"=>$logistic->name??"未知"]);
  112. }catch(QueryException $qe){
  113. if ($qe->getCode()=='23000')$this->error("unique");
  114. else $this->error("数据异常");
  115. }catch (Exception $e){
  116. $this->error("处理异常");
  117. }
  118. }
  119. }