diff --git a/main.js b/main.js index c443bde..70f4179 100644 --- a/main.js +++ b/main.js @@ -22117,6 +22117,9 @@ const workDayData = { const QUERY_DELAY_MS = 500; const MYTOOLS_BASE = 'https://mytools.fengbohan.com'; + // 当前显示月份的偏移量(0=当月周期,正数=往前翻,负数=往后翻) + let currentMonthOffset = 0; + // 加班配置(默认值,启动时尝试从 MyTools 拉取) let overtimeConfig = { overtime_start: '17:20', weekly_target: 18 }; @@ -22319,6 +22322,52 @@ const workDayData = { }; } + // 基于当前偏移量动态导航月份(反复点击可逐月翻看历史) + function navigateMonth(delta) { + currentMonthOffset += delta; + const range = getCustomMonthRange(currentMonthOffset); + console.log(`navigateMonth offset=${currentMonthOffset}: ${range.firstDay} ~ ${range.lastDay}`); + simulateDateInput('beginDate', range.firstDay); + simulateDateInput('endDate', range.lastDay); + queryButton.click(); + setTimeout(() => get_work_time(), QUERY_DELAY_MS); + } + + // 根据指定年月查询(考勤周期:上月21 ~ 本月20) + function queryByYearMonth(year, month) { + const formatLocal = (date) => { + return date.toLocaleDateString('en-CA', { + year: 'numeric', month: '2-digit', day: '2-digit' + }).replace(/\//g, '-'); + }; + // 考勤周期:当月21日 至 次月20日 + let startMonth = month - 1; // JS month: 0-indexed + let startYear = year; + const firstDay = new Date(startYear, startMonth, 21); + let endYear = year, endMonth = month; + if (endMonth > 11) { endMonth -= 12; endYear++; } + const lastDay = new Date(endYear, endMonth, 20); + + // 推算偏移量,让后续 navigateMonth 能正确工作 + const now = new Date(); + const currentCycleStart = getCustomMonthRange(0).firstDay; + const targetFirst = formatLocal(firstDay); + // 近似:计算目标月与当前月的月份差 + const monthDiff = (now.getFullYear() - year) * 12 + (now.getMonth() + 1) - month; + const day = now.getDate(); + if (day >= 21) { + currentMonthOffset = monthDiff; + } else { + currentMonthOffset = monthDiff - 1; + } + + console.log(`queryByYearMonth ${year}-${month}: ${targetFirst} ~ ${formatLocal(lastDay)}`); + simulateDateInput('beginDate', targetFirst); + simulateDateInput('endDate', formatLocal(lastDay)); + queryButton.click(); + setTimeout(() => get_work_time(), QUERY_DELAY_MS); + } + // 查询工作时间 function get_work_time() { const totalSum = sumOfSecondColumn('grid'); @@ -22348,9 +22397,12 @@ const workDayData = { } }); const button4 = createQueryButton('查当周', getCurrentWeekRange); - const button0 = createQueryButton('查当月', () => getCustomMonthRange(0)); - const buttonNext = createQueryButton('查下月', () => getCustomMonthRange(-1)); - const button1 = createQueryButton('查上月', () => getCustomMonthRange(1)); + const button0 = createQueryButton('查当月', () => { + currentMonthOffset = 0; + navigateMonth(0); + }); + const buttonNext = createQueryButton('查下月', () => navigateMonth(-1)); + const buttonPrev = createQueryButton('查上月', () => navigateMonth(1)); const button2 = createQueryButton('查上上月', () => getCustomMonthRange(2)); const button3 = createQueryButton('查上上上月', () => getCustomMonthRange(3)); @@ -22363,9 +22415,53 @@ const workDayData = { container.appendChild(button4); container.appendChild(button0); container.appendChild(buttonNext); - container.appendChild(button1); + container.appendChild(buttonPrev); container.appendChild(button2); container.appendChild(button3); + + // 年月选择器 + (function createYearMonthSelector() { + const wrapper = document.createElement('span'); + wrapper.style.cssText = 'display:inline-flex;align-items:center;gap:4px;margin:0 8px;'; + + const yearSel = document.createElement('select'); + yearSel.id = 'fmohs-year'; + const thisYear = new Date().getFullYear(); + for (let y = 2024; y <= thisYear + 1; y++) { + const opt = document.createElement('option'); + opt.value = y; opt.textContent = y + '年'; + if (y === thisYear) opt.selected = true; + yearSel.appendChild(opt); + } + yearSel.style.cssText = 'padding:2px 6px;font-size:12px;border:1px solid #666;border-radius:3px;background:#333;color:#e5e5e5;font-family:inherit;cursor:pointer;'; + + const monthSel = document.createElement('select'); + monthSel.id = 'fmohs-month'; + for (let m = 1; m <= 12; m++) { + const opt = document.createElement('option'); + opt.value = m; opt.textContent = m + '月'; + if (m === new Date().getMonth() + 1) opt.selected = true; + monthSel.appendChild(opt); + } + monthSel.style.cssText = yearSel.style.cssText; + + const queryBtn = document.createElement('button'); + queryBtn.textContent = '查询'; + queryBtn.style.cssText = 'padding:2px 12px;font-size:12px;color:#e5e5e5;background:transparent;border:1px solid #666;border-radius:3px;cursor:pointer;font-family:inherit;transition:color 0.15s,border-color 0.15s;'; + queryBtn.addEventListener('mouseenter', () => { queryBtn.style.color = '#fff'; queryBtn.style.borderColor = '#999'; }); + queryBtn.addEventListener('mouseleave', () => { queryBtn.style.color = '#e5e5e5'; queryBtn.style.borderColor = '#666'; }); + queryBtn.addEventListener('click', () => { + const y = parseInt(yearSel.value); + const m = parseInt(monthSel.value); + queryByYearMonth(y, m); + }); + + wrapper.appendChild(yearSel); + wrapper.appendChild(monthSel); + wrapper.appendChild(queryBtn); + container.appendChild(wrapper); + })(); + console.log("复旦微加班时间统计脚本已加载"); console.log("点击按钮后会统计加班时间"); diff --git a/main.template.js b/main.template.js index 356d4f9..8159c84 100644 --- a/main.template.js +++ b/main.template.js @@ -194,6 +194,9 @@ const QUERY_DELAY_MS = 500; const MYTOOLS_BASE = 'https://mytools.fengbohan.com'; + // 当前显示月份的偏移量(0=当月周期,正数=往前翻,负数=往后翻) + let currentMonthOffset = 0; + // 加班配置(默认值,启动时尝试从 MyTools 拉取) let overtimeConfig = { overtime_start: '17:20', weekly_target: 18 }; @@ -396,6 +399,52 @@ }; } + // 基于当前偏移量动态导航月份(反复点击可逐月翻看历史) + function navigateMonth(delta) { + currentMonthOffset += delta; + const range = getCustomMonthRange(currentMonthOffset); + console.log(`navigateMonth offset=${currentMonthOffset}: ${range.firstDay} ~ ${range.lastDay}`); + simulateDateInput('beginDate', range.firstDay); + simulateDateInput('endDate', range.lastDay); + queryButton.click(); + setTimeout(() => get_work_time(), QUERY_DELAY_MS); + } + + // 根据指定年月查询(考勤周期:上月21 ~ 本月20) + function queryByYearMonth(year, month) { + const formatLocal = (date) => { + return date.toLocaleDateString('en-CA', { + year: 'numeric', month: '2-digit', day: '2-digit' + }).replace(/\//g, '-'); + }; + // 考勤周期:当月21日 至 次月20日 + let startMonth = month - 1; // JS month: 0-indexed + let startYear = year; + const firstDay = new Date(startYear, startMonth, 21); + let endYear = year, endMonth = month; + if (endMonth > 11) { endMonth -= 12; endYear++; } + const lastDay = new Date(endYear, endMonth, 20); + + // 推算偏移量,让后续 navigateMonth 能正确工作 + const now = new Date(); + const currentCycleStart = getCustomMonthRange(0).firstDay; + const targetFirst = formatLocal(firstDay); + // 近似:计算目标月与当前月的月份差 + const monthDiff = (now.getFullYear() - year) * 12 + (now.getMonth() + 1) - month; + const day = now.getDate(); + if (day >= 21) { + currentMonthOffset = monthDiff; + } else { + currentMonthOffset = monthDiff - 1; + } + + console.log(`queryByYearMonth ${year}-${month}: ${targetFirst} ~ ${formatLocal(lastDay)}`); + simulateDateInput('beginDate', targetFirst); + simulateDateInput('endDate', formatLocal(lastDay)); + queryButton.click(); + setTimeout(() => get_work_time(), QUERY_DELAY_MS); + } + // 查询工作时间 function get_work_time() { const totalSum = sumOfSecondColumn('grid'); @@ -425,9 +474,12 @@ } }); const button4 = createQueryButton('查当周', getCurrentWeekRange); - const button0 = createQueryButton('查当月', () => getCustomMonthRange(0)); - const buttonNext = createQueryButton('查下月', () => getCustomMonthRange(-1)); - const button1 = createQueryButton('查上月', () => getCustomMonthRange(1)); + const button0 = createQueryButton('查当月', () => { + currentMonthOffset = 0; + navigateMonth(0); + }); + const buttonNext = createQueryButton('查下月', () => navigateMonth(-1)); + const buttonPrev = createQueryButton('查上月', () => navigateMonth(1)); const button2 = createQueryButton('查上上月', () => getCustomMonthRange(2)); const button3 = createQueryButton('查上上上月', () => getCustomMonthRange(3)); @@ -440,9 +492,53 @@ container.appendChild(button4); container.appendChild(button0); container.appendChild(buttonNext); - container.appendChild(button1); + container.appendChild(buttonPrev); container.appendChild(button2); container.appendChild(button3); + + // 年月选择器 + (function createYearMonthSelector() { + const wrapper = document.createElement('span'); + wrapper.style.cssText = 'display:inline-flex;align-items:center;gap:4px;margin:0 8px;'; + + const yearSel = document.createElement('select'); + yearSel.id = 'fmohs-year'; + const thisYear = new Date().getFullYear(); + for (let y = 2024; y <= thisYear + 1; y++) { + const opt = document.createElement('option'); + opt.value = y; opt.textContent = y + '年'; + if (y === thisYear) opt.selected = true; + yearSel.appendChild(opt); + } + yearSel.style.cssText = 'padding:2px 6px;font-size:12px;border:1px solid #666;border-radius:3px;background:#333;color:#e5e5e5;font-family:inherit;cursor:pointer;'; + + const monthSel = document.createElement('select'); + monthSel.id = 'fmohs-month'; + for (let m = 1; m <= 12; m++) { + const opt = document.createElement('option'); + opt.value = m; opt.textContent = m + '月'; + if (m === new Date().getMonth() + 1) opt.selected = true; + monthSel.appendChild(opt); + } + monthSel.style.cssText = yearSel.style.cssText; + + const queryBtn = document.createElement('button'); + queryBtn.textContent = '查询'; + queryBtn.style.cssText = 'padding:2px 12px;font-size:12px;color:#e5e5e5;background:transparent;border:1px solid #666;border-radius:3px;cursor:pointer;font-family:inherit;transition:color 0.15s,border-color 0.15s;'; + queryBtn.addEventListener('mouseenter', () => { queryBtn.style.color = '#fff'; queryBtn.style.borderColor = '#999'; }); + queryBtn.addEventListener('mouseleave', () => { queryBtn.style.color = '#e5e5e5'; queryBtn.style.borderColor = '#666'; }); + queryBtn.addEventListener('click', () => { + const y = parseInt(yearSel.value); + const m = parseInt(monthSel.value); + queryByYearMonth(y, m); + }); + + wrapper.appendChild(yearSel); + wrapper.appendChild(monthSel); + wrapper.appendChild(queryBtn); + container.appendChild(wrapper); + })(); + console.log("复旦微加班时间统计脚本已加载"); console.log("点击按钮后会统计加班时间");