Ver código fonte

对快递模板进行修改

ajun 4 anos atrás
pai
commit
1c90cd8bca

+ 4 - 0
app/Http/Controllers/PrintController.php

@@ -50,4 +50,8 @@ class PrintController extends Controller
         return ['success' => true, 'data' => $item];
     }
 
+    public function updatePrintCountApi(Request $request)
+    {
+
+    }
 }

+ 3 - 7
app/Http/Controllers/PrintTemplateController.php

@@ -22,17 +22,14 @@ class PrintTemplateController extends Controller
         }])->paginate($request['paginate'] ?? 50);
         $owners = Owner::query()->get();
         $logistics = Logistic::query()->get();
-        $delivery_interface = OwnerLogisticPrintTemplate::$enums['delivery_interface'];
-        $delivery_interfaces = array_chunk($delivery_interface,count($delivery_interface) / 2)  ;
-        $delivery_interfaces = array_values($delivery_interfaces[1]);
-        return view('/maintenance/expressPrinting/template/index', compact('templates','owners','logistics','delivery_interfaces'));
+        return view('maintenance.expressPrinting.template.index', compact('templates','owners','logistics','delivery_interfaces'));
     }
 
     public function create(PrintTemplateService $service)
     {
         $printParts = $service->getParts();
         $printPartImages = PrintPartImage::query()->with('file')->get();
-        return view('/maintenance/expressPrinting/template/create', compact('printParts', 'printPartImages'));
+        return view('maintenance.expressPrinting.template.create', compact('printParts', 'printPartImages'));
     }
 
     public function edit($id,PrintTemplateService $service)
