// ==UserScript== // @name 来文跟踪 // @namespace http://tampermonkey.net/ // @version 0.6 // @description 在部门文件查询窗口显示文件办理要求! // @author You // @match http://*.zhbg.kjt.gx.gov/* // @grant none // ==/UserScript== (function() { // 获取app对象 let app = document.getElementById("app"); //newData保存从服务器获得的需要更新的文件列表,保存时已经删除不需要跟踪的文件 let newData = null; // 延迟1秒设置数据劫持函数 setTimeout(setProxy, 1000); // 数据劫持函数 function setProxy(){ // 每秒设置一次数据劫持函数 setTimeout(setProxy, 1000); //劫持获取文件列表的函数 myhook("archivelistaction_getDataGridData");//劫持部门公文 //如果文件列表更新了,更新页面上的显示 if(newData){ //清除待更新数据 let myData = newData; newData = null; //更新界面显示 for(let index = 0; index < myData.length; index++){ //如果是外部来文就显示办理要求 if (myData[index].inboxguid != "")handleData(myData[index]); } } function handleData(data){ //根据inboxguid查找对应的行元素 let state = document.getElementById(data.inboxguid); //在文件名后增加分办意见显示元素,用红字显示 let myMark = state.querySelector("add"); if (!myMark){ myMark = document.createElement('add'); myMark.style.color = "red"; state.appendChild(myMark); } //在行首增加复选框用于办结(不再追踪) let myCheck = state.querySelector("input"); if (!myCheck){ myCheck = document.createElement('input'); myCheck.type = "checkbox"; myCheck.addEventListener("click", function(){ if(myCheck.checked){ //选中就标记为办结,不再追踪 localStorage.setItem(data.inboxguid, "(已办结)"); } else{ //没有选中就清除办结标记 localStorage.removeItem(data.inboxguid); } }); //插到行首序号前面 state.parentNode.parentNode.parentNode.firstChild.firstChild.insertBefore(myCheck, state.parentNode.parentNode.parentNode.firstChild.firstChild.firstChild); } //读取本地缓存的分办意见 let fenbantips4All = localStorage.getItem(data.inboxguid); if (!fenbantips4All){//如果没有缓存分办意见,从服务器读取办理要求 let httpRequest = new XMLHttpRequest(); httpRequest.open('POST', 'http://dzgw.zhbg.kjt.gx.gov/bgtoa/rest/handleframeaction/getDataBean?isCommondto=true&action2rest=true', true); //第二步:打开连接 httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");//设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头) let params = {guid:data.rowguid, handleguid:data.handleguid}; httpRequest.send("params=" + JSON.stringify(params)); httpRequest.onreadystatechange = function () { if (httpRequest.readyState == 4 && httpRequest.status == 200) { let dataBean = JSON.parse(httpRequest.responseText); if (dataBean.custom.fenbantips4All == ""){ myMark.innerHTML = ""; }else{ myMark.innerHTML = "(" + dataBean.custom.fenbantips4All.replace(/\d+月\d+日/, function(match){return " " + match + " "}) + ")"; } //缓存显示的办理要求 localStorage.setItem(data.inboxguid, myMark.innerHTML); } } }else{//如果有缓存,更新显示 myMark.innerHTML = fenbantips4All; } } function myhook(f){ // 检查是否已经劫持 if ((f + "_hook") in app.__vue__.$parent.$children[0].$children[0].$children[0].$children[1].$Api){ // 如果已劫持就直接返回 return; } // 设置已劫持标志 app.__vue__.$parent.$children[0].$children[0].$children[0].$children[1].$Api[f + "_hook"] = true; // 保存原有的数据处理函数 let realfun = app.__vue__.$parent.$children[0].$children[0].$children[0].$children[1].$Api[f]; // 劫持数据处理函数 app.__vue__.$parent.$children[0].$children[0].$children[0].$children[1].$Api[f] = myfun; function myfun(c,n){//c中保存了查询参数 //读取查询类别的字符串 let gwType = c.values().next().value.match(/\"gwtype\"\:\".\"/)[0]; if(gwType == '"gwtype":"2"') {//如果是查询部门文件,一次查500个 c.set("params", c.values().next().value.replace('"pageSize":10', '"pageSize":500')); } // 劫持并修改返回的数据 let mypromise = { // 调用原有的处理函数并保存返回的Promise对象 realpromise : realfun(c,n), // 劫持原有的then函数处理返回的数据 then : function(a, b){ return this.realpromise.then(i=>{ // 删除不符合要求的 i.total = 500; i.data = i.data.filter(item=>{ if(gwType == '"gwtype":"2"') {//如果是查询部门文件,删除各处室来的文件,因为可以在会签窗口查看 if ((function(item){ if(item.filetypestr == "会签意见笺") return true; if(item.inboxguid == "")return true; // if(item.blzt == "已办结"){ // localStorage.setItem(item.inboxguid, "(已办结)");//删除已经办结的文件 // } let fenbantips4All = localStorage.getItem(item.inboxguid); if (fenbantips4All == "(已办结)") return true; return false; })(item)) { i.total = i.total - 1; return false; } } return true; }); //如果是部门文件查询,保存需要更新的文件列表 if(gwType == '"gwtype":"2"'){ newData = i.data; } // 调用系统数据处理函数处理已修改过的数据 a(i); },b); } }; // 返回劫持的Promise对象 return mypromise; } } } })();