| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?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 Firebase\JWT\ExpiredException;
- use Firebase\JWT\JWT;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\QueryException;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\Gate;
- use Illuminate\Support\Str;
- 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");
- $logistic = $request->input("logistic_id");
- $warehouse = $request->input("warehouse");
- if ($timeSt && $timeEn){
- $builder->where(function ($query) use($timeSt, $timeEn) {
- /** @var Builder $query */
- $query->whereBetween("record_at",[$timeSt.':00', $timeEn.':00'])
- ->orWhereBetween("location_at",[$timeSt.':00', $timeEn.':00']);
- });
- }else{
- if ($timeSt){
- $builder->where(function ($query) use($timeSt) {
- /** @var Builder $query */
- $query->where("record_at",'>=',$timeSt.':00')
- ->orWhere("location_at",'>=',$timeSt.':00');
- });
- }
- if ($timeEn) {
- $builder->where(function ($query) use($timeEn) {
- /** @var Builder $query */
- $query->where("record_at",'<=',$timeEn.':00')
- ->orWhere("location_at",'<=',$timeEn.':00');
- });
- }
- }
- 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 ($logistic !== null) {
- $builder->whereIn("logistic_id", explode(",",$logistic));
- }
- if ($warehouse !== null) {
- $builder->where("warehouse_id", $warehouse);
- }
- 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->paginate($request->input("paginate",50),['*'],'page',$request->input("page",1));
- $status = ReceiveRecord::DELAYED;
- $paginateParams = $request->input();
- $logistics = app('LogisticService')->getSelection();
- $warehouses = app('WarehouseService')->getSelection();
- return view("rejected.receiveRecord",compact("records","status","paginateParams","logistics","warehouses"));
- }
- 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,
- $item->location_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();
- $privateKey = file_get_contents(base_path().'/private.pem');
- $jwtToken = app("UserService")->getJWTToken(Auth::user(),$privateKey);
- return view("rejected.record",compact("warehouses","jwtToken"));
- }
- public function refreshToken()
- {
- $jwtToken = \request()->header("jwtToken");
- if (!$jwtToken)$this->error("非法请求");
- $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
- return file_get_contents(base_path().'/public.pem');
- });
- $payload = JWT::decode($jwtToken, $publicKey, ['RS256']);
- $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
- $privateKey = file_get_contents(base_path().'/private.pem');
- $jwtToken = app("UserService")->getJWTToken($user,$privateKey);
- $this->success($jwtToken);
- }
- public function receive()
- {
- $jwtToken = \request()->header("jwtToken");
- if (!$jwtToken)$this->error("非法请求");
- $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
- return file_get_contents(base_path().'/public.pem');
- });
- try {
- $payload = JWT::decode($jwtToken, $publicKey, ['RS256']);
- $user = app("UserService")->getOrRefreshCache($payload->data->id,$payload->exp);
- if (!$user)throw new ExpiredException();
- Auth::setUser($user);
- }catch (ExpiredException $e){
- $this->error("认证过期,请保存当前失败记录刷新页面");
- }
- $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;
- if(str_ends_with($logisticNumber,'_') && str_starts_with($logisticNumber,'JD')){
- preg_match_all('/[A-Za-b0-9]+/', $logisticNumber, $codes);
- $logisticNumber = $codes[0][0] ?? $logisticNumber;
- }
- try {
- $dateTime = now()->toDateTimeString();
- ReceiveRecord::query()->create([
- "logistic_number" => $logisticNumber,
- "logistic_id" => $logisticId,
- "record_at" => $dateTime,
- "location_at" => \request("locationAt"),
- "warehouse_id" => $warehouse,
- "delayed" => 0,
- ]);
- $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("处理异常");
- }
- }
- }
|