@@ -71,9 +68,8 @@ class PrintTemplateController extends Controller
 
     public function saveRelationApi(Request $request,PrintTemplateService $service): array
     {
-        $data = $request->only(['owner_id','logistic_id','print_template_id','delivery_interface']);
+        $data = $request->only(['owner_id','logistic_id','print_template_id']);
 
-        if(array_key_exists('delivery_interface',$data))$data['delivery_interface'] = OwnerLogisticPrintTemplate::$enums['delivery_interface'][$data['delivery_interface']];
         if ($request['is_save']) {
             if(OwnerLogisticPrintTemplate::query()->where($data)->exists()){
                 return ['success' => false,'message' => '关联关系已存在'];

+ 2 - 2
app/Http/Controllers/TerminalPrinterController.php

@@ -14,7 +14,7 @@ class TerminalPrinterController extends Controller
     {
 //        if (!Gate::allows('基础设置-快递打印-打印机-添加')) return redirect('/');
 
-        $terminalPrinters = TerminalPrinter::query()->with('terminal')->orderByDesc('terminal_id')->orderByDesc('id')->paginate($request['paginate'] ?? 50);
+        $terminalPrinters = TerminalPrinter::query()->with('terminal','logistic')->orderByDesc('terminal_id')->orderByDesc('id')->paginate($request['paginate'] ?? 50);
 
         $terminals =  Terminal::query()->get();
 
@@ -54,7 +54,7 @@ class TerminalPrinterController extends Controller
         if (!$terminal_printer) return ['success' => false, 'message' => '对应的打印机不存在'];
 
         $terminal_printer->update($request->all());
-        $terminal_printer->load('terminal');
+        $terminal_printer->load(['terminal','logistic']);
         return ['success' => true, 'data' => $terminal_printer];
     }
 

+ 1 - 32
app/OwnerLogisticPrintTemplate.php

@@ -11,38 +11,7 @@ class OwnerLogisticPrintTemplate extends Model
 {
     use ModelLogChanging;
     public $timestamps = false;
-    protected $fillable = ['owner_id','logistic_id','print_template_id','delivery_interface'];
-    //
-
-    static public $enums = [
-        'delivery_interface' => [
-            'TB' => '1',
-            'PDD' => '2',
-            'JD' => '3',
-            'SF' => '4',
-            'SFQHD' => '5',
-        ]
-    ];
-
-    function __construct(array $attributes = [])
-    {
-        foreach (self::$enums as &$enum) {
-            $enum = $enum + array_flip($enum);
-        }
-        parent::__construct($attributes);
-    }
-
-    public function getDeliveryInterfaceAttribute($value): string
-    {
-        if (!$value) return '';
-        return self::$enums['delivery_interface'][$value];
-    }
-
-    public function setDeliveryInterfaceAttribute($value)
-    {
-        if (!$value) return 0;
-        $this->attributes['delivery_interface'] = self::$enums['delivery_interface'][$value];
-    }
+    protected $fillable = ['owner_id','logistic_id','print_template_id'];
 
     public function printTemplate(): BelongsTo
     {

+ 5 - 36
app/TerminalPrinter.php

@@ -13,48 +13,17 @@ class TerminalPrinter extends Model
     use ModelLogChanging;
     use ModelTimeFormat;
 
-    protected $fillable = ['terminal_id', 'printer_name', 'alias_name', 'print_type'];
-
-    static public $enums = [
-        'print_type' => [
-            '菜鸟' => 0,
-            '拼多多' => 1,
-            '顺丰' => 2,
-            '京东' => 3,
-        ],
-    ];
-
-    static public $PrintType = [
-        "TB" => '菜鸟',
-        "PDD" => '拼多多',
-        "SF" => '顺丰',
-        "SFQHD" => '顺丰',
-        "JD" => '京东',
-    ];
-
-    function __construct(array $attributes = [])
-    {
-        foreach (self::$enums as &$enum) {
-            $enum = $enum + array_flip($enum);
-        }
-        parent::__construct($attributes);
-    }
+    protected $fillable = ['terminal_id', 'printer_name', 'alias_name', 'logistic_id'];
 
-    public function getPrintTypeAttribute($value)
-    {
-        if (!$value && $value !== 0) return '';
-        return self::$enums['print_type'][$value];
-    }
 
-    public function setPrintTypeAttribute($value)
+    public function terminal(): BelongsTo
     {
-        if (!$value) return 0;
-        $this->attributes['print_type'] = self::$enums['print_type'][$value];
+        return $this->belongsTo(Terminal::class);
     }
 
 
-    public function terminal(): BelongsTo
+    public function logistic_id(): BelongsTo
     {
-        return $this->belongsTo(Terminal::class);
+        return $this->belongsTo(Logistic::class);
     }
 }

+ 1 - 1
app/Traits/DrawImage.php

@@ -210,7 +210,7 @@ trait DrawImage
     // 获取打印图片的路径
     private function getImagePath(): string
     {
-        $img_name = Str::uuid() . '.png';
+        $img_name = Str::uuid() . '.jpg';
         $path_arr = ['app', 'public', 'print'];
         $dir_path = implode(DIRECTORY_SEPARATOR, $path_arr);
         if (!file_exists(storage_path($dir_path))) mkdir(storage_path($dir_path));

+ 1 - 1
database/migrations/2021_06_18_150129_create_terminal_printers_table.php

@@ -26,7 +26,7 @@ class CreateTerminalPrintersTable extends Migration
             $table->string('terminal_id')->comment('终端id');
             $table->string('printer_name')->comment('打印机名称');
             $table->string('alias_name')->comment('打印机别名');
-            $table->tinyInteger('print_type')->comment('打印类型');
+            $table->tinyInteger('logistic_id')->comment('快递');
             $table->timestamps();
         });
     }

+ 0 - 1
database/migrations/2021_06_22_172006_create_owner_logistic_print_templates_table.php

@@ -18,7 +18,6 @@ class CreateOwnerLogisticPrintTemplatesTable extends Migration
             $table->integer('owner_id')->comment('货主');
             $table->integer('logistic_id')->comment('快递');
             $table->integer('print_template_id')->comment('模板编码');
-            $table->integer('delivery_interface')->comment('下发接口');
         });
     }
 

