HY核价

更新F3启动弹出框,输入驳回价格和原因,点击确认或取消

// ==UserScript==
// @name         HY核价
// @namespace    http://tampermonkey.net/
// @version      2024/12/4
// @description  更新F3启动弹出框,输入驳回价格和原因,点击确认或取消
// @author       LYW
// @match        https://sso.geiwohuo.com/*
// @run-at       document-end
// @grant        GM_addStyle
// @license MIT
// @require      https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/index.min.js
// @resource     element-ui-css https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/theme-chalk/index.min.css
// ==/UserScript==

(function () {
    'use strict';

    // Inject Element UI CSS
    GM_addStyle('@import url("https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/theme-chalk/index.min.css");');

    // Create a Vue instance for Element UI
    const app = document.createElement('div');
    document.body.appendChild(app);

    // Define Vue component with Element UI dialog
    new Vue({
        el: app,
        data: {
            dialogVisible: false, // 控制弹出框显示与否
            rejectPrice: '',      // 驳回价格输入框的值
            rejectReason: '',     // 驳回原因输入框的值
            running: false,       // 控制循环是否继续
        },
        template: `
            <div style="position: absolute; bottom: 16px; right: 16px; z-index: 9999;">
                <el-dialog title="请输入核价信息" :visible.sync="dialogVisible" @close="handleClose">
                    <!-- 驳回价格输入框 -->
                    <el-input v-model="rejectPrice" placeholder="请输入统一的驳回价格" type="text"></el-input>
                    <!-- 驳回原因输入框 -->
                    <el-input v-model="rejectReason" placeholder="请输入驳回原因" type="textarea" rows="4"></el-input>
                    <span slot="footer" class="dialog-footer">
                        <el-button type="primary" @click="confirm">确认</el-button>
                        <el-button @click="dialogVisible = false">取消</el-button>
                    </span>
                </el-dialog>
            </div>
        `,
        methods: {
            handleClose() {
                // 关闭对话框时清空输入框内容
                this.rejectPrice = '';
                this.rejectReason = '';
            },
            confirm() {
                // 在确认按钮点击时,获取驳回价格和驳回原因的输入值
                console.log('驳回价格:', this.rejectPrice);
                console.log('驳回原因:', this.rejectReason);

                // 设置 running 为 true,启动循环
                this.running = true;
                // 调用 loop 方法并传入价格和原因
                this.loop(this.rejectPrice, this.rejectReason);

                // 关闭对话框
                this.dialogVisible = false;
            },
            loop(rejectprice, rejectreason) {
                // 如果正在运行,则继续循环
                if (!this.running) return;

                // 获取页面中第一个目标元素
                const targetElement = document.querySelector('td.so-table-fixed-right')?.children[0]?.children[2]?.children[0];

                // 如果元素存在则点击该元素
                if (targetElement) {
                    targetElement.click();
                } else {
                    // 如果元素不存在,则退出循环
                    console.log('目标元素不存在,退出循环');
                    this.stopLoop();
                    return;
                }

                // 填写表单
                let divs1 = document.querySelector('.so-card-body .so-input-inline .so-input-number-ltr');
                let divs2 = document.querySelector('.so-card-body .so-button-primary');
                let divs3 = document.querySelector('.so-card-body .so-input-inline textarea');

                divs1.focus();
                document.execCommand('selectAll', false, null);
                document.execCommand('insertText', false, rejectprice);
                divs2.click();
                divs3.focus();
                document.execCommand('selectAll', false, null);
                document.execCommand('insertText', false, rejectreason);

                // 监听 .so-modal-mask 是否存在
                const checkModalMask = setInterval(() => {
                    const modalMask = document.querySelector('.so-modal-mask');
                    if (!modalMask) {
                        // 如果 .so-modal-mask 不存在,调用 loop
                        this.loop(rejectprice, rejectreason);
                        clearInterval(checkModalMask); // 清除定时器
                    }
                }, 1000); // 每秒检查一次 .so-modal-mask 是否存在
            },
            stopLoop() {
                // 设置 running 为 false,停止循环
                this.running = false;

                // 显示提示消息(toast)
                this.showToast('核价脚本已停止运行');
            },
            showToast(message) {
                this.$message({
                    message: message,
                    type: 'info', // 'success', 'warning', 'info', 'error'
                    duration: 3000, // 提示框显示时间
                });
            }
        },
        mounted() {
            // 监听 F3 键触发事件
            window.addEventListener('keydown', (event) => {
                if (event.key === 'F3') {
                    this.dialogVisible = true; // 按下 F3 键时显示对话框
                }
            });

            // 监听 Esc 键按下事件,停止循环
            window.addEventListener('keydown', (event) => {
                if (event.key === 'Escape') {
                    console.log('Esc 被按下,停止循环');
                    this.stopLoop(); // 按下 Esc 键时停止循环
                }
            });

            // 监听 button2 点击事件,停止循环
            const button2 = document.querySelector('.so-card .so-card-footer .so-button-default');
            if (button2) {
                button2.addEventListener('click', () => {
                    console.log('button2 被点击,停止循环');
                    this.stopLoop(); // 点击 button2 时停止循环
                });
            }
        }
    });
})();