// ==UserScript== // @name WTRS工数自动填写 // @namespace http://tampermonkey.net/ // @version 1.0.2 // @description A script help you input work time automatically, enjoy! // @author 贝克街的流浪猫 // @match *://* // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @downloadURL none // ==/UserScript== (function() { //Constant const SYSTEM_MATCH_PREFIX = 'wtrs-cn'; const WORK_MODE_VALUE_KEY = 'WORK_MODE'; const FAVORITE_PROJECTS_SIZE_VALUE_KEY = 'FAVORITE_PROJECT_SIZE'; const DEVELOPER_WORK_MODE = 0; const QA_WORK_MODE = 1; const DEVELOP_SWITCH_MENU_TITLE = 'WTRS工数填写插件->切换到开发模式'; const QA_SWITCH_MENU_TITLE = 'WTRS工数填写插件->切换到QA模式'; const TIPS_MENU_TITLE = 'WTRS工数填写插件->查看注意事项'; const FAVORITE_PROJECT_SIZE_MENU_TITLE = 'WTRS工数填写插件->设置"気に入り項目"数量'; const DEVELOP_MODE_TIPS = '开发模式注意事项:\n1."気に入り項目"必须有且只有一个(展开工数纪录中的任意一行,点击"気に入り項目編集"进行设定)\n2."画面初期表示項目設定"需要设定为"お気に入り項目"(在页面左上角的"环境设置"中进行设定)\n3.设定完成后刷新页面,然后再点击页面左上角的"自动填写工数"按钮\n'; const QA_MODE_TIPS = 'QA模式注意事项:\n1."気に入り項目"至少设定2个,并且最后一个必须为加班时使用的项目(展开工数纪录中的任意一行,点击"気に入り項目編集"进行设定)\n2."画面初期表示項目設定"需要设定为"お気に入り項目"(在页面左上角的"环境设置"中进行设定)\n3.在您设定完WTRS系统的"お気に入り項目"之后,需要正确设置插件的"お気に入り項目数量"(点击浏览器地址栏右侧的Tampermonkey图标,再点击WTRS工数填写插件->设置"気に入り項目"数量)\n4.设定完成后刷新页面,然后再点击页面左上角的"自动填写工数"按钮\n'; const WORKING_DAY_FLAG = '出勤'; //Variable workMode = GM_getValue(WORK_MODE_VALUE_KEY) || DEVELOPER_WORK_MODE; favoriteProjectsSize = GM_getValue(FAVORITE_PROJECTS_SIZE_VALUE_KEY) || 1; workModeSwitchMenuId = undefined; favoriteProjectSizeMenuId = undefined; //Methods isWTRSSystem = () => { return window.location.host.startsWith(SYSTEM_MATCH_PREFIX); }; registerAllMenu = () => { registerTipsMenu(); registerModeSwitchMenuByCurrentWrokMode(); }; registerModeSwitchMenuByCurrentWrokMode = () => { if (workMode === QA_WORK_MODE) { registerModeSwitchMenu(DEVELOPER_WORK_MODE, DEVELOP_SWITCH_MENU_TITLE, DEVELOP_MODE_TIPS); registerFavoriteProjectSizeMenu(); } else { registerModeSwitchMenu(QA_WORK_MODE, QA_SWITCH_MENU_TITLE, QA_MODE_TIPS); } }; registerModeSwitchMenu = (modeType, menuTitle, modeTips) => { workModeSwitchMenuId = GM_registerMenuCommand(menuTitle, () => { alert(modeTips); if (workModeSwitchMenuId) { GM_unregisterMenuCommand(workModeSwitchMenuId); } if (favoriteProjectSizeMenuId) { GM_unregisterMenuCommand(favoriteProjectSizeMenuId); favoriteProjectSizeMenuId = undefined; } GM_setValue(WORK_MODE_VALUE_KEY, modeType); workMode = modeType; if (modeType === DEVELOPER_WORK_MODE) { favoriteProjectsSize = 1; GM_setValue(FAVORITE_PROJECTS_SIZE_VALUE_KEY, 1); } registerModeSwitchMenuByCurrentWrokMode(); alert('已切换到' + (workMode === DEVELOPER_WORK_MODE ? '开发':'QA') + '模式'); } ); }; registerTipsMenu = () => { GM_registerMenuCommand(TIPS_MENU_TITLE, () => {alert(DEVELOP_MODE_TIPS + QA_MODE_TIPS);}); }; registerFavoriteProjectSizeMenu = () => { favoriteProjectSizeMenuId = GM_registerMenuCommand(FAVORITE_PROJECT_SIZE_MENU_TITLE, () => { let size = prompt('请输入您设置的"気に入り項目"数量'); try { if (size == '') { throw 'not a number'; } size = parseInt(Number(size)); if (Number.isInteger(size)) { if (size < 2) { alert('"気に入り項目"数量应该至少为2个,第一个是业务项目,第二个为加班项目!'); return; } favoriteProjectsSize = size; GM_setValue(FAVORITE_PROJECTS_SIZE_VALUE_KEY, size); alert('"気に入り項目"数量已设置为' + size + '个'); } else { throw 'not a number'; } } catch (e) { alert('输入数据无效,操作取消!'); return; } } ); }; addWorkButton = () => { let runButton = document.createElement("BUTTON"); let runButtonSpan = document.createElement("SPAN"); runButtonSpan.appendChild(document.createTextNode("自动填写工数")); runButton.appendChild(runButtonSpan); runButtonSpan.className = "ui-button-text"; runButton.className = "ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"; runButton.onclick = doWork; $('#logoutBtn')[0].parentElement.appendChild(runButton); }; doWork = () => { alert(workMode === DEVELOPER_WORK_MODE ? DEVELOP_MODE_TIPS : QA_MODE_TIPS); if (!isAllInputRowLoaded()) { rowsDisplayToggle(); setInterval(loopWaitInputRowLoadedAndInputWorkTime, 100); } else { loopWaitInputRowLoadedAndInputWorkTime(); } }; loopWaitInputRowLoadedAndInputWorkTime = () => { if (isAllInputRowLoaded()) { inputWorkTime(); rowsDisplayToggle(); clearInterval(); } }; getAllRows = () => { with (document.getElementById('mainWin').contentWindow) { return $('.ui-widget-content.jqgrow.ui-row-ltr:not(.ui-state-disabled,.selected-row)'); } }; getInputElement = (index) => { with (document.getElementById('mainWin').contentWindow) { return $('#' + (index) + '_times'); } }; getDataRows = () => { var result = []; var searchResult = getAllRows(); for(var i = 0; i < searchResult.length; i++){ if (searchResult[i].id.indexOf('LINE') == -1) { result.push(searchResult[i]); } } return result; }; getInputRows = () => { var result = []; var searchResult = getAllRows(); for(var i = 0; i < searchResult.length; i++){ if (searchResult[i].id.indexOf('LINE') != -1) { result.push(searchResult[i]); } } return result; }; rowsDisplayToggle = () => { var rows = getAllRows(); for(var i = 0; i < rows.length; i++){ rows[i].children[1].click(); } }; isAllInputRowLoaded = () => { return getDataRows().length * favoriteProjectsSize == getInputRows().length; }; inputWorkTime = () => { var rows = getAllRows(); for(var j = 0; j < rows.length; j++){ let value =parseFloat(rows[j].children[8].innerText); if (workMode === DEVELOPER_WORK_MODE) { j += favoriteProjectsSize; rows[j].children[6].click(); getInputElement(favoriteProjectsSize).val(value).trigger('change'); rows[j].children[5].click(); } else { let isWorkInHoliday = rows[j].children[5].innerText != WORKING_DAY_FLAG; if (isWorkInHoliday) { for (let k = 0; k < favoriteProjectsSize - 1; k++) { j++; rows[j].children[1].children[0].click(); } j++; if (value >= 3) { rows[j].children[6].click(); getInputElement(favoriteProjectsSize).val(value >= 7 ? 8 : 4).trigger('change'); rows[j].children[5].click(); } else { rows[j].children[1].children[0].click(); } } else { let isWorkThan8Hours = value > 8; let normalWorkTime; let overTime; if (isWorkThan8Hours) { normalWorkTime = 8; overTime = (value - 8).toFixed(2); } else { normalWorkTime = value; overTime = 0; } let usedTime = 0; for (let k = 0; k < favoriteProjectsSize - 1; k++) { let itemTime; if (k != favoriteProjectsSize - 1) { itemTime = (normalWorkTime / (favoriteProjectsSize - 1)).toFixed(2); usedTime += itemTime; } else { itemTime = (normalWorkTime - usedTime); } j++; rows[j].children[6].click(); getInputElement(k+1).val(itemTime).trigger('change'); rows[j].children[5].click(); } j++; if (overTime > 1) { rows[j].children[6].click(); getInputElement(favoriteProjectsSize).val(overTime.toFixed(0)).trigger('change'); rows[j].children[5].click(); } else { rows[j].children[1].children[0].click(); } } } } }; //Main if (!isWTRSSystem()) { return; } console.log('当前插件工作模式为' + (workMode === DEVELOPER_WORK_MODE ? '开发模式' : 'QA模式')); console.log('喜欢的项目数量应为' + favoriteProjectsSize); registerAllMenu(); addWorkButton(); })();