+ 245 - 19
resources/views/maintenance/expressPrinting/print/template.blade.php

@@ -8,15 +8,17 @@
             <div class="card-header">
                 <div class="form-group">
                     <label class="form-inline" for="printStr"></label>
-                    <input type="text" name="printStr" class="form-control" ref="printStr" id="printStr" placeholder="输入波次号,订单号,">
+                    <input type="text" name="printStr" class="form-control" ref="printStr" id="printStr"
+                           placeholder="输入波次号,订单号,">
                 </div>
             </div>
             <div class="card-body">
                 <button class="btn btn-primary" @click="getPrintItems">获取</button>
-                <button class="btn btn-outline-info" @click="wsGetImage">GoWebSocket 预览</button>
+                <button class="btn btn-outline-info" @click="testPreview"> 预览</button>
                 <button class="btn btn-outline-primary" @click="uploadPrintData">WAS加工</button>
                 <button class="btn btn-success" @click="wsPrintImage">GoWebSocket 打印</button>
-                {{--<button class="btn btn-outline-warning" @click="initGoWebSocket">GoWebSocket 重置</button>--}}
+                <button class="btn btn-outline-warning" @click="initGoWebSocket">GoWebSocket 重置</button>
+                <button class="btn btn-outline-warning" @click="getPrinters">获取打印机</button>
             </div>
 
             <div class="container">
@@ -43,7 +45,7 @@
                         <p> 编号:@{{ item.task_id }}</p>
                         <p> 快递单号 :@{{ item.logistic_number }}</p>
                         <div v-if="item.base64" class="position-relative">
-                            <img :src="'data:image/jpeg;base64,'+item.base64" alt="" style="width: 50%;height: 50%"
+                            <img :src="item.base64" alt="" style="width: 50%;height: 50%"
                                  class="position-relative">
                         </div>
                     </li>
@@ -58,6 +60,11 @@
 
 @section('lastScript')
     <script>
