您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
增强日历,首页直接显示打卡日历信息,有问题请反馈[email protected]
当前为
// ==UserScript== // @name 邦达新HR系统 // @namespace http://tampermonkey.net/ // @version 1.0.16 // @description 增强日历,首页直接显示打卡日历信息,有问题请反馈[email protected] // @author GodLin // @match *im.bondex.com.cn:8092/* // @require https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js // @require https://cdn.staticfile.org/bootstrap/5.2.3/js/bootstrap.min.js // @require https://cdn.staticfile.org/jquery-contextmenu/2.9.2/jquery.contextMenu.min.js // @require https://cdn.staticfile.org/jquery-contextmenu/2.9.2/jquery.ui.position.min.js // @grant GM_xmlhttpRequest // @grant unsafeWindow // @license MIT // ==/UserScript== ;(function () { 'use strict' // config // 企业微信cookie let qiYeWeiXinCookie = '' // 企业微信的sid let qiYeWeiXinSid = '' // 添加css let cssHtml = ` <link rel="stylesheet" href="http://i.bondex.com.cn/Content/css/bootstrap.css"> <link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/5.2.3/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdn.staticfile.org/jquery-contextmenu/2.9.2/jquery.contextMenu.min.css"> <style> #index{background-color:#fff;} .table-bordered, .table-bordered>tbody>tr>td, .table-bordered>tbody>tr>th, .table-bordered>tfoot>tr>td, .table-bordered>tfoot>tr>th, .table-bordered>thead>tr>td, .table-bordered>thead>tr>th{border-color:#ccc;} .table>tbody>tr>td{padding: 5px;} .table>tbody>tr>td>p{line-height:90%;} </style>` $('head').append(cssHtml) // 基础信息 // 基础加班费 12元/h let baseOvertimeMoneys = 12 // 基础可用迟到时长 30分钟 let baseLate = 30 // 基础迟到扣钱,迟到1分钟5块钱 let baseDeductLate = 5 // 基础未打卡,扣50 let baseDeductNotLock = 50 // 基础下班加班开始时间,下班时间往后偏移30分钟 let baseOvertimeOffset = 30 // base let weekDay = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', ] let today = new Date() let todayStr = today.getFullYear() + '-' + (today.getMonth() + 1 < 10 ? '0' + (today.getMonth() + 1) : today.getMonth() + 1) + '-' + (today.getDate() < 10 ? '0' + today.getDate() : today.getDate()) // 请假方式 let baseLeaveWay = { allDay: { code: '1', name: '整天', }, upDay: { code: '2', name: '上半天', }, downDay: { code: '3', name: '下半天', }, consecutiveDay: { code: '6', name: '连续整天', }, } /** * 等元素出现后操作 * @param {*} selector 选择器,$()括号里面的 * @param {*} func 元素出现后执行的方法 * @param {*} times 循环次数 * @param {*} interval 循环间隔 * @returns */ function wait(selector, func, times, interval) { let _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = $(selector), _selector = selector, //选择器 _iIntervalID //定时器id if (_self.length) { //如果已经获取到了,就直接执行函数 func && func.call(_self) } else { _iIntervalID = setInterval(function () { if (!_times) { //是0就退出 clearInterval(_iIntervalID) } _times <= 0 || _times-- //如果是正数就 -- _self = $(_selector) //再次选择 if (_self.length) { //判断是否取到 func && func.call(_self) clearInterval(_iIntervalID) } }, _interval) } return _self } /** * 将时间偏移 * @param date 时间 * @param minutes 需要推迟或提前的分钟数 */ function offsetDate(date, minutes) { let newDate = new Date(date.valueOf()); newDate.setMinutes(newDate.getMinutes() + 30); return newDate; } // 对Date的扩展,将 Date 转化为指定格式的String // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) Date.prototype.Format = function (fmt) { let o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "H+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (let k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } /** * 获取日期范围内的每天 * 返回 yyyy-MM-dd 数组 * @param {*} start yyyy-MM-dd hh:mm:ss * @param {*} end yyyy-MM-dd hh:mm:ss * @returns */ function dealDate(start, end) { let dateList = [] let startTime = new Date(start) let endTime = new Date(end) while (endTime.getTime() - startTime.getTime() >= 0) { let year = startTime.getFullYear() let month = startTime.getMonth() + 1 < 10 ? '0' + (startTime.getMonth() + 1) : startTime.getMonth() + 1 let day = startTime.getDate().toString().length == 1 ? '0' + startTime.getDate() : startTime.getDate() dateList.push(year + '-' + month + '-' + day) startTime.setDate(startTime.getDate() + 1) } return dateList } /** * sleep 休眠 */ let Sleep = { setId_xml: async function (objs) { while (true) { await this.sleep(10) if (objs.loadingNum == 0) { break } } }, sleep: function (ms) { return new Promise((resolve) => setTimeout(resolve, ms)) }, } /** * 页面加载完执行 */ $(function () { // 判断如果是 邦达首页则跳过 if (window.location.href.indexOf('i.bondex.com.cn') != -1) { return } // 获取企业微信文档 qiYeWeiXinDoc() // 获取日历 loadThreeMonthsCalendarData() // 获取审批 getApprove() // 获取工期 getWorkCycle() // 加班单模态框初始化 initOvertimeModal() // 顶部菜单初始化 initTopMenuBtn() // 获取用户信息 getUserInfo() // 加班日历元素加载 calendarLoad(calendarIndex, () => { wait('.topRouterWrapper li[title=单据申请]', () => { // 等待菜单加载完成,可能是首页 if ($('.topRouterWrapper li').first().hasClass('active')) { // 首页才进行渲染 // 隐藏快捷方式 wait( '.el-carousel__indicators', function () { $('.el-carousel__indicators').hide() }, 100, 100 ) wait( '.customHomePageBox', function () { $(".customHomePageBox[id!='calendarBox']").hide() // 重新渲染 renderCalendarHtml() }, 100, 100 ) } }) }) // 获取castoken getCasToken() // 初始化右键菜单 bindRightClickMenu() }) /** * 加载顶部切换按钮 */ function initTopMenuBtn() { // 上方菜单追加元素 $('.topRouterWrapper').append( "<li title='打卡日历' class='ellipsis' id='jiabanrili'>打卡日历</li><li title='快捷入口' class='ellipsis' id='kuaiJieRuKou'>快捷入口</li>" ) // 加载点击事件 wait('.topRouterWrapper li[title=单据申请]', () => { $('.topRouterWrapper') .find('*') .on('click', function () { $(this).parent().find('*').removeClass('active') $(this).addClass('active') }) }) // 显示快捷入口按钮 wait('#kuaiJieRuKou', function () { $('#kuaiJieRuKou').click(function () { // 判断是否是在首页 let homePage = $('.topRouterWrapper li').first() if (!homePage.hasClass('active')) { // 不是在首页,则点击首页按钮 homePage.click() } // 判断是否存在empCard左侧信息,没有的话说明是第一次进,不需要处理,如果不是第一次,需要隐藏和显示 let empCard = $('#empCard') if (empCard.length != 0) { $('#calendarBox').hide() $(".customHomePageBox[id!='calendarBox']").show() $('.el-carousel__indicators').show() } }) }) // 显示日历按钮 wait('#jiabanrili', () => { $('#jiabanrili').click(function () { // 显示日历 // 判断是否是在首页 let homePage = $('.topRouterWrapper li').first() if (!homePage.hasClass('active')) { // 不是在首页,则点击首页按钮 homePage.click() } // 判断是否存在empCard左侧信息,没有的话说明是第一次进,需要延迟加载 let empCard = $('#empCard') // 判断是否存在calendarBox,存在则直接显示 不存在则从calendarBoxHtml中获取渲染 if (empCard.length != 0) { let calendarBox = $('#calendarBox') if (calendarBox.length == 0) { wait( '#calendarBoxHtml', () => { // 隐藏蓝点 $('.el-carousel__indicators').hide() // 隐藏快捷方式 $(".customHomePageBox[id!='calendarBox']").hide() // 重新渲染 renderCalendarHtml() }, 100, 100 ) } else { // 隐藏蓝点 $('.el-carousel__indicators').hide() // 隐藏快捷方式 $(".customHomePageBox[id!='calendarBox']").hide() calendarBox.show() } } else { // 如果是第一次进 wait(".customHomePageBox[id!='calendarBox']", () => { // 隐藏蓝点 $('.el-carousel__indicators').hide() // 隐藏快捷方式 $(".customHomePageBox[id!='calendarBox']").hide() wait( '#calendarBoxHtml', () => { // 重新渲染 renderCalendarHtml() }, 100, 100 ) }) } }) }) } // 加班日历元素加载 // index =0 本月 只能获取到 上月 上上月 不能小于-2 let calendarIndex = 0 // 日历表的html let calendarHtml = '' /** * 重新日历赋按钮予点击事件 */ function calendarEvent() { // 上月按钮点击事件 wait('#calendarPrevious', () => { $('#calendarPrevious').click(() => { calendarIndex -= 1 // 重新加载html calendarLoad(calendarIndex, () => { renderCalendarHtml() }) // 如果=-2 禁用按钮 if (calendarIndex == -1) { $('#calendarPrevious').attr('disabled', true) $('#calendarPrevious').html('无') } }) }) // 本月 wait('#calendarNow', () => { $('#calendarNow').click(() => { calendarIndex = 0 // 重新加载html calendarLoad(calendarIndex, () => { renderCalendarHtml() }) // 取消禁用 $('#calendarPrevious').attr('disabled', false) $('#calendarPrevious').html('上月') }) }) } let renderingCalendar = false /** * 渲染日历html 单位时间只能执行一次 */ function renderCalendarHtml() { if (!renderingCalendar) { renderingCalendar = true $('#calendarBox').remove() $(".customHomePageBox[id!='calendarBox']") .parent() .append($('#calendarBoxHtml').html()) // 加载日历事件 calendarEvent() // 绑定日历调取单据申请 // bindDocumentApplication() renderingCalendar = false } } /** * 绑定日历调取单据申请 */ function bindDocumentApplication() { // 加班单 $('.openOvertime').css("cursor", "pointer").click(function () { // 获取日期 let that = $(this).closest('td') let date = that.data("date") let baseSignOut = that.data("base-sign-out") let signOut = that.data("sign-out") if (date && baseSignOut && signOut) { // 加载数据 baseSignOut = baseSignOut.substring(0, 5) signOut = signOut.substring(0, 5) openSimpleOvertimeSlip(date, baseSignOut, signOut) // 打开模态框 $('#overtimeModalDateInfo').html(`<span class="label label-primary">加班日期: ${date} 开始时间: ${baseSignOut} 结束时间: ${signOut} </span>`) $('#overtimeModalReason').val('') $('#overtimeModal').modal('show') } }) // 补卡单 $('.openSignIn').css("cursor", "pointer").click(function () { // 打开补卡单页面 $('#flowCard :contains(签卡单)').click() }) } /** * 时间戳 构建时间对象 * @param {*} ticks 时间戳 * @returns */ function calcTime(ticks) { let leftSecond = parseInt(ticks / 1000) let day = Math.floor(leftSecond / (60 * 60 * 24)) let hour = Math.floor((leftSecond - day * 24 * 60 * 60) / 3600) let minute = Math.floor( (leftSecond - day * 24 * 60 * 60 - hour * 3600) / 60 ) let second = Math.floor( leftSecond - day * 24 * 60 * 60 - hour * 3600 - minute * 60 ) return {day: day, hour: hour, minute: minute, second: second} } /** * 获取当前月的前 up 月的日期 * 比如 202206上1个月日期为 202205,需要传入负数-1 * @param {*} up * @returns */ function getUpDate(up) { // 如果大于0或者没传 默认给0 if (!!!up || up > 0) { up = 0 } // 当前年月 let year = today.getFullYear() // 经过计算后的月数 let month = today.getMonth() + 1 + up if (up == 0) { return {year: year + '', month: month < 10 ? ('0' + month) : ('' + month)} } // 取余 取商 let upMonth = parseInt(month % 12) let upYear = parseInt(month / 12) if (upMonth < 1) { upMonth = 12 + upMonth year = year - 1 - upYear } if (upMonth < 10) { upMonth = '0' + upMonth } return {year: year + '', month: upMonth + ''} } /** * 判断日期字符串或者date是否在范围内 * start <= date <= end * @param {*} start * @param {*} end * @param {*} date * @returns */ function dateInScope(start, end, date) { let _start = 0 if (typeof start == 'string') { if (start.indexOf(':') == -1) { start = start + ' 00:00:00' } _start = new Date(start).getTime() } else { _start = _start.getTime() } let _end = 0 if (typeof end == 'string') { if (end.indexOf(':') == -1) { end = end + ' 00:00:00' } _end = new Date(end).getTime() } else { _end = end.getTime() } let _date = 0 if (typeof date == 'string') { if (date.indexOf(':') == -1) { date = date + ' 00:00:00' } _date = new Date(date).getTime() } else { _date = date.getTime() } return _date >= _start && _date <= _end } /** * 处理日历的html * @param {*} param */ function calendarHandleHtml(param) { // 参数 let index = param.index, data = param.data, func = param.func, startDate = param.startDate, endDate = param.endDate // 本账期 let paymentDays = { remainLate: baseLate, // 可用迟到数量 deductMoneys: 0, // 扣钱 (包括未打卡扣50,迟到1分钟5块钱) lateMinutes: 0, // 迟到分钟数 overtimeHour: 0.0, // 有效加班小时 overtimeTotalMinutes: 0, // 总加班分钟 notPassDays: false, // 审批为通过 } // 下一账期(本月最后几天) let lastPaymentDays = { flag: false, // 是否到了下一账期 remainLate: baseLate, // 可用迟到数量 deductMoneys: 0, // 扣钱 (包括未打卡扣50,迟到1分钟5块钱) lateMinutes: 0, // 迟到分钟数 overtimeHour: 0.0, // 有效加班小时 overtimeTotalMinutes: 0, // 总加班分钟 notPassDays: false, // 审批为通过 } // 顶层总览按钮 // 获取前 up 月的日期 let upDate = getUpDate(index) // 账期汇总 + 表格table插槽 calendarHtml = ` <div id="btn-group" class="row" style="padding-top:10px;"> <div class="col-xs-12 text-center"> <div class="btn-group" role="group" aria-label="按钮组"> <button type="button" class="btn btn-primary btn-sm" id="calendarPrevious" >上月</button> <button type="button" class="btn btn-primary btn-sm">${upDate.year} - ${upDate.month}</button> <button type="button" class="btn btn-primary btn-sm" id="calendarNow">本月</button> </div> </div> <div class="col-xs-12"> <span class="label label-primary">操作提示:右键日历日期有菜单!</span> <span class="label label-danger">加班单只能申请 7天 内的,注意时间</span> </div> <div class="col-xs-12">#{paymentDaysSummary}</div> <div class="col-xs-12">#{lastPaymentDaysSummary}</div> </div> <div>#{calendarTable}</div> ` // 拼接日历的html let calendarTableHtml = ` <table class="table table-bordered"> <thead> <tr> ` // 渲染 周标体 $.each(weekDay, function (i, v) { if (i === 0 || i === 6) { calendarTableHtml += ` <th class="col-xs-1 text-center" style="color:#fff;background-color:#f39c12;"> <span class="label"> ${v} </span> </th>` } else { calendarTableHtml += ` <th class="col-xs-2 text-center" style="color:#fff;background-color:#777;"> <span class="label label-default" style="color:#fff;background-color:#777;">${v}</span> </th> ` } }) calendarTableHtml += ` </tr> </thead> ` // 获取准备好的审批数据 let askOff = approve.askOff let signIn = approve.signIn // 日历的开始 calendarTableHtml += '<tbody>' // 日历处理数据 $.each(data, function (i, v) { // 判断是否有签卡单,如果有,优先签卡单覆盖上下班时间 if (signIn.up[v.Date_Sign]) { v.Time_SignIn = signIn.up[v.Date_Sign] } if (signIn.down[v.Date_Sign]) { v.Time_SignOut = signIn.down[v.Date_Sign] } //上午打卡时间 let dateSignIn = new Date(v.Date_Sign + ' ' + v.Time_SignIn) //下午打卡时间 let dateSignOut = new Date(v.Date_Sign + ' ' + v.Time_SignOut) // 上下班时间点数据 //上午上班时间 08:30 let dateBaseSignIn = new Date(v.Date_Sign + ' ' + userInfo.BaseSignIn) //下午下班时间 17:30 let dateBaseSignOut = new Date(v.Date_Sign + ' ' + userInfo.BaseSignOut) //中午下班时间 12:00 let RelaxStartTime = new Date(v.Date_Sign + ' ' + v.RelaxStartTime) //下午上班时间 13:30 let RelaxEndTime = new Date(v.Date_Sign + ' ' + v.RelaxEndTime) // 下班开始计算加班的时间 let overtimeStartTime = offsetDate(dateBaseSignOut, baseOvertimeOffset); // 账期 let currentDays = {} if (dateInScope(startDate, endDate, v.Date_Sign)) { currentDays = paymentDays } else { currentDays = lastPaymentDays currentDays.flag = true } // 获取星期几 let day = new Date(v.Date_Sign) let week = weekDay[day.getDay()] // 是否是工作日 true // IsHoliday有点问题,调休和放假都算节假日 // let isWorking = (day.getDay() != 0 && day.getDay() != 6) && v.IsHoliday == false; // 存在上班时间、IsHoliday、info里面有上班字眼 let isWorking = false let holidayInfo = v.HolidayInfo if (v.IsHoliday) { // true 可能是调休上班 也可能是调休休假,只能通过判断HolidayInfo isWorking = holidayInfo ? holidayInfo.indexOf('上班') != -1 : false } else if (holiday[v.Date_Sign]) { // 里面有法定节假日和周末 isWorking = false holidayInfo = holiday[v.Date_Sign]; } else { // 打卡日历和假期日历都是false // false代表不是假期,不是假期直接判断有没有上班时间即可 isWorking = !!v.BaseSignIn } // 第一天 给个 <tr> 开始 if (day.getDay() === 0) { calendarTableHtml += '<tr>' } if (i === 0) { for (let j = 0; j < day.getDay() - i; j++) { if (j == 0 || j == 6) { calendarTableHtml += '<td class="col-xs-1"></td>' } else { calendarTableHtml += '<td class="col-xs-2"></td>' } } } // 日期 calendarTableHtml += '<td class="col-xs-' + (day.getDay() === 0 || day.getDay() === 6 ? '1' : '2') + '"' + ' data-date="' + v.Date_Sign + '"' + ' data-base-sign-out="' + v.BaseSignOut + '"' + ' data-sign-out="' + v.Time_SignOut + '"' + '><p><span class="badge ' + (day.getDay() === 0 || day.getDay() === 6 ? 'bg-yellow' : '') + '">' + day.getDate() + '</span></p>' if (todayStr == v.Date_Sign) { // 判断如果是当天则不算 calendarTableHtml += '<p><span class="label label-default">今天不算</span></p>' } else { // 已通过加班时间 let approveOvertime = approve.overtime[v.Date_Sign] // 已申请申请的加班时间 let applyOvertime = approve.applyOvertime[v.Date_Sign] if (isWorking) { // 工作日 // 上午 let upAskOff = askOff.up[v.Date_Sign] // 未打卡 (上午打卡时间 > 中午下班时间 || 上午未打卡 ) if (dateSignIn > RelaxStartTime || v.Time_SignIn == '') { if (upAskOff || v.ApproveInfo.indexOf('已通过') != -1) { calendarTableHtml += `<p><span class="label label-default">上午 ${upAskOff} 已通过</span></p>` } else { // 审批未通过 扣50 currentDays.deductMoneys -= baseDeductNotLock calendarTableHtml += `<p class="openSignIn"><span class="label label-danger">上班未打卡 ¥${baseDeductNotLock}</span></p>` // 未通过标记 currentDays.notPassDays = true } } //上班迟到 (上午打卡时间 > 上午上班时间) else if (dateSignIn > dateBaseSignIn) { if (upAskOff || v.ApproveInfo.indexOf('已通过') != -1) { // 迟到了,但是提交了审批 calendarTableHtml += ` <p class="text-warning"><span class="label label-danger">${v.Time_SignIn}</span></p> <p><span class="label label-default">上午 ${upAskOff} 已通过</span></p> ` } else { //迟到了 let timer = calcTime(dateSignIn - dateBaseSignIn) // 迟到分钟数 秒不算 let loseMinute = (timer.hour + timer.day * 24) * 60 + timer.minute if (loseMinute > 0) { // 总迟到分钟数 currentDays.lateMinutes += loseMinute // 今天扣钱 let deductMoney = 0 if (currentDays.remainLate > 0) { // 可能可以抵扣 if (currentDays.remainLate < loseMinute) { // 如果迟到分钟大于剩余可用迟到分钟,真迟到了 // 真实应该扣钱的迟到分钟 let realLoseMinute = loseMinute - currentDays.remainLate // 迟到扣钱 deductMoney = realLoseMinute * baseDeductLate } } else { // 别想了,肯定扣钱 deductMoney = loseMinute * baseDeductLate } // 总扣钱 currentDays.deductMoneys += deductMoney calendarTableHtml += ` <p class="text-warning openSignIn"> <span class="label label-danger">${v.Time_SignIn}</span> <span class="label label-danger">${loseMinute} min</span> ${(currentDays.deductMoneys ? ' <span class="label label-danger">¥' + deductMoney + '</span>' : '')} </p> ` // 剩余可用迟到分钟 currentDays.remainLate -= loseMinute } else { //一分钟内不算 calendarTableHtml += `<p><span class="label label-default" style="color:#fff;background-color:#777;">${v.Time_SignIn}</span></p>` } } } else { // 没迟到 calendarTableHtml += `<p><span class="label label-default" style="color:#fff;background-color:#777;"> ${v.Time_SignIn}</span></p>` } // 下午 let downAskOff = askOff.down[v.Date_Sign] // 下班未打卡 if (dateSignOut < dateBaseSignOut || v.Time_SignOut == '') { if (downAskOff || v.ApproveInfo.indexOf('已通过') != -1) { calendarTableHtml += `<p><span class="label label-default">下午 ${downAskOff} 已通过</span></p>` } else { //未通过 扣50 currentDays.deductMoneys -= baseDeductNotLock calendarTableHtml += `<p class="openSignIn"><span class="label label-danger">下班未打卡 ¥${baseDeductNotLock}</span></p>` // 未通过标记 currentDays.notPassDays = true } } //下班打卡 else if (dateSignOut > dateBaseSignOut) { // 加班时间 let dayOvertime = calcTime(dateSignOut - dateBaseSignOut) // 今日加班分钟 let dayOvertimeMinute = (dayOvertime.hour + dayOvertime.day * 24) * 60 + dayOvertime.minute let effectiveOvertimeHour = 0; let actualOvertimeMoney = 0; if (overtimeStartTime > dateBaseSignOut) { // 实际有效加班时间 let actualOvertime = calcTime(dateSignOut - overtimeStartTime) // 有效小时数 let effectiveOvertimeMinute = (actualOvertime.hour + actualOvertime.day * 24) * 60 + actualOvertime.minute effectiveOvertimeHour = (effectiveOvertimeMinute - (effectiveOvertimeMinute % 30)) / 60 // 有效加班费 actualOvertimeMoney = effectiveOvertimeHour * baseOvertimeMoneys } // 总加班时长 currentDays.overtimeTotalMinutes += dayOvertimeMinute // 有效加班小时 currentDays.overtimeHour += effectiveOvertimeHour if (actualOvertimeMoney > 0) { calendarTableHtml += ` <p class="text-info"> <span class="label label-primary">${(v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut)}</span> </p> <p ${approveOvertime ? '' : 'class="openOvertime"'}> <span class="label label-primary">${dayOvertimeMinute}min</span> <span class="label label-primary">有效加班¥${actualOvertimeMoney}</span> ${approveOvertime ? '<span class="label label-primary applicationFinish">已审过</span>' : ''} ${applyOvertime ? '<span class="label label-warning applicationFinish">已申请</span>' : ''} </p> ` } else { calendarTableHtml += ` <p class="text-info"> <span class="label label-default" style="color:#fff;background-color:#777;">${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut}</span> </p> <p> <span class="label label-default" style="color:#fff;background-color:#777;">${dayOvertimeMinute}min</span> </p> ` } } else { if (downAskOff || v.ApproveInfo.indexOf('已通过') != -1) { calendarTableHtml += ` <p> <span class="label label-default" style="color:#fff;background-color:#777;"> ${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut} </span> </p> ` } else { //早退了 let timer = calcTime(dateBaseSignOut - dateSignOut) let leaveEarlyMinute = (timer.hour + timer.day * 24) * 60 + timer.minute if (!!!leaveEarlyMinute) { // 早退不到1分钟,也算1分钟 leaveEarlyMinute = 1 } currentDays.deductMoneys -= leaveEarlyMinute * baseDeductLate calendarTableHtml += ` <p class="openSignIn"> <span class="label label-default" style="color:#fff;background-color:#777;"> ${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut} </span> <span class="label label-danger">早退¥${leaveEarlyMinute * baseDeductLate}</span> </p> ` // 未通过标记 currentDays.notPassDays = true } } } else { // 休息日 if (!!v.Time_SignIn) { // 休息日有打卡 // 上班时间 calendarTableHtml += `<p><span class="label label-default" style="color:#fff;background-color:#777;">${v.Time_SignIn}</span></p>` if (!!!v.Time_SignOut) { // 只有上班没有下班 calendarTableHtml += '<p class="text-info"><span class="label label-primary">下班未打卡,好家伙钱都不要了!</span></p>' } else { // 申请加班了 if (approveOvertime) { // 审批通过 // 取加班单与打卡时间交集最小值 let approveOvertimeBegin = new Date( v.Date_Sign + ' ' + approveOvertime.begin ) let approveOvertimeEnd = new Date( v.Date_Sign + ' ' + approveOvertime.end ) let timerLong = 0 //上午打卡时间 if ( dateSignOut <= approveOvertimeBegin || approveOvertimeEnd <= dateSignIn ) { timerLong = 0 } else { let overtimeArray = [ dateSignIn, dateSignOut, approveOvertimeBegin, approveOvertimeEnd, ] // 正序 overtimeArray.sort(function (a, b) { return a > b ? 1 : -1 }) timerLong = overtimeArray[2] - overtimeArray[1] } // 加班了 let timer = calcTime(timerLong) // 今日加班分钟 let overtimeMinute = (timer.hour + timer.day * 24) * 60 + timer.minute // 有效小时数 let overtimeHour = (overtimeMinute - (overtimeMinute % 30)) / 60 // 有效加班费 let overtimeMoney = overtimeHour * baseOvertimeMoneys currentDays.overtimeTotalMinutes += overtimeMinute currentDays.overtimeHour += overtimeHour if (overtimeMinute > 0) { calendarTableHtml += ` <p class="text-info"> <span class="label label-primary"> ${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut} </span> </p> <p> <span class="label label-primary">${overtimeMinute} min</span> <span class="label label-primary">¥${overtimeMoney}</span> </p> ` } else { calendarTableHtml += ` <p class="text-info"> <span class="label label-default" style="color:#fff;background-color:#777;"> ${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut} </span> </p> <p> <span class="label label-default" style="color:#fff;background-color:#777;"> ${overtimeMinute}min </span> </p> <p class="text-info"><span class="label label-primary">加班了,但是没申请通过!</span></p> ` } } else { // 没审批通过 // 加班了 let timer = calcTime(dateSignOut - dateSignIn) // 今日加班分钟 let overtimeMinute = (timer.hour + timer.day * 24) * 60 + timer.minute currentDays.overtimeTotalMinutes += overtimeMinute calendarTableHtml += ` <p class="text-info"> <span class="label label-default" style="color:#fff;background-color:#777;"> ${v.Time_SignOut === v.Time_SignIn ? '' : v.Time_SignOut} </span> </p> <p> <span class="label label-default" style="color:#fff;background-color:#777;"> ${overtimeMinute} min </span> </p> <p class="text-info"><span class="label label-primary">加班了,但是没申请通过!</span></p> ` } } } else { // 调休等消息 calendarTableHtml += `<p class="text-info"><span class="label label-success">${holidayInfo ? holidayInfo : '加班是不可能加班的'}</span></p>` } } } calendarTableHtml += '</td>' if (day.getDay() === 6) { calendarTableHtml += '</tr>' } }) calendarTableHtml += '</tbody>' calendarTableHtml += '</table>' // 等快捷方式出现后,渲染页面 // 渲染日历表 // 替换表格 calendarHtml = calendarHtml.replace('#{calendarTable}', calendarTableHtml) // 替换标题 合计,放到paymentDaysSummaryHtml下 let paymentDaysSummaryHtml = ` 当前账期 <span class= "label label-primary" >${startDate.substring(0, 10)} —— ${endDate.substring(0, 10)} </span> 共迟到:<span class="label label-warning"> ${paymentDays.lateMinutes}min</span> <span class="label label-danger">余额 ${paymentDays.remainLate}min</span> 共加班:<span class="label label-primary">${paymentDays.overtimeTotalMinutes}min</span> 有效加班:<span class="label label-primary"> ${paymentDays.overtimeHour * 60}min</span><span class="badge">${paymentDays.overtimeHour}h</span> 扣除工资:<span class="label label-danger">¥${paymentDays.deductMoneys}</span> 加班奖励工资:<span class="label label-primary">¥${paymentDays.overtimeHour * baseOvertimeMoneys}</span> ${(paymentDays.notPassDays ? '<span class="label label-danger">有没通过的的审批,要扣钱啦,快在' + endDate.substring(0, 10) + '之前提交审批</span>' : '')} ` calendarHtml = calendarHtml.replace( '#{paymentDaysSummary}', paymentDaysSummaryHtml ) // 判断是否到了下一账期进行处理 let lastPaymentDaysHtml = '' if (lastPaymentDays.flag) { lastPaymentDaysHtml = ` 下月账期共迟到:<span class="label label-warning">${lastPaymentDays.lateMinutes}min</span> <span class="label label-danger">余额${lastPaymentDays.remainLate}min</span> 共加班:<span class="label label-primary">${lastPaymentDays.overtimeTotalMinutes}min</span> 有效加班:<span class="label label-primary">${lastPaymentDays.overtimeHour * 60}min</span> <span class="badge">${lastPaymentDays.overtimeHour}h</span> 扣除工资:<span class="label label-danger">¥${lastPaymentDays.deductMoneys}</span> 加班奖励工资:<span class="label label-primary">¥${lastPaymentDays.overtimeHour * baseOvertimeMoneys}</span> ${(lastPaymentDays.notPassDays ? ' <span class="label label-danger">有没通过的的审批,要扣钱啦,快在' + endDate.substring(0, 10) + '之前提交审批</span>' : '')} ` } calendarHtml = calendarHtml.replace( '#{lastPaymentDaysSummary}', lastPaymentDaysHtml ) // 添加日历box let calendarBoxHtml = ` <div class = "customHomePageBox" id = "calendarBox" style = "height: 100%; flex: 75 1 0%;overflow-y: auto;overflow-x: hidden" > <div id = "calendarItem" style = "width:100%!important;" > ${calendarHtml} </div> </div> ` let calendarBoxHtmlJq = $('#calendarBoxHtml') if (calendarBoxHtmlJq.length == 0) { $('body').append(`<script type = "text/html" id="calendarBoxHtml" >${calendarBoxHtml}</script>`) } else { calendarBoxHtmlJq.html(calendarBoxHtml) } // 回调函数 func && func.call() } /** * 日历加载,将生成的html存入script * @param {*} index 本月为零,上月为-1,以此类推 * @param {*} func 回调函数,一般为重新染显示日历 */ function calendarLoad(index, func) { wait('#workCycleJson', () => { // 账期数据存在后 wait('#threeMonthsCalendarDataJson', () => { let currentMonth = today.getMonth() + 1 let index2 = today.getMonth() + 1 + index; if (currentMonth == 1 && index == -1) { // 当前月为1月份 且按了上个月 index2 = 12 } // 获取到账期日期 let startDate = workCycle[index2 + 'start'] let endDate = workCycle[index2 + 'end'] let _endDate = endDate // 处理数据 需要账期数据和日历数据同时存在 if (index == 0) { // 本账期,取start到今天的data 非本月账期,按照账期日期获取data _endDate = today } // 处理data,只要账期内的 let data = threeMonthsCalendarDataJson.filter((item) => { return dateInScope(startDate, _endDate, item.Date_Sign) }) // 准备处理日历html let param = { startDate: startDate, endDate: endDate, data: data, index: index, func: func, } calendarHandleHtml(param) }) }) } let workCycle = {} /** * 获取工作周期 近2个月 * 缓存到script中 */ function getWorkCycle() { // 删除工期json $('#workCycleJson').remove() workCycle = {} // 准备获取工期 // 获取工期 $.ajax({ type: 'POST', url: '/attWorkHourMonth/listCustomSearch?tId=1543134799064313857&pageNum=1&pageSize=20', contentType: 'application/json', dataType: 'json', data: '{}', success: function (data) { let workList = data.rows if (workList.length > 0) { workList.forEach((item) => { let currentMonth = new Date(item.attendance_month_end_date).getMonth() + 1 workCycle[currentMonth + 'start'] = item.attendance_month_begin_date workCycle[currentMonth + 'end'] = item.attendance_month_end_date }) } // 获取完工期后的操作 存入到页面 json字符串 $('body').append(`<script type = "text/html" id = "workCycleJson" >true</script>`) } , }) } let threeMonthsCalendarDataJson = [] /** * 加载近三个月日历数据 * 缓存到script中 */ function loadThreeMonthsCalendarData() { let threeMonthsCalendarData = {} // 删除日历数据json $('#threeMonthsCalendarDataJson').remove() // 访问老邦达接口,直接拉取3个月数据 // 油猴跨域访问 GM_xmlhttpRequest({ method: 'post', url: 'http://i.bondex.com.cn/My/CheckData', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, onload: function (data) { // 重新登录(不可用)可能会返回网页,需要捕获重新加载 try { data = JSON.parse(data.responseText) } catch (e) { if ( data.responseText.indexOf('注意:请使用邦达黄页的用户名密码登录(不可用)') != -1 ) { // cookie过期,重新登录(不可用),跳转到i.bomdex,从该页面进入 window.location.href = 'http://i.bondex.com.cn/' } else { // 可能加载到页面元素,重新加载 loadThreeMonthsCalendarData() } return } threeMonthsCalendarData.current = data }, }) // 油猴跨域访问 GM_xmlhttpRequest({ method: 'post', url: 'http://i.bondex.com.cn/My/CheckData?flag=prepre', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, onload: function (data) { // 重新登录(不可用)可能会返回网页,需要捕获重新加载 try { data = JSON.parse(data.responseText) } catch (e) { if ( data.responseText.indexOf('注意:请使用邦达黄页的用户名密码登录(不可用)') != -1 ) { // cookie过期,重新登录(不可用) window.location.href = 'http://i.bondex.com.cn/' } else { // 可能加载到页面元素,重新加载 loadThreeMonthsCalendarData() } return } threeMonthsCalendarData.prepre = data }, }) // 条件成立后执行 let _iIntervalID //定时器id let _times = 100 // 定时器异步,需要函数执行 _iIntervalID = setInterval(function () { if (!_times) { //是0就退出 clearInterval(_iIntervalID) } _times-- if (Object.keys(threeMonthsCalendarData).length == 2) { threeMonthsCalendarDataJson = threeMonthsCalendarData.prepre threeMonthsCalendarDataJson.push.apply( threeMonthsCalendarDataJson, threeMonthsCalendarData.current ) // 获取完工期后的操作 存入到页面 json字符串 使用wait去监控 $('body').append('<script type="text/html" id="threeMonthsCalendarDataJson">true</script>') // 清除定时任务 clearInterval(_iIntervalID) } }, 50) } let approve = { askOff: {up: {}, down: {}}, signIn: {up: {}, down: {}}, overtime: {}, }; /** * 获取全部审批数据 请假、签到、加班 * 缓存到script里 */ function getApprove() { // 删除工期json $('#approveJson').remove() approve = { askOff: {up: {}, down: {}}, signIn: {up: {}, down: {}}, overtime: {}, applyOvertime: {}, } let queryCount = 0 // 请假单获取 $.ajax({ type: 'POST', url: '/attHolidayLeaveOrder/listCustomSearch?tId=1158666390359023618&pageNum=0&pageSize=70&sort=create_date%20&order=descending', contentType: 'application/json', dataType: 'json', data: JSON.stringify({}), success: function (data) { queryCount++ let rows = data.rows if (Array.isArray(rows)) { // 过滤出审批通过的 rows = $.grep(rows, function (n, i) { return n.audit_status == '3' || n.audit_status == '5' }) rows.forEach((item) => { // leave_way 1整天 2上半天 3下半天 6连续整天 let leaveWay = item.leave_way let leaveCategoryName = item.leave_category_name || '请假' if ( leaveWay == baseLeaveWay.allDay.code || leaveWay == baseLeaveWay.upDay.code || leaveWay == baseLeaveWay.downDay.code ) { let approveDate = item.begin_date.substring(0, 10) if (leaveWay == baseLeaveWay.allDay.code) { // 整天 approve.askOff.up[approveDate] = leaveCategoryName approve.askOff.down[approveDate] = leaveCategoryName } else if (leaveWay == baseLeaveWay.upDay.code) { // 上 approve.askOff.up[approveDate] = leaveCategoryName } else { // 下 approve.askOff.down[approveDate] = leaveCategoryName } } else if (leaveWay == baseLeaveWay.consecutiveDay.code) { let approveDateArr = dealDate(item.begin_date, item.end_date) approveDateArr.forEach((e) => { approve.askOff.up[e] = leaveCategoryName approve.askOff.down[e] = leaveCategoryName }) } else { // 补签卡,补签,直接覆盖原上下班时间 let signDate = item.sign_date.substring(0, 10) let signTime = item.sign_time // 判断上午下午 if ('12:30' > signTime) { // 上午 approve.signIn.up[signDate] = signTime + ':00' } else { // 下午 approve.signIn.down[signDate] = signTime + ':00' } } }) } }, }) // 签卡单获取 $.ajax({ type: 'POST', url: '/attHolidayLeaveOrder/listCustomSearch?tId=1158673087379054595&pageNum=0&pageSize=70&sort=create_date%20&order=descending', contentType: 'application/json', dataType: 'json', data: JSON.stringify({}), success: function (data) { queryCount++ let rows = data.rows if (Array.isArray(rows)) { // 过滤出审批通过的 rows = $.grep(rows, function (n, i) { return n.audit_status == '3' || n.audit_status == '5' }) rows.forEach((item) => { // 补签卡,补签,直接覆盖原上下班时间 let signDate = item.sign_date.substring(0, 10) let signTime = item.sign_time // 判断上午下午 if ('12:30' > signTime) { // 上午 approve.signIn.up[signDate] = signTime + ':00' } else { // 下午 approve.signIn.down[signDate] = signTime + ':00' } }) } }, }) // 加班单获取 $.ajax({ type: 'POST', url: '/attHolidayLeaveOrder/listCustomSearch?tId=1158674612583178242&pageNum=0&pageSize=70&sort=create_date%20&order=descending', contentType: 'application/json', dataType: 'json', data: JSON.stringify({}), success: function (data) { queryCount++ let rows = data.rows if (Array.isArray(rows)) { // 过滤出审批通过的加班单 let overtimeRows = $.grep(rows, function (n, i) { return n.audit_status == '3' || n.audit_status == '5' }) overtimeRows.forEach((item) => { let attendanceDate = item.attendance_date.substring(0, 10) approve.overtime[attendanceDate] = {} approve.overtime[attendanceDate].begin = item.begin_time approve.overtime[attendanceDate].end = item.end_time }) // 过滤已申请的加班单 let applyRows = $.grep(rows, function (n, i) { return n.audit_status == '1' }) applyRows.forEach((item) => { let attendanceDate = item.attendance_date.substring(0, 10) approve.applyOvertime[attendanceDate] = {} approve.applyOvertime[attendanceDate].begin = item.begin_time approve.applyOvertime[attendanceDate].end = item.end_time }) } }, }) // 条件成立后执行 let _iIntervalID; //定时器id let _times = 1000; // 定时器异步,需要函数执行 _iIntervalID = setInterval(function () { if (!_times) { //是0就退出 clearInterval(_iIntervalID) } _times-- if (queryCount == 3) { // 获取审批后的操作 存入到页面 json字符串 $('body').append('<script type="text/html" id="approveJson">true</script>') // 清除定时任务 clearInterval(_iIntervalID) } }, 50) } let userInfo = {} let holiday = {} /** * 用户信息获取 */ function getUserInfo() { // 获取到个人数据 $.ajax({ type: 'GET', url: '/desktop/employee?isSelf=1', contentType: 'application/json', dataType: 'json', async: false, success: function (data) { userInfo = data.data }, }) // 上个月 let lastMonth = getUpDate(-1) let param = { "empOriginIds": [userInfo.empOriginId], "yearMonthText": `${lastMonth.year} ${lastMonth.month}` } $.ajax({ type: 'POST', url: '/attAttendanceRecordEmp/listEmpScheduleNew', contentType: 'application/json', dataType: 'json', data: JSON.stringify(param), success: function (data) { let scheduleDetailList = data.data.scheduleDetailList scheduleDetailList = $.grep(scheduleDetailList, function (n, i) { return n.vacationSource == '9' && n.vacationCategoryName != '周末' }) scheduleDetailList.forEach((item) => { holiday[item.scheduleDate.substring(0, 10)] = item.vacationCategoryName }) }, }) // 当前月 let currentMonth = getUpDate(0) param.yearMonthText = `${currentMonth.year} ${currentMonth.month}` $.ajax({ type: 'POST', url: '/attAttendanceRecordEmp/listEmpScheduleNew', contentType: 'application/json', dataType: 'json', async: false, data: JSON.stringify(param), success: function (data) { let scheduleDetailList = data.data.scheduleDetailList // 填充到用户信息 上下班时间 let shiftTime = scheduleDetailList[0].shiftTime let shiftTimeArr = shiftTime.split('~') userInfo.BaseSignIn = shiftTimeArr[0] userInfo.BaseSignOut = shiftTimeArr[2] // 过滤出节假日 scheduleDetailList = $.grep(scheduleDetailList, function (n, i) { return n.vacationSource == '9' && n.vacationCategoryName != '周末' }) scheduleDetailList.forEach((item) => { holiday[item.scheduleDate.substring(0, 10)] = item.vacationCategoryName }) }, }) } let mainForm = {} /** * 快速加班单 * @param date 加班日期 * @param baseSignOut 开始时间 * @param signOut 结束时间 */ function openSimpleOvertimeSlip(date, baseSignOut, signOut) { $('#overtimeModalConfirm').attr("disabled", "true") $('#overtimeModalMessage').html('') $("#qiYeWeiXinRiBao").html('') mainForm = {} // 员工原始id let empOriginId = userInfo.empOriginId // 数据准备 // 获取用户信息 let queryCount = 0 $.ajax({ type: 'POST', url: `/sys/common/initFormView?formViewId=&formViewCode=att_overtime_order_emp_FormTabs&edittype=edit`, contentType: 'application/json', dataType: 'json', data: JSON.stringify({}), success: function (data) { mainForm = data.data.init.mainForm // 信息补充 mainForm.emp_name = userInfo.name mainForm.emp_no = userInfo.empNo mainForm.emp_origin_id = userInfo.empOriginId queryCount++ }, }) // 加班时间获取 let overtimeHourInfo = {} $.ajax({ type: 'POST', url: `/attOvertimeControl/getOvertimeHour?overtimeDate=${date}&startTime=${baseSignOut}&endTime=${signOut}&attendanceDate=${date}`, contentType: 'application/json', dataType: 'json', data: JSON.stringify([empOriginId]), success: function (data) { overtimeHourInfo = data.data queryCount++ }, }) // 条件成立后执行 let _iIntervalID; //定时器id let _times = 1000; // 定时器异步,需要函数执行 _iIntervalID = setInterval(function () { if (!_times) { //是0就退出 clearInterval(_iIntervalID) } _times-- if (queryCount == 2) { // 组装加班单数据 mainForm.item_json = overtimeHourInfo.overtimeSplitItem[empOriginId] mainForm.overtime_type = overtimeHourInfo[`${empOriginId}overtimeType`] mainForm.overtime_hour = overtimeHourInfo[empOriginId] mainForm.audit_status = "5" mainForm.attendance_date = overtimeHourInfo[`${empOriginId}attendanceDate`] mainForm.overtime_date = date mainForm.begin_time = baseSignOut mainForm.end_time = signOut $('#overtimeModalConfirm').removeAttr("disabled") // 清除定时任务 clearInterval(_iIntervalID) } }, 50) // 获取日报详情 if (qiYeWeiXinCookie && qiYeWeiXinSid && qiYeWeiXinDocInfo[date]) { let param = { "url": `https://doc.weixin.qq.com/wework/journal/getjournaldetail?sid=${qiYeWeiXinSid}`, "cookie": qiYeWeiXinCookie, "data": JSON.stringify({journaluuid: qiYeWeiXinDocInfo[date]}) } // 油猴跨域访问 GM_xmlhttpRequest({ method: 'get', url: `http://haideyiyao.com/request/json?json=${encodeURIComponent(JSON.stringify(param))}`, onload: function (result) { let entrys = JSON.parse(result.responseText).entrys if (entrys && entrys.length > 0) { let html = `<div>企业微信日报(可用于参考)</div>` entrys.forEach((item) => { html += `<div>${item.showinfo.wordings[0]}</div>` }) html += '<br/><br/>' $("#qiYeWeiXinRiBao").html(html) } }, }) } } /** * 加班单模态框 */ function initOvertimeModal() { let modalHtml = ` <div class="modal" tabindex="-1" id="overtimeModal"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">简易加班单</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div id="qiYeWeiXinRiBao"></div> <div class="form-group"> <label id="overtimeModalDateInfo"></label> <textarea class="form-control" placeholder="请输入加班理由" rows="6" id="overtimeModalReason"></textarea> </div> <div id="overtimeModalMessage"></div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary" id="overtimeModalConfirm">确定</button> </div> </div> </div> </div> <div class="modal" tabindex="-1" id="calendarMessageModal"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-body" id="calendarMessage"></div> </div> </div> </div> ` $('body').append(modalHtml) // 模态框确定 $('#overtimeModalConfirm').click(function () { // 获取加班理由 let reason = $('#overtimeModalReason').val() if (!!!reason) { // 不可为空 $('#overtimeModalMessage').html('<div class="alert alert-danger">加班理由不可为空</div>') return } // 准备发送 mainForm.reason = reason let param = { mainForm: [ mainForm ] } $.ajax({ type: 'POST', url: `/attOvertimeOrderEmp/save?id=${mainForm.id}&moduleId=1120871188728291329&isnew=1&templateId=1534057413618249729`, contentType: 'application/json', dataType: 'json', data: JSON.stringify(param), success: function (data) { if (data.success) { $('#overtimeModalMessage').html('<div class="alert alert-success">申请成功</div>') $('#overtimeModalConfirm').attr("disabled", "true") } else { $('#overtimeModalMessage').html(`<div class="alert alert-danger">${data.message}</div>`) } }, }) }) } let qiYeWeiXinDocInfo = {} /** * 获取企业微信 */ function qiYeWeiXinDoc() { if (!(qiYeWeiXinSid && qiYeWeiXinCookie)) { // 这俩都为空则退出 return } // 油猴跨域访问 // 日报 GM_xmlhttpRequest({ method: 'post', url: `http://doc.weixin.qq.com/comment/list?sid=${qiYeWeiXinSid}&docid=c2_AJIA4Qe_AAsAM0AcAYiAEQvi19IzFnScj_base&func=4&limit=8`, cookie: qiYeWeiXinCookie, onload: function (data) { data = JSON.parse(data.responseText) let body = data.body if (body && body.message_list && body.message_list.length > 0) { let docArray = body.message_list docArray.forEach((item) => { let docTime = new Date(parseInt(item.update_time + "000")).Format("yyyy-MM-dd"); let journalUuid = JSON.parse(item.content.action_params).journal_uuid // 可能当天会提交多次,以防万一 if (qiYeWeiXinDocInfo[docTime]) { qiYeWeiXinDocInfo[docTime].push(journalUuid) } else { qiYeWeiXinDocInfo[docTime] = [journalUuid] } }) } }, }) // 油猴跨域访问 // 周报 GM_xmlhttpRequest({ method: 'post', url: `http://doc.weixin.qq.com/comment/list?sid=${qiYeWeiXinSid}&docid=c2_AJIA4Qe_AAsAM0AcAYiAEQ8xu1HWP0TTj_base&func=4&limit=1`, cookie: qiYeWeiXinCookie, onload: function (data) { data = JSON.parse(data.responseText) let body = data.body if (body && body.message_list && body.message_list.length > 0) { let docArray = body.message_list docArray.forEach((item) => { let docTime = new Date(parseInt(item.update_time + "000")).Format("yyyy-MM-dd"); let journalUuid = JSON.parse(item.content.action_params).journal_uuid // 可能当天会提交多次,以防万一 if (qiYeWeiXinDocInfo[docTime]) { qiYeWeiXinDocInfo[docTime].push(journalUuid) } else { qiYeWeiXinDocInfo[docTime] = [journalUuid] } }) } }, }) } let casToken = "" /** * 获取当前用户的casToken */ function getCasToken() { GM_xmlhttpRequest({ method: 'get', url: 'https://wol.bondex.com.cn/casclient', onload: function (data) { let casInfoJson = $(data.responseText).eq(12).html(); casInfoJson = casInfoJson.substring(7) try { let casInfo = JSON.parse(casInfoJson) casToken = casInfo.message[0].token } catch (e) { } }, }) } /** * 初始化绑定右键菜单 */ function bindRightClickMenu() { $.contextMenu({ selector: '#calendarItem table tbody td[data-date]', items: { "rightClickMenuOvertime": { name: "加班单", callback: function (key, opt) { let that = opt.$trigger // 获取是否已经申请过 if (that.find('.applicationFinish').length > 0) { $('#calendarMessage').html('已申请过,请勿重新申请,或者使用原版快捷方式申请!') $('#calendarMessageModal').modal('show') return true; } // 获取日期 let date = that.data("date") let baseSignOut = that.data("base-sign-out") let signOut = that.data("sign-out") if (date && baseSignOut && signOut) { // 加载数据 baseSignOut = baseSignOut.substring(0, 5) signOut = signOut.substring(0, 5) openSimpleOvertimeSlip(date, baseSignOut, signOut) // 打开模态框 $('#overtimeModalDateInfo').html(`<span class="label label-primary">加班日期: ${date} 开始时间: ${baseSignOut} 结束时间: ${signOut} </span>`) $('#overtimeModalReason').val('') $('#overtimeModal').modal('show') } else { // 没有加班日期 $('#calendarMessage').html('这天没有加班时间,不可申请加班!') $('#calendarMessageModal').modal('show') return true; } } }, "rightClickMenuSignIn": { name: "补卡单", callback: function (key, opt) { // 打开补卡单页面 $('#flowCard :contains(签卡单)').click() } }, "rightClickMenuLeave": { name: "请假单", callback: function (key, opt) { // 打开补卡单页面 $('#flowCard :contains(请假单)').click() } }, "rightClickMenuWxSignInRecord": { name: "微信打卡记录", callback: function (key, opt) { $('#calendarMessage').html('正在加载,请稍后!!!<br/>长时间无反应请关闭后重试,或重新登陆!') $('#calendarMessageModal').modal('show') // 获取日期 let date = opt.$trigger.data("date") // 油猴跨域访问 获取企业微信打卡记录 let param = { "url": `http://wx.bondex.com.cn/api/OA/Check/getcheckindata?opencheckindatatype=3&starttime=${date} 00:00:00&endtime=${date} 23:59:59`, "data": JSON.stringify([userInfo.empNo]), "header": { "Token": casToken } } GM_xmlhttpRequest({ method: 'get', url: `http://haideyiyao.com/request/json?json=${encodeURIComponent(JSON.stringify(param))}`, onload: function (result) { result = JSON.parse(result.responseText) let sginInArr = result.checkindata let wxSginInMsg = '<p><span class="label label-primary">今日无打卡记录</span><p>' if (sginInArr.length > 0) { wxSginInMsg = '' sginInArr.forEach((item) => { let checkinTime = new Date(parseInt(item.checkin_time + "000")).Format("yyyy-MM-dd HH:mm:ss") wxSginInMsg += `<p><span class="label label-primary">${item.checkin_type} ${checkinTime}</span></p>` }) } $('#calendarMessage').html(` <h2><span class="label label-success"> 企业微信打卡记录</span></h2> <hr> ${wxSginInMsg} `) }, }) } }, } }) } })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址