ERP321Delivery

自动发货脚本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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()
        }
    }
})()