// ==UserScript==
// @name 易迅数据服务自动审批
// @namespace http://tampermonkey.net/
// @version 4.0
// @description 实时监听URL变化,仅在指定页面显示控制面板
// @author 刘运运
// @match *://*/partal/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
const TARGET_PATH = '/partal/#/layout/home/personal-center/myTodoList';
let panel = null; // 用于存储面板的DOM对象
let isRunning = false;
// --- 1. 判断是否是目标页面 ---
function isTargetPage() {
return window.location.href.includes(TARGET_PATH);
}
// --- 2. 创建并显示控制面板 ---
function showPanel() {
// 如果面板已经存在,或者不是目标页面,就不重复创建
if (panel || !isTargetPage()) return;
// 创建面板 DOM (这里简写了部分样式,保持和你之前的一致)
panel = document.createElement('div');
panel.id = 'auto-task-panel';
panel.style.cssText = `position: fixed; bottom: 20px; right: 20px; width: 300px; background: #fff;
border: 1px solid #409EFF; border-radius: 8px; box-shadow: 0 4px 12px rgba(64,158,255,0.3);
z-index: 9999; padding: 15px; font-family: Arial, sans-serif;`;
panel.innerHTML = `
自动审批助手
`;
document.body.appendChild(panel);
log('✅ 脚本已就绪');
// 绑定按钮事件
document.getElementById('startBtn').addEventListener('click', startProcess);
document.getElementById('stopBtn').addEventListener('click', stopProcess);
}
// --- 3. 隐藏并销毁控制面板 ---
function hidePanel() {
if (panel) {
// 如果正在运行,先强制停止
if (isRunning) stopProcess();
panel.remove(); // 从页面中彻底移除
panel = null; // 清空变量
console.log('❌ 离开目标页面,脚本面板已隐藏');
}
}
// --- 4. 核心业务逻辑 (简化版) ---
function log(msg) {
const logBox = document.getElementById('logBox');
if (logBox) {
logBox.innerHTML += `[${new Date().toLocaleTimeString()}] ${msg}
`;
logBox.scrollTop = logBox.scrollHeight;
}
}
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
async function startProcess() {
if (isRunning) return;
isRunning = true;
document.getElementById('startBtn').disabled = true;
log('🚀 任务启动...');
while (isRunning) {
// 1. 检查页面状态
if (!isTargetPage()) {
stopProcess();
break;
}
// --- 阶段一:寻找弹窗中的“同意”按钮 (高优先级) ---
// 查找文本为"同意"且可见的按钮
const agreeBtn = Array.from(document.querySelectorAll('button, span'))
.find(el => el.innerText.trim() === '同意' && el.offsetWidth > 0);
if (agreeBtn) {
log('🔍 发现弹窗,点击同意...');
agreeBtn.click();
await sleep(2000); // 等待提交反应
continue; // 点击同意后,立即重新开始循环
}
// --- 阶段二:寻找主页面的“处理”按钮 ---
const handleBtn = document.querySelector('i.handletable');
if (handleBtn) {
log('🔍 找到待处理项,点击...');
handleBtn.click();
await sleep(1000); // 等待弹窗出现
} else {
// 修改点:直接停止
log('🏁 未找到任务,直接停止');
stopProcess();
break;
}
}
}
function stopProcess() {
isRunning = false;
const startBtn = document.getElementById('startBtn');
if (startBtn) startBtn.disabled = false;
log('🛑 任务已停止');
}
// --- 5. 初始化与 URL 监听 (重点!) ---
// 首次加载时检查一次
if (isTargetPage()) showPanel();
// 使用 MutationObserver 监听整个页面的变化(适配单页应用的路由跳转)
const observer = new MutationObserver(() => {
// 当 URL 变化导致 DOM 更新时,会触发这里
const currentIsTarget = isTargetPage();
if (currentIsTarget && !panel) {
showPanel(); // 进来了且没有面板 -> 显示
} else if (!currentIsTarget && panel) {
hidePanel(); // 出去了且有面板 -> 隐藏
}
});
// 开始观察 document 下所有子节点的变动
observer.observe(document.body, { childList: true, subtree: true });
})();