ReceiveRecordController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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\ExpiredException;
  10. use Firebase\JWT\JWT;
  11. use Illuminate\Database\Eloquent\Builder;
  12. use Illuminate\Database\QueryException;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Auth;
  15. use Illuminate\Support\Facades\Cache;
  16. use Illuminate\Support\Facades\Gate;
  17. use Illuminate\Support\Str;
  18. use Oursdreams\Export\Export;
  19. class ReceiveRecordController extends Controller
  20. {
  21. use AsyncResponse;
  22. private function query(Request $request, Builder $builder):Builder
  23. {
  24. $timeSt = $request->input("record_at_start");
  25. $timeEn = $request->input("record_at_end");
  26. $logisticNumber = $request->input("logistic_number");
  27. $delayed = $request->input("delayed");
  28. <<<<<<< HEAD
  29. $logistic = $request->input("logistic_id");
  30. $warehouse = $request->input("warehouse");
  31. if ($timeSt && $timeEn){
  32. $builder->whereBetween("record_at",[$timeSt.':00', $timeEn.':00']);
  33. }else{
  34. if ($timeSt)$builder->where("record_at",'>=',$timeSt.':00');
  35. if ($timeEn)$builder->where("record_at",'<=',$timeEn.':00');
  36. =======
  37. if ($timeSt && $timeEn){
  38. $builder->whereBetween("record_at",[$timeSt, $timeEn]);
  39. }else{
  40. if ($timeSt)$builder->where("record_at",'>=',$timeSt);
  41. if ($timeEn)$builder->where("record_at",'<=',$timeEn);
  42. >>>>>>> b0347ca84d8eeedd9c1ac88b1c55b77c6a0613e8
  43. }
  44. if ($logisticNumber!==null){
  45. mb_regex_encoding('utf-8');
  46. $par = array_unique(preg_split('/[,, ]+/u', $logisticNumber));
  47. if (count($par)!=1) $builder->whereIn("logistic_number",$par);
  48. else $builder->where("logistic_number",'like',$par[0]."%");
  49. }
  50. <<<<<<< HEAD
  51. if ($logistic !== null) {
  52. $builder->whereIn("logistic_id", explode(",",$logistic));
  53. }
  54. if ($warehouse !== null) {
  55. $builder->where("warehouse_id", $warehouse);
  56. }
  57. =======
  58. >>>>>>> b0347ca84d8eeedd9c1ac88b1c55b77c6a0613e8
  59. if ($delayed!==null)$builder->where("delayed",$delayed);
  60. return $builder;
  61. }
  62. public function index(Request $request)
  63. {
  64. if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
  65. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"])->orderByDesc("record_at");
  66. $records = $this->query($request,$records);
  67. $records = $records->paginate($request->input("paginate",50),['*'],'page',$request->input("page",1));
  68. $status = ReceiveRecord::DELAYED;
  69. $paginateParams = $request->input();
  70. <<<<<<< HEAD
  71. $logistics = app('LogisticService')->getSelection();
  72. $warehouses = app('WarehouseService')->getSelection();
  73. return view("rejected.receiveRecord",compact("records","status","paginateParams","logistics","warehouses"));
  74. =======
  75. return view("rejected.receiveRecord",compact("records","status","paginateParams"));
  76. >>>>>>> b0347ca84d8eeedd9c1ac88b1c55b77c6a0613e8
  77. }
  78. public function export(Request $request)
  79. {
  80. if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
  81. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"]);
  82. if ($request->input("checkAllSign",false)){
  83. $records = $this->query($request,$records);
  84. }else{
  85. $numbers = explode(",",$request->input("data",""));
  86. $records->whereIn("logistic_number",$numbers);
  87. }
  88. $list = [];
  89. foreach ($records->get() as $item){
  90. $list[] = [
  91. $item->warehouse->name ?? "未知",
  92. $item->logistic_number,
  93. $item->logistic->name ?? '未知',
  94. $item->record_at,
  95. <<<<<<< HEAD
  96. $item->location_at,
  97. ReceiveRecord::DELAYED[$item->delayed],
  98. ];
  99. }
  100. return Export::make(["仓库","快递单号","快递公司","上传时间","本地记录时间","延时标记"],$list,"退件记录");
  101. =======
  102. ReceiveRecord::DELAYED[$item->delayed],
  103. ];
  104. }
  105. return Export::make(["仓库","快递单号","快递公司","记录时间","延时标记"],$list,"退件记录");
  106. >>>>>>> b0347ca84d8eeedd9c1ac88b1c55b77c6a0613e8
  107. }
  108. public function record()
  109. {
  110. if(!Gate::allows('退货管理-退件记录')){ return redirect(url('denied')); }
  111. $warehouses = Warehouse::query()->select("id","name")->get();
  112. $privateKey = file_get_contents(base_path().'/private.pem');
  113. $jwtToken = app("UserService")->getJWTToken(Auth::user(),$privateKey);
  114. return view("rejected.record",compact("warehouses","jwtToken"));
  115. }
  116. public function refreshToken()
  117. {
  118. $jwtToken = \request()->header("jwtToken");
  119. if (!$jwtToken)$this->error("非法请求");
  120. $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
  121. return file_get_contents(base_path().'/public.pem');
  122. });
  123. $payload = JWT::decode($jwtToken, $publicKey, ['RS256']);
  124. $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
  125. $privateKey = file_get_contents(base_path().'/private.pem');
  126. $jwtToken = app("UserService")->getJWTToken($user,$privateKey);
  127. $this->success($jwtToken);
  128. }
  129. public function receive()
  130. {
  131. $jwtToken = \request()->header("jwtToken");
  132. if (!$jwtToken)$this->error("非法请求");
  133. $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
  134. return file_get_contents(base_path().'/public.pem');
  135. });
  136. try {
  137. $payload = JWT::decode($jwtToken, $publicKey, ['RS256']);
  138. $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
  139. if (!$user)throw new ExpiredException();
  140. Auth::setUser($user);
  141. }catch (ExpiredException $e){
  142. $this->error("认证过期,请保存当前失败记录刷新页面");
  143. }
  144. $this->gate("退货管理-退件记录");
  145. $logisticNumber = \request("logisticNumber");
  146. $warehouse = \request("warehouse");
  147. if (!$logisticNumber || !$warehouse)$this->error("非法单号");
  148. /** @var LogisticService $service */
  149. $service = app("LogisticService");
  150. $name = $service->assertExpressCompany($logisticNumber);
  151. if ($name){
  152. $logistic = Logistic::query()->select("id","name")->where("name","like","%{$name}%")->first();
  153. $logisticId = $logistic ? $logistic->id : 0;
  154. } else $logisticId = 0;
  155. if(str_ends_with($logisticNumber,'_') && str_starts_with($logisticNumber,'JD')){
  156. preg_match_all('/[A-Za-b0-9]+/', $logisticNumber, $codes);
  157. $logisticNumber = $codes[0][0] ?? $logisticNumber;
  158. }
  159. try {
  160. $dateTime = now()->toDateTimeString();
  161. ReceiveRecord::query()->create([
  162. "logistic_number" => $logisticNumber,
  163. "logistic_id" => $logisticId,
  164. "record_at" => $dateTime,
  165. "location_at" => \request("locationAt"),
  166. "warehouse_id" => $warehouse,
  167. "delayed" => 0,
  168. ]);
  169. $this->success(["recordAt"=>$dateTime,"logistic"=>$logistic->name??"未知"]);
  170. }catch(QueryException $qe){
  171. if ($qe->getCode()=='23000')$this->error("unique");
  172. else $this->error("数据异常");
  173. }catch (Exception $e){
  174. $this->error("处理异常");
  175. }
  176. }
  177. }