MEST Modeling Helper

Modeling Helper

Od 11.11.2022.. Pogledajte najnovija verzija.

// ==UserScript==
// @name         MEST Modeling Helper
// @namespace    joyings.com.cn
// @version      2.1.6
// @description  Modeling Helper
// @author       zmz125000
// @match        http://*/mest/*
// @icon         http://www.google.com/s2/favicons?domain=openwrt.org
// @grant        none
// @license      MIT
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
    addClickActions();
    updateIndexBtn();
    semiCellEvent();
    multiUnit();
    addObserverIfDesiredNodeAvailable();
    // 新增一行自动填写
    window.autofill = false;
    window.autofillMat = false;
    window.autoSerial = false;
    window.autoSemi = false;
    window.skipMat = false;

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

    function addObserverIfDesiredNodeAvailable() {
        var composeBox = document.querySelectorAll('[class="el-popup-parent--hidden"]')[0];
        if (!composeBox) {
            //The node we need does not exist yet.
            //Wait 500ms and try again
            window.setTimeout(addObserverIfDesiredNodeAvailable, 500);
            return;
        }
        var config = {
            attributes: true,
        };
        var composeObserver = new MutationObserver(function () {
            window.setTimeout(addClickActions, 500);
            window.setTimeout(updateIndexBtn, 500);
            window.setTimeout(multiUnit, 500);
            composeObserver.disconnect();
            addObserverIfDesiredNodeAvailable();
        });
        composeObserver.observe(composeBox, config);
    }

    // 选择自己
    async function semiCellEvent() {
        if (!$('button:contains(" 选择自己 ")')[0] || $('button:contains(" 选择自己 ")')[0].hasAttribute('helper') || window.autoSemi) {
            await sleep(500);
            semiCellEvent();
            return;
        }
        $('button:contains(" 选择自己 ")')[0].addEventListener('click', async function (e) {
            await sleep(100);
            dbck();
        });
        await sleep(100);
        while ($('button:contains(" 选择自己 ")')[0] && !$('button:contains(" 选择 ")', $('button:contains(" 选择自己 ")')[0].parentElement.parentElement)) {
            await sleep(100);
        }
        if ($('button:contains(" 选择自己 ")')[0]) {
            for (let btn of $('button:contains(" 选择 ")', $('button:contains(" 选择自己 ")')[0].parentElement.parentElement)) {
                btn.addEventListener('click', async function (e) {
                    await sleep(500);
                    dbck();
                    await sleep(500);
                    dbck();
                });
                btn.setAttribute('helper', true);
            }
        }
        semiCellEvent();
    }

    // 添加按钮
    async function updateIndexBtn() {
        if ($('button:contains("存货Excel导入")')[0] && !$('button:contains("居宜轩导入模板")')[0]) {
            let btn = document.createElement('button');
            btn.setAttribute('type', 'button');
            btn.addEventListener('click', async function () {
                window.open('https://mest-system.oss-cn-guangzhou.aliyuncs.com/orderFiles/document/9967821a-f16c-494d-b7e0-eb5f0b688be6.xlsx');
            });
            btn.appendChild(document.createTextNode('⇩下载居宜轩导入模板'));

            $('button:contains("存货Excel导入")')[0].parentElement.appendChild(btn);
        }
        if (!$('#tab-basic')[0] && !$('button:contains(" 新增一行 ")')[0]) {
            await sleep(500);
            updateIndexBtn();
            return;
        } else if (!$('button:contains("使用说明")')[0]) {
            let btnRow = $('button:contains(" 新增一行 ")')[0].parentElement;
            var btn = document.createElement('button');
            btn.setAttribute('title', '一键更新所有序号');
            btn.setAttribute('id', 'oneKeyButton');
            btn.setAttribute('type', 'button');
            btn.onclick = updateIndex;
            btn.appendChild(document.createTextNode('⇩更新序号'));

            var btn2 = document.createElement('button');
            btn2.setAttribute('title', '重新设置自动填充');
            btn2.setAttribute('id', 'reloadBtn');
            btn2.setAttribute('type', 'button');
            btn2.onclick = dbck;
            btn2.appendChild(document.createTextNode('⟳重载自动填充'));

            var btn3 = document.createElement('button');
            btn3.setAttribute('title', '一键设置工序');
            btn3.setAttribute('id', 'updateProcBtn');
            btn3.setAttribute('type', 'button');
            btn3.onclick = updateProcess;
            btn3.appendChild(document.createTextNode('⇩一键设置工序'));

            var btn4 = document.createElement('button');
            btn4.setAttribute('title', '一键设置物料');
            btn4.setAttribute('id', 'updateMaterialBtn');
            btn4.setAttribute('type', 'button');
            btn4.onclick = updateMaterial;
            btn4.appendChild(document.createTextNode('⇩一键设置物料'));

            var btn5 = document.createElement('button');
            btn5.setAttribute('type', 'button');
            btn5.onclick = readme;
            btn5.appendChild(document.createTextNode('❓使用说明'));

            var btn6 = document.createElement('button');
            btn6.setAttribute('title', '一键替换同系列半产品');
            btn6.setAttribute('id', 'updateSemiBtn');
            btn6.setAttribute('type', 'button');
            btn6.onclick = updateSemi;
            btn6.appendChild(document.createTextNode('⇩一键替换同系列半成品'));

            var btn8 = document.createElement('button');
            btn8.setAttribute('title', '新增一行跳过物料选择');
            btn8.setAttribute('id', 'skipMateralBtn');
            btn8.setAttribute('type', 'button');
            btn8.onclick = skipMaterial;
            btn8.appendChild(document.createTextNode(window.skipMat ? "✔" : "✘"));

            var btnUpdate = document.createElement('button');
            btnUpdate.setAttribute('type', 'button');
            btnUpdate.addEventListener('click', async function () {
                window.open('https://greasyfork.org/en/scripts/452790-mest-modeling-helper');
            });
            btnUpdate.appendChild(document.createTextNode('更新插件'));

            var tDiv1 = document.createElement('div');
            tDiv1.setAttribute('style', 'float:right;');
            var tbox1 = document.createElement('input');
            tbox1.setAttribute('id', 'formerNmaeInput');
            btn4.setAttribute('title', '要被替换的前缀');
            tbox1.setAttribute('placeholder', '要被替换的前缀');
            tbox1.setAttribute('class', 'el-textarea__inner');
            tbox1.setAttribute('style', 'width: 130px;');
            tDiv1.appendChild(tbox1);

            var tDiv2 = document.createElement('div');
            tDiv2.setAttribute('style', 'float:right;');
            var tbox2 = document.createElement('input');
            tbox2.setAttribute('id', 'newNmaeInput');
            btn4.setAttribute('title', '新的前缀');
            tbox2.setAttribute('placeholder', '新的前缀');
            tbox2.setAttribute('class', 'el-textarea__inner');
            tbox2.setAttribute('style', 'width: 130px;');
            tDiv2.appendChild(tbox2);

            // 自动选择半成品
            var aDiv = document.createElement('div');
            aDiv.setAttribute('style', 'float:right;');
            var namesArea = document.createElement('textarea');
            namesArea.setAttribute('id', 'nameListArea');
            namesArea.setAttribute('class', 'el-textarea__inner');
            namesArea.setAttribute('placeholder', "在此输入产品名(多行)");
            namesArea.setAttribute('style', "width: auto;");
            aDiv.appendChild(namesArea);
            var btn7 = document.createElement('button');
            btn7.setAttribute('title', '自动选择半成品');
            btn7.setAttribute('id', 'autofillSemiBtn');
            btn7.setAttribute('type', 'button');
            btn7.onclick = autofillSemi;
            btn7.appendChild(document.createTextNode('⇩自动选择半成品'));

            btnRow.appendChild(btn);
            btnRow.appendChild(btn3);
            btnRow.appendChild(btn4);
            btnRow.appendChild(btn6);
            btnRow.appendChild(btn2);
            btnRow.appendChild(btn5);
            btnRow.appendChild(btn7);
            btnRow.appendChild(btn8);
            btnRow.appendChild(btnUpdate);
            btnRow.appendChild(aDiv);
            btnRow.appendChild(tDiv2);
            btnRow.appendChild(tDiv1);
            dbck();
            window.autofill = false;
            window.autofillMat = false;
            window.autoSerial = false;
            window.autoSemi = false;
        }
    }

    function skipMaterial() {
        if (window.skipMat) {
            window.skipMat = false;
            document.getElementById("skipMateralBtn").firstChild.nodeValue = "✘";
        } else {
            window.skipMat = true;
            document.getElementById("skipMateralBtn").firstChild.nodeValue = "✔";
        }
    }

    // 根据textarea自动选择半成品
    async function autofillSemi() {
        try {
            window.autoSemi = true;
            if ($('div:contains(" 暂未设置工艺 ")')[0]) {
                $('button:contains(" 设置工艺版本 ")')[0].click();
            }
            while (!document.querySelectorAll('[class="edit-cell"]')[0]) {
                $('button:contains(" 新增一行 ")')[0].click();
                await sleep(50);
            }
            let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
            const alias = document.querySelector('[placeholder="别名"]').closest('textarea').value;
            const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
            var lines = $('#nameListArea').val().split('\n');
            if (lines.length < 2) {
                alert("请填写名称");
                window.autoSemi = false;
                return;
            }
            for (var i = 0; i < lines.length; i++) {
                while (!bodyRows.item(i)) {
                    $('button:contains(" 新增一行 ")')[0].click();
                    await sleep(100);
                }
                let semiCell = bodyRows.item(i).cells.item(semiIndex);
                $('span', semiCell).click();
                await sleep(50);
                $('button', semiCell).click();
                while (!document.querySelectorAll('[placeholder="存货别名"]')[1]) {
                    await sleep(50);
                }
                document.querySelectorAll('[placeholder="存货名称"]')[1].value = lines[i];
                document.querySelectorAll('[placeholder="存货名称"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                document.querySelectorAll('[placeholder="存货别名"]')[1].value = alias;
                await sleep(50);
                document.querySelectorAll('[placeholder="存货别名"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                await sleep(50);
                $('button:contains(" 搜索 ")')[0].click();
                await sleep(100);

                let tmp = 'tr:contains("' + lines[i] + '")';
                while (true) {
                    if ($('button:contains("选择自己")')[0] && $(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0]).length != 2) {
                        await sleep(50);
                    } else
                    if ($(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0])[0] && !$(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0])[0].innerHTML.includes(alias)) {
                        await sleep(50);
                    } else {
                        break;
                    }
                }
                if ($('button:contains("选择自己")')[0]) {
                    $('button:contains("选择")', $(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0]))[0].click();
                }
                await sleep(50);
            }
            await sleep(150);
            dbck();
            window.autoSemi = false;
        } catch (error) {
            console.error(error);
            window.autoSemi = false;
        }
    }

    // 同系列半成品
    async function updateSemi() {
        try {
            let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
            const alias = document.querySelector('[placeholder="别名"]').closest('textarea').value;
            const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
            var oldName = $('#formerNmaeInput')[0].value;
            var newName = $('#newNmaeInput')[0].value;
            if (!newName || !oldName) {
                alert("请填写名称");
                return;
            }
            window.autoSemi = true;
            for (let i of bodyRows) {
                let semiCell = i.cells.item(semiIndex);
                let oldFullName = $('span', semiCell)[0].textContent;
                let newFullName = oldFullName.replace(oldName, newName);
                $('span', semiCell).click();
                await sleep(50);
                $('button', semiCell).click();
                while (!document.querySelectorAll('[placeholder="存货别名"]')[1]) {
                    await sleep(50);
                }
                document.querySelectorAll('[placeholder="存货名称"]')[1].value = newFullName;
                document.querySelectorAll('[placeholder="存货名称"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                document.querySelectorAll('[placeholder="存货别名"]')[1].value = alias;
                await sleep(50);
                document.querySelectorAll('[placeholder="存货别名"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                await sleep(50);
                $('button:contains(" 搜索 ")')[0].click();

                let tmp = 'tr:contains("' + alias + '")';
                while (true) {
                    if ($('button:contains("选择自己")')[0] && $(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0]).length != 2) {
                        await sleep(50);
                    } else
                    if ($(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0])[0] && !$(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0])[0].innerHTML.includes(alias)) {
                        await sleep(50);
                    } else {
                        break;
                    }
                }
                if ($('button:contains("选择自己")')[0]) {
                    $('button:contains("选择")', $(tmp, $('div[class="el-dialog__body"]:contains("搜索")')[0]))[0].click();
                }
            }
            window.autoSemi = false;
        } catch (error) {
            console.error(error);
            window.autoSemi = false;
        }
    }
    // 多计量计算
    async function multiUnit() {
        if (!$('td:contains("浮动")')[0]) {
            await sleep(500);
            multiUnit();
            return;
        }
        if ($('button:contains("设置换算率")')[0]) {
            await sleep(5000);
            multiUnit();
            return;
        }

        let btnA = document.createElement('button');
        btnA.setAttribute('type', 'button');
        btnA.setAttribute('class', 'multiUnitBtn');
        btnA.appendChild(document.createTextNode('刷新'));
        btnA.onclick = clearMultiUnitBtn;
        $('th:contains("换算类型")')[0].appendChild(btnA);

        for (let row of $('tr:contains("浮动")')) {
            let btn = document.createElement('button');
            btn.setAttribute('type', 'button');
            btn.setAttribute('class', 'multiUnitBtn');
            btn.appendChild(document.createTextNode('设置换算率'));

            let divb = document.createElement('div');
            divb.setAttribute('class', 'multiUnitBtn');

            let result = multiUnitUtil();
            for (let cell of $('td:contains("浮动")', row)) {
                divb.innerHTML = "类型: " + result[3] + "; 厚度: " + result[2][0] + "; 长: " + result[2][1] + "; 宽: " + result[2][2] + "; 总长: " + result[2][3];
                cell.appendChild(divb);
                switch (row.cells.item(0).textContent) {
                    case 'KG':
                        btn.onclick = function () {
                            result = multiUnitUtil()
                            divb.innerHTML = "类型: " + result[3] + "; 厚度: " + result[2][0] + "; 长: " + result[2][1] + "; 宽: " + result[2][2] + "; 总长: " + result[2][3];
                            $('input', row.cells.item(3))[0].value = multiUnitUtil()[0];
                            $('input', row.cells.item(3))[0].dispatchEvent(new Event('input', {
                                bubbles: true
                            }));
                        };
                        break;
                    case '支':
                        btn.onclick = function () {
                            result = multiUnitUtil()
                            divb.innerHTML = "类型: " + result[3] + "; 厚度: " + result[2][0] + "; 长: " + result[2][1] + "; 宽: " + result[2][2] + "; 总长: " + result[2][3];
                            $('input', row.cells.item(3))[0].value = multiUnitUtil()[1];
                            $('input', row.cells.item(3))[0].dispatchEvent(new Event('input', {
                                bubbles: true
                            }));
                        };
                        break;
                    case '块':
                        btn.onclick = function () {
                            result = multiUnitUtil()
                            divb.innerHTML = "类型: " + result[3] + "; 厚度: " + result[2][0] + "; 长: " + result[2][1] + "; 宽: " + result[2][2] + "; 总长: " + result[2][3];
                            $('input', row.cells.item(3))[0].value = multiUnitUtil()[1];
                            $('input', row.cells.item(3))[0].dispatchEvent(new Event('input', {
                                bubbles: true
                            }));
                        };
                        break;
                }
                cell.appendChild(btn);
            }
        }
    }

    function clearMultiUnitBtn() {
        let elms = $('[class="multiUnitBtn"]');
        for (let elm of elms) {
            elm.remove();
        }
        multiUnit();
    }

    function readme() {
        alert("请先用excel导入所需半成品。\n脚本会用当前存货的别名作为半成品筛选条件,请为产品的所有工件设置相同的别名。\n脚本会根据上一道工序的半成品名填写物料和工序信息。\n如有意见建议或者在使用中遇到问题请联系敬轩\n半成品分类\n【02-101】非开料半成品\n【02-102】开料半成品\n【02-103】喷粉电镀外发\n插件版本号: " + GM_info.script.version);
    }
    // 一键设置物料
    async function updateMaterial() {
        if (!document.querySelectorAll('[class="edit-cell"]')[0]) {
            await sleep(500);
            updateMaterial();
            return;
        }
        let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
        const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
        const materialIndex = $('th:contains(" 所需物料集 ")')[0].cellIndex;

        window.autofillMat = true;
        for (let i of bodyRows) {
            let prevSemi = '';
            let currSemi = $('span', i.cells.item(semiIndex))[0].textContent;
            if (i.rowIndex > 0) {
                prevSemi = $('span', bodyRows.item(i.rowIndex - 1).cells.item(semiIndex))[0].textContent;
            }
            $('a', i.cells.item(materialIndex))[0].click();
            await setMaterial(prevSemi, currSemi, true);
            while ($('button:contains("新增行")')[0]) {
                await sleep(200);
            }
        }
        window.autofillMat = false;
    }

    // 一键更新序号
    async function updateIndex() {
        if (!document.querySelectorAll('[class="edit-cell"]')[0]) {
            await sleep(500);
            updateIndex();
            return;
        }
        window.autoSerial = true;
        let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
        const procIndex = $('th:contains(" 上级序号 ")')[0].cellIndex;

        for (let i of bodyRows) {
            let indexCell = i.cells.item(procIndex);
            if ($('span', indexCell)[0].textContent.includes('始工序')) {
                continue;
            }
            $('span', indexCell)[0].click();
            await sleep(50);
            $('span', indexCell)[0].click();
            while (!$('button:contains(" 选择 ")')[i.rowIndex]) {
                await sleep(50);
            }
            $('button:contains(" 选择 ")')[i.rowIndex].click();
            await sleep(50);
        }
        window.autoSerial = false;
    }

    // 一键设置工序
    async function updateProcess() {
        if (!document.querySelectorAll('[class="edit-cell"]')[0]) {
            await sleep(500);
            updateProcess();
            return;
        }
        let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
        const processIndex = $('th:contains(" 工序名称 ")')[0].cellIndex;
        const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
        window.autofill = true;
        for (let i of bodyRows) {
            let name = $('span', bodyRows.item(i.rowIndex).cells.item(semiIndex))[0].textContent;

            await sleep(50);
            $('span', i.cells.item(processIndex))[0].click();
            await sleep(50);
            $('button', i.cells.item(processIndex))[0].click();
            await setProcess(name, i, true);
        }
        window.autofill = false;
    }

    // 新增一行自动填写
    async function addClickActions() {
        if (!$('button:contains(" 新增一行 ")')[0] || $('button:contains(" 设置工艺版本 ")')[0].hasAttribute('helper')) {
            await sleep(500);
            addClickActions();
            return;
        }
        $('button:contains(" 设置工艺版本 ")')[0].addEventListener('click', async function (e) {
            if ($('div:contains(" 暂未设置工艺 ")')[0]) {
                await sleep(150);
                $('button:contains(" 新增工艺版本 ")')[0].click();
                await sleep(150);
                document.querySelectorAll('[placeholder="输入工艺版本名称"]')[0].value = "default";
                document.querySelectorAll('[placeholder="输入工艺版本名称"]')[0].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                await sleep(50);
                $('button:contains(" 选择 ")')[0].click();
            }
        });
        $('button:contains(" 设置工艺版本 ")')[0].setAttribute('helper', true);

        while (!$('th:contains(" 半成品/成品名称 ")')[0]) {
            await sleep(250);
        }
        const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
        const materialIndex = $('th:contains(" 所需物料集 ")')[0].cellIndex;
        const procIndex = $('th:contains(" 上级序号 ")')[0].cellIndex;
        const processIndex = $('th:contains(" 工序名称 ")')[0].cellIndex;
        const alias = document.querySelector('[placeholder="别名"]').closest('textarea').value;

        $('button:contains(" 新增一行 ")')[0].addEventListener('click', async function newLineListener() {
            if (!window.autoSemi) {
                await sleep(100);
                let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
                let currRows = bodyRows.item(bodyRows.length - 1).cells;
                // 设置上级序号
                let lastIndexCell = currRows.item(procIndex);
                $('span', lastIndexCell)[0].click();
                await sleep(50);
                $('span', lastIndexCell)[0].click();
                while (!$('button:contains(" 选择 ")')[bodyRows.length - 1]) {
                    await sleep(50);
                }
                $('button:contains(" 选择 ")')[bodyRows.length - 1].click();
                await sleep(100);

                // 设置半成品
                let prevSemi = "";
                if (bodyRows.length > 1) {
                    prevSemi = $('span', bodyRows.item(bodyRows.length - 2).cells.item(semiIndex))[0].textContent;
                }
                let label1 = document.createElement('label');
                label1.classList.add("el-form-item__label");
                label1.appendChild(document.createTextNode(prevSemi + ' ' + alias));

                let lastSemiCell = currRows.item(semiIndex);
                $('span', lastSemiCell).click();
                await sleep(50);
                $('button', lastSemiCell).click();
                while (!document.querySelectorAll('[placeholder="存货别名"]')[1]) {
                    await sleep(50);
                }
                $('button:contains("搜索")')[0].parentElement.appendChild(label1);
                document.querySelectorAll('[placeholder="存货别名"]')[1].value = document.querySelector('[placeholder="别名"]').closest('textarea').value;
                await sleep(50);
                document.querySelectorAll('[placeholder="存货别名"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                await sleep(50);
                $('button:contains(" 搜索 ")')[0].click();
                while ($('button:contains(" 选择自己 ")')[0]) {
                    await sleep(100);
                }

                // 设置物料
                if (!window.skipMat) {
                    let currSemi = $('span', currRows.item(semiIndex))[0].textContent;
                    let lastMatCell = currRows.item(materialIndex);
                    $('a', lastMatCell)[0].click();
                    await sleep(150);
                    await setMaterial(prevSemi, currSemi, true);
                    await sleep(150);
                    while ($('button:contains("新增行")')[0]) {
                        await sleep(200);
                    }

                    // 设置工序
                    $('span', currRows.item(processIndex))[0].click();
                    await sleep(50);
                    $('button', currRows.item(processIndex))[0].click();
                    await setProcess(currSemi, bodyRows.item(bodyRows.length - 1), true);
                    await sleep(150);
                }
                dbck();
            }
        });
    }

    // 整个表格自动填写
    async function dbck() {
        if (!document.querySelectorAll('[class="edit-cell"]')[0]) {
            await sleep(500);
            dbck();
            return;
        }
        let bodyRows = document.querySelectorAll('[class="edit-cell"]')[0].closest('table').lastChild.rows;
        const alias = document.querySelector('[placeholder="别名"]').closest('textarea').value;
        const semiIndex = $('th:contains(" 半成品/成品名称 ")')[0].cellIndex;
        const processIndex = $('th:contains(" 工序名称 ")')[0].cellIndex;
        const materialIndex = $('th:contains(" 所需物料集 ")')[0].cellIndex;
        const procIndex = $('th:contains(" 上级序号 ")')[0].cellIndex;
        // 设置上级序号
        for (let i of bodyRows) {
            let indexCell = i.cells.item(procIndex);
            if (!indexCell.hasAttribute('helper')) {
                indexCell.addEventListener('click', async function serialListener() {
                    if (!window.autoSerial) {
                        if ($('span', indexCell)[0].textContent.includes('始工序')) {
                            $('a', indexCell)[0].click();
                            await sleep(100);
                            while (!$('button:contains(" 选择 ")')[i.rowIndex]) {
                                await sleep(50);
                            }
                            $('button:contains(" 选择 ")')[i.rowIndex].click();
                        } else {
                            indexCell.querySelector('[class="el-icon-setting"]').closest('a').click();
                            await sleep(100);
                            while (!$('button:contains(" 选择 ")')[0]) {
                                await sleep(50);
                            }
                            $('button:contains(" 选择 ")')[0].click();
                        }
                    }
                });
                indexCell.setAttribute('helper', true);
            }
        }

        // 半成品
        for (let i of bodyRows) {
            let semiCell = i.cells.item(semiIndex);
            if (!semiCell.hasAttribute('helper')) {
                semiCell.addEventListener('click', async function semiListener() {
                    if (!window.autoSemi) {
                        let prevSemi = '';
                        if (i.rowIndex > 0) {
                            prevSemi = $('span', bodyRows.item(i.rowIndex - 1).cells.item(semiIndex))[0].textContent;
                        }
                        let label1 = document.createElement('label');
                        label1.classList.add("el-form-item__label");
                        label1.appendChild(document.createTextNode(prevSemi + ' ' + alias));

                        $('button', semiCell).click();
                        while (!document.querySelectorAll('[placeholder="存货别名"]')[1]) {
                            await sleep(50);
                        }
                        $('button:contains("搜索")')[0].parentElement.appendChild(label1);
                        document.querySelectorAll('[placeholder="存货别名"]')[1].value = alias;
                        await sleep(50);
                        document.querySelectorAll('[placeholder="存货别名"]')[1].dispatchEvent(new Event('input', {
                            bubbles: true
                        }));
                        await sleep(50);
                        $('button:contains(" 搜索 ")')[0].click();
                    }
                });
                semiCell.setAttribute('helper', true);
            }
        }

        // 物料集
        for (let i of bodyRows) {
            let matCell = i.cells.item(materialIndex);
            if (!matCell.hasAttribute('helper')) {
                matCell.addEventListener('click', async function matListener() {
                    let prevSemi = '';
                    let currSemi = $('span', i.cells.item(semiIndex))[0].textContent;
                    if (i.rowIndex > 0) {
                        prevSemi = $('span', bodyRows.item(i.rowIndex - 1).cells.item(semiIndex))[0].textContent;
                    }
                    if (!window.autofillMat) {
                        $('a', matCell)[0].click();
                        await sleep(150);
                        await setMaterial(prevSemi, currSemi, false);
                    }
                });
                matCell.setAttribute('helper', true);
            }
        }

        // 工序
        for (let i of bodyRows) {
            let lastProcessCell = i.cells.item(processIndex);
            if (!lastProcessCell.hasAttribute('helper')) {
                lastProcessCell.addEventListener('click', async function procListener() {
                    if (!window.autofill) {
                        let name = $('span', i.cells.item(semiIndex))[0].textContent;
                        $('button', lastProcessCell)[0].click();
                        await sleep(150);
                        await setProcess(name, i, false);
                    }
                });
                lastProcessCell.setAttribute('helper', true);
            }

        }
    }

    // 设置工序函数
    async function setProcess(name, tr, autoSelect) {
        let processName = getProcName(name);
        while (!document.querySelectorAll('[placeholder="工序名称"]')[0]) {
            await sleep(50);
        }
        document.querySelectorAll('[placeholder="工序名称"]')[0].value = processName;
        await sleep(50);
        document.querySelectorAll('[placeholder="工序名称"]')[0].dispatchEvent(new Event('input', {
            bubbles: true
        }));
        await sleep(50);
        $('button:contains(" 搜索 ")')[0].click();
        if (!document.getElementById('semiNameLabel')) {
            let label1 = document.createElement('label');
            label1.classList.add("el-form-item__label");
            label1.setAttribute('id', 'semiNameLabel');
            label1.appendChild(document.createTextNode(name));
            $('button:contains(" 搜索 ")')[0].parentElement.appendChild(label1);
        }
        await sleep(150);
        // 自动选择第一个工序名称
        while (!$('td:contains("GX")')[0]) {
            await sleep(100);
        }
        if (autoSelect && $('button:contains(" 选择 ")', $('td:contains("GX")')[0].parentElement.parentElement).length == 1) {
            $('button:contains(" 选择 ")', $('td:contains("GX")')[0].parentElement)[0].click();
            await sleep(200);
        } else {
            while ($('button:contains(" 搜索 ")')[0]) {
                await sleep(200);
            }
        }
        const processIndex = $('th:contains(" 工序名称 ")')[0].cellIndex;
        processName = ($('span', tr.cells.item(processIndex))[0]) ? ($('span', tr.cells.item(processIndex))[0].textContent) : processName;
        if (processName.includes('振光') || processName.includes('镀') || processName.includes('电解')) {
            await setOutsourcing(tr, "向前电镀厂");
        } else if (processName.includes('电泳')) {
            await setOutsourcing(tr, "涂霸");
        } else if (processName.includes('喷粉')) {
            await setOutsourcing(tr, "喷粉车间");
        }
    }
    // 设置物料函数
    async function setMaterial(prevSemi, currSemi, ok) {
        while (!$('button:contains("新增行")')[0]) {
            await sleep(100);
        }
        if (!$('button:contains(" 移除 ")')[0]) {
            $('button:contains("新增行")')[0].click();
            await sleep(100);
        }
        while (!document.querySelector('[placeholder="物料选择"]')) {
            await sleep(100);
        }
        const alias = $('[placeholder="别名"]')[0].value;
        let label1 = document.createElement('label');
        label1.classList.add("el-form-item__label");
        label1.appendChild(document.createTextNode('请选择物料;' + "当前半成品: " + currSemi + ', 产品别名: ' + alias));
        $('span:contains("已新增物料行")')[0].parentElement.appendChild(label1);
        if (document.querySelector('[placeholder="物料选择"]').parentElement.parentElement.parentElement.parentElement.parentElement.querySelectorAll('[placeholder="物料选择"]').length == 1) {
            if (!(new RegExp('^0[0|1]-').test(document.querySelector('[placeholder="物料选择"]').value))) {
                let quantity = $('input[type=text]', $('[placeholder="物料选择"]')[0].closest('tr'))[1].value;
                document.querySelector('[placeholder="物料选择"]').closest('div').querySelector('button').click();
                while (!$('button:contains("新增存货")')[0]) {
                    await sleep(100);
                }
                $('button:contains("新增存货")')[0].parentElement.appendChild(label1);
                document.querySelectorAll('[placeholder="存货名称"]')[1].value = prevSemi;
                document.querySelectorAll('[placeholder="存货名称"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                document.querySelectorAll('[placeholder="存货别名"]')[1].value = alias;
                document.querySelectorAll('[placeholder="存货别名"]')[1].dispatchEvent(new Event('input', {
                    bubbles: true
                }));
                await sleep(50);
                $('button:contains(" 搜索 ")')[0].click();
                var dialog = $('button:contains("搜索")')[0].closest('[class="el-dialog__body"]')
                await sleep(150);
                while (!$('button:contains(" 选择 ")', dialog)[0]) {
                    await sleep(100);
                }
                if ($('button:contains(" 选择 ")', $('button:contains(" 选择 ")', dialog)[0].parentElement.parentElement.parentElement.parentElement).length == 1) {
                    $('button:contains(" 选择 ")', dialog)[0].click();
                    await sleep(100);
                    $('input[type=text]', $('[placeholder="物料选择"]')[0].closest('tr'))[1].value = quantity;
                    if (ok) {
                        $('button:contains("确 定")', $('button:contains("新增行")')[0].parentElement.parentElement.parentElement)[0].click();
                        await sleep(200);
                    }
                }
            }
        }
    }

    function multiUnitUtil() {
        const numPattern = /[0-9]+[.]?[0-9]*/g;
        const code = $('[placeholder="编码"]')[0].value;
        const alias = $('[placeholder="别名"]')[0].value;
        const specs = $('[placeholder="规格"]')[0].value;
        const name = $('[placeholder="名称"]')[0].value;
        let aalias = alias.match(numPattern);
        let aspecs = specs.match(numPattern);
        let rkg = 0; // kg
        let rmm = 0; // 面积
        let t = 0;
        let l = 0;
        let w = 0;
        let length = 0;
        let mtype = '';
        if ((new RegExp('^0[0|1]-10').test(code))) {
            // 线材
            t = aspecs[0];
            length = aspecs[1];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = 1 / (t * t * 0.00000619);
                mtype = '钢线';
            } else {
                rkg = 1 / (t * t * 0.00000617);
                mtype = '铁线';
            }
        } else if ((new RegExp('^0[0|1]-011').test(code))) {
            // 棒料
            t = aspecs[0];
            length = aspecs[1];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = 1 / (t * t * 0.00000619);
                rmm = length;
                mtype = '钢棒';
            }
        } else if ((new RegExp('^0[0|1]-201').test(code))) {
            // 分条料
            t = aspecs[0];
            w = aspecs[1];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = 1 / (0.00000793 * t * w);
                mtype = '钢分条料';
            } else {
                rkg = 1 / (0.00000785 * t * w);
                mtype = '铁分条料';
            }
        } else if ((new RegExp('^0[0|1]-20[2|3]').test(code))) {
            // 板材
            t = aspecs[0];
            l = aspecs[1];
            w = aspecs[2];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = 1 / (0.00000793 * t);
                rmm = l * w;
                mtype = '钢板';
            } else if (name.includes('铝')) {
                rkg = 1
                rmm = l * w;
                mtype = '铝板';
            } else {
                rkg = 1 / (0.00000785 * t);
                rmm = l * w;
                mtype = '铁板';
            }
        } else if ((new RegExp('^0[0|1]-204').test(code))) {
            // 扁铁
            t = aspecs[0];
            l = aspecs[1];
            w = aspecs[2];
            if (w) {
                // 扁铁板
                rkg = 1 / (0.00000785 * t);
                rmm = l * w;
                mtype = '扁铁板';

            } else {
                // 分条扁铁
                rkg = 1 / (0.00000785 * t * l);
                mtype = '分条扁铁';
            }
        } else if ((new RegExp('^0[0|1]-301').test(code)) || ((new RegExp('^0[0|1]-304').test(code)) && name.includes('方管'))) {
            // 方管
            t = aspecs[2];
            l = aspecs[0];
            w = aspecs[1];
            length = aspecs[3];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = (1 / (0.00000793 * 2 * (Number(l) + Number(w)) * t));
                rmm = length ? length : 6000;
                mtype = '钢方管';
            } else {
                rkg = (1 / (0.00000785 * 2 * (Number(l) + Number(w)) * t));
                rmm = length ? length : 6000;
                mtype = '铁方管';
            }
        } else if ((new RegExp('^0[0|1]-302').test(code)) || ((new RegExp('^0[0|1]-304').test(code)) && name.includes('圆管'))) {
            // 圆管
            t = aspecs[1];
            l = aspecs[0];
            length = aspecs[2];
            if (alias.includes('304') || name.includes('201') || name.includes('钢')) {
                rkg = 1 / (0.00000793 * 3.14159 * l * t);
                rmm = length ? length : 6000;
                mtype = '钢圆管';
            } else {
                rkg = 1 / (0.00000785 * 3.14159 * l * t);
                rmm = length ? length : 6000;
                mtype = '铁圆管';
            }
        }
        return [rkg, rmm, [t, l, w, length], mtype];
    }

    // 设置外协
    async function setOutsourcing(tr, company) {
        const typeIndex = $('th:contains(" 加工类型 ")')[0].cellIndex;
        const companyIndex = $('th:contains(" 外协供应商 ")')[0].cellIndex;
        var typeCell = tr.cells.item(typeIndex);
        var companyCell = tr.cells.item(companyIndex);
        $('span', typeCell)[0].click();
        await sleep(50);
        $('span', typeCell)[0].click();
        $('li:contains("外协")')[0].click();
        await sleep(50);
        $('span', companyCell)[0].click();
        await sleep(10);
        $('button', companyCell)[0].click();
        await sleep(100);
        $('input[placeholder="往来单位名称"]')[0].value = company;
        $('input[placeholder="往来单位名称"]')[0].dispatchEvent(new Event('input', {
            bubbles: true
        }));
        await sleep(100);
        $('button:contains(" 搜索 ")')[0].click();
        var dialog = $('button:contains("搜索")')[0].closest('[class="el-dialog__body"]')
        while ($('button:contains(" 选择 ")', dialog).length !== 2) {
            await sleep(100);
        }
        $('button:contains(" 选择 ")', dialog)[0].click()
    }

    function getProcName(name) {
        var processName = '';
        if (name.includes('打磨抛光')) {
            processName = '打磨抛光';
        } else if (name.includes('3D弯线')) {
            processName = '3D弯线';
        } else if (name.includes('电解')) {
            processName = '电解';
        } else if (name.includes('振光')) {
            processName = '振光';
        } else if (name.includes('电镀')) {
            processName = '电镀';
        } else if (name.includes('电泳')) {
            processName = '电泳';
        } else if (name.includes('喷粉')) {
            processName = '喷粉';
        } else if (name.includes('喷涂')) {
            processName = '喷粉';
        } else if (name.includes('产品组装')) {
            processName = '产品组装';
        } else if (name.includes('激光')) {
            processName = '激光';
        } else if (name.includes('拉伸')) {
            processName = '拉伸';
        } else if (name.includes('开胚')) {
            processName = '开胚';
        } else if (name.includes('洗水')) {
            processName = '洗水';
        } else if (name.includes('飞边')) {
            processName = '飞边';
        } else if (name.includes('打磨抛光')) {
            processName = '打磨抛光';
        } else if (name.includes('打磨拉丝')) {
            processName = '打磨拉丝';
        } else if (name.includes('打磨')) {
            processName = '打磨';
        } else if (name.includes('烧焊')) {
            processName = '满焊';
        } else if (name.includes('验收')) {
            processName = '验收';
        } else if (name.includes('剪板')) {
            processName = '剪板';
        } else if (name.includes('开料')) {
            processName = '开料';
        } else if (name.includes('折弯')) {
            processName = '折弯';
        } else if (name.includes('注塑')) {
            processName = '注塑';
        } else if (name.includes('成型')) {
            processName = '成型';
        } else if (name.includes('弯线')) {
            processName = '弯线';
        } else if (name.includes('碰焊')) {
            processName = '碰焊';
        } else if (name.includes('抛光')) {
            processName = '抛光';
        } else if ((new RegExp('.*冲(\\W|\\w)*孔.*')).test(name)) {
            processName = '冲孔';
        } else if (name.includes('锯')) {
            processName = '锯';
        } else if (name.includes('弯')) {
            processName = '弯';
        } else if (name.includes('压')) {
            processName = '压';
        } else if (name.includes('磨')) {
            processName = '磨';
        } else if (name.includes('焊')) {
            processName = '焊';
        } else if (name.includes('组装')) {
            processName = '组装';
        } else if (name.includes('铆')) {
            processName = '铆';
        } else if (name.includes('攻牙')) {
            processName = '攻牙';
        } else if (name.includes('锣')) {
            processName = '锣';
        } else if (name.includes('压印')) {
            processName = '压印';
        } else if (name.includes('调')) {
            processName = '调';
        } else if ((new RegExp('.+镀(\\W|\\w)$')).test(name)) {
            processName = '镀';
        } else if (name.includes('冲')) {
            processName = '冲';
        } else if (name.includes('清洗')) {
            processName = '清洗';
        } else if (name.includes('包装')) {
            processName = '包装';
        } else {
            processName = '';
        }
        return processName;
    }
})();