| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <?php
- namespace App\Http\Controllers;
- use App\Components\AsyncResponse;
- use App\Exceptions\Exception;
- use App\Logistic;
- use App\ReceiveRecord;
- use App\Services\LogisticService;
- use App\Warehouse;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\QueryException;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Gate;
- use Oursdreams\Export\Export;
- class ReceiveRecordController extends Controller
- {
- use AsyncResponse;
- private function query(Request $request, Builder $builder):Builder
- {
- $timeSt = $request->input("record_at_start");
- $timeEn = $request->input("record_at_end");
- $logisticNumber = $request->input("logistic_number");
- $delayed = $request->input("delayed");
- if ($timeSt && $timeEn){
- $builder->whereBetween("record_at",[$timeSt, $timeEn]);
- }else{
- if ($timeSt)$builder->where("record_at",'>=',$timeSt);
- if ($timeEn)$builder->where("record_at",'<=',$timeEn);
- }
- if ($logisticNumber!==null){
- mb_regex_encoding('utf-8');
- $par = array_unique(preg_split('/[,, ]+/u', $logisticNumber));
- if (count($par)!=1) $builder->whereIn("logistic_number",$par);
- else $builder->where("logistic_number",'like',$par[0]."%");
- }
- if ($delayed!==null)$builder->where("delayed",$delayed);
- return $builder;
- }
- public function index(Request $request)
- {
- if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
- $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"])->orderByDesc("record_at");
- $records = $this->query($request,$records);
- $records = $records->get();
- $status = ReceiveRecord::DELAYED;
- return view("rejected.receiveRecord",compact("records","status"));
- }
- public function export(Request $request)
- {
- if(!Gate::allows('退货管理-记录列表')){ return redirect(url('denied')); }
- $records = ReceiveRecord::query()->with(["logistic:id,name","warehouse:id,name"]);
- if ($request->input("checkAllSign",false)){
- $records = $this->query($request,$records);
- }else{
- $numbers = explode(",",$request->input("data",""));
- $records->whereIn("logistic_number",$numbers);
- }
- $list = [];
- foreach ($records->get() as $item){
- $list[] = [
- $item->warehouse->name ?? "未知",
- $item->logistic_number,
- $item->logistic->name ?? '未知',
- $item->record_at,
- ReceiveRecord::DELAYED[$item->delayed],
- ];
- }
- return Export::make(["仓库","快递单号","快递公司","记录时间","延时标记"],$list,"退件记录");
- }
- public function record()
- {
- if(!Gate::allows('退货管理-退件记录')){ return redirect(url('denied')); }
- $warehouses = Warehouse::query()->select("id","name")->get();
- return view("rejected.record",compact("warehouses"));
- }
- public function receive()
- {
- $this->gate("退货管理-退件记录");
- $logisticNumber = \request("logisticNumber");
- $warehouse = \request("warehouse");
- if (!$logisticNumber || !$warehouse)$this->error("非法单号");
- /** @var LogisticService $service */
- $service = app("LogisticService");
- $name = $service->assertExpressCompany($logisticNumber);
- if ($name){
- $logistic = Logistic::query()->select("id","name")->where("name","like","%{$name}%")->first();
- $logisticId = $logistic ? $logistic->id : 0;
- } else $logisticId = 0;
- try {
- $dateTime = now()->toDateTimeString();
- ReceiveRecord::query()->create([
- "logistic_number" => $logisticNumber,
- "logistic_id" => $logisticId,
- "record_at" => $dateTime,
- "warehouse_id" => $warehouse,
- ]);
- $this->success(["recordAt"=>$dateTime,"logistic"=>$logistic->name??"未知"]);
- }catch(QueryException $qe){
- if ($qe->getCode()=='23000')$this->error("unique");
- else $this->error("数据异常");
- }catch (Exception $e){
- $this->error("处理异常");
- }
- }
- }
|