Greasy Fork

Greasy Fork is available in English.

轻流QingFlow超级插件(Tampermonkey版本)

轻流QingFlow应用自动超级字段插件

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         轻流QingFlow超级插件(Tampermonkey版本)
// @namespace    http://tampermonkey.net/
// @version      3.1.1
// @description  轻流QingFlow应用自动超级字段插件
// @author       Mr.Dragon King
// @license      Mr.Dragon King
// @match       *://*.qingflow.com/*
// @match       *://*.uat.scholarshipsgateway.gov.sg/*
// @match       *://*.app4355.eapps.dingtalkcloud.com/*
// @icon         https://file.qingflow.com/assets/logo-pure.png
// @require      http://libs.baidu.com/jquery/2.1.4/jquery.min.js
// @grant        GM_log
// @grant        GM_xmlhttpRequest
// ==/UserScript==

//消息推送
var MessagePushState = false;//是否开启消息推送 功能下线 请勿开启
var QW_QrobotHook = "";//企业微信群机器人Hook

//——————————————————————————————————————————————//
//——————————————————————————————————————————————//
/**
 * 按钮配色方案(皮肤方案)
 * 开启本地皮肤方案  (在线功能下线)
 */
var ButtonColorOpen = true;
/**
 * 按钮配色方案(皮肤方案)
 * 是否开启看板娘
 */
var ButtonColorOpen_Live2DWidget = true;
/**
 * 按钮配色方案(皮肤方案)
 * 皮肤ID
 */
var ButtonColorTypeID = "1004";
//——————————————————————————————————————————————//
//——————————————————————————————————————————————//



//——————————————————————————————————————————————//
//——————————————————————————————————————————————//
/**
 *  悬浮动画开关
 */
var floatingAnimationOpen = false;
/**
 * 预设的悬浮动画方案
 * id==custom 为自定义动画元素图片,支持base64、png、jpg、gif
 * 当id==custom时floatingAnimationCustom参数必填,自定义动画元素资源
 * 当id==1000时为默认动画资源配置
 */
var floatingAnimationTypeID = "1000";
/**
 * 当id==custom时floatingAnimationCustom参数必填,自定义动画元素资源
 */
var floatingAnimationCustom = "";

//——————————————————————————————————————————————//
//——————————————————————————————————————————————//


//Imean帮助中心
/**
 * 是否开启Imean帮助中心
 */
var ImeanOpen = false;//开启Imean帮助中心 功能下线
/**
 * Imean项目ID
 * Imean工作台网址:https://useimean.com/home/
 */
var ImeanProjectIdID = "tc1KoYSaBnR90fuTDg-OU";//Imean项目ID


//@Data
var fieldUN = "未同步!!!";//字段数量
var PageOptimizationOpen = false;
//@注册基础元素-字段
var field_Textfield = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[1]";//单行文字
var field_Textarea = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[2]";//多行文字
var field_Number = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[3]";//数字
var field_Link = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[4]";//链接
var field_Date = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[5]";//日期
var field_StartStopTime = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[6]";//起止时间
var field_Phone = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[7]";//电话
var field_Mailbox = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[8]";//邮箱
var field_AloneChoice = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[9]";//单项选择
var field_DropDownChoice = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[10]";//下拉选择
var field_MultipleChoice = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[11]";//多项选择
var field_ImagesChoice = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[12]";//图片选择
var field_FileUpload = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[13]";//附件上传
var field_Address = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]/div/div/div[14]";//地址


//@注册基础元素-字段基础参数
var field_Title = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/qf-title-and-hint/div[2]/input";//字段标题
var fieldParameter_Required = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[1]/label";//必填
var fieldParameter_QRCode = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[2]/label";//扫码(默认二维码)
var fieldParameter_BarCode = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[2]/qf-radio-group/label[2]";//扫码-条形码
var fieldParameter_NotDuplicateValue = "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[3]/label"//不允许重复值

//@注册基础元素-字段高级参数
var fieldParameter_AssociateExistingData = "";//关联已有数据
var fieldParameter_LimitWords = "";//限制字数
var fieldParameter_DecimalsAllowed = "";//允许小数
var fieldParameter_DisplayAmount = ""//显示金额
var fieldParameter_TimeFormat = "";//时间格式
var fieldParameter_TimeOverlapNotAllowed = "";//不允许时间重叠
var fieldParameter_FixedTelephone = "";//支持固定电话
var fieldParameter_SMSVerification = "";//短信验证
var fieldParameter_OptionContent = "";//选项内容

