visuddhinanda hace 2 años
padre
commit
f9c97dfa1d
Se han modificado 1 ficheros con 304 adiciones y 0 borrados
  1. 304 0
      app/Http/Controllers/TermExportController.php

+ 304 - 0
app/Http/Controllers/TermExportController.php

@@ -0,0 +1,304 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\DhammaTerm;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+
+use App\Http\Api\AuthApi;
+use App\Http\Api\StudioApi;
+use App\Http\Api\ChannelApi;
+use App\Http\Api\ShareApi;
+use App\Tools\Tools;
+
+class TermExportController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index(Request $request)
+    {
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+//TODO 判断是否有导出权限
+        switch ($request->get("view")) {
+            case 'channel':
+                # code...
+                $rows = DhammaTerm::where('channal',$request->get("id"))->cursor();
+                break;
+            case 'studio':
+                # code...
+                $studioId = StudioApi::getIdByName($request->get("name"));
+                $rows = DhammaTerm::where('owner',$studioId)->cursor();
+                break;
+            default:
+                $this->error('no view');
+                break;
+        }
+
+        $spreadsheet = new Spreadsheet();
+        $activeWorksheet = $spreadsheet->getActiveSheet();
+        $activeWorksheet->setCellValue('A1', 'id');
+        $activeWorksheet->setCellValue('B1', 'word');
+        $activeWorksheet->setCellValue('C1', 'meaning');
+        $activeWorksheet->setCellValue('D1', 'other_meaning');
+        $activeWorksheet->setCellValue('E1', 'note');
+        $activeWorksheet->setCellValue('F1', 'tag');
+        $activeWorksheet->setCellValue('G1', 'language');
+        $activeWorksheet->setCellValue('H1', 'channel_id');
+
+        $currLine = 2;
+        foreach ($rows as $key => $row) {
+            # code...
+            $activeWorksheet->setCellValue("A{$currLine}", $row->guid);
+            $activeWorksheet->setCellValue("B{$currLine}", $row->word);
+            $activeWorksheet->setCellValue("C{$currLine}", $row->meaning);
+            $activeWorksheet->setCellValue("D{$currLine}", $row->other_meaning);
+            $activeWorksheet->setCellValue("E{$currLine}", $row->note);
+            $activeWorksheet->setCellValue("F{$currLine}", $row->tag);
+            $activeWorksheet->setCellValue("G{$currLine}", $row->language);
+            $activeWorksheet->setCellValue("H{$currLine}", $row->channal);
+            $currLine++;
+        }
+        $writer = new Xlsx($spreadsheet);
+        $fId = Str::uuid();
+        $filename = storage_path("app/tmp/{$fId}");
+        $writer->save($filename);
+        $key = "download/tmp/{$fId}";
+        Redis::set($key,file_get_contents($filename));
+        Redis::expire($key,300);
+        unlink($filename);
+        return $this->ok(['uuid'=>$fId,'filename'=>"term.xlsx",'type'=>"application/vnd.ms-excel"]);
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  string  $downloadId
+     * @return \Illuminate\Http\Response
+     */
+    public function show(string $downloadId)
+    {
+        header('Content-Type: application/vnd.ms-excel');
+        header('Content-Disposition: attachment; filename="term.xlsx"');
+        $content = Redis::get("download/tmp/{$downloadId}");
+        file_put_contents("php://output",$content);
+    }
+
+    public function import(Request $request){
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'),401,401);
+        }
+        /**
+         * 判断是否有权限
+         */
+        switch ($request->get('view')) {
+            case 'channel':
+                # 向channel里面导入,忽略源数据的channel id 和 owner 都设置为这个channel 的
+                $channel = ChannelApi::getById($request->get('id'));
+                $owner_id = $channel['studio_id'];
+                if($owner_id !== $user["user_uid"]){
+                    //判断是否为协作
+                    $power = ShareApi::getResPower($user["user_uid"],$request->get('id'));
+                    if($power<20){
+                        return $this->error(__('auth.failed'),403,403);
+                    }
+                }
+                $language = $channel['lang'];
+                break;
+            case 'studio':
+                # 向 studio 里面导入,忽略源数据的 owner 但是要检测 channel id 是否有权限
+                $owner_id = StudioApi::getIdByName($request->get('name'));
+                if(!$owner_id){
+                    return $this->error('no studio name',403,403);
+                }
+
+                break;
+        }
+
+        $message = "";
+        $filename = $request->get('filename');
+        if(Storage::missing($filename)){
+            return $this->error('no file '.$filename);
+        }
+        $contents = Storage::get($filename);
+        $fId = Str::uuid();
+        $tmpFile = storage_path("app/tmp/{$fId}.xlsx");
+        $ok = file_put_contents($tmpFile,$contents);
+        if($ok===false){
+            return $this->error('create tmp file fail '.$tmpFile,500,500);
+        }
+        $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
+        $reader->setReadDataOnly(true);
+        $spreadsheet = $reader->load($tmpFile);
+        $activeWorksheet = $spreadsheet->getActiveSheet();
+        $currLine = 2;
+        $countFail = 0;
+
+        do {
+            # code...
+            $id = $activeWorksheet->getCell("A{$currLine}")->getValue();
+            $word = $activeWorksheet->getCell("B{$currLine}")->getValue();
+            $meaning = $activeWorksheet->getCell("C{$currLine}")->getValue();
+            $other_meaning = $activeWorksheet->getCell("D{$currLine}")->getValue();
+            $note = $activeWorksheet->getCell("E{$currLine}")->getValue();
+            $tag = $activeWorksheet->getCell("F{$currLine}")->getValue();
+            $language = $activeWorksheet->getCell("G{$currLine}")->getValue();
+            $channel_id = $activeWorksheet->getCell("H{$currLine}")->getValue();
+            $query = ['word'=>$word,'tag'=>$tag];
+            $channelId = null;
+            switch ($request->get('view')) {
+                case 'channel':
+                    # 向channel里面导入,忽略源数据的channel id 和 owner 都设置为这个channel 的
+                    $query['channal'] = $request->get('id');
+                    $channelId = $request->get('id');
+                    break;
+                case 'studio':
+                    # 向 studio 里面导入,忽略源数据的owner 但是要检测 channel id 是否有权限
+                    $query['owner'] = $owner_id;
+                    if(!empty($channel_id)){
+
+                        //有channel 数据,查看是否在studio中
+                        $channel = ChannelApi::getById($channel_id);
+                        if($channel === false){
+                            $message .= "没有查到版本信息:{$channel_id} - {$word}\n";
+                            $currLine++;
+                            $countFail++;
+                            continue 2;
+                        }
+                        if($owner_id != $channel['studio_id']){
+                            $message .= "版本不在studio中:{$channel_id} - {$word}\n";
+                            $currLine++;
+                            $countFail++;
+                            continue 2;
+                        }
+                        $query['channal'] = $channel_id;
+                        $channelId = $channel_id;
+                    }
+                    # code...
+                    break;
+            }
+
+            if(empty($id) && empty($word)){
+                break;
+            }
+
+            //查询此id是否有旧数据
+            if(!empty($id)){
+                $oldRow = DhammaTerm::find($id);
+                //TODO 有 id 无 word 删除数据
+                if(empty($word)){
+                    //查看权限
+                    if($oldRow->owner !== $user['user_uid']){
+                        if(!empty($oldRow->channal)){
+                            //看是否为协作
+                            $power = ShareApi::getResPower($user['user_uid'],$oldRow->channal);
+                            if($power < 20){
+                                $message .= "无删除权限:{$id} - {$word}\n";
+                                $currLine++;
+                                $countFail++;
+                                continue;
+                            }
+                        }else{
+                            $message .= "无删除权限:{$id} - {$word}\n";
+                            $currLine++;
+                            $countFail++;
+                            continue;
+                        }
+                    }
+                    //删除
+                    $oldRow->delete();
+                    $currLine++;
+                    continue;
+                }
+            }else{
+                $oldRow = null;
+            }
+            //查询是否跟已有数据重复
+            $row = DhammaTerm::where($query)->first();
+            if(!$row){
+                //不重复
+                if(isset($oldRow) && $oldRow){
+                    //找到旧的记录-修改旧数据
+                    $row = $oldRow;
+                }else{
+                    //没找到旧的记录-新建
+                    $row = new DhammaTerm();
+                    $row->id = app('snowflake')->id();
+                    $row->guid = Str::uuid();
+                    $row->word = $word;
+                    $row->create_time = time()*1000;
+                }
+            }else{
+                //重复-如果与旧的id不同,报错
+                if(isset($oldRow) && $oldRow && $row->guid !== $id){
+                    $message .= "重复的数据:{$id} - {$word}\n";
+                    $currLine++;
+                    $countFail++;
+                    continue;
+                }
+            }
+            $row->word = $word;
+            $row->word_en = Tools::getWordEn($word);
+            $row->meaning = $meaning;
+            $row->other_meaning = $other_meaning;
+            $row->note = $note;
+            $row->tag = $tag;
+            $row->language = $language;
+            $row->channal = $channelId;
+            $row->editor_id = $user['user_id'];
+            $row->owner = $owner_id;
+            $row->modify_time = time()*1000;
+            $row->save();
+
+            $currLine++;
+        } while (true);
+        unlink($tmpFile);
+        return $this->ok(["success"=>$currLine-2-$countFail,'fail'=>($countFail)],$message);
+    }
+
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Models\DhammaTerm  $dhammaTerm
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, DhammaTerm $dhammaTerm)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\DhammaTerm  $dhammaTerm
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(DhammaTerm $dhammaTerm)
+    {
+        //
+    }
+}