RefreshFinRequest

定时刷新待打款订单请求, 并生成alert窗口

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        RefreshFinRequest
// @namespace   refreshyckfin
// @version      1.0.4
// @description  定时刷新待打款订单请求, 并生成alert窗口
// @author       Jack Li
// @include       http://finance.yinchengku.com/*
// @include       http://finance01.tst.yinchengku.com/*
// @include       http://finance01.uat.yinchengku.com/*
// @exclude       http://*/admin
// @exclude       http://*/admin/logout
// @grant        none
// ==/UserScript==

Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j--, 1);
        }
    }

    return a;
};


var NotifyWindow = {
  domElement: undefined,
  title: "Notify Window",
  content: "",
    isRunWithIFrame: function() {
        return window.frameElement && window.frameElement.nodeName == "IFRAME";
    },
create: function(title, content) {
    if (this.isRunWithIFrame()) {
        return;
    }
    this.title = title;
    this.content = content;
  var notifyEle = document.createElement("div");
  notifyEle.id = "notification";
  notifyEle.style = "display: none;cursor: pointer;position: fixed;right: .5em;bottom: .5em;overflow: hidden;width: 260px;color: #ddd;border-radius: 5px;background: rgba(35, 40, 45, 0.9);box-shadow: 0 3px 12px rgba(0, 0, 0, 0.6);animation: bottom50 300ms;";
    notifyEle.setAttribute("onclick", "window.location.href=\'" + OCRDynData.url + "\'");

  var titleEle = document.createElement("div");
  titleEle.style = "   text-align: center;padding: 3px 10px;font-weight: 600;border-bottom: 1px solid #898C7B;";
  titleEle.innerHTML = "<span class=\"icon\"></span>" + this.title;
  notifyEle.appendChild(titleEle);

  var bodyEle = document.createElement("div");
  bodyEle.style = " font-size: 13px;padding: 8px 12px;word-break: break-all;transition: all .3s ease-in-out";
  var msgEle = document.createElement("span");
  msgEle.style = "animation: bottom20 500ms;";
  msgEle.textContent = this.content;
  bodyEle.appendChild(msgEle);

  notifyEle.appendChild(bodyEle);

  var body = document.getElementsByTagName("body")[0];
  body.appendChild(notifyEle);
  this.domElement = notifyEle;

  return this;
},
    update: function(title, content) {
        var parser = new DOMParser();
        var titleIter = document.evaluate( '//*[@id="notification"]/div[1]', this.domElement, null, XPathResult.ANY_TYPE, null );
        var titleNode = titleIter.iterateNext();
        if (titleNode) {
            titleNode.textContent = title || this.title;
        }

        var contentIter = document.evaluate( '//*[@id="notification"]/div[2]/span', this.domElement, null, XPathResult.ANY_TYPE, null );
        var contentNode = contentIter.iterateNext();
        if (contentNode) {
            contentNode.textContent = content || this.content;
        }
    },
    isVisible: function() {
        if (!this.domElement) {
            return false;
        }
        if (this.domElement.style && this.domElement.style.display === "none") {
            return false;
        }
        return true;
    },
remove: function() {
    if (!!this.domElement) {
      this.domElement.parentNode.removeChild(this.domElement);
    }
},
show: function(title, content) {
    if (this.isVisible()) {
        console.debug("Update Notification wth title: " + title + ", content: " + content);
        this.update(title, content);
    } else {
        console.debug("Create Notification wth title: " + title + ", content: " + content);
        this.create(title, content);
    }
    if (!this.domElement) {
        console.warn("Cannot display notification due to no node");
        console.debug(this.domElement);
        return;
    }
    this.domElement.style.display = "block";
},
hide: function() {
    this.domElement.style.display = "none";
}
};

