Greasy Fork

WTRS工数自动填写

A script help you input work time automatically, enjoy!

目前为 2018-03-24 提交的版本。查看 最新版本

// ==UserScript==
// @name         WTRS工数自动填写
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  A script help you input work time automatically, enjoy!
// @author       贝克街的流浪猫
// @match        *://*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// ==/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."画面初期表示項目設定"需要设定为"お気に入り項目"(在页面左上角的"环境设置"中进行设定)\n';
    const QA_MODE_TIPS = 'QA模式注意事项:\n1."気に入り項目"至少设定2个,并且最后一个必须为加班时使用的项目(展开工数纪录中的任意一行,点击"気に入り項目編集"进行设定)\n2."画面初期表示項目設定"需要设定为"お気に入り項目"(在页面左上角的"环境设置"中进行设定)\n3.在您设定完WTRS系统的"お気に入り項目"之后,需要正确设置插件的"お気に入り項目数量"\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 = () => {
        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) {
                    j += favoriteProjectsSize;
                    rows[j].children[6].click();
                    getInputElement(favoriteProjectsSize).val(value).trigger('change');
                    rows[j].children[5].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 > 0) {
                        rows[j].children[6].click();
                        getInputElement(favoriteProjectsSize).val(overTime).trigger('change');
                        rows[j].children[5].click();
                    }
                }
            }
        }
    };

    //Main
    if (!isWTRSSystem()) {
        return;
    }
    console.log('当前插件工作模式为' + (workMode === DEVELOPER_WORK_MODE ? '开发模式' : 'QA模式'));
    console.log('喜欢的项目数量应为' + favoriteProjectsSize);
    registerAllMenu();
    addWorkButton();
})();