//@Excel表头导入字段关键字识别-匹配字段类型并设置字段参数
var fieldData_type_testData = [
    {
        RegExp: "金额",//关键词【字符串】
        fieldData_type: "【数字】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "日期",//关键词【字符串】
        fieldData_type: "【日期】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "单价",//关键词【字符串】
        fieldData_type: "【数字】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "资本",//关键词【字符串】
        fieldData_type: "【数字】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "编号",//关键词【字符串】
        fieldData_type: "【单行文本】",//字段类型【字符串】
        fieldData_parameter: [{ type: "必填" }],//字段参数【数组】
    },
    {
        RegExp: "邮箱",//关键词【字符串】
        fieldData_type: "【邮箱】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "电话",//关键词【字符串】
        fieldData_type: "【电话】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    },
    {
        RegExp: "手机",//关键词【字符串】
        fieldData_type: "【电话】",//字段类型【字符串】
        fieldData_parameter: [],//字段参数【数组】
    }
]

//打印控制台版本信息
console.log("=====================================================================")
console.log("|| @name         QingFlow Dragon King Super Tools")
console.log("|| @description  轻流QingFlow应用自动超级字段插件")
console.log("|| @author       Mr.Dragon King")
console.log("|| @license      Mr.Dragon King")
console.log("=====================================================================")



console.log("Hello,欢迎使用【QingFlow Dragon King Super Tools】\n轻流QingFlow应用自动超级字段插件🐲\n\n@author       Mr.Dragon King \n\n使用帮助:\nhttps://www.yuque.com/g/mrscott-prexr/bgia0r/hfwq3pdgm0y7m50i/collaborator/join?token=Je5Br7K9hrV1R8FE# 《QingFlow Dragon King Super Tools使用帮助》\n\n更多信息可联系作者");

/**
 * @jquery库
 * 引入jquery库
 */
function jquery() {
    var myScript = document.createElement('script');
    myScript.src = 'https://cdn.bootcss.com/jquery/3.3.1/jquery.js';
    document.getElementsByTagName('head')[0].appendChild(myScript);
}


/**
 * @XPath方法
 * 引入XPath方法
 */
function $x(STR_XPATH) {
    var xresult = document.evaluate(STR_XPATH, document, null, XPathResult.ANY_TYPE, null);
    var xnodes = [];
    var xres;
    while (xres = xresult.iterateNext()) {
        xnodes.push(xres);
    }
    return xnodes;
}


/**
 * @xlsx库
 * 引入xlsx库
 */
function xlsx() {
    var myScript = document.createElement('script');
    myScript.src = 'http://libs.baidu.com/jquery/2.1.4/jquery.min.js';
    document.getElementsByTagName('head')[0].appendChild(myScript);
}


//@页面启动
(function () {
    //加载库
    setTimeout(function () {
        jquery();
        Menu();
        xlsx();
        ButtonColorScheme();
        floatingAnimation()
        Imean()
    }, 2000);
})();


$(function () {
    $(document).on("click", "#a", function () {
        console.log("优化界面完成")
    });
});


//=================================功能菜单=================================
//@菜单menu
/**
 * 加载操作菜单
 */
function Menu() {
    //编辑页菜单
    var BatchAddFields = "<button id='BatchAddFields'  style='height: 36px;margin-left:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><text style='margin-left:6px;'>批量添加字段</text></button>";//批量添加字段按钮
    var Help = "<button id='Help'  style='height: 36px;margin-left:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><text style='margin-left:6px;'>插件使用帮助</text></button>";//插件使用帮助按钮
    var SystemDesignDrawing = "<button id='SystemDesignDrawing'  style='height: 36px;margin-left:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><img src='https://dss0.bdstatic.com/-0U0bXSm1A5BphGlnYG/tam-ogel/1208056450_-1268512460_88_88.png' width='20' height='20'><text style='margin-left:6px;border-radius:20px'>QingFlow系统设计图</text></button>";//系统设计图
    var PageOptimization = "<button id='PageOptimization'  style='height: 36px;margin-left:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><text style='margin-left:6px;border-radius:20px'>面板界面优化</text></button>";//界面优化
    var ExcelImport = "<input type='file' id='excel-file' style='height: 36px;margin-left:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'>";//Excel导入

    //首页菜单
    var ImeanButton = "<button id='Imean'  style='height: 36px;margin-right:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><img src='https://useimean.com/home/assets/favicon.13d0c104.ico' width='20' height='20'><text style='margin-left:6px;'>iMean帮助引导</text></button>";//Imean帮助引导
    var ButtonColorButton = "<button id='Imean'  style='height: 36px;margin-right:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><img src='https://dss0.bdstatic.com/-0U0bXSm1A5BphGlnYG/tam-ogel/1208056450_-1268512460_88_88.png' width='20' height='20'><text style='margin-left:6px;'>QIngFlow皮肤中心</text></button>";//QIngFlow皮肤中心
    var SecondaryScreenMode = "<button id='Imean'  style='height: 36px;margin-right:20px; margin-bottom:20px;  margin-top: 20px; border: 1px solid #e6eaf0;  border-radius: 4px; border-radius: 4px; color: #494f57;cursor: pointer; background: #F9FAFC;'><img src='https://676f-gokuschool-3gl85srrc0c313c4-1304791592.tcb.qcloud.la/cmsReminderServiceResources/%E6%98%BE%E7%A4%BA%E5%99%A8.svg?sign=1bccc6f03433c82667a353584ed45c77&t=1683267914' width='20' height='20'><text style='margin-left:6px;'>副屏模式</text></button>";//副屏模式

    setInterval(function () {
        //校验编辑应用页面
        if (window.location.href.indexOf('/f/') !== -1 && $x("/html/body/qf-root/qf-pages/qf-app-item/qf-creation/qf-header-edit/div").length <= 0) {
            $("body > qf-root > qf-pages > qf-app-item > qf-creation > qf-header-edit > header").before("<div style='z-index:999'>" + BatchAddFields + PageOptimization + Help + SystemDesignDrawing + ExcelImport + "</div>");
        }
        /**校验轻流首页
        if(window.location.href.indexOf('/index/') !== -1 &&$x("/html/body/qf-root/qf-pages/div").length <= 0 ){
            $("body > qf-root > qf-pages >").before("<div style='z-index:999'>" + ImeanButton + ButtonColorButton + SecondaryScreenMode + "</div>");
        }
        */
        /*轻流 (旧版本)
        */
        if (window.location.href.indexOf('/tag/') !== -1 && $x("/html/body/qf-root/qf-pages/div").length <= 0) {
            $("body > qf-root > qf-pages >").before("<div style='z-index:999'>" + ImeanButton + ButtonColorButton + SecondaryScreenMode + "</div>");
        }

    }, 3000);
}


/**
 * 新版本菜单
 */
function Menu2() {
    (function () {
        // 定义公共样式
        const buttonStyle = `
        display: flex;
        align-items: center;
        justify-content: center;
        width: 116px;
        height: 36px;
        border: 1px solid #e6eaf0;
        border-radius: 4px;
        background: #F9FAFC;
        color: #494f57;
        cursor: pointer;
        text-align: center;
        text-decoration: none;
        font-size: 14px;
        margin:8px 4px 0 0
    `;

        // 定义菜单项模板
        const createMenuItem = (imgUrl, text) => `
        <span style="margin-left;4px; font-size:14px;font-weight:600;">超级工具</span>
       <div style="margin:10px 0 0 0 ; width: 20px; height: 20px;">
          <div style="${buttonStyle}">
              <img src="${imgUrl}" style="margin-right: 1px; width: 20px; height: 20px;">
              ${text}
          </div>
        </div>
    `;

        // 创建菜单栏
        const menuContainer = document.createElement('div');
        menuContainer.style.display = 'grid';
        menuContainer.style.gridTemplateColumns = '1fr 1fr';
        menuContainer.style.gap = '10px';
        menuContainer.style.padding = '26px 0 0 10px';

        // 添加标题
        const title = document.createElement('div');
        title.innerText = '超级工具';
        title.style.fontSize = '14px';
        title.style.fontWeight = '600';
        title.style.gridColumn = 'span 2';
        title.style.marginBottom = '10px';
        menuContainer.appendChild(title);

        // 定义菜单项数据
        const menuItems = [
            { img: 'icon1.png', text: '批量添加字段' },
            { img: 'icon2.png', text: 'Excle导入' },
            { img: 'icon2.png', text: 'UI大屏适配' },
        ];

        // 生成菜单项并添加到菜单栏
        menuItems.forEach(item => {
            menuContainer.innerHTML += createMenuItem(item.img, item.text);
        });

        // 插入菜单栏到指定位置
        function injectMenu() {
            const targetElements = document.evaluate(
                "/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[1]",
                document,
                null,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );

            for (let i = 0; i < targetElements.snapshotLength; i++) {
                const targetElement = targetElements.snapshotItem(i);
                if (targetElement && !document.getElementById('custom-menu')) {
                    menuContainer.id = 'custom-menu'; // 防止重复注入
                    targetElement.appendChild(menuContainer);
                }
            }
        }

        // 定期检查并注入菜单栏
        setInterval(function () {
            if (window.location.href.indexOf('/f/') !== -1) {
                injectMenu();
            }
        }, 3000);
    })();


}







//===========================================================================
//=================================插件使用帮助=================================
//@插件使用帮助Help
$(function () {
    $(document).on("click", "#Help", function () {
        window.open("https://exiao.yuque.com/pc5k40/ngqg4r/lv64cgq5rdy4xvtn?singleDoc# 《QingFLow浏览器插件工具介绍》", "_blank");
    });
});
//=================================轻流系统设计图=================================
//@轻流系统设计图SystemDesignDrawing
$(function () {
    $(document).on("click", "#SystemDesignDrawing", function () {
        window.open("https://exiao.yuque.com/pc5k40/ngqg4r/oucgap?singleDoc", "_blank");
    });
});

//=================================面板界面优化=================================
//@面板界面优化PageOptimization
$(function () {
    $(document).on("click", "#PageOptimization", function () {
        PageOptimizationOpen = true;
        setTimeout(() => {
            $x("/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]")[0].style.cssText = "width:750px";
            console.log("优化界面完成")
        }, 1000)
    });
});
//=================================Imean帮助中心=================================
/**
 * Imean帮助中心
 */
function Imean() {
    if (ImeanOpen) {
        console.log("启动Imean");
        // 创建并插入 link 元素
        var linkElement = document.createElement('link');
        linkElement.rel = 'stylesheet';
        linkElement.href = 'https://useimean.com/sdk/main.css';
        document.head.appendChild(linkElement);

        // 创建并插入第一个 script 元素
        var scriptElement1 = document.createElement('script');
        scriptElement1.src = 'https://useimean.com/sdk/main.js';
        scriptElement1.onload = function () {
            try {
                ImeanSDK.init({
                    projectId: ImeanProjectIdID, // 项目id
                    baseUrl: 'https://useimean.com', // 请求服务器地址
                    onStepChange: function ({ recording, currentIndex }) { }, // 引导中步骤变化
                    onFinish: function ({ recording }) { }, // 引导步骤完成
                    onExit: function ({ recording }) { }, // 引导中主动退出
                    identity: function () { return {} }, // 返回用户信息
                    hideHelp: false, // 设置为false即展示帮助中心
                });
            }
            catch (error) { }
        };
        document.head.appendChild(scriptElement1);

    }
};
//=================================按钮配色优化方案=================================
/**
 * 获取皮肤方案
 */
function ButtonColorScheme() {
    if (ButtonColorOpen) {
        var a = $x("/html/body/qf-root/qf-pages/qf-new-index/div/div[1]/qf-index-sidebar/div");
        if (a.length > 0) {
            var attrs = a[0].attributes;
            for (var i = 0; i < attrs.length; i++) {
                var attrName = attrs[i].name;
                var match = attrName.match(/_ngcontent-0-c(\d+)/);
                if (match) {
                    var num = match[1];
                    console.log(num);
                    switch (ButtonColorTypeID) {
                        case "1001": {
                            // 粉紫色渐变
                            let styles = [
                                { "explain": "导航栏背景", "pourInto": `<style>.window-left[_ngcontent-0-c${num}]{background-image: linear-gradient(-225deg, #231557 0%, #44107A 29%, #FF1361 67%, #FFF800 100%);}</style>` },
                                { "explain": "元素颜色适配", "pourInto": `<style>:root { --brand-primary-05: #f2e9ff; --brand-primary-10: #e4d3ff; --brand-primary-20: #c9a6ff; --brand-primary-30: #ae7aff; --brand-primary-40: #944dff; --brand-primary-50: #7931ff; --brand-primary-base: #231557; --brand-primary-70: #1b0e41; --brand-primary-80: #14082b; --brand-primary-90: #0c0414; --brand-primary-100: #05020a; --qf-brand-neutral-color-05: #ffffff; --qf-brand-neutral-color-10: #e6eaf0; --qf-brand-neutral-color-20: #ccd4e0; --qf-brand-neutral-color-30: #9ea7b3; --qf-brand-neutral-color-40: #767e89; --qf-brand-neutral-color-50: #494f57; --qf-brand-neutral-color-60: #2a2c30; --qf-brand-neutral-color-70: #242629; --qf-brand-neutral-color-80: #1e1f22; --qf-brand-neutral-color-90: #18191c; --qf-brand-neutral-color-100: #121315; }</style>` },
                            ];

                            let styleString = styles.map(style => `${style.pourInto}`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "1002": {
                            // 粉黄色渐变面板
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #FFED46 0%, #FF7EC7 100%);}` },
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "1003": {
                            // 天空蓝渐变
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #7CF7FF 0%, #4B73FF 100%);}` },
                                { "explain": "元素颜色适配", "pourInto": `:root { --brand-primary-05: #eef3ff; --brand-primary-10: #dde7ff; --brand-primary-20: #bbcfff; --brand-primary-30: #99b8ff; --brand-primary-40: #779fff; --brand-primary-50: #5586ff; --brand-primary-base: #4B73FF; --brand-primary-70: #0a2fcf; --brand-primary-80: #0027a3; --brand-primary-90: #001a7a; --brand-primary-100: #000e56; --qf-brand-neutral-color-05: #ffffff; --qf-brand-neutral-color-10: #e6eaf0; --qf-brand-neutral-color-20: #ccd4e0; --qf-brand-neutral-color-30: #9ea7b3; --qf-brand-neutral-color-40: #767e89; --qf-brand-neutral-color-50: #494f57; --qf-brand-neutral-color-60: #2a2c30; --qf-brand-neutral-color-70: #242629; --qf-brand-neutral-color-80: #1e1f22; --qf-brand-neutral-color-90: #18191c; --qf-brand-neutral-color-100: #121315;}` }
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "1004": {
                            // 粉紫渐变(浅色)
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #B7DCFF 0%, #FFA4F6 100%);}` },
                                { "explain": "元素颜色适配", "pourInto": `:root { --brand-primary-05: #ffebfb; --brand-primary-10: #ffd8f8; --brand-primary-20: #ffb2f1; --brand-primary-30: #ff8ceb; --brand-primary-40: #ff66e5; --brand-primary-50: #ff40df; --brand-primary-base: #FFA4F6; --brand-primary-70: #cc82c5; --brand-primary-80: #996193; --brand-primary-90: #663f62; --brand-primary-100: #331e31; --qf-brand-neutral-color-05: #ffffff; --qf-brand-neutral-color-10: #e6eaf0; --qf-brand-neutral-color-20: #ccd4e0; --qf-brand-neutral-color-30: #9ea7b3; --qf-brand-neutral-color-40: #767e89; --qf-brand-neutral-color-50: #494f57; --qf-brand-neutral-color-60: #2a2c30; --qf-brand-neutral-color-70: #242629; --qf-brand-neutral-color-80: #1e1f22; --qf-brand-neutral-color-90: #18191c; --qf-brand-neutral-color-100: #121315; }` }
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "1005": {
                            // 深绿色渐变
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #00B960 0%, #00552C 100%);}` }
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "1006": {
                            // 黄绿色渐变
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #FFEB3A 0%, #4DEF8E 100%);}` }
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');
                            break;
                        }
                        case "newyear01": {
                            // 新年方案1
                            let styles = [
                                { "explain": "导航栏背景色", "pourInto": `.window-left[_ngcontent-0-c${num}]{background: linear-gradient(220.55deg, #FF0000 0%, #470000 100%);}` },
                                { "explain": "元素颜色适配", "pourInto": `:root { --brand-primary-05: #ffe5e5; --brand-primary-10: #ffcccc; --brand-primary-20: #ff9999; --brand-primary-30: #ff6666; --brand-primary-40: #ff3333; --brand-primary-50: #ff1a1a; --brand-primary-base: #FF0000; --brand-primary-70: #cc0000; --brand-primary-80: #990000; --brand-primary-90: #660000; --brand-primary-100: #330000; --qf-brand-neutral-color-05: #ffffff; --qf-brand-neutral-color-10: #e6eaf0; --qf-brand-neutral-color-20: #ccd4e0; --qf-brand-neutral-color-30: #9ea7b3; --qf-brand-neutral-color-40: #767e89; --qf-brand-neutral-color-50: #494f57; --qf-brand-neutral-color-60: #2a2c30; --qf-brand-neutral-color-70: #242629; --qf-brand-neutral-color-80: #1e1f22; --qf-brand-neutral-color-90: #18191c; --qf-brand-neutral-color-100: #121315; }` }
                            ];
                            let styleString = styles.map(style => `<style>${style.pourInto}</style>`).join('');
                            $(styleString).appendTo('head');

                            //网页新年灯笼挂件
                            $("body > qf-root > qf-pages >").before(" <script src='https://cdn.jsdelivr.net/gh/fz6m/[email protected]/dist/china-lantern.min.js'></script>");
                            break;
                        }
                    }

                }
                /**
                 * 是否开启看板娘
                 */
                if (ButtonColorOpen_Live2DWidget) {
                    //注入看板娘(修版本注入方案)
                    // $(`<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css"/><script src="https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget/autoload.js"></script>`).appendTo('head');

                    // 创建并插入 jQuery script 元素
                    var scriptJQuery = document.createElement('script');
                    scriptJQuery.src = 'https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js';
                    document.head.appendChild(scriptJQuery);

                    // 创建并插入 Font Awesome link 元素
                    var linkFontAwesome = document.createElement('link');
                    linkFontAwesome.rel = 'stylesheet';
                    linkFontAwesome.href = 'https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css';
                    document.head.appendChild(linkFontAwesome);

                    // 创建并插入 Live2D Widget script 元素
                    var scriptLive2D = document.createElement('script');
                    scriptLive2D.src = 'https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget/autoload.js';
                    document.head.appendChild(scriptLive2D);

                }
            }
        } else {
            console.log("没有找到匹配的元素");
        }
    }
}
function replaceString(str, replaceStr) {
    // 使用正则表达式 / \$\$\$/g 来匹配所有的 "$$$",并用 replaceStr 替换它们
    return str.replace(/\$\$\$/g, replaceStr);
}
//=================================设计图添加=================================
//@批量添加字段BatchAddFields
$(function () {
    $(document).on("click", "#BatchAddFields", function () {
        BatchAddFields();
    });
});


//@触发批量添加字段BatchAddFields
function BatchAddFields() {
    var InputValue = prompt("Hello,欢迎使用【QingFlow Dragon King Super Tools】\n轻流QingFlow应用自动超级字段插件🐲\n@author       Mr.Dragon King \n\n请批量输入字段信息", "【单行文本】字段名称");
    if (InputValue != null && InputValue != "") {
        AnalysisOfConstructionContent(InputValue)
    }
}

//@解析文字算法AnalysisOfConstructionContent
function AnalysisOfConstructionContent(InputData) {
    InputData = InputData.replace(/\ +/g, "");
    InputData = InputData.replace(/[\r\n]/g, "");
    var FieldAnalysisData = [];//解析结果

    // 定义识别类型
    const DistinguishType = {
        FieldType: 1,
        FieldTitle: 2,
        FieldParameter: 3
    }

    var fieldData = {//字段数据
        type: "",//字段类型
        title: "",//字段标题
        parameter: [],//字段参数
    };

    var fieldData_parameter_textData = "";//解析参数字段内容 二次解析内容

    var distinguishType = DistinguishType.FieldType;//默认为1,即字段类型

    for (let textLengthIndex = 0; InputData.length > textLengthIndex; textLengthIndex++) {
        // 校验字段类型添加
        if (InputData[textLengthIndex].match(/\【/)) {
            // 识别上个字段内容并添加到字段信息中
            if (fieldData.type.length != 0) {
                FieldAnalysisData.push(fieldData);
                // 初始化值
                fieldData = {
                    type: "",
                    title: "",
                    parameter: []
                };
                fieldData_parameter_textData = "";
            }
            // 转换识别类型为1,即字段类型
            distinguishType = DistinguishType.FieldType;
        }

        // 校验字段类型添加结束,添加字段标题
        if (InputData[textLengthIndex].match(/\】/)) {
            fieldData.type = `${fieldData.type}${InputData[textLengthIndex]}`;
            distinguishType = DistinguishType.FieldTitle;
        }

        // 校验字段标题添加结束,添加字段参数
        if (InputData[textLengthIndex].match(/\(/) || InputData[textLengthIndex].match(/(/)) {
            distinguishType = DistinguishType.FieldParameter;
        }

        if (distinguishType === DistinguishType.FieldType) {
            fieldData.type = `${fieldData.type}${InputData[textLengthIndex]}`;
        }

        if (distinguishType === DistinguishType.FieldTitle) {
            if (InputData[textLengthIndex] != "】") {
                fieldData.title = `${fieldData.title}${InputData[textLengthIndex]}`;
            }
        }

        if (distinguishType === DistinguishType.FieldParameter) {
            if (InputData[textLengthIndex] != "(" && InputData[textLengthIndex] != "(") {
                if (InputData[textLengthIndex].match(/\)/) || InputData[textLengthIndex].match(/)/)) {
                    if (fieldData_parameter_textData.length == 0) {
                    } else {
                        let outfieldData_parameter_textData = ResolveFieldParameters(fieldData_parameter_textData);
                        if (outfieldData_parameter_textData.type == "非注册参数") {
                            alert(`Hello,欢迎使用【QingFlow Dragon King Super Tools】\n轻流QingFlow应用自动超级字段插件🐲\n\n@author       Mr.Dragon King
                                \n@version      0.2\n\n【非注册参数】\n发现未注册的字段参数,错误参数将无法进行添加到字段中!!!\n\n${fieldData.type}${fieldData.title}(${fieldData_parameter_textData})\n\n如有疑问可仔细查阅插件帮助文档,更多信息可联系作者!`);
                            fieldData_parameter_textData = "";
                        } else {
                            fieldData.parameter.push(outfieldData_parameter_textData);
                            fieldData_parameter_textData = "";
                        }
                    }
                } else {
                    if (InputData[textLengthIndex].match(/;/) || InputData[textLengthIndex].match(/;/)) {
                        let outfieldData_parameter_textData = ResolveFieldParameters(fieldData_parameter_textData);
                        if (outfieldData_parameter_textData.type == "非注册参数") {
                            alert(`Hello,欢迎使用【QingFlow Dragon King Super Tools】\n轻流QingFlow应用自动超级字段插件🐲\n\n@author       Mr.Dragon King
                                \n@version      0.2\n\n【非注册参数】\n发现未注册的字段参数,错误参数将无法进行添加到字段中!!!\n\n${fieldData.type}${fieldData.title}(${fieldData_parameter_textData})\n\n如有疑问可仔细查阅插件帮助文档,更多信息可联系作者!`);
                            fieldData_parameter_textData = "";
                        } else {
                            fieldData.parameter.push(outfieldData_parameter_textData);
                            fieldData_parameter_textData = "";
                        }
                    } else {
                        fieldData_parameter_textData = `${fieldData_parameter_textData}${InputData[textLengthIndex]}`;
                    }
                }
            }
        }

        if (textLengthIndex == InputData.length - 1) {
            console.log("字段校验完成判断是否存在fieldData数据...");
            if (fieldData.type.length != 0) {
                console.log("存在fieldData数据,添加到FieldAnalysisData");
                FieldAnalysisData.push(fieldData);
                console.log("添加到FieldAnalysisData完成");

            } else {
                console.log("不存在fieldData数据,添加到FieldAnalysisData");
            }
            //初始化值
            fieldData = {//字段数据
                type: "",//字段类型
                title: "",//字段标题
                parameter: [],//字段参数
            }
            fieldData_parameter_textData = "";//解析参数字段内容 二次解析内容
            console.log("【QingFlow Dragon King Super Tools】-->字段解析完成:", FieldAnalysisData);
            AddField(FieldAnalysisData);
        }
    }

}

//@解析字段参数算法ResolveFieldParameters
function ResolveFieldParameters(fieldData_parameter_textData) {
    fieldData_parameter_textData = fieldData_parameter_textData.replace(/\ +/g, "");
    fieldData_parameter_textData = fieldData_parameter_textData.replace(/[\r\n]/g, "");
    var fieldData_parameter = {
        type: "",//参数类型
    };//缓存字段参数
    switch (fieldData_parameter_textData) {
        case "必填": {
            fieldData_parameter.type = "必填";
        }
            break;
        case "二维码": {
            fieldData_parameter.type = "二维码";
        }
            break;
        case "条形码": {
            fieldData_parameter.type = "条形码";
        }
            break;
        case "不允许重复值": {
            fieldData_parameter.type = "不允许重复值";
        }
            break;
        case "金额¥": {
            fieldData_parameter.type = "金额¥";
        }
            break;
        case "金额$": {
            fieldData_parameter.type = "金额$";
        }
        case "不允许时间重叠": {
            fieldData_parameter.type = "不允许时间重叠";
        }
            break;
        case "年": {
            fieldData_parameter.type = "年";
        }
            break;
        case "年月": {
            fieldData_parameter.type = "年月";
        }
            break;
        case "年月日": {
            fieldData_parameter.type = "年月日";
        }
            break;
        case "年月日时分": {
            fieldData_parameter.type = "年月日时分";
        }
            break;
        case "年月日时分秒": {
            fieldData_parameter.type = "年月日时分秒";
        }
        case "固定电话": {
            fieldData_parameter.type = "年月日时分秒";
        }
            break;
        case "短信验证": {
            fieldData_parameter.type = "年月日时分秒";
        }
            break;
        default: {
            if (fieldData_parameter_textData.slice(1, 7) == "关联已有数据") {
                fieldData_parameter.type = "关联已有数据";
                var DataType = 1
                var AssociateExistingData = {
                    "app": "",
                    "field": "",
                }
                for (let index = 8; index < fieldData_parameter_textData.length; index++) {
                    if (DataType == 1) {
                        if (fieldData_parameter_textData[index] != "-") {
                            AssociateExistingData.app = `${AssociateExistingData.app}${fieldData_parameter_textData[index]}`
                        } else {
                            DataType = 2;
                        }
                    }
                    if (DataType == 2) {
                        if (fieldData_parameter_textData[index] != "/" && fieldData_parameter_textData[index] != "-") {
                            AssociateExistingData.field = `${AssociateExistingData.field}${fieldData_parameter_textData[index]}`
                        }
                    }

                }
                fieldData_parameter["AssociateExistingData"] = AssociateExistingData;


            } else {
                fieldData_parameter.type = "非注册参数";
            }
        }
    }
    return fieldData_parameter;
}


//=================================添加字段算法=================================
var fieldloopIndex = 0;
//@添加字段AddField
async function AddField(FieldAnalysisData) {
    switch (FieldAnalysisData[fieldloopIndex].type) {
        case "【单行文本】": {
            await Add_field_click(field_Textfield);//添加单行文本字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
            //设置字段参数
            for (let Parameter_index = 0; Parameter_index < FieldAnalysisData[fieldloopIndex].parameter.length; Parameter_index++) {
                if (FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].type == "关联已有数据") {
                    await ToggleDefault();//切换默认内容选择
                    await Choice_AssociateExistingData();//选择元素2-关联已有数据
                    await Choice_AssociateExistingData_App();//触发关联已有数据的应用
                    await Choice_AssociateExistingData_AppInput(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.app);//关联已有数据的应用名称输入
                    await Choice_AssociateExistingData_AppChoice(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.app);//关联已有数据的应用选择
                    await Choice_AssociateExistingData_Field();//触发关联已有数据的字段
                    await Choice_AssociateExistingData_FieldInput(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.field);//关联已有数据的字段名称输入
                    await Choice_AssociateExistingData_FieldChoice(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.field);//关联已有数据的字段选择
                } else {
                    await Textfield_Parameter(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index])
                }
            }
        }
            break;
        case "【多行文本】": {
            await Add_field_click(field_Textarea);//添加多行文本字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
            for (let Parameter_index = 0; Parameter_index < FieldAnalysisData[fieldloopIndex].parameter.length; Parameter_index++) {
                if (FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].type == "关联已有数据") {
                    await ToggleDefault();//切换默认内容选择
                    await Choice_AssociateExistingData();//选择元素2-关联已有数据
                    await Choice_AssociateExistingData_App();//触发关联已有数据的应用
                    await Choice_AssociateExistingData_AppInput(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.app);//关联已有数据的应用名称输入
                    await Choice_AssociateExistingData_AppChoice(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.app);//关联已有数据的应用选择
                    await Choice_AssociateExistingData_Field();//触发关联已有数据的字段
                    await Choice_AssociateExistingData_FieldInput(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.field);//关联已有数据的字段名称输入
                    await Choice_AssociateExistingData_FieldChoice(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index].AssociateExistingData.field);//关联已有数据的字段选择
                } else {
                    await Textarea_Parameter(FieldAnalysisData[fieldloopIndex].parameter[Parameter_index])
                }
            }
        }
            break;
        case "【数字】": {
            await Add_field_click(field_Number);//添加数字字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【链接】": {
            await Add_field_click(field_Link);//添加链接字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【日期】": {
            await Add_field_click(field_Date);//添加日期字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【起止时间】": {
            await Add_field_click(field_StartStopTime);//添加起止时间字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【电话】": {
            await Add_field_click(field_Phone);//添加电话字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【邮箱】": {
            await Add_field_click(field_Mailbox);//添加邮箱字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【单项选择】": {
            await Add_field_click(field_AloneChoice);//添加单项选择字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【下拉选择】": {
            await Add_field_click(field_DropDownChoice);//添加下拉选择字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【多项选择】": {
            await Add_field_click(field_MultipleChoice);//添加多项选择字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【图片选择】": {
            await Add_field_click(field_ImagesChoice);//添加图片选择字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break;
        case "【附件上传】": {
            await Add_field_click(field_FileUpload);//添加附件上传字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break
        case "【地址】": {
            await Add_field_click(field_Address);//添加地址字段
            await InputData(field_Title, FieldAnalysisData[fieldloopIndex].title);//设置字段标题
        }
            break
        default: {
            console.log("未注册字段", FieldAnalysisData[fieldloopIndex].type)
        }

    }

    fieldloopIndex = fieldloopIndex + 1;
    if (fieldloopIndex < FieldAnalysisData.length) {
        AddField(FieldAnalysisData)
    } else {
        fieldloopIndex = 0;
        //字段添加任务完完成进行消息推送
        if (MessagePushState == true) {
            MessagePush(QW_QrobotHook, "字段添加任务", "当前字段任务已经完成,请注意检查查看!")
        }
        setTimeout(() => {
            alert("【QingFlow Dragon King Super Tools】\n轻流QingFlow应用自动超级字段插件🐲\n字段批量添加任务已经完成😀")
        }, 1000)

    }
}
//===========================================================================================
//====================================方法事件【添加字段】===================================

//@添加字段方法 Add_field_click(field)
function Add_field_click(field) {
    return new Promise(resolve => {
        setTimeout(() => {
            $x(field)[0].click();
            resolve()//成功态
        }, 500)
    })
}
//===========================================================================================
//=================================方法事件【输入&输入结束】=================================
//@输入内容 InputData
function InputData(element, data) {
    return new Promise(resolve => {
        setTimeout(() => {
            $x(element)[0].value = data;
            InputEnd(element);
            resolve()//成功态
        }, 500)
    })
}

//@输入结束 InputEvent
function InputEnd(data) {
    return new Promise(resolve => {
        $x(data)[0].dispatchEvent(new InputEvent("input"));
        resolve()//成功态
    })
}
//===========================================================================================
//====================================字段参数===============================================
//=================================字段参数【单行文本参数】==================================
//@添加单行文本参数Textfield_Parameter
async function Textfield_Parameter(parameter) {
    return new Promise(resolve => {
        setTimeout(() => {
            switch (parameter.type) {
                case "必填": {
                    if ($x(fieldParameter_Required).length == 1) {
                        $x(fieldParameter_Required)[0].click()
                    }
                }
                    break;
                case "二维码": {
                    if ($x(fieldParameter_QRCode).length == 1) {
                        $x(fieldParameter_QRCode)[0].click()
                    }
                }
                    break;
                case "条形码": {
                    if ($x(fieldParameter_QRCode).length == 1) {
                        $x(fieldParameter_QRCode)[0].click()
                        setTimeout(() => {
                            if ($x(fieldParameter_BarCode).length == 1) {
                                $x(fieldParameter_BarCode)[0].click()
                            }
                        }, 200)
                    }
                }
                    break;
                case "不允许重复值": {
                    if ($x(fieldParameter_NotDuplicateValue).length == 1) {
                        $x(fieldParameter_NotDuplicateValue)[0].click()
                    }
                }
                    break;
                default: {
                    console.log("未注册字段参数")
                }
            }
            resolve()//成功态
        }, 500)
    })
}
//=================================字段参数【多行文本参数】=================================
//@添加多行文本参数Textarea_Parameter
async function Textarea_Parameter(parameter) {
    return new Promise(resolve => {
        setTimeout(() => {
            switch (parameter.type) {
                case "必填": {
                    $x("/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[1]/label")[0].click()
                }
                    break;
                case "不允许重复值": {
                    $x("/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[3]/qf-edit-area/div/qf-function-lock/div[3]/label")[0].click()
                }
                    break;
                default: {
                    console.log("未注册字段参数")
                }
            }
            resolve()//成功态
        }, 500)
    })
}
//=================================特殊参数【关联已有数据】=================================

//@切换默认 ToggleDefault
function ToggleDefault() {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                if ($x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-select/qf-select-top-control/qf-select-item`).length == 1) {
                    $x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-select/qf-select-top-control/qf-select-item`)[0].click();
                    openType = false;
                }
            }
            resolve()//成功态
        }, 200)
    })
}