+        let WebSocketStatus = {
+            Close: 0,
+            Open: 1,
+            Error: 2,
+        }
         let vue = new Vue({
             el: '#list',
             data: {
@@ -65,15 +72,63 @@
                 goWebSocketPath: "ws://127.0.0.1:11101/print",
                 goWebSocket: null,
                 goWebSocketStatus: 0,
+
+                cnWebSocket: null,
+                cnWebSocketPath: "ws://127.0.0.1:13528",
+                cnWebSocketStatus: null,
+                pddWebSocket: null,
+                pddWebSocketPath: "ws://127.0.0.1:5000",
+                pddWebSocketStatus: null,
+
+                clientPrinters: {
+                    defaultPrinter: "",
+                    printers: [],
+                },
             },
             created() {
 
             },
             mounted() {
                 // 初始化 go 链接
-                this.initGoWebSocket();
+                // this.initGoWebSocket();
+                this.initPddWebSocket();
+                this.initCnWebSocket();
+
             },
             methods: {
+                initPddWebSocket() {
+                    if (this.pddWebSocket && this.pddWebSocket.readyState === 2) return
+                    this.pddWebSocket = new window.WebSocket(this.pddWebSocketPath)
+                    let self = this;
+                    this.pddWebSocket.onclose = function () {
+                        self.pddWebSocketStatus = WebSocketStatus.Close
+                    }
+                    this.pddWebSocket.onopen = function () {
+                        self.getPrinters()
+                        self.pddWebSocketStatus = WebSocketStatus.Open
+                    }
+                    this.pddWebSocket.onerror = function (message) {
+                        self.pddWebSocketStatus = WebSocketStatus.Error
+                    }
+                    this.pddWebSocket.onmessage = this.handlerPddWebsocket
+                },
+                initCnWebSocket() {
+                    if (this.cnWebSocket && this.cnWebSocket.readyState === 2) return
+                    this.cnWebSocket = new window.WebSocket(this.cnWebSocketPath)
+                    let self = this;
+
+                    this.cnWebSocket.onclose = function () {
+                        self.cnWebSocketStatus = WebSocketStatus.Close
+                    }
+                    this.cnWebSocket.onopen = function () {
+                        self.getPrinters()
+                        self.cnWebSocketStatus = WebSocketStatus.Open
+                    }
+                    this.cnWebSocket.onerror = function () {
+                        self.cnWebSocketStatus = WebSocketStatus.Error
+                    }
+                    this.cnWebSocket.onmessage = this.handlerCnWebsocket
+                },
                 // TODO 获取打印参数
                 getPrintItems() {
                     let url = '{{url('apiLocal/maintenance/print/getData')}}'
@@ -111,25 +166,39 @@
                     }
                 },
                 // TODO 发送到后台进行加工
-                uploadPrintData() {
+                {{--uploadPrintData() {--}}
+                    {{--    let url = "{{url("apiLocal/maintenance/print/uploadPrintData")}}";--}}
+                    {{--    let data = {printData: this.printItems}--}}
+                    {{--    let self = this;--}}
+                    {{--    window.axios.post(url, data).then(res => {--}}
+                    {{--        console.log(res)--}}
+                    {{--        if (res.data.success) {--}}
+                    {{--            res.data.data.forEach(function (item) {--}}
+                    {{--                self.printItems.forEach(function (data, index, array) {--}}
+                    {{--                    if (data['logistic_number'] === item['logistic_number']) {--}}
+                    {{--                        array[index] = item--}}
+                    {{--                    }--}}
+                    {{--                })--}}
+                    {{--            })--}}
+                    {{--            this.$forceUpdate();--}}
+                    {{--        }--}}
+                    {{--    }).then(err => {--}}
+
+                    {{--    })--}}
+                    {{--},--}}
+                uploadPrintData(item) {
                     let url = "{{url("apiLocal/maintenance/print/uploadPrintData")}}";
-                    let data = {printData: this.printItems}
-                    let self = this;
+                    let data = {printData: [item]};
                     window.axios.post(url, data).then(res => {
-                        console.log(res)
                         if (res.data.success) {
-                            res.data.data.forEach(function (item) {
-                                self.printItems.forEach(function (data, index, array) {
-                                    if (data['logistic_number'] === item['logistic_number']) {
-                                        array[index] = item
-                                    }
-                                })
-                            })
-                            this.$forceUpdate();
+                            res.data.data
                         }
-                    }).then(err => {
+                    }).catch(err => {
+
+                    });
+                },
+                sendPrinterDate(item) {
 
-                    })
                 },
                 // TODO GoWebSocket 初始化
                 initGoWebSocket() {
@@ -184,6 +253,163 @@
                         self.goWebSocket.send(JSON.stringify(item));
                     });
                 },
