Greasy Fork镜像 支持简体中文。

亿赛通oa工时自动计算

亿赛通oa工时自动计算脚本 http://jsrun.net/2wsKp.js

目前為 2023-08-23 提交的版本,檢視 最新版本

// ==UserScript==
// @name         亿赛通oa工时自动计算
// @namespace    http://tampermonkey.net/
// @version      0.5.2
// @description  亿赛通oa工时自动计算脚本 http://jsrun.net/2wsKp.js
// @author       hangj
// @match        https://oa.esafenet.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=0.26
// @grant        none
// ==/UserScript==
(function () {
    'use strict'
    let dataArray = [], dataArrayIds = new Set(), timerId, isSelfChange = false;
    const holidaySetArray = ['2023-01-18', '2023-01-19', '2023-01-20', '2023-01-21', '2023-01-22', '2023-01-23', '2023-01-24', '2023-01-25', '2023-01-26', '2023-01-27', '2023-01-28', '2023-01-29', 
        '2023-04-05', '2023-04-29', '2023-04-30', '2023-05-01', '2023-05-02', '2023-05-03', '2023-06-22', '2023-06-23', '2023-06-24', '2023-09-29', '2023-09-30', 
        '2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05', '2023-10-06']
    const fuckHolidaySetArray = ['2023-04-23', '2023-05-06', '2023-06-25', '2023-10-07', '2023-10-08']

    function average(nums) {
        return nums.length === 0 ? 0 : (nums.reduce((a, b) => a + b) / nums.length).toFixed(2)
    }

    function sum(nums) {
        return nums.length === 0 ? 0 : nums.reduce((a, b) => a + b).toFixed(2)
    }

    function percentage(num, total) {
        return (num === 0 || total === 0) ? 0 : Math.round(num / total * 10000) / 100.00
    }

    function isHoliday(date, week) {
        if (holidaySetArray.includes(date) || fuckHolidaySetArray.includes(date)) {
            return holidaySetArray.includes(date)
        }
        return week === 0 || week === 6
    }

    function spansToData(tr) {
        const spans = tr.querySelectorAll('span.wea-url')
        const data = {
            date: spans[2].innerText,
            week: spans[3].innerText,
            dept: spans[0].innerText,
            name: spans[1].innerText,
            er: spans[6].innerText
        }
        data.startTime = new Date(data.date + ' ' + spans[4].innerText)
        data.endTime = new Date(data.date + ' ' + spans[5].innerText)
        if (data.er !== '') {
            data.endTime.setTime(data.endTime.getTime() + 1000 * 60 * 60 * 24)
        }
        data.hour = parseInt(data.endTime - data.startTime + '') / 1000 / 60 / 60
        const isHolidayFlag = isHoliday(data.date, data.startTime.getDay())
        let endTime = new Date(data.startTime.getTime() + 1000 * 60 * 60 * (isHolidayFlag ? 8 : 9.5))
        spans[6].innerText = ""
        spans[6].style['font-weight'] = 'bold'
        tr.style['background-color'] = ''
        if (new Date() > endTime) {
            if (!isHolidayFlag && data.hour < 9.5) {
                spans[6].innerText = spans[6].innerText + '(' + data.hour.toFixed(2) + 'h)'
                tr.style['background-color'] = 'red'
            }
        } else {
            spans[6].innerText = spans[6].innerText + '(' + endTime.getHours() + ':' + endTime.getMinutes() + ':' + endTime.getSeconds() + ')'
        }
        if (dataArrayIds.has(data.date)) {
            return null
        }
        return data
    }

    // 显示名称、所有数据、true 本月 false 上月 undefined 所有
    function createHtml(name, value, moreMonth) {
        const dayStartDate = new Date(new Date().toLocaleDateString())
        const dayStartTime = dayStartDate.getTime()
        dayStartDate.setDate(1)
        const monthStartTime = dayStartDate.getTime()
        const filterValue = value.filter(o => {
            const time = o.startTime.getTime()
            let monthFlag = true
            if (moreMonth !== undefined) {
                monthFlag = moreMonth ? (time >= monthStartTime) : (time < monthStartTime)
            }
            return monthFlag && time < dayStartTime && !isHoliday(o.date, o.week) && o.hour > 1
        }).map(o => o.hour)
        const val = average(filterValue)
        return sum(filterValue) + '小时,' + filterValue.length + '天,' + name + ':' + val + '(' + percentage(val, 9.5) + '%)\n'
    }

    let syncPromise = () => {
        new Promise((resolve, reject) => {
            const title = document.querySelector('.wea-new-top-title-breadcrumb')
            const trs = document.querySelectorAll('table > tbody > tr');
            if (title.innerText.startsWith('个人考勤查询')) {
                title.innerText = '个人考勤查询^_^ by jackkke'
                trs.forEach(tr => {
                    const data = spansToData(tr)
                    if (data != null) {
                        dataArray.push(data)
                        dataArrayIds.add(data.date)
                    }
                })
                title.title = createHtml('月平均', dataArray, true) + createHtml('总平均', dataArray, undefined)
                resolve('解析成功')
            } else {
                reject('非考勤页面,结束')
            }
        }).then(result => console.log(result))
            .catch(error => console.error(error))
            .finally(() => {
                isSelfChange = false
            })
    }
    (function mainFunc() {
        let main = document.querySelector('#themeLayoutRoute')
        if (main == null) {
            setTimeout(mainFunc, 500)
        } else {
            console.log("开始监听页面变化")
            new MutationObserver(() => {
                // (mutationsList, observer) => {}
                if (!isSelfChange) {
                    isSelfChange = true
                    clearTimeout(timerId);
                    timerId = setTimeout(syncPromise, 2000)
                }
            }).observe(main, {childList: true, subtree: true})
        }
    })()
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址