希音核价2.0

希音核价

// ==UserScript==
// @name         希音核价2.0
// @namespace    http://tampermonkey.net/
// @version      2024/12/23
// @description  希音核价
// @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: '',     // 驳回原因输入框的值
            observer: '',
        },
        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);
                this.edit(this.rejectPrice, this.rejectReason)
                this.observeDOMChanges(this.rejectPrice, this.rejectReason);
                this.showToast('脚本已开始运行');
                // 关闭对话框
                this.dialogVisible = false;
            },
            edit(rejectPrice, rejectReason) {
                const inputval = document.querySelectorAll('.so-modal-mask tbody input[type="text"]')
                const textval = document.querySelectorAll('.so-modal-mask tbody textarea')

                inputval.forEach((element) => {
                    if (element.value === '') {
                        element.focus();
                        document.execCommand('selectAll', false, null);
                        document.execCommand('insertText', false, rejectPrice);
                    }
                })

                textval.forEach((element) => {
                    if (element.value === '') {
                        element.focus();
                        document.execCommand('selectAll', false, null);
                        document.execCommand('insertText', false, rejectReason);
                    }
                })
            },
            observeDOMChanges(rejectPrice, rejectReason) {
                const mask = document.querySelector('.so-modal-mask .so-scroll-handle');

                // 创建 MutationObserver 实例
                this.observer = new MutationObserver((mutationsList, observer) => {
                    this.edit(rejectPrice, rejectReason)
                });

                // 观察目标区域的子元素变化
                this.observer.observe(mask, { childList: true, subtree: true, attributes: true });
            },
            showToast(message) {
                this.$message({
                    message: message,
                    type: 'info', // 'success', 'warning', 'info', 'error'
                    duration: 3000, // 提示框显示时间
                });
            }
        },
        mounted() {
            // 监听 F2 键触发事件
            window.addEventListener('keydown', (event) => {
                if (event.key === 'F2') {
                    this.dialogVisible = true; // 按下 F2 键时显示对话框
                }
                if (event.key === 'Delete') {
                    // 移除焦点,避免焦点仍在最后一个输入框
                    document.activeElement.blur();
                    this.observer.disconnect();
                    this.showToast('脚本已停止运行');
                }
            });

        }
    });
})();