MEST Custon Report

美尔斯通报表上传打印

// ==UserScript==
// @name         MEST Custon Report
// @namespace    joyings.com.cn
// @version      2.5.5
// @description  美尔斯通报表上传打印
// @author       zmz125000
// @match       http://*/mest/*
// @icon          http://www.google.com/s2/favicons?domain=openwrt.org
// @grant        none
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.js
// @license     MIT
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
    addPrintButtons();
    window.fastPrint = false;

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    function unsecuredCopyToClipboard(text) {
        const textArea = document.createElement("textarea");
        textArea.value = text;
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();
        try {
            document.execCommand('copy');
        } catch (err) {
            console.error('Unable to copy to clipboard', err);
        }
        document.body.removeChild(textArea);
    }

    // 添加按钮、快速复制文本

    async function addPrintButtons() {
        if (!$('div[class="el-tabs__item is-top is-active is-closable"]:contains("自定义报表")')[0] || !$('input[placeholder="输入关键字进行过滤"]')[0]) {
            await sleep(500);
            addPrintButtons();
            return;
        }
        if ($('[role="group"]')[0]) {
            for (let elm of $('[class="custom-tree-node"]', $('[role="group"]')[0])) {
                if (!elm.hasAttribute('helper')) {
                    elm.addEventListener('click', async function () {
                        await sleep(100);
                        // 设为100条
                        while (!$('[class="el-scrollbar__view el-select-dropdown__list"]')[0]) {
                            await sleep(50);
                        }
                        $('li', $('[class="el-scrollbar__view el-select-dropdown__list"]')).last().click()
                        await sleep(100);
                        while ($('[class="el-loading-mask"]')[0] && $('[class="el-loading-mask"]')[0].getAttribute("style") == 'display: none;') {
                            await sleep(100);
                        }
                        while (!$('tbody')[0]) {
                            await sleep(100);
                        }
                        // 自动复制
                        if (!$('tbody')[0].hasAttribute('helper')) {
                            $('tbody')[0].addEventListener('click', function (e) {
                                const cell = e.target.closest('td');
                                if (cell) {
                                    let headerText = $('[class="has-gutter"]')[0].rows.item(0).cells.item(cell.cellIndex).firstChild.textContent;
                                    let sval = cell.childNodes[0].innerText;
                                    unsecuredCopyToClipboard(sval);
                                    setInput(headerText, sval);
                                }
                            });
                            $('tbody')[0].setAttribute('helper', true);
                        }
                        elm.setAttribute('helper', true);
                    })
                }
            }
        }

        if (!$('button:contains("打印")')[0]) {
            let btnRow = $('button:contains("导出")')[0].parentElement;
            var btn = document.createElement('button');
            btn.setAttribute('id', 'printMaterialBtn');
            btn.setAttribute('type', 'button');
            btn.onclick = generateMaterial;
            btn.appendChild(document.createTextNode('打印排料单'));

            var btn2 = document.createElement('button');
            btn2.setAttribute('id', 'printTableBtn');
            btn2.setAttribute('title', '同种物料合并计数');
            btn2.setAttribute('type', 'button');
            btn2.onclick = generateSumTable;
            btn2.appendChild(document.createTextNode('打印备料单'));

            var btn3 = document.createElement('button');
            btn3.setAttribute('type', 'button');
            btn3.onclick = generateAndPrint;
            btn3.appendChild(document.createTextNode('打印生产单'));

            var btn4 = document.createElement('button');
            btn4.setAttribute('type', 'button');
            btn4.onclick = uploadProcessReport;
            btn4.appendChild(document.createTextNode('上传报工单'));

            var btn6 = document.createElement('button');
            btn6.setAttribute('type', 'button');
            btn6.onclick = uploadMaterialList;
            btn6.appendChild(document.createTextNode('上传出入库单'));

            var btn5 = document.createElement('button');
            btn5.setAttribute('type', 'button');
            btn5.onclick = generatePurchase;
            btn5.appendChild(document.createTextNode('打印采购单'));

            var btn8 = document.createElement('button');
            btn8.setAttribute('title', '快速打印');
            btn8.setAttribute('id', 'fastPrintBtn');
            btn8.setAttribute('type', 'button');
            btn8.onclick = toggleFastPrint;
            btn8.appendChild(document.createTextNode(window.fastPrint ? "✔" : "✘"));

            btnRow.appendChild(btn);
            btnRow.appendChild(btn3);
            btnRow.appendChild(btn5);
            btnRow.appendChild(btn2);
            btnRow.appendChild(btn4);
            btnRow.appendChild(btn6);
            btnRow.appendChild(btn8);
        }
        if ($('button:contains("重置")')[0] && !$('button:contains("重置")')[0].hasAttribute('helper')) {
            $('button:contains("重置")')[0].addEventListener('click', async function (e) {
                if ($('[class="el-tree-node is-expanded is-current is-focusable"]')[0]) {
                    $('[class="el-tree-node is-expanded is-current is-focusable"]')[0].click();
                }
                await sleep(100);
                while (!$('tbody')[0]) {
                    await sleep(100);
                }
                // 自动复制
                if (!$('tbody')[0].hasAttribute('helper')) {
                    $('tbody')[0].addEventListener('click', function (e) {
                        const cell = e.target.closest('td');
                        if (cell) {
                            let headerText = $('[class="has-gutter"]')[0].rows.item(0).cells.item(cell.cellIndex).firstChild.textContent;
                            let sval = cell.childNodes[0].innerText;
                            unsecuredCopyToClipboard(sval);
                            setInput(headerText, sval);
                        }
                    });
                    $('tbody')[0].setAttribute('helper', true);
                }
            })
            $('button:contains("重置")')[0].setAttribute('helper', true);
        }
        await sleep(500);
        addPrintButtons();
    }

    function setInput(label, value) {
        if ($('label:contains(' + label + ')')[0]) {
            $('input', $('label:contains(' + label + ')')[0].nextSibling)[0].value = value;
            $('input', $('label:contains(' + label + ')')[0].nextSibling)[0].dispatchEvent(new Event('input', {
                bubbles: true
            }));
        }
    }

    function toggleFastPrint() {
        if (window.fastPrint) {
            window.fastPrint = false;
            document.getElementById("fastPrintBtn").firstChild.nodeValue = "✘";
        } else {
            window.fastPrint = true;
            document.getElementById("fastPrintBtn").firstChild.nodeValue = "✔";
        }
    }

    async function getFullTable(index) {
        var tbody = document.createElement('table');
        let nextBodyRows = $('tr', $('tbody')[0]);
        for (let tr of nextBodyRows) {
            tbody.appendChild(tr.cloneNode(true));
        }
        // 主键所在列
        let i = index;
        if (!index) {
            i = 2
        }
        var oldValue = $('div', $('tbody')[0].rows.item(0).cells.item(i))[0].textContent;
        while (!$('[class="btn-next"]')[0].getAttribute("disabled")) {
            $('[class="btn-next"]')[0].click();
            await sleep(100);
            while ($('div', $('tbody')[0].rows.item(0).cells.item(i))[0].textContent == oldValue) {
                await sleep(100);
            }
            let nextBodyRows = $('tr', $('tbody')[0]);
            for (let tr of nextBodyRows) {
                tbody.appendChild(tr.cloneNode(true));
            }
            oldValue = $('div', $('tbody')[0].rows.item(0).cells.item(i))[0].textContent;
        }
        return tbody;
    }

    // 上传SCD数据
    async function uploadProcessReport() {
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const aliasIndex = $('th:contains("别名")')[0].cellIndex;
        const productNameIndex = $('th:contains("产品名")')[0].cellIndex;
        const productCodeIndex = $('th:contains("编码")')[0].cellIndex;
        const SCDIndex = $('th:contains("生产单")')[0].cellIndex;
        const createDateIndex = $('th:contains("订单日期")')[0].cellIndex;

        var tbody = null;
        await getFullTable(SCDIndex).then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        var lastCustomer = bodyRows.item(0).cells.item(customerIndex).textContent;
        var lastOrder = bodyRows.item(0).cells.item(orderNoIndex).textContent;
        var object = {
            customers: [{
                "name": lastCustomer,
                "orders": [{
                    "order": lastOrder,
                    "SCDs": []
                }]
            }]
        };
        var objC = object.customers
        var customerArrayIndex = 0;
        var orderArrayIndex = 0;
        for (let row of bodyRows) {
            if (row.cells.item(customerIndex).textContent != lastCustomer) {
                customerArrayIndex = objC.push({
                    "name": row.cells.item(customerIndex).textContent,
                    "orders": []
                }) - 1;
                lastCustomer = row.cells.item(customerIndex).textContent;
            }
            if (row.cells.item(orderNoIndex).textContent != lastOrder) {
                orderArrayIndex = objC[customerArrayIndex]['orders'].push({
                    "order": row.cells.item(orderNoIndex).textContent,
                    "SCDs": []
                }) - 1;
                lastOrder = row.cells.item(orderNoIndex).textContent;
            }
            objC[customerArrayIndex]['orders'][orderArrayIndex]['SCDs'].push({
                'SCD': row.cells.item(SCDIndex).textContent,
                "productCode": row.cells.item(productCodeIndex).textContent,
                "productName": row.cells.item(productNameIndex).textContent,
                "productAlias": row.cells.item(aliasIndex).textContent
            })
        }
        console.log(object);
        var myJSONString = JSON.stringify(object);
        var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
        (async () => {
            const rawResponse = await fetch('https://api.jsonbin.io/v3/b/636b64a10e6a79321e444fe8', {
                method: 'PUT',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                },
                body: myEscapedJSONString
            });
            const content = await rawResponse.json();
            alert(JSON.stringify(content));
        })();
    }

    // 上传物料数据
    async function uploadMaterialList() {
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        // 物料
        const materialCodeIndex = $('th:contains("物料编码")')[0].cellIndex;
        const materialNameIndex = $('th:contains("物料名")')[0].cellIndex;
        const materialAliasIndex = $('th:contains("物料别名")')[0].cellIndex;
        const materialSpecsIndex = $('th:contains("物料规格")')[0].cellIndex;
        const processIndex = $('th:contains("用途")')[0].cellIndex;

        var tbody = null;
        await getFullTable(materialCodeIndex).then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        var lastOrder = bodyRows.item(0).cells.item(orderNoIndex).textContent;
        var lastCustomer = bodyRows.item(0).cells.item(customerIndex).textContent;
        var object = {
            "material": [],
            "orders": [{
                "order": lastOrder,
                "customer": lastCustomer,
                "material": []
            }]
        };
        var objO = object.orders;
        var objM = object.material;
        var orderArrayIndex = 0;
        var matCodeArray = [];
        for (let row of bodyRows) {
            if (row.cells.item(orderNoIndex).textContent != lastOrder) {
                orderArrayIndex = objO.push({
                    "order": row.cells.item(orderNoIndex).textContent,
                    "customer": row.cells.item(customerIndex).textContent,
                    "material": []
                }) - 1;
                lastOrder = row.cells.item(orderNoIndex).textContent;
            }
            let i = "material";
            if (row.cells.item(processIndex).textContent == "包装") {
                i = "packaging";
            }
            if (!matCodeArray.includes(row.cells.item(materialCodeIndex).textContent)) {
                matCodeArray.push(row.cells.item(materialCodeIndex).textContent);
                objM.push({
                    "type": i,
                    "code": row.cells.item(materialCodeIndex).textContent,
                    "name": row.cells.item(materialNameIndex).textContent,
                    "alias": row.cells.item(materialAliasIndex).textContent,
                    "specs": row.cells.item(materialSpecsIndex).textContent,
                })
            }
            objO[orderArrayIndex]['material'].push({
                "type": i,
                "code": row.cells.item(materialCodeIndex).textContent,
                "name": row.cells.item(materialNameIndex).textContent,
                "alias": row.cells.item(materialAliasIndex).textContent,
                "specs": row.cells.item(materialSpecsIndex).textContent,
            }) - 1;
        }
        console.log(object);
        var myJSONString = JSON.stringify(object);
        var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
        (async () => {
            const rawResponse = await fetch('https://api.jsonbin.io/v3/b/637eceb165b57a31e6c15f19', {
                method: 'PUT',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                },
                body: myEscapedJSONString
            });
            const content = await rawResponse.json();
            alert(JSON.stringify(content));
        })();
    }


    // 打印采购单
    async function generatePurchase() {
        if (!$('input', $('label:contains("订单号")')[0].nextSibling)[0].value) {
            alert("未输入订单号/生产单号/产品编号/产品名,请先设置至少一项筛选条件");
            return;
        }
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        const billDateIndex = $('th:contains("单据日期")')[0].cellIndex;
        const billDeliveryIndex = $('th:contains("发货日期")')[0].cellIndex;
        // 物料
        const materialCodeIndex = $('th:contains("物料编码")')[0].cellIndex;
        const materialNameIndex = $('th:contains("物料名")')[0].cellIndex;
        const materialAliasIndex = $('th:contains("物料别名")')[0].cellIndex;
        const materialSpecsIndex = $('th:contains("物料规格")')[0].cellIndex;
        const materialQIndex = $('th:contains("订单用量")')[0].cellIndex;
        const materialUnitIndex = $('th:contains("计量单位")')[0].cellIndex;
        const processIndex = $('th:contains("用途")')[0].cellIndex;
        const wareHouseIndex = $('th:contains("库存量")')[0].cellIndex;
        const usedIndex = $('th:contains("材料未出库")')[0].cellIndex;
        const onwayIndex = $('th:contains("采购未入库")')[0].cellIndex;

        var tbody = null;
        await getFullTable(materialCodeIndex).then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        let map = new Map();
        let trCells = tbody.rows.item(0).cells;

        var today = new Date();
        var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
        var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
        // 原料采购单
        let w = null;
        let iframe = null;
        if (window.fastPrint) {
            iframe = document.createElement('iframe');
            document.body.appendChild(iframe);
            iframe.contentWindow.document.open();
            iframe.contentWindow.document.write(purchaseTemplate);
            w = iframe.contentWindow;
        } else {
            w = window.open();
            w.document.write(purchaseTemplate);
            w.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "原料采购计划" + '-' + date + ".html");
        }

        map.set('orderNo', trCells.item(orderNoIndex));
        map.set('orderDate', trCells.item(billDateIndex));
        map.set('deliveryDate', trCells.item(billDeliveryIndex));
        map.set('OCellA', trCells.item(orderNoIndex));
        map.set('OCellB', trCells.item(orderNoIndex));
        for (let item of map) {
            if ($('#' + item[0], w.document)[0]) {
                $('#' + item[0], w.document)[0].textContent = $('div', item[1])[0].textContent;
            }
        }
        // 填信息
        $('#printTime', w.document)[0].textContent = date + ' ' + time;


        // 包装采购单
        let w1 = null;
        let iframe1 = null;
        if (window.fastPrint) {
            iframe1 = document.createElement('iframe');
            document.body.appendChild(iframe1);
            iframe1.contentWindow.document.open();
            iframe1.contentWindow.document.write(w.document.documentElement.innerHTML);
            w1 = iframe1.contentWindow;
        } else {
            w1 = window.open();
            w1.document.write(w.document.documentElement.innerHTML);
            w1.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "包装采购计划" + '-' + date + ".html");
        }
        new QRCode($('#SCDQR', w.document)[0], {
            text: trCells.item(orderNoIndex).textContent,
            width: 144,
            height: 144
        });

        new QRCode($('#SCDQR', w1.document)[0], {
            text: trCells.item(orderNoIndex).textContent,
            width: 144,
            height: 144
        });
        w1.document.getElementById('title').textContent = "包装采购计划";

        // 原料表
        var materialTable = $('#materialTable', w.document)[0];
        // 工艺表指针
        var wIndex = 1;
        // 物料表指针
        var mIndex = 1;
        // 表体序号
        var tIndex = 1;
        let name = '';
        let lastName = '';
        let cell0 = null;

        // 物料表
        var materialTable1 = $('#materialTable', w1.document)[0];
        // 工艺表指针
        var wIndex1 = 1;
        // 物料表指针
        var mIndex1 = 1;
        // 表体序号
        var tIndex1 = 1;
        let name1 = '';
        let lastName1 = '';
        let cell01 = null;
        for (let row of bodyRows) {
            let materialCode = $('div', row.cells.item(materialCodeIndex))[0].textContent;
            let process = $('div', row.cells.item(processIndex))[0].textContent;
            if (process != '包装' && !materialCode.startsWith('00-')) {
                name = $('div', row.cells.item(materialNameIndex))[0].textContent;
                const cells = row.cells;
                let tr = materialTable.insertRow(wIndex++);

                let i = 0;
                tr.insertCell(i++).innerHTML = tIndex++;
                if (tr.rowIndex == 1) {
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name;
                } else
                if (name == lastName) {
                    cell0.setAttribute('rowspan', ++mIndex);
                } else {
                    mIndex = 1;
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name;
                }
                tr.insertCell(i++).innerHTML = cells.item(materialSpecsIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(wareHouseIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(usedIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(onwayIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialQIndex).textContent;
                let remaining = parseFloat(cells.item(wareHouseIndex).textContent) - parseFloat(cells.item(materialQIndex).textContent) - parseFloat(cells.item(usedIndex).textContent) + parseFloat(cells.item(onwayIndex).textContent);
                if (remaining >= 0) {
                    tr.insertCell(i++).innerHTML = '0';
                } else {
                    let x = Math.abs(remaining) > parseFloat(cells.item(materialQIndex).textContent) ? cells.item(materialQIndex).textContent : Math.abs(remaining);
                    tr.insertCell(i++).innerHTML = Math.ceil(x);
                }
                tr.insertCell(i++).innerHTML = cells.item(materialUnitIndex).textContent
                lastName = name;
            }
            if (process == '包装' || materialCode.startsWith('01-012')) {
                name1 = $('div', row.cells.item(materialNameIndex))[0].textContent;
                const cells = row.cells;
                let tr = materialTable1.insertRow(wIndex1++);

                let i = 0;
                tr.insertCell(i++).innerHTML = tIndex1++;
                if (tr.rowIndex == 1) {
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name1;
                } else
                if (name1 == lastName1) {
                    cell01.setAttribute('rowspan', ++mIndex1);
                } else {
                    mIndex1 = 1;
                    cell01 = tr.insertCell(i++);
                    cell01.innerHTML = name1;
                }
                tr.insertCell(i++).innerHTML = cells.item(materialSpecsIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(wareHouseIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(usedIndex).textContent;
                // tr.insertCell(i++).innerHTML = available % 1 == 0 ? available : Number(available).toFixed(2);
                tr.insertCell(i++).innerHTML = cells.item(onwayIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialQIndex).textContent;
                let remaining = parseFloat(cells.item(wareHouseIndex).textContent) - parseFloat(cells.item(materialQIndex).textContent) - parseFloat(cells.item(usedIndex).textContent) + parseFloat(cells.item(onwayIndex).textContent);
                if (remaining >= 0) {
                    tr.insertCell(i++).innerHTML = '0';
                } else {
                    let x = Math.abs(remaining) > parseFloat(cells.item(materialQIndex).textContent) ? cells.item(materialQIndex).textContent : Math.abs(remaining);
                    tr.insertCell(i++).innerHTML = Math.ceil(x);
                }
                tr.insertCell(i++).innerHTML = cells.item(materialUnitIndex).textContent
                lastName1 = name1;
            }
        }

        await sleep(100);
        if (w.document.getElementById("download").hasAttribute('download')) {
            w.document.getElementById("download").click();
        }
        if (w1.document.getElementById("download").hasAttribute('download')) {
            w1.document.getElementById("download").click();
        }
        if (window.fastPrint) {
            w.print();
            w1.print();
            w.close();
            w1.close();
            document.body.removeChild(iframe);
            document.body.removeChild(iframe1);
        }
    }
    // 打印备料单
    async function generateSumTable() {
        if (!$('input', $('label:contains("订单号")')[0].nextSibling)[0].value) {
            alert("未输入订单号/生产单号/产品编号/产品名,请先设置至少一项筛选条件");
            return;
        }
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        const billDateIndex = $('th:contains("单据日期")')[0].cellIndex;
        const billDeliveryIndex = $('th:contains("发货日期")')[0].cellIndex;
        // 物料
        const materialCodeIndex = $('th:contains("物料编码")')[0].cellIndex;
        const materialNameIndex = $('th:contains("物料名")')[0].cellIndex;
        const materialAliasIndex = $('th:contains("物料别名")')[0].cellIndex;
        const materialSpecsIndex = $('th:contains("物料规格")')[0].cellIndex;
        const materialQIndex = $('th:contains("订单用量")')[0].cellIndex;
        const materialUnitIndex = $('th:contains("计量单位")')[0].cellIndex;
        const processIndex = $('th:contains("用途")')[0].cellIndex;
        const wareHouseIndex = $('th:contains("库存量")')[0].cellIndex;
        const usedIndex = $('th:contains("材料未出库")')[0].cellIndex;
        const onwayIndex = $('th:contains("采购未入库")')[0].cellIndex;

        var tbody = null;
        await getFullTable(materialCodeIndex).then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        let map = new Map();
        let trCells = tbody.rows.item(0).cells;

        var today = new Date();
        var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
        var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
        // 生产备料单
        let w = null;
        let iframe = null;
        if (window.fastPrint) {
            iframe = document.createElement('iframe');
            document.body.appendChild(iframe);
            iframe.contentWindow.document.open();
            iframe.contentWindow.document.write(sumMaterialTemplate);
            w = iframe.contentWindow;
        } else {
            w = window.open();
            w.document.write(sumMaterialTemplate);
            w.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "生产备料单" + '-' + date + ".html");
        }

        map.set('orderNo', trCells.item(orderNoIndex));
        map.set('orderDate', trCells.item(billDateIndex));
        map.set('deliveryDate', trCells.item(billDeliveryIndex));
        map.set('OCellA', trCells.item(orderNoIndex));
        map.set('OCellB', trCells.item(orderNoIndex));
        for (let item of map) {
            if ($('#' + item[0], w.document)[0]) {
                $('#' + item[0], w.document)[0].textContent = $('div', item[1])[0].textContent;
            }
        }
        // 填信息
        $('#printTime', w.document)[0].textContent = date + ' ' + time;


        // 包装备料单
        let w1 = null;
        let iframe1 = null;
        if (window.fastPrint) {
            iframe1 = document.createElement('iframe');
            document.body.appendChild(iframe1);
            iframe1.contentWindow.document.open();
            iframe1.contentWindow.document.write(w.document.documentElement.innerHTML);
            w1 = iframe1.contentWindow;
        } else {
            w1 = window.open();
            w1.document.write(w.document.documentElement.innerHTML);
            w1.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "包装备料单" + '-' + date + ".html");
        }
        new QRCode($('#SCDQR', w.document)[0], {
            text: trCells.item(orderNoIndex).textContent,
            width: 144,
            height: 144
        });

        new QRCode($('#SCDQR', w1.document)[0], {
            text: trCells.item(orderNoIndex).textContent,
            width: 144,
            height: 144
        });
        w1.document.getElementById('title').textContent = "包装备料单";

        // 原料表
        var materialTable = $('#materialTable', w.document)[0];
        // 工艺表指针
        var wIndex = 1;
        // 物料表指针
        var mIndex = 1;
        // 表体序号
        var tIndex = 1;
        let name = '';
        let lastName = '';
        let cell0 = null;

        // 物料表
        var materialTable1 = $('#materialTable', w1.document)[0];
        // 工艺表指针
        var wIndex1 = 1;
        // 物料表指针
        var mIndex1 = 1;
        // 表体序号
        var tIndex1 = 1;
        let name1 = '';
        let lastName1 = '';
        let cell01 = null;
        for (let row of bodyRows) {
            let materialCode = $('div', row.cells.item(materialCodeIndex))[0].textContent;
            let process = $('div', row.cells.item(processIndex))[0].textContent;
            if (process != '包装' && !materialCode.startsWith('00-')) {
                name = $('div', row.cells.item(materialNameIndex))[0].textContent;
                const cells = row.cells;
                let tr = materialTable.insertRow(wIndex++);

                let i = 0;
                tr.insertCell(i++).innerHTML = tIndex++;
                tr.insertCell(i++).innerHTML = cells.item(materialCodeIndex).textContent;
                if (tr.rowIndex == 1) {
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name;
                } else
                if (name == lastName) {
                    cell0.setAttribute('rowspan', ++mIndex);
                } else {
                    mIndex = 1;
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name;
                }
                tr.insertCell(i++).innerHTML = cells.item(materialAliasIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialSpecsIndex).textContent;
                if (materialCode.startsWith('00-') || materialCode.startsWith('01-012')) {
                    tr.insertCell(i++).innerHTML = '外购';
                } else {
                    tr.insertCell(i++).innerHTML = '';
                }
                tr.insertCell(i++).innerHTML = cells.item(materialQIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialUnitIndex).textContent
                lastName = name;
            }
            if (process == '包装' || materialCode.startsWith('01-012')) {
                name1 = $('div', row.cells.item(materialNameIndex))[0].textContent;
                const cells = row.cells;
                let tr = materialTable1.insertRow(wIndex1++);

                let i = 0;
                tr.insertCell(i++).innerHTML = tIndex1++;
                tr.insertCell(i++).innerHTML = cells.item(materialCodeIndex).textContent;
                if (tr.rowIndex == 1) {
                    cell0 = tr.insertCell(i++);
                    cell0.innerHTML = name1;
                } else
                if (name1 == lastName1) {
                    cell01.setAttribute('rowspan', ++mIndex1);
                } else {
                    mIndex1 = 1;
                    cell01 = tr.insertCell(i++);
                    cell01.innerHTML = name1;
                }
                tr.insertCell(i++).innerHTML = cells.item(materialAliasIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialSpecsIndex).textContent;
                if (materialCode.startsWith('01-012')) {
                    tr.insertCell(i++).innerHTML = '车件';
                } else {
                    tr.insertCell(i++).innerHTML = '';
                }
                tr.insertCell(i++).innerHTML = cells.item(materialQIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialUnitIndex).textContent
                lastName1 = name1;
            }
        }

        await sleep(100);
        if (w.document.getElementById("download").hasAttribute('download')) {
            w.document.getElementById("download").click();
        }
        if (w1.document.getElementById("download").hasAttribute('download')) {
            w1.document.getElementById("download").click();
        }
        if (window.fastPrint) {
            w.print();
            w1.print();
            w.close();
            w1.close();
            document.body.removeChild(iframe);
            document.body.removeChild(iframe1);
        }
    }


    // 打印排料单
    async function generateMaterial() {
        if (!$('input', $('label:contains("订单号")')[0].nextSibling)[0].value && !$('input', $('label:contains("生产单号")')[0].nextSibling)[0].value && !$('input', $('label:contains("产品编码")')[0].nextSibling)[0].value && !$('input', $('label:contains("产品名")')[0].nextSibling)[0].value) {
            alert("未输入订单号/生产单号/产品编号/产品名,请先设置至少一项筛选条件");
            return;
        }
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        const billDateIndex = $('th:contains("单据日期")')[0].cellIndex;
        const billDeliveryIndex = $('th:contains("发货日期")')[0].cellIndex;
        const productCodeIndex = $('th:contains("产品编码")')[0].cellIndex;
        const productNameIndex = $('th:contains("产品名")')[0].cellIndex;
        const productAliasIndex = $('th:contains("产品别名")')[0].cellIndex;
        const productSpecsIndex = $('th:contains("产品规格")')[0].cellIndex;
        const scdIndex = $('th:contains("生产单号")')[0].cellIndex;
        const orderQuantityIndex = $('th:contains("下单数")')[0].cellIndex;
        const processIndex = $('th:contains("工序名")')[0].cellIndex;
        const semiIndex = $('th:contains("工件名")')[0].cellIndex;
        const plannedQuantityIndex = $('th:contains("加工数")')[0].cellIndex;
        const productPlannedQuantityIndex = $('th:contains("生产数")')[0].cellIndex;
        const workshopIndex = $('th:contains("车间")')[0].cellIndex;
        const keyIndex = $('th:contains("主键")')[0].cellIndex;
        // 物料
        const materialCodeIndex = $('th:contains("物料编码")')[0].cellIndex;
        const materialNameIndex = $('th:contains("物料名")')[0].cellIndex;
        const materialAliasIndex = $('th:contains("物料别名")')[0].cellIndex;
        const materialSpecsIndex = $('th:contains("物料规格")')[0].cellIndex;
        const semiSpecsIndex = $('th:contains("工件尺寸")')[0].cellIndex;
        const materialQIndex = $('th:contains("领料数")')[0].cellIndex;
        const materialUnitIndex = $('th:contains("计量单位")')[0].cellIndex;

        var tbody = null;
        await getFullTable().then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        let trCells = tbody.rows.item(0).cells;
        var today = new Date();
        var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
        var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();

        let w = null;
        let iframe = null;
        if (window.fastPrint) {
            iframe = document.createElement('iframe');
            document.body.appendChild(iframe);
            iframe.contentWindow.document.open();
            iframe.contentWindow.document.write(materialTemplate);
            w = iframe.contentWindow;
        } else {
            w = window.open();
            w.document.write(materialTemplate);
            w.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "生产排料单" + '-' + date + ".html");
        }
        let map = new Map();
        map.set('orderNo', trCells.item(orderNoIndex));
        map.set('SCD', trCells.item(scdIndex));
        map.set('SCDCell', trCells.item(scdIndex));
        map.set('orderQuantity', trCells.item(orderQuantityIndex));
        map.set('plannedQuantity', trCells.item(productPlannedQuantityIndex));
        map.set('orderDate', trCells.item(billDateIndex));
        map.set('deliveryDate', trCells.item(billDeliveryIndex));
        map.set('OCellA', trCells.item(orderNoIndex));
        map.set('OCellB', trCells.item(orderNoIndex));

        for (let item of map) {
            if ($('#' + item[0], w.document)[0]) {
                $('#' + item[0], w.document)[0].textContent = $('div', item[1])[0].textContent;
            }
        }
        // 填信息
        $('#printTime', w.document)[0].textContent = date + ' ' + time;
        new QRCode($('#SCDQR', w.document)[0], {
            text: trCells.item(orderNoIndex).textContent,
            width: 144,
            height: 144
        });

        var materialTable = $('#materialTable', w.document)[0];
        // 工艺表指针
        var wIndex = 1;
        // 物料表指针
        var mIndex = 1;
        let lastCode = '';
        let cell0 = null;
        let cell1 = null;
        let cell2 = null;
        for (let row of bodyRows) {
            let materialCode = $('div', row.cells.item(materialCodeIndex))[0].textContent;
            let process = $('div', row.cells.item(processIndex))[0].textContent;
            if (materialCode && process != '包装' && process != '产品组装' && !materialCode.startsWith('02-1')) {
                const semi = $('div', row.cells.item(semiIndex))[0].textContent;
                const code = $('div', row.cells.item(productCodeIndex))[0].textContent;
                const cells = row.cells;
                let tr = materialTable.insertRow(wIndex++);
                if (tr.rowIndex == 1) {
                    cell0 = tr.insertCell(0);
                    cell1 = tr.insertCell(1);
                    cell2 = tr.insertCell(2);
                    cell0.innerHTML = cells.item(productAliasIndex).textContent + "<br />" + cells.item(productNameIndex).textContent;
                    cell1.innerHTML = cells.item(productPlannedQuantityIndex).textContent;
                    cell1.className = "numCell";
                    cell2.innerHTML = cells.item(orderQuantityIndex).textContent;
                    cell2.className = "numCell";
                } else
                if (code == lastCode) {
                    cell0.setAttribute('rowspan', mIndex);
                    cell1.setAttribute('rowspan', mIndex);
                    cell2.setAttribute('rowspan', mIndex);
                } else {
                    mIndex = 1;
                    cell0 = tr.insertCell(0);
                    cell1 = tr.insertCell(1);
                    cell2 = tr.insertCell(2);
                    cell0.innerHTML = cells.item(productAliasIndex).textContent + "<br />" + cells.item(productNameIndex).textContent;
                    cell1.innerHTML = cells.item(productPlannedQuantityIndex).textContent;
                    cell1.className = "numCell";
                    cell2.innerHTML = cells.item(orderQuantityIndex).textContent;
                    cell2.className = "numCell";
                }
                let i = 0;
                if (code != lastCode) {
                    i = 3;
                }
                //tr.insertCell(i++).innerHTML = cells.item(processIndex).textContent;
                tr.insertCell(i++).innerHTML = semi;
                tr.insertCell(i++).innerHTML = mIndex++;
                //tr.insertCell(i++).innerHTML = cells.item(materialCodeIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialNameIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialSpecsIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(semiSpecsIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(plannedQuantityIndex).textContent;
                if (materialCode.startsWith('00-') || materialCode.startsWith('01-012')) {
                    tr.insertCell(i++).innerHTML = '外购';
                } else {
                    tr.insertCell(i++).innerHTML = '';
                }
                tr.insertCell(i++).innerHTML = cells.item(materialQIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(materialUnitIndex).textContent;
                //tr.insertCell(i++).innerHTML = cells.item(processIndex).textContent;
                tr.insertCell(i++).innerHTML = cells.item(workshopIndex).textContent;
                lastCode = code;
            }

        }

        await sleep(100);
        if (w.document.getElementById("download").hasAttribute('download')) {
            w.document.getElementById("download").click();
        }
        if (window.fastPrint) {
            w.print();
            w.close();
            document.body.removeChild(iframe);
        }
    }

    // 打印生产单
    async function generateAndPrint() {
        if (!$('input', $('label:contains("订单号")')[0].nextSibling)[0].value && !$('input', $('label:contains("生产单号")')[0].nextSibling)[0].value && !$('input', $('label:contains("产品编码")')[0].nextSibling)[0].value && !$('input', $('label:contains("产品名")')[0].nextSibling)[0].value) {
            alert("未输入订单号/生产单号/产品编号/产品名,请先设置至少一项筛选条件");
            return;
        }
        const orderNoIndex = $('th:contains("订单号")')[0].cellIndex;
        const customerIndex = $('th:contains("客户名")')[0].cellIndex;
        const billDateIndex = $('th:contains("单据日期")')[0].cellIndex;
        const billDeliveryIndex = $('th:contains("发货日期")')[0].cellIndex;
        const productCodeIndex = $('th:contains("产品编码")')[0].cellIndex;
        const productNameIndex = $('th:contains("产品名")')[0].cellIndex;
        const productAliasIndex = $('th:contains("产品别名")')[0].cellIndex;
        const productSpecsIndex = $('th:contains("产品规格")')[0].cellIndex;
        const scdIndex = $('th:contains("生产单号")')[0].cellIndex;
        const orderQuantityIndex = $('th:contains("下单数")')[0].cellIndex;
        const processIndex = $('th:contains("工序名")')[0].cellIndex;
        const semiIndex = $('th:contains("工件名")')[0].cellIndex;
        const plannedQuantityIndex = $('th:contains("加工数")')[0].cellIndex;
        const productPlannedQuantityIndex = $('th:contains("生产数")')[0].cellIndex;
        const workshopIndex = $('th:contains("车间")')[0].cellIndex;
        const keyIndex = $('th:contains("主键")')[0].cellIndex;
        // 物料
        const materialCodeIndex = $('th:contains("物料编码")')[0].cellIndex;
        const materialNameIndex = $('th:contains("物料名")')[0].cellIndex;
        const materialAliasIndex = $('th:contains("物料别名")')[0].cellIndex;
        const materialSpecsIndex = $('th:contains("物料规格")')[0].cellIndex;
        const semiSpecsIndex = $('th:contains("工件尺寸")')[0].cellIndex;
        const materialQIndex = $('th:contains("领料数")')[0].cellIndex;
        const materialUnitIndex = $('th:contains("计量单位")')[0].cellIndex;


        var tbody = null;
        await getFullTable().then(t => {
            tbody = t;
        })

        var bodyRows = tbody.rows;
        var today = new Date();
        var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
        var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();

        let oldSCD = ''
        let atable = [];
        var currentTable = null;
        // 根据不同生产单生成n个表
        for (let tr of bodyRows) {
            let cSCD = $('div', tr.cells.item(scdIndex))[0].textContent;
            if (cSCD != oldSCD) {
                currentTable = document.createElement('table');
                atable.push(currentTable);
            }
            currentTable.appendChild(tr.cloneNode(true));
            oldSCD = cSCD;
        }

        for (let t of atable) {
            let trCells = t.rows.item(0).cells;
            let w = null;
            let iframe = null;
            if (window.fastPrint) {
                iframe = document.createElement('iframe');
                document.body.appendChild(iframe);
                iframe.contentWindow.document.open();
                iframe.contentWindow.document.write(htmlTemplate);
                w = iframe.contentWindow;
            } else {
                w = window.open();
                w.document.write(htmlTemplate);
                w.document.getElementById("download").setAttribute('download', trCells.item(orderNoIndex).textContent + '-' + "生产任务单" + '-' + trCells.item(productAliasIndex).textContent + '-' + trCells.item(productNameIndex).textContent + '-' + date + ".html");
            }
            let map = new Map();
            map.set('customerName', trCells.item(customerIndex));
            map.set('orderNo', trCells.item(orderNoIndex));
            map.set('productCode', trCells.item(productCodeIndex));
            map.set('productName', trCells.item(productNameIndex));
            map.set('ProductNameCell', trCells.item(productNameIndex));
            map.set('productAlias', trCells.item(productAliasIndex));
            map.set('productSpecs', trCells.item(productSpecsIndex));
            map.set('SCD', trCells.item(scdIndex));
            map.set('SCDCell', trCells.item(scdIndex));
            map.set('orderQuantity', trCells.item(orderQuantityIndex));
            map.set('plannedQuantity', trCells.item(productPlannedQuantityIndex));
            map.set('orderDate', trCells.item(billDateIndex));
            map.set('deliveryDate', trCells.item(billDeliveryIndex));

            // 填信息
            for (let item of map) {
                $('#' + item[0], w.document)[0].textContent = $('div', item[1])[0].textContent;
            }
            $('#ProductNameCell', w.document)[0].textContent = $('div', trCells.item(productAliasIndex))[0].textContent + ' ' + $('#ProductNameCell', w.document)[0].textContent;
            $('#printTime', w.document)[0].textContent = date + ' ' + time;
            new QRCode($('#SCDQR', w.document)[0], {
                text: $('div', map.get('SCD'))[0].textContent,
                width: 144,
                height: 144
            });

            var tBodyRows = t.rows;
            var processTable = $('#procedureTable', w.document)[0];
            var materialTable = $('#materialTable', w.document)[0];
            // 工艺表指针
            var wIndex = 1;
            // 物料表指针
            var mIndex = 1;
            var contentIndex = 0;
            let outsourcing = '';
            let lastID = '';
            let processCell = null;
            let span = 1;
            for (let row of tBodyRows) {
                let process = $('div', row.cells.item(processIndex))[0].textContent;
                const semi = $('div', row.cells.item(semiIndex))[0].textContent;
                const plannedQuantity = $('div', row.cells.item(plannedQuantityIndex))[0].textContent;
                const workshop = $('div', row.cells.item(workshopIndex))[0].textContent;
                const key = $('div', row.cells.item(keyIndex))[0].textContent;

                if (process.includes('振光') || process.includes('镀') || process.includes('电解') || process.includes('丝印') || process.includes('打砂') || process.includes('浸塑') || process.includes('震光') || process.includes('氧化着色') || process.includes('喷粉')) {
                    if (!outsourcing.includes(process))
                        outsourcing = outsourcing ? outsourcing + '/' + process : process;
                }


                let materialCode = $('div', row.cells.item(materialCodeIndex))[0].textContent;
                if (materialCode.startsWith("02-")) {
                    materialCode = null;
                }
                // 填工序卡表体
                if (key != lastID) {
                    let tr = processTable.insertRow(wIndex);
                    contentIndex = wIndex++;
                    tr.insertCell(0).innerHTML = contentIndex;
                    let processCell = tr.insertCell(1);
                    processCell.innerHTML = materialCode ? '🅐' + process : process;
                    processCell.setAttribute('class', 'processCell');
                    let semiCell = tr.insertCell(2);
                    semiCell.innerHTML = semi;
                    semiCell.setAttribute('class', 'semiCell');
                    let i = 3
                    let pieceQuantity = plannedQuantity / $('#plannedQuantity', w.document)[0].textContent;
                    tr.insertCell(i++).innerHTML = plannedQuantity;
                    tr.insertCell(i++).innerHTML = pieceQuantity < 1 ? Number(pieceQuantity).toFixed(2) : pieceQuantity;
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = '';
                    tr.insertCell(i++).innerHTML = workshop;
                    // let qrCell = tr.insertCell(6);
                    // var qrDiv = document.createElement('div');
                    // new QRCode(qrDiv, {
                    //     text: process,
                    //     width: 64,
                    //     height: 64
                    // });
                    // qrCell.appendChild(qrDiv);
                }

                // 填物料表体
                if (materialCode && process != '包装' && process != '产品组装') {
                    let materialCode = $('div', row.cells.item(materialCodeIndex))[0].textContent;
                    let materialName = $('div', row.cells.item(materialNameIndex))[0].textContent;
                    let materialAlias = $('div', row.cells.item(materialAliasIndex))[0].textContent;
                    let materialSpecs = $('div', row.cells.item(materialSpecsIndex))[0].textContent;
                    let semiSpecs = $('div', row.cells.item(semiSpecsIndex))[0].textContent;
                    let materialQ = $('div', row.cells.item(materialQIndex))[0].textContent;
                    let materialUnit = $('div', row.cells.item(materialUnitIndex))[0].textContent;
                    let tr = materialTable.insertRow(mIndex++);
                    if (mIndex == 1) {
                        processCell = tr.insertCell(0);
                        processCell.innerHTML = contentIndex + '.' + process;
                        processCell.setAttribute('class', 'processCell');
                    } else
                    if (key == lastID) {
                        processCell.setAttribute('rowspan', ++span);
                    } else {
                        span = 1;
                        processCell = tr.insertCell(0);
                        processCell.innerHTML = contentIndex + '.' + process;
                        processCell.setAttribute('class', 'processCell');
                    }
                    let i = 0;
                    if (key != lastID) {
                        i = 1;
                    }
                    tr.insertCell(i++).innerHTML = materialCode;
                    let nameCell = tr.insertCell(i++);
                    nameCell.innerHTML = materialName;
                    nameCell.setAttribute('class', 'nameCell');
                    tr.insertCell(i++).innerHTML = materialSpecs;
                    tr.insertCell(i++).innerHTML = semiSpecs;
                    tr.insertCell(i++).innerHTML = plannedQuantity;
                    tr.insertCell(i++).innerHTML = materialQ;
                    tr.insertCell(i++).innerHTML = materialUnit;
                }
                lastID = key;
            }
            $('#outSourceType', w.document)[0].textContent = outsourcing;

            await sleep(100);
            if (w.document.getElementById("download").hasAttribute('download')) {
                w.document.getElementById("download").click();
            }
            if (window.fastPrint) {
                w.print();
                w.close();
                document.body.removeChild(iframe);
            }
        }
    }

    //async function makeQRCode() {
    //    let bodyRows = document.querySelectorAll('[class="cell el-tooltip"]')[0].closest('table').lastChild.rows;
    //    const qrIndex = $('th:contains("二维码")')[0].cellIndex;
    //    if (!qrIndex) {
    //        return;
    //    }
    //    let qrCell = null;
    //    for (let row of bodyRows) {
    //        qrCell = row.cells.item(qrIndex);
    //        let qrDiv = $('#qrBoxDiv', qrCell)[0];
    //        if (qrDiv) {
    //            qrCell.removeChild(qrDiv);
    //        }
    //        qrDiv = document.createElement('div');
    //        qrDiv.setAttribute('id', 'qrBoxDiv');
    //        qrCell.appendChild(qrDiv);

    //        let str = $('div', row.cells.item(qrIndex))[0].textContent;
    //        new QRCode(qrDiv, {
    //            text: str,
    //            width: 96,
    //            height: 96
    //        });
    //    }
    //    while ($('img', qrCell)[0].getAttribute('style') == "display: none;") {
    //        await sleep(100);
    //    }
    //    formatAndPrint();
    //}

    //async function formatAndPrint() {
    //    var header = $('thead')[0].firstChild;
    //    var body = document.querySelectorAll('[class="cell el-tooltip"]')[0].closest('tbody').cloneNode(true);
    //    var bodyRows = body.rows;

    //    // cleanup table elements
    //    var tbl = document.createElement('table');

    //    for (let row of bodyRows) {
    //        // tr
    //        row.removeAttribute('class');
    //        for (let cell of row.cells) {
    //            // td
    //            cell.removeAttribute('class');
    //            cell.removeAttribute('rowspan');
    //            cell.removeAttribute('colspan');
    //            // td-div
    //            cell.firstChild.removeAttribute('class');
    //            cell.firstChild.removeAttribute('style');
    //        }
    //    }

    //    var printContents = body.innerHTML;
    //    var pageTemplate = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css">\n<style>@page { size: A4 }</style>\n<body class="A5">\n<section class="sheet padding-10mm">\n';
    //    // add contents here
    //    pageTemplate += "<table>" + printContents + "</table>";
    //    pageTemplate += '\n</section>\n</body>';
    //    var w = window.open();
    //    w.document.write(pageTemplate);
    //    await sleep(500);
    //    w.print();
    //    // w.close();
    //}

    // 生产任务单
    const htmlTemplate = `<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css">

<body class="A4" style="height: auto;">
    <a onclick="this.href='data:text/html;charset=UTF-8,'+encodeURIComponent(document.documentElement.outerHTML)"
        href="#" id="download"></a>
    <section class="sheet padding-10mm" style="height: auto;">
        <p align=center style="margin-top: -5px;"><span class=title lang=ZH-CN>车间生产任务单</span></p>
        <div align=center>
            <div id="leftbox">
                <p align=left><label>客户名: </label><span id="customerName"></span></p>
                <p align=left><label>订单号: </label><span id="orderNo"></span></p>
                <p align=left><label>产品编码: </label><span id="productCode"></span></p>
                <p align=left><label>产品名: </label><span id="productName"></span></p>
                <p align=left><label>产品别名: </label><span id="productAlias"></span></p>
                <p align=left><label>产品规格: </label><span id="productSpecs"></span></p>
                <p align=left><label>生产单号: </label><span id="SCD"></span></p>
                <p align=left><label>客户下单数: </label><span id="orderQuantity"></span></p>
                <p align=left><label>计划生产数: </label><span id="plannedQuantity"></span></p>
                <p align=left><label>订单日期: </label><span id="orderDate"></span></p>
                <p align=left><label>交货日期: </label><span id="deliveryDate"></span></p>
                <p align=left><label>打印时间: </label><span id="printTime"></span></p>
                <p align=left><label>外发类型: </label><span id="outSourceType"></span></p>
            </div>

            <div id="rightbox" style="margin-bottom: 10px;">
                <table id="materialTable" style="font-size:small;" contenteditable>
                    <tr>
                        <th>工序</th>
                        <th>物料编号</th>
                        <th>物料名称</th>
                        <th>物料规格</th>
                        <th>开料尺寸</th>
                        <th>开料数</th>
                        <th>用量</th>
                        <th>单位</th>
                    </tr>
                </table>
                <div style="margin-top: 20px;" id="SCDQR"></div>
            </div>
        </div>
        <div style="clear: both;"></div>
        <div style="margin-top: 10px;" align=center>
            <table style="font-size:small;" contenteditable>
                <thead>
                    <tr>
                        <td colspan="12" style="font-size: medium;"><span>产品名: </span> <span
                                id="ProductNameCell"></span>
                        </td>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <td colspan="12" style="font-size: medium;"><span>车间生产单号: </span><span id="SCDCell"></span>
                        </td>
                    </tr>
                </tfoot>
                <tbody id="procedureTable">
                    <tr>
                        <th>#</th>
                        <th>工序</th>
                        <th>工序内容</th>
                        <th>数量</th>
                        <th>单件</th>
                        <th style="min-width: 15mm;">日期</th>
                        <th style="min-width: 15mm;">投入数</th>
                        <th style="min-width: 15mm;">产出数</th>
                        <th style="min-width: 10mm;">不良品</th>
                        <th style="min-width: 10mm;">用时</th>
                        <th style="min-width: 15mm;">生产员</th>
                        <th>车间</th>
                    </tr>
                </tbody>
            </table>
        </div>
    </section>
</body>
<style>
    @page {
        size: A4;
    }

    #leftbox {
        float: left;
        margin-top: 20px;
        margin-bottom: 20px;
        width: 30%;
    }

    #rightbox {
        float: right;
        margin-top: 30px;
        width: 68%;
    }

    .title {
        text-align: center;
        font-size: large;
    }

    p {
        margin-bottom: -10px;
        font-size: 90%;
    }

    .avoidBreak {
        page-break-after: avoid;
    }

    table,
    th,
    td {
        word-wrap: break-word;
    }

    .semiCell {
        max-width: 50mm;
    }

    .processCell {
        max-width: 17mm;
    }

    .nameCell {
        max-width: 25mm;
    }

    .materialCode {
        font-size: 6px;
    }

    table {
        width: 100%;
        border-width: 1px;
        border-spacing: 0px;
        border-style: solid;
        border-color: grey;
        border-collapse: separate;
    }

    table th {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    table td {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    td {
        font-size: smaller;
    }

    tr {
        page-break-inside: avoid;
        page-break-after: auto;
    }

    thead {
        display: table-header-group;
    }

    tfoot {
        display: table-footer-group;
    }
</style>`;

    // 排料单
    const materialTemplate = `<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css">

<body class="A4" style="height: auto;">
    <a onclick="this.href='data:text/html;charset=UTF-8,'+encodeURIComponent(document.documentElement.outerHTML)"
        href="#" id="download"></a>
    <section class="sheet padding-10mm" style="height: auto;">
        <p align=center style="margin-top: -5px;"><span class=title lang=ZH-CN>生产排料单</span></p>
        <div align=center>
            <div id="leftbox">
                <p align=left><label>订单号: </label><span id="orderNo"></span></p>
                <p align=left><label>订单日期: </label><span id="orderDate"></span></p>
                <p align=left><label>领料日期: </label><span id="pickingDate"></span></p>
                <p align=left><label>交货日期: </label><span id="deliveryDate"></span></p>
                <p align=left><label>打印时间: </label><span id="printTime"></span></p>
            </div>

            <div id="rightbox">
                <div align="right" style="margin-top: 20px;" id="SCDQR"></div>
            </div>
        </div>
        <div style="clear: both;"></div>
        <div style="margin-top: 10px;" align=center>
            <table style="font-size:small;" contenteditable>
                <thead>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span> <span id="OCellA"></span>
                        </td>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span><span id="OCellB"></span>
                        </td>
                    </tr>
                </tfoot>
                <tbody id="materialTable">
                    <tr>
                        <th>产品名称</th>
                        <th class="numCell">生产数</th>
                        <th class="numCell">出货数</th>
                        <th>工件名称</th>
                        <th>#</th>
                        <th>物料名称</th>
                        <th>物料规格</th>
                        <th>开料尺寸</th>
                        <th>开料数</th>
                        <th style="min-width: 30px;">物料来源</th>
                        <th>用量</th>
                        <th>单位</th>
                        <th>车间</th>
                    </tr>
                </tbody>
            </table>
        </div>
    </section>
</body>
<style>
    @page {
        size: A4;
    }

    #leftbox {
        float: left;
        margin-top: 20px;
        margin-bottom: 20px;
        width: 30%;
    }

    #rightbox {
        float: right;
        margin-top: 10px;
        width: 68%;
    }

    .numCell {
        max-width: 25px;
    }

    .title {
        text-align: center;
        font-size: large;
    }

    .materialCode {
        font-size: 6px;
    }

    .avoidBreak {
        page-break-after: avoid;
    }

    p {
        margin-bottom: -10px;
        font-size: 90%;
    }

    table,
    th,
    td {
        word-wrap: break-word;
    }

    table {
        width: 100%;
        border-width: 1px;
        border-spacing: 0px;
        border-style: solid;
        border-color: grey;
        border-collapse: separate;
    }

    table th {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    table td {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    td {
        font-size: smaller;
        max-width: 80px;
    }
</style>`;

    // 备料单
    const sumMaterialTemplate = `<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css">

<body class="A4" style="height: auto;">
    <a onclick="this.href='data:text/html;charset=UTF-8,'+encodeURIComponent(document.documentElement.outerHTML)"
        href="#" id="download"></a>
    <section class="sheet padding-10mm" style="height: auto;">
        <p align=center style="margin-top: -5px;"><span id="title" class="title">生产备料单</span></p>
        <div align=center>
            <div id="leftbox">
                <p align=left><label>订单号: </label><span id="orderNo"></span></p>
                <p align=left><label>订单日期: </label><span id="orderDate"></span></p>
                <p align=left><label>领料日期: </label><span id="pickingDate"></span></p>
                <p align=left><label>交货日期: </label><span id="deliveryDate"></span></p>
                <p align=left><label>打印时间: </label><span id="printTime"></span></p>
            </div>

            <div id="rightbox">
                <div align="right" style="margin-top: 20px;" id="SCDQR"></div>
            </div>
        </div>
        <div style="clear: both;"></div>
        <div style="margin-top: 10px;" align=center>
            <table style="font-size:small;" contenteditable>
                <thead>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span> <span id="OCellA"></span>
                        </td>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span><span id="OCellB"></span>
                        </td>
                    </tr>
                </tfoot>
                <tbody id="materialTable">
                    <tr>
                        <th>#</th>
                        <th>物料编码</th>
                        <th>物料名称</th>
                        <th>物料别名</th>
                        <th>物料规格</th>
                        <th style="min-width: 30px;">物料来源</th>
                        <th>用量</th>
                        <th>单位</th>
                    </tr>
                </tbody>
            </table>
        </div>
    </section>
</body>
<style>
    @page {
        size: A4;
    }

    #leftbox {
        float: left;
        margin-top: 20px;
        margin-bottom: 20px;
        width: 30%;
    }

    #rightbox {
        float: right;
        margin-top: 10px;
        width: 68%;
    }

    .numCell {
        max-width: 10px;
    }

    .materialCode {
        font-size: 6px;
    }

    .title {
        text-align: center;
        font-size: large;
    }

    p {
        margin-bottom: -10px;
        font-size: 90%;
    }

    .avoidBreak {
        page-break-after: avoid;
    }

    table,
    th,
    td {
        word-wrap: break-word;
    }

    table {
        width: 100%;
        border-width: 1px;
        border-spacing: 0px;
        border-style: solid;
        border-color: grey;
        border-collapse: separate;
    }

    table th {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    table td {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }
</style>`;

    // 采购单
    const purchaseTemplate = `
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paper-css/0.3.0/paper.css">

<body class="A4" style="height: auto;">
    <a onclick="this.href='data:text/html;charset=UTF-8,'+encodeURIComponent(document.documentElement.outerHTML)"
        href="#" id="download"></a>
    <section class="sheet padding-10mm" style="height: auto;">
        <p align=center style="margin-top: -5px;"><span id="title" class="title">原料采购计划</span></p>
        <div align=center>
            <div id="leftbox">
                <p align=left><label>订单号: </label><span id="orderNo"></span></p>
                <p align=left><label>订单日期: </label><span id="orderDate"></span></p>
                <p align=left><label>领料日期: </label><span id="pickingDate"></span></p>
                <p align=left><label>交货日期: </label><span id="deliveryDate"></span></p>
                <p align=left><label>打印时间: </label><span id="printTime"></span></p>
            </div>

            <div id="rightbox">
                <div align="right" style="margin-top: 20px;" id="SCDQR"></div>
            </div>
        </div>
        <div style="clear: both;"></div>
        <div style="margin-top: 10px;" align=center>
            <table style="font-size:small;" contenteditable>
                <thead>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span> <span id="OCellA"></span>
                        </td>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <td colspan="15" style="font-size: medium;"><span>订单号: </span><span id="OCellB"></span>
                        </td>
                    </tr>
                </tfoot>
                <tbody id="materialTable">
                    <tr>
                        <th>#</th>
                        <th>物料名称</th>
                        <th>物料规格</th>
                        <th style="min-width: 30px;">当前库存</th>
                        <th>生产待领料</th>
                        <th>采购未入库</th>
                        <th>订单用量</th>
                        <th>建议采购数</th>
                        <th>单位</th>
                    </tr>
                </tbody>
            </table>
        </div>
    </section>
</body>
<style>
    @page {
        size: A4;
    }

    #leftbox {
        float: left;
        margin-top: 20px;
        margin-bottom: 20px;
        width: 30%;
    }

    #rightbox {
        float: right;
        margin-top: 10px;
        width: 68%;
    }

    .numCell {
        max-width: 10px;
    }

    .materialCode {
        font-size: 6px;
    }

    .title {
        text-align: center;
        font-size: large;
    }

    p {
        margin-bottom: -10px;
        font-size: 90%;
    }

    .avoidBreak {
        page-break-after: avoid;
    }

    table,
    th,
    td {
        word-wrap: break-word;
    }

    table {
        width: 100%;
        border-width: 1px;
        border-spacing: 0px;
        border-style: solid;
        border-color: grey;
        border-collapse: separate;
    }

    table th {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }

    table td {
        border-width: 1px;
        border-color: grey;
        border-style: solid;
    }
</style>
 `;
})();