ReceiveRecordController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 Illuminate\Database\Eloquent\Builder;
  10. use Illuminate\Database\QueryException;
  11. use Illuminate\Http\Request;
  12. use Oursdreams\Export\Export;
  13. class ReceiveRecordController extends Controller
  14. {
  15. use AsyncResponse;
  16. private function query(Request $request, Builder $builder):Builder
  17. {
  18. $timeSt = $request->input("record_at_start");
  19. $timeEn = $request->input("record_at_end");
  20. $logisticNumber = $request->input("logistic_number");
  21. $delayed = $request->input("delayed");
  22. if ($timeSt && $timeEn){
  23. $builder->whereBetween("record_at",[$timeSt, $timeEn]);
  24. }else{
  25. if ($timeSt)$builder->where("record_at",'>=',$timeSt);
  26. if ($timeEn)$builder->where("record_at",'<=',$timeEn);
  27. }
  28. if ($logisticNumber!==null){
  29. mb_regex_encoding('utf-8');
  30. $par = array_unique(preg_split('/[,, ]+/u', $logisticNumber));
  31. if (count($par)!=1) $builder->whereIn("logistic_number",$par);
  32. else $builder->where("logistic_number",'like',$par[0]."%");
  33. }
  34. if ($delayed!==null)$builder->where("delayed",$delayed);
  35. return $builder;
  36. }
  37. public function index(Request $request)
  38. {
  39. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"])->orderByDesc("record_at");
  40. $records = $this->query($request,$records);
  41. $records = $records->get();
  42. $status = ReceiveRecord::DELAYED;
  43. return view("rejected.receiveRecord",compact("records","status"));
  44. }
  45. public function export(Request $request)
  46. {
  47. $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"]);
  48. if ($request->input("checkAllSign",false)){
  49. $records = $this->query($request,$records);
  50. }else{
  51. $numbers = explode(",",$request->input("data",""));
  52. $records->whereIn("logistic_number",$numbers);
  53. }
  54. $list = [];
  55. foreach ($records->get() as $item){
  56. $list[] = [
  57. $item->warehouse->name ?? "未知",
  58. $item->logistic_number,
  59. $item->logistic->name ?? '未知',
  60. $item->record_at,
  61. ReceiveRecord::DELAYED[$item->delayed],
  62. ];
  63. }
  64. return Export::make(["仓库","快递单号","快递公司","记录时间","延时标记"],$list,"退件记录");
  65. }
  66. public function record()
  67. {
  68. $warehouses = Warehouse::query()->select("id","name")->get();
  69. return view("rejected.record",compact("warehouses"));
  70. }
  71. public function receive()
  72. {
  73. $logisticNumber = \request("logisticNumber");
  74. $warehouse = \request("warehouse");
  75. if (!$logisticNumber || !$warehouse)$this->error("非法单号");
  76. /** @var LogisticService $service */
  77. $service = app("LogisticService");
  78. $name = $service->assertExpressCompany($logisticNumber);
  79. if ($name){
  80. $logistic = Logistic::query()->select("id","name")->where("name","like","%{$name}%")->first();
  81. $logisticId = $logistic ? $logistic->id : 0;
  82. } else $logisticId = 0;
  83. try {
  84. $dateTime = now()->toDateTimeString();
  85. ReceiveRecord::query()->create([
  86. "logistic_number" => $logisticNumber,
  87. "logistic_id" => $logisticId,
  88. "record_at" => $dateTime,
  89. "warehouse_id" => $warehouse,
  90. ]);
  91. $this->success(["recordAt"=>$dateTime,"logistic"=>$logistic->name??"未知"]);
  92. }catch(QueryException $qe){
  93. if ($qe->getCode()=='23000')$this->error("unique");
  94. else $this->error("数据异常");
  95. }catch (Exception $e){
  96. $this->error("处理异常");
  97. }
  98. }
  99. }