//@切换关联已有数据 Choice_AssociateExistingData
function Choice_AssociateExistingData() {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                for (let index_1 = 0; index_1 < 99 && openType == true; index_1++) {
                    if ($x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item[2]`).length == 1) {
                        $x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item[2]`)[0].click();
                        openType = false;
                    }
                }
            }
            resolve()//成功态
        }, 200)
    })
}


//@触发关联已有数据的应用 Choice_AssociateExistingData_App
function Choice_AssociateExistingData_App() {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                if ($x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[1]/qf-select-top-control/div[1]/input`).length == 1) {
                    $x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[1]/qf-select-top-control/div[1]/input`)[0].click();
                    openType = false;
                }
            }
            resolve()//成功态
        }, 200)
    })
}

//@关联已有数据的应用名称输入 Choice_AssociateExistingData_AppInput
function Choice_AssociateExistingData_AppInput(appName) {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                if ($x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[1]/qf-select-top-control/div[1]/input`).length == 1) {
                    $x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[1]/qf-select-top-control/div[1]/input`)[0].value = appName;
                    InputEnd(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[1]/qf-select-top-control/div[1]/input`);
                    openType = false;
                }
            }
            resolve()//成功态
        }, 200)
    })
}


//@关联已有数据的应用选择 Choice_AssociateExistingData_AppChoice
function Choice_AssociateExistingData_AppChoice(appName) {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                for (let index_1 = 0; index_1 < 99 && openType == true; index_1++) {
                    if ($x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`).length > 0) {
                        for (let index_2 = 0; index_2 < $x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`).length; index_2++) {
                            let index_3 = index_2 + 1;
                            if ($x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item[${index_3}]/div`)[0].innerText == appName) {
                                $x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`)[`${index_2}`].click();
                                openType = false;
                            }
                        }
                    }
                }
            }
            resolve()//成功态
        }, 200)
    })
}

//@触发关联已有数据的字段 Choice_AssociateExistingData_Field
function Choice_AssociateExistingData_Field() {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                if ($x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[2]/qf-select-top-control/div[1]/input`).length == 1) {
                    $x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[2]/qf-select-top-control/div[1]/input`)[0].click();
                    openType = false;
                }
            }
            resolve()//成功态
        }, 200)
    })
}

//@关联已有数据的字段名称输入 Choice_AssociateExistingData_FieldInput
function Choice_AssociateExistingData_FieldInput(fieldName) {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                if ($x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[2]/qf-select-top-control/div[1]/input`).length == 1) {
                    $x(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[2]/qf-select-top-control/div[1]/input`)[0].value = fieldName;;
                    InputEnd(`/html/body/qf-root/qf-pages/qf-app-item/qf-creation/div/div[${index}]/qf-edit-area/div/qf-function-lock/qf-dft-val-edit/div/qf-function-lock/qf-dft-associate-data/div[1]/qf-select[2]/qf-select-top-control/div[1]/input`);
                    openType = false;
                }
            }
            resolve()//成功态
        }, 200)
    })
}


//@关联已有数据的字段选择Choice_AssociateExistingData_FieldChoice
function Choice_AssociateExistingData_FieldChoice(fieldName) {
    return new Promise(resolve => {
        setTimeout(() => {
            var openType = true
            for (let index = 0; index < 99 && openType == true; index++) {
                for (let index_1 = 0; index_1 < 99 && openType == true; index_1++) {
                    if ($x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`).length > 0) {
                        for (let index_2 = 0; index_2 < $x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`).length; index_2++) {
                            let index_3 = index_2 + 1;
                            if ($x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item[${index_3}]/div`)[0].innerText == fieldName) {
                                $x(`/html/body/div[${index}]/div[${index_1}]/div/qf-option-container/div[2]/cdk-virtual-scroll-viewport/div[1]/div/qf-option-item`)[`${index_2}`].click();
                                openType = false;
                            }
                        }
                    }
                }
            }
            resolve()//成功态
        }, 200)
    })
}
//=========================================================================================
//=======================================Excel字段导入【Excel】============================
$(function () {
    $(document).on("change", "#excel-file", function (e) {
        var files = e.target.files;
        var fileReader = new FileReader();
        fileReader.onload = function (ev) {
            try {
                var data = ev.target.result
                var workbook = XLSX.read(data, {
                    type: 'binary'
                }) // 以二进制流方式读取得到整份excel表格对象
                var persons = []; // 存储获取到的数据
            } catch (e) {
                console.log('文件类型不正确');
                return;
            }
            // 表格的表格范围,可用于判断表头是否数量是否正确
            var fromTo = '';
            // 遍历每张表读取
            for (var sheet in workbook.Sheets) {
                if (workbook.Sheets.hasOwnProperty(sheet)) {
                    fromTo = workbook.Sheets[sheet]['!ref'];
                    persons = persons.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
                    let FieldAnalysisData = EXCEL_FieldAnalysisData(workbook.Sheets[sheet])
                    console.log("【QingFlow Dragon King Super Tools】-->Excel字段导入解析完成:", FieldAnalysisData)
                    AddField(FieldAnalysisData);
                    break; // 如果只取第一张表,就取消注释这行
                }
            }
            var index = 0;
            for (var i in persons) {
                var prjid = persons[i].prjid;
                var parentid = persons[i].parentid;
                var subject = persons[i].subject;
                var hrmid = persons[i].hrmid;
                var begindate = persons[i].begindate;
                begindate = new Date(begindate).toLocaleDateString().replace(/\//g, '-');

                var enddate = persons[i].enddate;
                enddate = new Date(enddate).toLocaleDateString().replace(/\//g, '-');

                var actualbegindate = persons[i].actualbegindate;
                actualbegindate = new Date(actualbegindate).toLocaleDateString().replace(/\//g, '-');

                var actualenddate = persons[i].actualenddate;
                actualenddate = new Date(actualenddate).toLocaleDateString().replace(/\//g, '-');

                var stageid = persons[i].stageid;
                var finish = persons[i].finish;

            }
            //在控制台打印出来表格中的数据
        };
        // 以二进制方式打开文件
        fileReader.readAsBinaryString(files[0]);
        console.log(files);
    });
});
function EXCEL_FieldAnalysisData(sheet) {
    const FieldAnalysisData = [];//解析结果
    /* sheet['!ref']表示所有单元格的范围,例如从A1到F8则记录为 A1:F8*/
    const range = XLSX.utils.decode_range(sheet['!ref'])
    let C,
        R = range.s.r + 0 /* 从第一行开始 */
    /* 按列进行数据遍历 */
    for (C = range.s.c; C <= range.e.c; ++C) {
        /* 查找第一行中的单元格 */
        const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]
        let title = 'UNKNOWN ' + C // <-- 进行默认值设置
        if (cell && cell.t) title = XLSX.utils.format_cell(cell)

        //格式化数据格式
        var fieldData_type = "【单行文本】";//默认字段类型
        var fieldData_parameter = [];//默认字段参数

        for (let index = 0; index < fieldData_type_testData.length; index++) {
            //let key = RegExp(fieldData_type_testData[index].RegExp)
            if (RegExp(fieldData_type_testData[index].RegExp).test(title)) {
                fieldData_type = fieldData_type_testData[index].fieldData_type;
                fieldData_parameter = fieldData_type_testData[index].fieldData_parameter;
            }
        }
        var fieldData = {//字段数据
            type: fieldData_type,//字段类型
            title: title,//字段标题
            parameter: fieldData_parameter,//字段参数
        }
        FieldAnalysisData.push(fieldData)
    }
    return FieldAnalysisData
};
//===========================================================================
//=======================================消息推送============================
/**
 * 企业微信提醒推送功能
 * 功能已经下线,请勿再次操作
 * @param {*} QW_QrobotHook
 * @param {*} title
 * @param {*} quote_text
 */
function MessagePush(QW_QrobotHook, title, quote_text) {
    // var data = {
    //     QW_QrobotHook: QW_QrobotHook,
    //     title: title,
    //     quote_text: quote_text
    // };
    // GM_xmlhttpRequest({
    //     method: "post",
    //     headers: {
    //         "Content-Type": "application/json"
    //     },
    //     url: "",
    //     data: JSON.stringify(data),
    //     onload: function (res) {
    //         // code
    //         console.log("返回", res);
    //     }
    // });
}
//===========================================================================

//===========================================================================


/**
 * 悬浮动画
 */
function floatingAnimation() {
    if (floatingAnimationOpen) {
        switch (floatingAnimationTypeID) {
            case "custom": {
                //小猫咪
                // 创建并插入 sakana-widget 容器
                var sakanaWidgetDiv = document.createElement('div');
                sakanaWidgetDiv.id = 'sakana-widget';
                sakanaWidgetDiv.style.position = 'fixed';
                sakanaWidgetDiv.style.right = '0px';
                sakanaWidgetDiv.style.bottom = '0px';
                document.body.appendChild(sakanaWidgetDiv);

                // 定义 initSakanaWidget 函数
                function initSakanaWidget() {
                    const demo = SakanaWidget.getCharacter('chisato');
                    demo.initialState = {
                        ...demo.initialState,
                        i: 0.001,
                        d: 1,
                        autoFit: true,
                    };
                    demo.image = floatingAnimationCustom;
                    SakanaWidget.registerCharacter('demo', demo);
                    new SakanaWidget({ character: 'demo' }).mount('#sakana-widget');
                }

                // 创建并插入第一个 script 元素
                var script1 = document.createElement('script');
                script1.textContent = '(' + initSakanaWidget.toString() + ')();';
                document.body.appendChild(script1);

                // 创建并插入第二个 script 元素
                var script2 = document.createElement('script');
                script2.async = true;
                script2.onload = initSakanaWidget;
                script2.src = 'https://cdn.jsdelivr.net/npm/[email protected]/lib/sakana.min.js';
                document.body.appendChild(script2);

                break;
            }
            case "1000": {
                //默认
                // 创建并插入 sakana-widget 容器
                var sakanaWidgetDiv = document.createElement('div');
                sakanaWidgetDiv.id = 'sakana-widget';
                sakanaWidgetDiv.style.position = 'fixed';
                sakanaWidgetDiv.style.right = '0px';
                sakanaWidgetDiv.style.bottom = '0px';
                document.body.appendChild(sakanaWidgetDiv);

                // 定义 initSakanaWidget 函数
                function initSakanaWidget() {
                    new SakanaWidget().mount('#sakana-widget');
                }

                // 创建并插入第一个 script 元素
                var script1 = document.createElement('script');
                script1.textContent = '(' + initSakanaWidget.toString() + ')();';
                document.body.appendChild(script1);

                // 创建并插入第二个 script 元素
                var script2 = document.createElement('script');
                script2.async = true;
                script2.onload = initSakanaWidget;
                script2.src = 'https://cdn.jsdelivr.net/npm/[email protected]/lib/sakana.min.js';
                document.body.appendChild(script2);


                break;
            }
            case "1001": {
                //小猫咪
                // 创建并插入 sakana-widget 容器
                var sakanaWidgetDiv = document.createElement('div');
                sakanaWidgetDiv.id = 'sakana-widget';
                sakanaWidgetDiv.style.position = 'fixed';
                sakanaWidgetDiv.style.right = '0px';
                sakanaWidgetDiv.style.bottom = '0px';
                document.body.appendChild(sakanaWidgetDiv);

                // 定义 initSakanaWidget 函数
                function initSakanaWidget() {
                    const demo = SakanaWidget.getCharacter('chisato');
                    demo.initialState = {
                        ...demo.initialState,
                        i: 0.001,
                        d: 1,
                        autoFit: true,
                    };
                    demo.image = 'https://wimg.588ku.com/gif620/20/06/11/7178bce8465bb5ecbd78a6a516fef0e7.gif';
                    SakanaWidget.registerCharacter('demo', demo);
                    new SakanaWidget({ character: 'demo' }).mount('#sakana-widget');
                }

                // 创建并插入第一个 script 元素
                var script1 = document.createElement('script');
                script1.textContent = '(' + initSakanaWidget.toString() + ')();';
                document.body.appendChild(script1);

                // 创建并插入第二个 script 元素
                var script2 = document.createElement('script');
                script2.async = true;
                script2.onload = initSakanaWidget;
                script2.src = 'https://cdn.jsdelivr.net/npm/[email protected]/lib/sakana.min.js';
                document.body.appendChild(script2);

                break;
            }
        }
    }
}

//===========================================================================
//帮助引导
function HelpGuide() {

    document.addEventListener('mousemove', function (event) {
        var target = event.target;
        if (target !== document.body) {
            target.style.border = '2px solid red';
        }
    });

    document.addEventListener('mouseout', function (event) {
        var target = event.target;
        if (target !== document.body) {
            target.style.border = '';
        }
    });

    document.addEventListener('click', function (event) {
        var target = event.target;
        var xpath = getXPath(target);
        console.log(xpath);
    });
    function getXPath(element) {
        var xpath = '';
        while (element !== document.body) {
            var nodeName = element.nodeName.toLowerCase();
            var index = 1;
            var sibling = element.previousSibling;
            while (sibling) {
                if (sibling.nodeName.toLowerCase() == nodeName) {
                    index++;
                }
                sibling = sibling.previousSibling;
            }
            xpath = '/' + nodeName + '[' + index + ']' + xpath;
            element = element.parentNode;
        }
        xpath = '//' + xpath;
        return xpath;
    }
}