RefreshFinRequest

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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);