From 6ce99cb40ee88271fa0d0d8daea99ba0eaec122f Mon Sep 17 00:00:00 2001
From: Administrator <admin>
Date: Fri, 05 Nov 2021 16:01:39 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.105:10010/r/zhba_enterprises

---
 src/assets/js/print.js                    |  123 +++++++++++++++++++++++++++++++++++++++++
 src/main.js                               |    5 +
 src/views/securityGuard/securityGuard.vue |   23 +++++--
 3 files changed, 143 insertions(+), 8 deletions(-)

diff --git a/src/assets/js/print.js b/src/assets/js/print.js
new file mode 100644
index 0000000..1e1c861
--- /dev/null
+++ b/src/assets/js/print.js
@@ -0,0 +1,123 @@
+const Print = function (dom, options) {
+    if (!(this instanceof Print)) return new Print(dom, options);
+
+    this.options = this.extend({
+        noPrint: '.no-print',
+        onStart: function () {},
+        onEnd: function () {}
+    }, options);
+
+    if ((typeof dom) === "string") {
+        this.dom = document.querySelector(dom);
+    } else {
+        this.dom = dom;
+    }
+
+    this.init();
+};
+Print.prototype = {
+    init: function () {
+        let content = this.getStyle() + this.getHtml();
+        this.writeIframe(content);
+    },
+    extend: function (obj, obj2) {
+        for (let k in obj2) {
+            obj[k] = obj2[k];
+        }
+        return obj;
+    },
+
+    getStyle: function () {
+        let str = "";
+        let styles = document.querySelectorAll('style,link');
+        for (let i = 0; i < styles.length; i++) {
+            str += styles[i].outerHTML;
+        }
+        str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
+
+        return str;
+    },
+
+    getHtml: function () {
+        let inputs = document.querySelectorAll('input');
+        let textareas = document.querySelectorAll('textarea');
+        let selects = document.querySelectorAll('select');
+
+        for (let k in inputs) {
+            if (inputs[k].type === "checkbox" || inputs[k].type === "radio") {
+                if (inputs[k].checked === true) {
+                    inputs[k].setAttribute('checked', "checked");
+                } else {
+                    inputs[k].removeAttribute('checked');
+                }
+            } else if (inputs[k].type === "text") {
+                inputs[k].setAttribute('value', inputs[k].value);
+            }
+        }
+
+        for (let k2 in textareas) {
+            if (textareas[k2].type === 'textarea') {
+                textareas[k2].innerHTML = textareas[k2].value;
+            }
+        }
+
+        for (let k3 in selects) {
+            if (selects[k3].type === 'select-one') {
+                let child = selects[k3].children;
+                for (let i in child) {
+                    if (child[i].tagName === 'OPTION') {
+                        if (child[i].selected === true) {
+                            child[i].setAttribute('selected', "selected");
+                        } else {
+                            child[i].removeAttribute('selected');
+                        }
+                    }
+                }
+            }
+        }
+        return this.dom.outerHTML;
+    },
+
+    writeIframe: function (content) {
+        let w;
+        let doc;
+        let iframe = document.createElement('iframe');
+        let f = document.body.appendChild(iframe);
+        iframe.id = "myIframe";
+        iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+        w = f.contentWindow || f.contentDocument;
+        doc = f.contentDocument || f.contentWindow.document;
+        doc.open();
+        doc.write(content);
+        doc.close();
+        this.toPrint(w, function () {
+            document.body.removeChild(iframe);
+        });
+    },
+
+    toPrint: function (w, cb) {
+        let _this = this;
+        w.onload = function () {
+            try {
+                setTimeout(function () {
+                    w.focus();
+                    typeof _this.options.onStart === 'function' && _this.options.onStart();
+                    if (!w.document.execCommand('print', false, null)) {
+                        w.print();
+                    }
+                    typeof _this.options.onEnd === 'function' && _this.options.onEnd();
+                    w.close();
+                    cb && cb();
+                });
+            } catch (err) {
+                console.log('err', err);
+            }
+        };
+    }
+};
+const MyPlugin = {};
+MyPlugin.install = function (Vue, options) {
+    // 4. 添加实例方法
+    Vue.prototype.$print = Print;
+};
+export default MyPlugin;
diff --git a/src/main.js b/src/main.js
index bd58cc3..45a4ef6 100644
--- a/src/main.js
+++ b/src/main.js
@@ -23,6 +23,11 @@
 import website from '@/config/website';
 import crudCommon from '@/mixins/crud';
 
+import Print from '@/assets/js/print';
+
+Vue.use(Print);
+
+
 import Map from './components/map/main';
 Vue.component('Map', Map);
 
diff --git a/src/views/securityGuard/securityGuard.vue b/src/views/securityGuard/securityGuard.vue
index 6f8ce0f..69862c6 100644
--- a/src/views/securityGuard/securityGuard.vue
+++ b/src/views/securityGuard/securityGuard.vue
@@ -266,7 +266,7 @@
                                :upload-after="uploadAfter2">
                     </avue-form>
                 </el-dialog>
-                <div style="position: fixed; top: 9999px; width: 100%; height: 100%;">
+                <div style="position: fixed; top: 9999px; width: 100%; height: 100%; ">
                     <div class="certificate_box"
                          id="certificateDom">
                         <div class="security_main"
@@ -1131,19 +1131,26 @@
                 return
             }
             //更新发证时间
-            this.updateUserInfo();
             var printDom = document.getElementById("certificateDom");
-            printDom.style.position = "fixed";
+            printDom.style.position = "absolute";
             printDom.style.top = "-27.5%";
             printDom.style.left = "-23%";
             printDom.style.width = "120%";
             printDom.style.height = "100%";
             printDom.style.fontFamily = "SimSun";
-            this.$Print(this.$refs.certificateBox);
-            printDom.style.position = "relative";
-            printDom.style.left = "0";
-            printDom.style.width = "100%";
-            printDom.style.height = "auto";
+
+            this.$print('#certificateDom', {
+                noPrint: '.noPrint',
+                onStart: () => {
+                    // console.log('打印开始', Date.parse(new Date()));
+                },
+                onEnd: () => {
+                    this.updateUserInfo();
+                    // console.log('打印完成', Date.parse(new Date()));
+                }
+            });
+
+
         },
         getNewTime () {
             var nowTime = new Date()

--
Gitblit v1.9.3