+                // TODO 获取预览面单
+                previewLogisticFace(data) {
+                    if (data.type === "CAINIAO") {
+                        let json = this.getCnPreviewTaskJson(data)
+                        if (this.cnWebSocket && this.cnWebSocket.readyState === 1) {
+                            this.cnWebSocket.send(json)
+                        }
+                    } else if (data.type === "PDD") {
+                        let json = this.getPddPreviewTaskJson(data)
+                        if (this.pddWebSocket && this.pddWebSocket.readyState === 1) {
+                            this.pddWebSocket.send(json)
+                        }
+                    }
+                },
+                handlerCnWebsocket(message) {
+                    let data = JSON.parse(message.data)
+                    if (data.msg !== '成功') {
+                        alert(data.msg);
+                        return
+                    }
+                    if (data.cmd === 'getPrinters') {
+                        this.setClientPrinters(data)
+                    } else if (data.cmd === 'print') {
+                        let url = data['previewImage'][0];
+                        this.getBase64(url, data);
+                    }
+                },
+                handlerPddWebsocket(message) {
+                    let data = JSON.parse(message.data);
+                    if (data.cmd === 'getPrinters') {
+                        this.setClientPrinters(data)
+                    } else if (data.cmd === "PrintResultNotify") {
+                        console.log(data)
+                        this.getBase64(data['previewURL'], data);
+                    }
+                },
+                getBase64(imgUrlPath, data) {
+                    let canvas = document.createElement('canvas');
+                    let cxt = canvas.getContext('2d');
+                    let img = new Image();
+                    img.setAttribute('crossOrigin', 'anonymous');
+                    if (data.cmd === "PrintResultNotify") {
+                        img.setAttribute('Access-Control-Allow-Oriain', 'http://127.0.0.1:16666');
+                        this.getBase64ByUrl(imgUrlPath,data)
+                        return
+                    }
+                    img.setAttribute('Access-Control-Allow-Credentials', 'true');
+                    img.src = imgUrlPath;
+                    let base64 = null;
+                    let self = this;
+                    img.onload = () => {
+                        canvas.width = img.width;
+                        canvas.height = img.height;
+                        cxt.drawImage(img, 0, 0);
+                        base64 = canvas.toDataURL("image/jpeg", 1);
+                        self.printItems.forEach(function (item) {
+                            if (item['task_id'] === data['taskID']) {
+                                item['base64'] = base64;
+                            }
+                        });
+                    }
+                },
+
+                getBase64ByUrl(url,data){
+                    let xhr = new XMLHttpRequest();
+                    xhr.withCredentials = true;
+                    xhr.responseType = 'blob';
+                    xhr.open('GET',url);
+                    xhr.send()
+                    xhr.onreadystatechange = function(){
+                        if ( xhr.readyState === 4 && xhr.status === 200 ) {
+                            alert( xhr.responseText );
+                            let  blob = new Blob([xhr.response], {type: 'image/png'});
+                            console.log(blob);
+                        } else {
+                            alert( xhr.statusText );
+                        }
+                    };
+
+                },
+
+                getPddPreviewTaskJson(item) {
+                    let printer = this.clientPrinters.printers[0]['name'];
+                    return JSON.stringify({
+                        cmd: "print",
+                        requestID: item['task_id'],
+                        version: "1.0",
+                        task: {
+                            taskID: item['task_id'],
+                            previewType: "jpg",
+                            notifyType: null,
+                            preview: true,
+                            printer: null,
+                            firstDocumentNumber: 0,
+                            totalDocumentCount: 1,
+                            documents: [{
+                                documentID: '11111',
+                                contents: [{
+                                    encryptedData: item['data']['encryptedData'],
+                                    signature: item['data']['signature'],
+                                    templateUrl: item['data']['templateUrl'],
+                                    ver: item['data']['ver'],
+                                }]
+                            }],
+                        }
+                    })
+                },
+                getCnPreviewTaskJson(item) {
+                    let printer = this.clientPrinters.printers[0]['name'];
+                    console.log(item);
+                    return JSON.stringify({
+                        cmd: 'print',
+                        request_id: item['task_id'],
+                        version: '1.0',
+                        task: {
+                            preview: true,
+                            previewType: 'image',
+                            printer: printer,
+                            taskID: item['task_id'],
+                            firstDocumentNumber: 0,
+                            totalDocumentCount: 1,
+                            documents: [{
+                                documentID: "11111",
+                                contents: [{
+                                    encryptedData: item['data']['encryptedData'],
+                                    signature: item['data']['signature'],
+                                    templateURL: item['data']['templateURL'],
+                                    ver: item['data']['ver'],
+                                }],
+                            }],
+                        },
+                    });
+                },
+                getPrinters() {
+                    let json = JSON.stringify({
+                        cmd: "getPrinters",
+                        requestID: "getPrinters" + (new Date().getDate()),
+                        version: "1.0",
+                    });
+                    if (this.cnWebSocket && this.cnWebSocket.readyState === 1) {
+                        this.cnWebSocket.send(json);
+                    } else if (this.pddWebSocket && this.pddWebSocket.readyState === 1) {
+                        this.pddWebSocket.send(json);
+                    } else {
+                        alert('未链接打印机终端')
+                    }
+                },
+                setClientPrinters(data) {
+                    this.clientPrinters.defaultPrinter = data['defaultPrinter'];
+                    this.clientPrinters.printers = data['printers'];
+                },
+                testPreview() {
+                    let self = this;
+                    this.printItems.forEach(function (item) {
+                        self.previewLogisticFace(item)
+                    })
+                },
             }
         });
 

