From e8f8d89a4248cd4d0a7138cc2e5a36ea9b136699 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 11 Feb 2025 17:03:01 +0800
Subject: [PATCH] feat(mall): 添加订单一键发货和取消发货功能

---
 src/main/resources/templates/febs/views/modules/order/orderList.html |  201 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 198 insertions(+), 3 deletions(-)

diff --git a/src/main/resources/templates/febs/views/modules/order/orderList.html b/src/main/resources/templates/febs/views/modules/order/orderList.html
index c2dbb7e..ee8d91e 100644
--- a/src/main/resources/templates/febs/views/modules/order/orderList.html
+++ b/src/main/resources/templates/febs/views/modules/order/orderList.html
@@ -356,6 +356,16 @@
                     cancelOrder(data.id);
                 });
             }
+            if (layEvent === 'deliverPdfGoods') {
+                febs.modal.confirm('一键发货', '确认一键发货?', function () {
+                    deliverPdfGoods(data.id);
+                });
+            }
+            if (layEvent === 'cancelDeliver') {
+                febs.modal.confirm('取消发货', '确认取消发货?', function () {
+                    cancelDeliver(data.id);
+                });
+            }
             if (layEvent === 'seePayImage') {
                 var t = $view.find('#seePayImage'+data.id+'');
                 //页面层
@@ -373,12 +383,195 @@
             }
         });
 