var OCRDynData = {
  url: "/outamountCon/payIndex",
  respContent: undefined,
  totalNoReplyJsonData: [],
  version: 0,
  fetchResponse: function(url, cb) {
      $.get(url, function(data){
          this.data = data;
          cb(this.data);
      });
  },
  notExist: function(key) {
        var exist = false;
        for (var i = 0; i < this.origJsonData.length; i++) {
            var item = this.origJsonData[i];
            if (item === key) {
                return false;
            }
        }
        return true;
  },
    hasNoReply: function(status) {
        return !status;
    },
    getQuoteStatus(domEle) {
        var statusStr = domEle.getElementsByTagName("th")[10].textContent.trim();
        if (statusStr === "打款成功") {
            return true;
        }
        return false;
    },
  json: function(url, cb) {
      var that = this;
        this.fetchResponse(url, function(content) {
            var diffNoReplyJsonData = [];
            var parser = new DOMParser();
            var doc = parser.parseFromString(content, "text/html");
            var iter = document.evaluate( "//th/a", doc, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null );
            var item = iter.iterateNext();
            while (item) {
                var id = item.getAttribute('id') ;
                if (!!id && that.hasNoReply(that.getQuoteStatus(item.parentNode.parentNode))) {
                    diffNoReplyJsonData.push(id);
                }
                item = iter.iterateNext();
            }
            if (diffNoReplyJsonData.length > 0) {
                this.totalNoReplyJsonData = that.totalNoReplyJsonData.concat(diffNoReplyJsonData).unique();
            }
            cb(diffNoReplyJsonData);
        });
  },
    fetch5PagesJson(cb) {
        var page = 5;
        var curPage = 1;
        var totalNoReplyJsonData = [];
        var count = 1;
        function successfulCallback(data) {
            if (count < page) {
                count++;
                return;
            }
            var newNoReplyJsonData = data.filter(key => !OCRDynData.totalNoReplyJsonData.includes(key));
            OCRDynData.totalNoReplyJsonData = data;
            cb(data, newNoReplyJsonData);
        }
        for (; curPage <= page; curPage++) {
            var url = this.url;
            if (curPage > 1) {
                url = this.url + "?page=" + curPage;
            }
            this.json(url, function(noReplyJsonDataByPage) {
                totalNoReplyJsonData = totalNoReplyJsonData.concat(noReplyJsonDataByPage).unique();
                successfulCallback(totalNoReplyJsonData);
            });
        }
    }
};

var Sound = {
    srcUrl: "http://img.yinchengku.com/vsftp/audio/microwave_oven.mp3",
    audioElement: undefined,
    finish: false,
    init: function() {
        this.finish=false;
        audioElement=document.createElement("audio");
        audioElement.id = "notify-sound";

        srcElement = document.createElement("source");
        srcElement.setAttribute("src", this.srcUrl);
        srcElement.setAttribute("type", "audio/mp3");

        audioElement.appendChild(srcElement);
        document.body.appendChild(audioElement);

        this.audioElement = audioElement;
    },
    start: function() {
        this.audioElement.play();
    },
    play: function() {
        if(!this.audioElement) {
            this.init();
        }
        this.start();
    },
    remove: function() {
        document.body.removeChild(this.audioElement);
        return this;
    }
};

var Storage = {
    storeTimeWindow: function(timestamep) {
        if(window.localStorage){
            window.localStorage.setItem('RequestOCRRequest.lastTimestamp', timestamep);
        }
    },
    getCachedTimeWindow: function() {
        if(window.localStorage){
            var timestamp = window.localStorage.getItem('RequestOCRRequest.lastTimestamp');
            if (!timestamp) {
                return undefined;
            }
            return window.localStorage.getItem('RequestOCRRequest.lastTimestamp');
        } else {
            return undefined;
        }
    }
};

(function(doc) {
  'use strict';
    doc.config = {
        fetchTimeWindow: 15000,
        checkTimeWindow: 1000
    };
    console.log("银承库 提现");
	console.debug("Start to fetch OCR No-Reply Data of 5 page");
    doc.cache = {
        lastFetch: undefined
    };
    function withInSpecifyTimewindow() {
        var lastTimestamp = Storage.getCachedTimeWindow();
        if (!lastTimestamp) {
            return false;
        }

        var curDate = new Date();
        if (curDate.getTime() - lastTimestamp < doc.config.fetchTimeWindow) {
            return true;
        }
        return false;
    }
    function newRoundNotify(cb) {
        if (doc.st) {
            clearTimeout(doc.st);
        }
        doc.st = setTimeout(cb, doc.config.checkTimeWindow);
    }
    function notifyWithNewOCRData() {
        if (withInSpecifyTimewindow() ) {
            return newRoundNotify(notifyWithNewOCRData);
        }
        console.debug("Start to fetch OCR No-Reply Data of 5 page");
        OCRDynData.fetch5PagesJson(function(totalNoReplyList, newNoReplyList) {
            Storage.storeTimeWindow(new Date().getTime());

            if (!totalNoReplyList || totalNoReplyList.length === 0) {
                console.debug("No Data Found");
            } else {
                console.debug(">>>>> Total No Reply List <<<<<<");
                console.debug(totalNoReplyList);
                NotifyWindow.show("[新] 待打款", "您有(" + totalNoReplyList.length + ")条未打款(" + (newNoReplyList.length || 0) + "条新增), 点击查看");
                Sound.play();
            }
            newRoundNotify(notifyWithNewOCRData);
        });
    }
    notifyWithNewOCRData();
})(document);