+ 4 - 4
resources/views/maintenance/expressPrinting/setting/printer/index.blade.php

@@ -5,12 +5,12 @@
 @section('content')
     <div class="container-fluid " id="list">
         <div class="card">
-            @can('基础设置-快递打印-打印机-添加')
+{{--            @can('基础设置-快递打印-打印机-添加')--}}
                 @include('maintenance.expressPrinting.setting.printer._create')
-            @endcan
-            @can('基础设置-快递打印-打印机-编辑')
+{{--            @endcan--}}
+{{--            @can('基础设置-快递打印-打印机-编辑')--}}
                 @include('maintenance.expressPrinting.setting.printer._edit')
-            @endcan
+{{--            @endcan--}}
             <div class="card-body">
                 <div class="row pull-left m-1">
                     @can('基础设置-快递打印-打印机-添加')

+ 1 - 10
resources/views/maintenance/expressPrinting/template/index.blade.php

@@ -59,11 +59,7 @@
                         // selected 是否选中
                         data[owner.id] = {isActivation:false,logistics:{},name:owner.name,selected:false,id:owner.id};
                         self.logistics.forEach(function(logistic){
-                            let interfaces = {}
-                            self['deliveryInterfaces'].forEach(function(i,index){
-                                interfaces[i] ={isActivation:false,interface:i}
-                            })
-                            data[owner.id].logistics[logistic.id] = {isActivation:false,id:logistic.id,name:logistic.name,selected:false,interfaces:interfaces}
+                            data[owner.id].logistics[logistic.id] = {isActivation:false,id:logistic.id,name:logistic.name,selected:false}
                         })
                     });
                     this.templateMode = data;
@@ -88,7 +84,6 @@
                     template['owner_logistic_print_template'].forEach(function(item){
                         data[item.owner_id].isActivation = true;
                         data[item.owner_id].logistics[item.logistic_id].isActivation = true;
-                        data[item.owner_id].logistics[item.logistic_id].interfaces[item.delivery_interface].isActivation = true;
                     });
 
                     this.editTemplate = JSON.parse(JSON.stringify(template));
@@ -96,7 +91,6 @@
                     this.editTemplate.data = data;
 
                     $("#edit-template").modal('show');
-                    console.log(123);
                 },
                 selectOwner(data,owners){
                     if(data.selected === true){
@@ -169,8 +163,6 @@
                     }).catch(err=>{
                         window.tempTip.show(err)
                     })
-
-
                 },
                 selectOwnerLogistic(logistic,model){
                     if (logistic.selected === true){
@@ -205,7 +197,6 @@
                         'owner_id' : this.editTemplateOwner.id,
                         'logistic_id' : this.editTemplateLogistic.id,
                         'print_template_id' : this.editTemplate.id,
-                        'delivery_interface' : item.interface,
                         'is_save':islink
                     }
                     window.tempTip.setIndex(1999)

+ 1 - 0
routes/apiLocal.php

@@ -125,6 +125,7 @@ Route::group(['prefix'=>'maintenance'],function (){
     Route::group(['prefix' => 'print'],function(){
         Route::post('getData','PrintController@getPrintDataApi');
         Route::post('uploadPrintData','PrintController@uploadPrintDataApi');
+        Route::post("upDatePrintCount","PrintController@updatePrintCountApi");
     });
     Route::group(['prefix'=>'expressPrinting'],function (){
         Route::group(['prefix'=>'part'],function(){