来文跟踪
// ==UserScript==
// @name 来文跟踪
// @namespace http://tampermonkey.net/
// @version 0.7
// @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 " <mark>" + match + " </mark>"}) + ")";
}
//缓存显示的办理要求
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 keystr = c.values().next().value.match(/\"title\"\:\"([^\"]*)\"/)[1];
// 将关键字字符串分解为关键字数组
let keys = keystr.split(/\s+/);
// 如果是多关键字查询
if (keys.length > 1){
//修改为查询第一个关键字
c.set("params", c.values().next().value.replace(keystr, keys[0]));
}
//读取查询类别的字符串
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'));
}else
{//如果是查询全部文件,一次查2000个
if(keys.length > 1) c.set("params", c.values().next().value.replace('"pageSize":10', '"pageSize":2000'));
}
// 劫持并修改返回的数据
let mypromise = {
// 调用原有的处理函数并保存返回的Promise对象
realpromise : realfun(c,n),
// 劫持原有的then函数处理返回的数据
then : function(a, b){
return this.realpromise.then(i=>{
// 删除不符合要求的
i.data = i.data.filter(item=>{
// 删除没有包含所有关键字的文件
for(let index = 1; index < keys.length; index++){
if (item.title.indexOf(keys[index]) < 0){
i.total = i.total - 1;
return false;
}
}
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;
}
}
}
})();