FIX: HDU教务系统培养计划

在HDU教务系统培养计划中对“通过情况”进行补全,方便查看

目前为 2021-03-29 提交的版本,查看 最新版本

// ==UserScript==
// @name        FIX: HDU教务系统培养计划
// @namespace   Violentmonkey Scripts
// @match       http://jxgl.hdu.edu.cn/*
// @grant       none
// @version     1.11
// @author      Rainbow Yang
// @description 在HDU教务系统培养计划中对“通过情况”进行补全,方便查看
// ==/UserScript==

const scores = {
  set: (code, score) => sessionStorage.setItem("scores-" + code, score),
  get: (code) => sessionStorage.getItem("scores-" + code),
}
const replacement = {
  set: (code, replacementCode) => sessionStorage.setItem("replace-" + code, replacementCode),
  get: (code) => sessionStorage.getItem("replace-" + code),
}

const getScoreURL = () => window.location.href.replace("pyjh.aspx", "xscjcx_dq.aspx").replace("N121607", "N121605")
const getReplacementURL = () => window.location.href.replace("pyjh.aspx", "xs_kctdcx.aspx").replace("N121607", "N121622")

const readScore = () => {
  const scoreWindow = window.open(getScoreURL())

  scoreWindow.onload = () => {
    scoreWindow.document.querySelector("#ddlxq").selectedIndex = 0
    scoreWindow.document.querySelector("#ddlxn").selectedIndex = 0
    scoreWindow.document.querySelector("#btnCx").click()

    setTimeout(() => {
      const scoreTable = scoreWindow.document.querySelector("#DataGrid1 > tbody");
      [...scoreTable.rows].slice(1).forEach((row) => {
        const code = row.cells[2].innerHTML
        const score = row.cells[11].innerHTML
        scores.set(code, score)
      })
      sessionStorage.setItem('hasRead', true)
      scoreWindow.close()
    }, 1000)
  }
}

const readReplacement = () => {
  const replacementWindow = window.open(getReplacementURL())

  replacementWindow.onload = () => {
    const singleTable = replacementWindow.document.querySelector("#dbgrid");
    const composeTable = replacementWindow.document.querySelector("#Datagrid1");

    [
      ...[...singleTable.rows].slice(1),
      ...[...composeTable.rows].slice(1)
    ].forEach((row) => {
      const code = row.cells[1].innerHTML
      const replacementCode = row.cells[3].innerHTML
      replacement.set(code, replacementCode)
    })
    replacementWindow.close()
  }
}

const addReadButton = () => {
  const readScoreButton = document.createElement("input")
  readScoreButton.id = "ReadButton"
  readScoreButton.type = "button"
  readScoreButton.className = "button"
  readScoreButton.value = "读取成绩"
  readScoreButton.onclick = () => {
    if (confirm("点击按钮之后\n将会自动弹出两个页面\n用于读取成绩和课程替代情况\n并会自动关闭")) {
      readReplacement()
      readScore()
    }
  }

  document.querySelector("#Button1").parentNode.appendChild(readScoreButton)
}

const writeScores = () => {
  let hasRead = sessionStorage.getItem('hasRead')
  const planTable = document.querySelector('#DBGrid');
  [...planTable.rows].slice(1, -1).forEach(row => {
    let code = row.cells[0].innerHTML
    row.cells[16].innerHTML =
      scores.get(code) ||
      (replacement.get(code) && replacement.get(code).split(',').map(code => scores.get(code) + `(${code})`)) ||
      (hasRead ? "未读取到成绩" : "请点击 读取成绩")
  })
}

function main() {
  if (
    document.getElementById("HyperLink1") &&
    document.getElementById("HyperLink1").innerText == "查看培养计划说明"
  ) {
    if (!document.getElementById("ReadButton")) {
      addReadButton()
    } else {
      writeScores()
    }
  }
}
main()
setInterval(main, 1000)