+        function cancelDeliver(id) {
+            febs.get(ctx + 'admin/order/cancelDeliver/' + id, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
         function cancelOrder(id) {
             febs.get(ctx + 'admin/order/cancelOrder/' + id, null, function () {
                 febs.alert.success('操作成功');
                 $query.click();
             });
         }
+
+        function deliverPdfGoods(id) {
+            febs.get(ctx + 'admin/order/deliverPdfGoods/' + id, null, function (e) {
+                if (e.code == 200) {
+                    // 创建弹层容器
+                    const content = `
+                                        <div style="position:relative;min-height:500px">
+                                          <div id="pdfContainer" style="margin:20px auto;max-width:800px"></div>
+                                          <div class="layui-form" style="text-align:center;margin-top:20px">
+                                            <button class="layui-btn layui-btn-normal" onclick="printPdf()">打印</button>
+                                          </div>
+                                        </div>
+                                      `;
+
+                    // 显示弹层
+                    const index = layer.open({
+                        type: 1,
+                        title: "电子面单",
+                        content: content,
+                        area: ['90%', '90%'],
+                        success: function() {
+                            // 渲染PDF
+                            renderPdf(e.data.pdfStream);
+                        }
+                    });
+                    // 存储当前PDF数据
+                    window.currentPDF = e.data.pdfStream;
+                } else {
+                    febs.alert.warn(e.message);
+                }
+            });
+            $query.click();
+        }
+
+        // PDF渲染函数
+        function renderPdf(base64Data) {
+            // 清理容器
+            const container = document.getElementById('pdfContainer');
+            container.innerHTML = '';
+
+            // Base64转Blob
+            const byteCharacters = atob(base64Data);
+            const byteNumbers = new Array(byteCharacters.length);
+            for (let i = 0; i < byteCharacters.length; i++) {
+                byteNumbers[i] = byteCharacters.charCodeAt(i);
+            }
+            const byteArray = new Uint8Array(byteNumbers);
+            const blob = new Blob([byteArray], {type: 'application/pdf'});
+
+            // 生成临时URL
+            const url = URL.createObjectURL(blob);
+
+            // 使用PDF.js渲染
+            pdfjsLib.getDocument(url).promise.then(pdf => {
+                // 循环渲染所有页面
+                for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
+                    pdf.getPage(pageNum).then(page => {
+                        const scale = 1.5;
+                        const viewport = page.getViewport({scale: scale});
+                        const canvas = document.createElement('canvas');
+                        const context = canvas.getContext('2d');
+                        canvas.height = viewport.height;
+                        canvas.width = viewport.width;
+
+                        // 创建页面容器
+                        const pageDiv = document.createElement('div');
+                        pageDiv.className = 'pdf-page';
+                        pageDiv.style.margin = '10px 0';
+                        container.appendChild(pageDiv);
+
+                        // 渲染到Canvas
+                        page.render({
+                            canvasContext: context,
+                            viewport: viewport
+                        }).promise.then(() => {
+                            pageDiv.appendChild(canvas);
+                        });
+                    });
+                }
+            });
+        }
+
+        // 打印函数
+        window.printPdf = function() {
+            let base64Image = window.currentPDF;
+            const printWindow = window.open('', '_blank');
+            printWindow.document.write(`
+                                        <html>
+                                          <head>
+                                            <title>电子面单打印</title>
+                                            <style>
+                                              body { margin: 0; padding: 20px }
+                                              canvas {
+                                                width: 100%!important;
+                                                height: auto!important;
+                                                page-break-after: always;
+                                              }
+                                            </style>
+                                          </head>
+                                          <body>
+                                            <iframe src="data:application/pdf;base64,`+base64Image+`" width="100%" height="100%"></iframe>
+                                          </body>
+                                        </html>
+                                      `);
+            printWindow.document.close();
+            printWindow.onload = function() {
+                printWindow.print();
+                printWindow.close();
+            }
+        }
+
+        // function deliverPdfGoods(id) {
+        //     febs.get(ctx + 'admin/order/deliverPdfGoods/' + id, null, function (e) {
+        //         if(e.code == 200){
+        //             console.info(e.data);
+        //             console.info(e.data.pdfStream);
+        //             console.info(e.data.result);
+        //             layer.open({
+        //                 type: 1,
+        //                 title: "电子面单",
+        //                 skin: 'layui-layer-rim', //加上边框
+        //                 area: ['100%', '100%'], //宽高
+        //                 shadeClose: true, //开启遮罩关闭
+        //                 end: function (index, layero) {
+        //                     return false;
+        //                 },
+        //                 content: '<div class="layui-card-body" id="pdfViewer"></div>'
+        //             });
+        //             if(e.data.pdfStream === null){
+        //
+        //                 renderPdf(e.data.pdfStreamList);
+        //             }
+        //             renderPdf(e.data.pdfStream);
+        //         }else{
+        //             febs.alert.warn(e.message);
+        //         }
+        //         $query.click();
+        //     });
+        // }
+
+        // 渲染 PDF 到页面
+        // function renderPdf(base64Data) {
+        //     // Base64 转 Blob
+        //     const byteCharacters = atob(base64Data);
+        //     const byteNumbers = new Array(byteCharacters.length);
+        //     for (let i = 0; i < byteCharacters.length; i++) {
+        //         byteNumbers[i] = byteCharacters.charCodeAt(i);
+        //     }
+        //     const byteArray = new Uint8Array(byteNumbers);
+        //     const blob = new Blob([byteArray], {type: 'application/pdf'});
+        //
+        //     // 生成临时 URL
+        //     const url = URL.createObjectURL(blob);
+        //
+        //     // 使用 PDF.js 渲染
+        //     pdfjsLib.getDocument(url).promise.then(function(pdf) {
+        //         pdf.getPage(1).then(function(page) {
+        //             const scale = 1.5;
+        //             const viewport = page.getViewport({scale: scale});
+        //             const canvas = document.createElement('canvas');
+        //             const context = canvas.getContext('2d');
+        //             canvas.height = viewport.height;
+        //             canvas.width = viewport.width;
+        //
+        //             // 将 PDF 页面渲染到 Canvas
+        //             page.render({
+        //                 canvasContext: context,
+        //                 viewport: viewport
+        //             }).promise.then(function() {
+        //                 $('#pdfViewer').html(canvas);
+        //             });
+        //         });
+        //     }).catch(function(error) {
+        //         layer.msg('PDF渲染失败: ' + error.message, {icon: 2});
+        //     });
+        // }
 
         // 查询按钮
         $query.on('click', function () {
@@ -456,11 +649,13 @@
                         {title: '操作',
                             templet: function (d) {
                                 if(d.status === 2){
-                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
-                                    +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
+                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverPdfGoods" shiro:hasPermission="user:update">一键发货</button>'
+                                    +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
+                                    // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
                                 }else if(d.status === 3){
                                     return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
-                                    +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="updateDeliver" shiro:hasPermission="user:update">修改物流信息</button>'
+                                        +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelDeliver" shiro:hasPermission="user:update">取消发货</button>'
+                                    // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="updateDeliver" shiro:hasPermission="user:update">修改物流信息</button>'
                                 }else{
                                     return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
                                 }

--
Gitblit v1.9.1