// ==UserScript== // @name 腾讯云代金券优惠力度计算 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 在hunyuan大模型辅助下完成 // @author fdrag0n // @match https://console.cloud.tencent.com/expense/voucher // @grant none // @license GPL3 // @downloadURL https://update.greasyfork.icu/scripts/519819/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BB%A3%E9%87%91%E5%88%B8%E4%BC%98%E6%83%A0%E5%8A%9B%E5%BA%A6%E8%AE%A1%E7%AE%97.user.js // @updateURL https://update.greasyfork.icu/scripts/519819/%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BB%A3%E9%87%91%E5%88%B8%E4%BC%98%E6%83%A0%E5%8A%9B%E5%BA%A6%E8%AE%A1%E7%AE%97.meta.js // ==/UserScript== (function() { 'use strict'; // 定义用于提取数字的正则表达式 const NUMBER_REGEX = /\d+/; // 计算折扣百分比的函数 function calculateDiscount(numerator, denominator) { // 如果分母为0,返回'N/A',否则计算并返回折扣百分比 return denominator === 0 ? 'N/A' : ((numerator / denominator) * 100).toFixed(2); } // 从文本中提取数字的函数 function extractNumberFromText(text) { const match = text.match(NUMBER_REGEX); return match ? parseInt(match[0], 10) : null; } // 处理所有表格行的函数 function processRows(rows) { // 遍历每一行 rows.forEach((row, index) => { // 提取分子(优惠券金额) const numeratorElement = row.querySelector('td:nth-child(4) div p:nth-child(1) span span'); if (!numeratorElement) { console.error(`在第 ${index + 1} 行中找不到分子元素`); return; } const numerator = parseFloat(numeratorElement.innerText.replace(/[^\d.-]/g, '')); // 提取分母(优惠券阈值) const denominatorElement = row.querySelector('td:nth-child(4) div p:nth-child(2) span'); if (!denominatorElement) { console.error(`在第 ${index + 1} 行中找不到分母元素`); return; } const denominatorText = denominatorElement.innerText; const denominator = extractNumberFromText(denominatorText); if (denominator === null) { console.error(`无法从第 ${index + 1} 行的文本中提取数字`); } // 计算折扣百分比 var discountPercentage = calculateDiscount(numerator, denominator); if (denominator === null){ discountPercentage = "无门槛"; } // 检查子节点数量,避免插入到错误的位置 const targetElement = row.querySelector('td:nth-child(4) div p:nth-child(1) span:nth-child(1)'); if (targetElement && targetElement.nextSibling && targetElement.nextSibling.nodeType === Node.ELEMENT_NODE) { // console.log(`由于存在多个子节点,跳过第 ${index + 1} 行的插入`); return; } // 将折扣百分比插入到指定的兄弟节点中 if (targetElement) { if (denominator === null){ targetElement.insertAdjacentHTML('afterend', `=无门槛`); } else { targetElement.insertAdjacentHTML('afterend', `=${discountPercentage}%`); } console.log(`折扣已插入第 ${index + 1} 行`); } else { console.error(`在第 ${index + 1} 行中找不到目标元素`); } // 输出或使用折扣信息 console.log(`第 ${index + 1} 行: ${numerator}/${denominator}=${discountPercentage}%`); }); } // 观察表格变化的函数 function observeTableChanges() { console.log("开始计算"); // 查询目标节点 const targetNode = document.querySelector('#expense-voucher main div div.app-expense-layout__content-body div div.app-expense-card.expense-card-verify div div div.expense-grid-operation div.app-expense-tabs div:nth-child(3) div.app-expense-table__body table tbody'); if (!targetNode) { console.error('找不到目标节点'); return; } // 配置观察选项 const config = { childList: true, subtree: true }; // 先执行一次 const rows = targetNode.querySelectorAll('tr'); processRows(rows); // 创建并启动观察者 // const observer = new MutationObserver((mutationsList) => { // console.log('检测到变化'); // for (let mutation of mutationsList) { // if (mutation.type === 'childList') { // // 每次表格变化时重新处理所有行 // const rows = targetNode.querySelectorAll('tr'); // processRows(rows); // } // } // }); // observer.observe(targetNode, config); } // 初始化函数,页面加载完成后启动观察者 function init() { console.log('页面已加载'); // 查询加载状态节点并存储在变量中 const targetSpan = document.querySelector("#expense-voucher > main > div > div.app-expense-layout__content-body > div > div.app-expense-card.expense-card-verify > div > div > div.expense-grid-operation > div.app-expense-tabs > div:nth-child(3) > div > div.app-expense-table__body > table > tbody > tr:nth-child(1) > td:nth-child(4) > div > p:nth-child(1) > span > span"); console.log(targetSpan); if (!targetSpan) { console.log('找不到价格状态节点'); return } if (targetSpan.textContent.includes('.')) { console.log('优惠券已加载:', targetSpan.textContent); setTimeout(init, 1000); // 1秒后执行 observeTableChanges(); // 执行observeTableChanges函数 } else { console.log('优惠券未加载,等待中...'); setTimeout(init, 2000); // 2秒后再次检查 } } // 监听页面加载完成事件 // window.addEventListener('load', init); // 监听DOM内容加载完成事件 // document.addEventListener('DOMContentLoaded', init); // 创建按钮元素 const btn = document.createElement('button'); btn.innerHTML = '点击我计算折扣'; // 设置按钮样式 btn.style.position = 'fixed'; btn.style.bottom = '20px'; btn.style.right = '20px'; btn.style.padding = '10px 20px'; btn.style.backgroundColor = '#007BFF'; btn.style.color = '#fff'; btn.style.border = 'none'; btn.style.borderRadius = '5px'; btn.style.cursor = 'pointer'; // 添加点击事件监听器 btn.addEventListener('click', init); // 将按钮添加到页面主体 document.body.appendChild(btn); })();