ERP321Delivery

自动发货脚本

// ==UserScript==
// @name         ERP321Delivery
// @namespace    https://www.erp321.com/
// @version      1.0
// @description  自动发货脚本
// @author       [email protected]
// @match        *://www.erp321.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @grant        none
// ==/UserScript==

(function () {
    'use strict'
    var CONFIG = {
        // 合法href 打单界面路由链接
        HREF: '/app/wms/express/expresssetter.aspx',
        // 定时执行周期 单位ms
        IntervalTimeOut: 1000 * 60 * 10,
        // 每天结束执行截止小时
        DeadlineHour: 17,
        // 默认是否开启自动发货
        IsOn: true,
    }

    typeof (OpenTab) === 'function' && OpenTab('打单拣货', 'app/wms/express/expresssetter.aspx', null, 'm_153')
    var delivery_company = ''
    var interval = null;//计时器
    var i = 0;

    /**
     * 获取Dom  table行元素
     * @param isChecked false 获取是否选中的行元素
     * @returns {*}
     */
    function getRowDom(isChecked = false) {
        var tableDom = $('#_jt_body_list');
        if (!tableDom) {
            console.log('tableDom 不存在')
            return []
        }
        // console.log($('#_jt_body_list').html())
        return tableDom.children(isChecked ? '._jt_row_checked' : '._jt_row');
    }

    /**
     * 获取每行中某单元格元素
     * @param domRow
     * @returns {{dom_way_no: jQuery, dom_delivery_company: jQuery, dom_check_box: jQuery}}
     */
    function getCellDom(domRow) {
        /**
         * 索引从 0 开始
         * 1:复选框;8:快递单号
         */
        var dom_delivery_company = $(domRow).children().eq(7);
        var dom_way_no = $(domRow).children().eq(8);
        var dom_check_box = $(domRow).children().eq(1);
        return {
            dom_delivery_company,
            dom_way_no,
            dom_check_box
        }
    }


    /**
     * 获取快递单号
     */
    function getDeliveryNo() {
        var children = getRowDom();
        //console.warn('children', children)
        //----------------------获取快递单号 start--------------------------
        for (var i = 0; i < children.length; i++) {
            var item = children[i];
            var {dom_way_no, dom_check_box, dom_delivery_company} = getCellDom(item)
            var way_no = dom_way_no.text();
            var class_row = $(item).attr('class');
            var is_row_checked = class_row.indexOf('_jt_row_checked') !== -1 // true选中 false非选中
            //console.warn('way_no', way_no)
            //console.warn('delivery_company', delivery_company)
            if (!way_no) {
                // 没有快递单号的行数据被触发选中
                if (!delivery_company) {
                    delivery_company = $(dom_delivery_company).text()
                }
                if ($(dom_delivery_company).text() === delivery_company) {
                    // 触发选中
                    $(dom_check_box).trigger('click')
                }
            } else {
                if (is_row_checked) {
                    // 有快递单号且被选中的元素  被反选
                    $(dom_check_box).trigger('click')
                }
            }
        }
        if (getRowDom(true).length) {
            // 触发【获取电子面单号】方法
            typeof (GetAndSetElids) === 'function' && GetAndSetElids()
        }
        delivery_company = ''
        //----------------------获取快递单号 end--------------------------
    }

    /**
     * 直接发货
     * 1. 触发选中行(条件:a.没有快递单号&&是选中状态;b.异常的快递单号&&选中状态;c.正常的快递单号&&非选中状态;)
     * 2. 调用发货方法(条件:选中行数大于0)
     */
    function toDeliverGoods() {
        //----------------------直接发货 start--------------------------
        var children = getRowDom();
        for (var i = 0; i < children.length; i++) {
            var item = children[i];
            var dom_way_no_delivery = getCellDom(item).dom_way_no
            var dom_check_box_delivery = getCellDom(item).dom_check_box
            var style_way_no = $(dom_way_no_delivery).attr('style');
            var class_row = $(item).attr('class');
            var way_no = dom_way_no_delivery.text();
            var is_row_checked = class_row.indexOf('_jt_row_checked') !== -1 // true选中 false非选中
            var is_row_unusual = style_way_no.indexOf('color') !== -1 // true异常 false正常

            console.log('class_row', class_row)
            console.log("style_way_no.indexOf('color')", style_way_no.indexOf('color'))

            if (!way_no) {
                // 没有快递单号&&是选中状态  进行反选!!
                is_row_checked && $(dom_check_box_delivery).trigger('click')
            } else {
                // 有快递单号
                if ((is_row_unusual && is_row_checked) || (!is_row_unusual && !is_row_checked)) {
                    // (是异常的快递单号&&当前行是选中状态)||(正常的快递单号&&非选中状态)
                    $(dom_check_box_delivery).trigger('click')
                }
            }
        }


        if (getRowDom(true).length) {
            // 触发【直接发货】方法
            typeof (Sends) === 'function' && Sends()
        }
        //----------------------直接发货 end--------------------------
    }

    function parseTime(time, cFormat = false) {
        if (arguments.length === 0 || !time) {
            return null
        }
        const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
        let date
        if (typeof time === 'object') {
            date = time
        } else {
            if ((typeof time === 'string')) {
                if ((/^[0-9]+$/.test(time))) {
                    // support "1548221490638"
                    time = parseInt(time)
                } else {
                    // support safari
                    // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
                    time = time.replace(new RegExp(/-/gm), '/')
                }
            }

            if ((typeof time === 'number') && (time.toString().length === 10)) {
                time = time * 1000
            }
            date = new Date(time)
        }
        const formatObj = {
            y: date.getFullYear(),
            m: date.getMonth() + 1,
            d: date.getDate(),
            h: date.getHours(),
            i: date.getMinutes(),
            s: date.getSeconds(),
            a: date.getDay()
        }
        return format.replace(/{([ymdhisa])+}/g, (result, key) => {
            const value = formatObj[key]
            // Note: getDay() returns 0 on Sunday
            if (key === 'a') {
                return ['日', '一', '二', '三', '四', '五', '六'][value]
            }
            return value.toString().padStart(2, '0')
        })
    }


    function start() {//启动计时器函数
        processDeliver()
        if (interval != null) {//判断计时器是否为空
            clearInterval(interval);
            interval = null;
        }
        interval = setInterval(processDeliver, CONFIG.IntervalTimeOut);//启动计时器,调用overs函数,
    }

    function stop() {
        clearInterval(interval);
        interval = null;
    }

    /**
     * processDeliver 发货进程
     */
    function processDeliver() {
        console.log('发货进程', parseTime(new Date().getTime()))
        var h_now = new Date(), h_hour = h_now.getHours();
        // console.log('now', h_hour)
        // console.log(CONFIG.DeadlineHour, typeof CONFIG.DeadlineHour)
        if (h_hour >= CONFIG.DeadlineHour) {
            // 【停止自动直接发货】当前时间大于等于截止时期
            alert(`${CONFIG.DeadlineHour} 点后不能进行自动发货操作!`)
            offAuto()
            return false
        }

        // 触发【搜索】查询方法
        typeof (Search) === 'function' && Search()
        setTimeout(() => {
            getDeliveryNo()
            setTimeout(() => {
                toDeliverGoods()
            }, 500)
            i++;
        }, 500)
    }

    /**
     * 生成按钮 Dom
     */
    function createButton() {
        $("head").append('<style type="text/css">     #shell-button {\n' +
            '        position: relative;\n' +
            '        font-size: 12px;\n' +
            '        font-weight: 700;\n' +
            '        min-height: 12px;\n' +
            '        overflow: hidden;\n' +
            '        display: flex;\n' +
            '        align-items: center;\n' +
            '        text-transform: uppercase;\n' +
            '        border-radius: 100px;\n' +
            '        padding: 12px 20px 8px;\n' +
            '        transition: all .15s ease, transform .2s ease-in-out;\n' +
            '        color: #fff;\n' +
            '        border-color: #959595;\n' +
            '        background-color: #959595;\n' +
            '        cursor: pointer;\n' +
            '        z-index: 1000;\n' +
            '        justify-content: center;\n' +
            '    }\n' +
            '\n' +
            '    .shell-button-text {\n' +
            '        position: relative;\n' +
            '        width: 100px;\n' +
            '        z-index: 1002;\n' +
            '        text-align: center;\n' +
            '    }\n' +
            '\n' +
            '    .shell-button-gradual {\n' +
            '        position: absolute;\n' +
            '        top: 0;\n' +
            '        bottom: 0;\n' +
            '        left: 0;\n' +
            '        right: 0;\n' +
            '        width: 0;\n' +
            '        height: 0;\n' +
            '        content: " ";\n' +
            '        display: block;\n' +
            '        background: -webkit-radial-gradient(center, ellipse cover, #402bf2 0, #f6174e 50%);\n' +
            '        transition: width .4s ease-in-out, height .4s ease-in-out;\n' +
            '        transform: translate(-50%, -50%); /*关键*/\n' +
            '        border-radius: 50%;\n' +
            '        z-index: 1001;\n' +
            '    }\n' +
            '\n' +
            '    #shell-button:hover .shell-button-gradual {\n' +
            '        width: 225%;\n' +
            '        height: 810px;\n' +
            '    }</style>');

        $("body").append('<div style="position: absolute;bottom:40px;right:40px">\n' +
            '    <div id="shell-button" flag="off">\n' +
            '        <div id="shell-button-text" class="shell-button-text">已关闭自动发货</div>\n' +
            '        <div class="shell-button-gradual"></div>\n' +
            '    </div>\n' +
            '</div>')
    }

    function offAuto() {
        var domButton = $('#shell-button')
        domButton.attr('flag', 'off')
        domButton.css('border-color', '#959595')
        domButton.css('background-color', '#959595')
        $('#shell-button-text').text('已关闭自动发货')
        stop()
    }


    function onAuto() {
        var domButton = $('#shell-button')
        domButton.attr('flag', 'on')
        domButton.css('border-color', '#fe1251')
        domButton.css('background-color', '#fe1251')
        $('#shell-button-text').text('已开启自动发货')
        start()
    }

    /**
     * 按钮拖拽 && 单击事件
     */
    function move() {
        var dv = document.getElementById('shell-button');
        var x = 0;
        var y = 0;
        var l = 0;
        var t = 0;
        var isDown = false;
        $('#shell-button').on('mousedown', function (e) { //鼠标按下
            x = e.clientX;
            y = e.clientY;
            l = dv.offsetLeft;
            t = dv.offsetTop;
            //开关打开
            isDown = true;
            //设置样式
            dv.style.cursor = 'pointer';
            // 判断一下这个按下是点击还是拖动
            var isClick = true;
            $(document).on('mousemove', (e) => {//鼠标移动
                dv.style.cursor = 'pointer';
                if (isDown == false) {
                    return;
                }
                //获取x和y
                var nx = e.clientX;
                var ny = e.clientY;
                //计算移动后的左偏移量和顶部的偏移量
                var nl = nx - (x - l);
                var nt = ny - (y - t);
                isClick = false
                dv.style.left = nl + 'px';
                dv.style.top = nt + 'px';
            })
            $(document).on('mouseup', (e) => {//鼠标抬起
                //当isClick为true时,就执行点击事件
                if (isClick) {
                    manualClick()
                }
                isDown = false;
                dv.style.cursor = 'pointer';
                $(document).off('mousemove mouseup')//移除鼠标移动、鼠标抬起事件
            })
        })

        function manualClick() {
            console.log("终于进来了2121");
            var domButton = $('#shell-button')
            if (domButton.attr('flag') === 'on') {
                offAuto()
            } else {
                onAuto()
            }
        }
    }

    /**
     * 判断是打单拣货才执行
     */
    if (window.location.href.indexOf(CONFIG.HREF) !== -1) {
        console.warn('window location', window.location)
        createButton()
        move()

        if (CONFIG.IsOn) {
            // 默认开启
            onAuto()
        }
    }
})()