Greasy Fork 支持简体中文。

hll的插件

hll的一个小插件-1.0.17

// ==UserScript==
// @name         hll的插件
// @namespace    http://tampermonkey.net/
// @version      1.0.17
// @description  hll的一个小插件-1.0.17
// @author       qianglog
// @match        http://warehouse.westcoal.com.cn/*
// @match        https://market3.westcoal.com.cn/*
// @match        http://warehouseapi.westcoal.com.cn/*
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js
// @connect      *
// @connect      127.0.0.1
// @connect      10.3.149.117
// @connect      market-1253330314.cos.ap-chengdu.myqcloud.com
// @grant        GM_xmlhttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @license      GPLV3
// ==/UserScript==
// 出库单
var hostUrl = ""
var domain = "" // 回收单系统 后端domain
var baseUrl = '' // 云仓项目url
var params = function () {
    return ""
}
var getSyncData = function () {
    return ""
}
var getUpdateDateUrl = ''
var postResponseUrl = '' // 请求回收单系统后端接口地址
var update_time = '' // 后端返回的更新时间
var element = '' // 同步按钮标签
var dataAll = [] // 全部数据存放位置
var startState = false // 开始状态,如果为 true 则检测到的数据进行追加,否则进行覆盖
var frequency = 10000 // 同步频率
var dateStr = "" // 请求时间字符串 2022-11-01 00:00:00,2022-11-08 23:59:59
var currentPage = 1 // 当前页面
var totalPages = 1 // 总页码
var pageCount = 1// 总个数
var isDscNew = false // 是否是新大市场同步
var loadingEle = ''
var title = ''
var materialList = []
var materialInfo = []
var materialDomain = "http://10.3.149.117:8009"
var downloadFileTaskId = ''
var downloadOk = false
var downloadUrl = ''

function getDateStr(date) {
    // 获取时间字符串
    var dateObject = date ? new Date(date) : new Date()
    var y = dateObject.getFullYear()
    var m = dateObject.getMonth() + 1
    m = m < 10 ? ('0' + m) : m
    var d = dateObject.getDate()
    d = d < 10 ? ('0' + d) : d
    return y + '-' + m + '-' + d
}

var isGet2DeliveryOrderNo = false

function get2DeliveryOrderNo(type) {
    // 获取有个多条退库对应一个出库的数据内容
    var orderNoDataAll = []
    GM_xmlhttpRequest({
        method: "get",
        url: 'http://10.3.149.117:8009/api/api/approve/get_2_delivery_order_no/?type=' + type,
        headers: {
            "Content-Type": "application/json",
        },
        onload: function (newResponse) {
            newResponse = JSON.parse(newResponse.response)
            newResponse.data.map(item => {
                let url = 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/?page=1&perPage=100&stockOutBatchNo=' + item.delivery_order_no + '&dateStr=' + getDateStr(new Date().setFullYear(new Date().getFullYear() - 1)) + '%2000:00:00,' + getDateStr() + '%2023:59:59&statusTag=refunded&productCode=' + item.material_code
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        "Content-Type": "application/json", "Authorization": "JWT " + getCookie('material-buyer')
                    },
                    onload: function (newResponse) {
                        newResponse = JSON.parse(newResponse.response)
                        let pickingOrderNo = ''
                        newResponse.data.items.map(newItem => {
                            if (newItem.stockOutItem.refundedQuantity === item.quantity && newItem.product.code === item.material_code) {
                                pickingOrderNo = newItem.consumeOrder && newItem.consumeOrder.orderNo
                            }
                        })
                        orderNoDataAll.push({
                            delivery_order_no: item.delivery_order_no,
                            material_code: item.material_code,
                            picking_order_no: pickingOrderNo,
                        })
                    }
                })
            })
            var setIntervalObj = setInterval(function () {
                if (newResponse.data.length <= orderNoDataAll.length) {
                    clearInterval(setIntervalObj)
                    // 推送对应成功信息
                    GM_xmlhttpRequest({
                        method: "post",
                        url: 'http://10.3.149.117:8009/api/api/approve/get_2_delivery_order_no/?type=' + type,
                        data: JSON.stringify({
                            "data": orderNoDataAll,
                            "type": type,
                        }),
                        headers: {
                            "Content-Type": "application/json"
                        },
                        onload: function (response) {
                            isGet2DeliveryOrderNo = true
                        },
                        onerror: function (response) {
                            isGet2DeliveryOrderNo = true
                        }
                    })
                }
            }, 1000);

        }
    })
}

var typeDict = {
    // 矿业入库
    "http://warehouse.westcoal.com.cn/inStatistics": {
        title: '矿业库房',
        hostUrl: "http://warehouse.westcoal.com.cn/inStatistics",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/statistics/data/details/?', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_RK/',
        params: function () {
            return "statisticEventType=deposit&finishedTime=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                // 入库单价(元)
                let money = Math.round(item.stock.price / item.stock.enlargedFactor / 100 * 1000) / 1000
                let quantity = item.storage.eventComment === '采购退货出库' ? (item.storage.originQuantity || 0) : (item.stock.quantity || 0)
                const retData = {
                    "data_id": item.storage.businessBatchNo,
                    "class_code": item.category0.code,
                    "class_describe": item.category0.name,
                    "price": Math.round(item.stock.price / item.stock.enlargedFactor / 100 * quantity * 100) / 100 || 0,
                    "supplier_name": item.supplier.name || '',
                    "completion_time": item.storage && item.storage.finishedTime,
                    "type": item.storage.eventComment,
                    "material_code": item.product.code || '',
                    "number": quantity,
                    "money": money || 0,
                }
                dataAll.push(retData)
            })
            totalPages = response.data.page.totalPages // 设置总页码

        }

    },
    // 出库 CK
    "http://warehouse.westcoal.com.cn/reportForm/outStock/list": {
        title: '区队库房',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/outStock/list",
        domain: "http://10.3.149.117:8008",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8008/spider/WMS_CK/',
        params: function () {
            return "statusTag=stock_out&dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let create_time = item.stockOutItem && item.stockOutItem.finishedAt
                if (create_time && item.location && item.location.name === '智能立体库') {
                    let goodsQty = Math.round(item.stockOutItem.quantity * 100) / 100
                    if (item.unit.name in ['公斤', '千克', '千米', '千件']) {
                        goodsQty = goodsQty * 1000
                    }
                    let goodsUnit = item.unit.name
                    if (goodsUnit === '千克') {
                        goodsUnit = '克'
                    } else if (goodsUnit === '公斤') {
                        goodsUnit = '克'
                    } else if (goodsUnit === '千米') {
                        goodsUnit = '米'
                    } else if (goodsUnit === '千件') {
                        goodsUnit = '件'
                    }
                    const retData = {
                        "dn_code": item.stockOutBatch.batchNo,
                        "goods_code": item.product.code,
                        "goods_desc": item.product.name,
                        "goods_class": item.category.code,
                        "goods_brand": item.category.name,
                        "goods_qty": goodsQty,
                        "goods_unit": goodsUnit,
                        "goods_unit_price": item.stock.price / item.stock.enlargedFactor / 100,
                        "goods_price": item.stockOutItem.total / 100,
                        "customer": item.consumeOrder ? (item.consumeOrder.payDepartment || '无') : '无',
                        "comments": item.stock.comment || '',
                        "supplier": item.supplier ? (item.supplier.name || '随机') : '随机',
                        "create_time": create_time,
                        "creater": item.operator.fullname,
                        "openid": 'e1d74f3c862d27333b56e27bd72a49bf',
                    }
                    const materialCode = retData.goods_code
                    const materialName = retData.goods_desc
                    const materialUnit = item.unit && item.unit.name
                    if (materialList.indexOf(materialCode) === -1) {
                        materialInfo.push({
                            code: materialCode, name: materialName, unit: materialUnit || ''
                        })
                        materialList.push(materialCode)
                    }
                    dataAll.push(retData)
                }
            })
            totalPages = response.data.page.totalPages // 设置总页码
        }
    },
    // 入库 RK
    "http://warehouse.westcoal.com.cn/reportForm/inStock/list": {
        title: '区队库房',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/inStock/list",
        domain: "http://10.3.149.117:8008",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/deposit_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8008/spider/WMS_RK/',
        params: function () {
            return "dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let create_time = item.depositBatch && item.depositBatch.endAt
                if (create_time && item.location && item.location.name === '智能立体库') {
                    let goodsQty = Math.round(item.depositPosition.depositQuantity * 1000) / 1000
                    if (item.unit.name in ['公斤', '千克', '千米', '千件']) {
                        goodsQty = goodsQty * 1000
                    }
                    let goodsUnit = item.unit.name
                    if (goodsUnit === '千克') {
                        goodsUnit = '克'
                    } else if (goodsUnit === '公斤') {
                        goodsUnit = '克'
                    } else if (goodsUnit === '千米') {
                        goodsUnit = '米'
                    } else if (goodsUnit === '千件') {
                        goodsUnit = '件'
                    }
                    const retData = {
                        "asn_code": item.depositBatch.batchNo,
                        "creater": item.operator.fullname,
                        "goods_code": item.product.code,
                        "goods_desc": item.product.name,
                        "goods_class": item.category.code,
                        "goods_brand": item.category.name,
                        "goods_qty": goodsQty,
                        "goods_unit": goodsUnit,
                        "goods_unit_cost": item.depositItem.price / item.depositItem.enlargedFactor / 100,
                        "goods_cost": item.depositPosition.total / 100,
                        "comments": item.depositItem.commente || '',
                        "supplier": item.supplier ? (item.supplier.name || '随机') : '随机',
                        "create_time": item.depositBatch && item.depositBatch.endAt,
                        "openid": 'e1d74f3c862d27333b56e27bd72a49bf',
                    }
                    const materialCode = retData.goods_code
                    const materialName = retData.goods_desc
                    const materialUnit = item.unit && item.unit.name
                    if (materialList.indexOf(materialCode) === -1) {
                        materialInfo.push({
                            code: materialCode, name: materialName, unit: materialUnit || ''
                        })
                        materialList.push(materialCode)
                    }
                    dataAll.push(retData)
                }
            })
            totalPages = response.data.page.totalPages // 设置总页码

        }
    },
    // 大市场
    "https://market3.westcoal.com.cn/line_item_report/material_receive/list": {
        title: '大市场',
        hostUrl: "https://market3.westcoal.com.cn/line_item_report/material_receive/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'https://api3.westcoal.com.cn/v1/market/admin/material_consume_order/report/line_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_DSC/',
        params: function () {
            return "delivery=true&dateBegin=" + dateStr.split(',')[0].split(' ')[0] + "&dateEnd=" + dateStr.split(',')[1].split(' ')[0]
        },
        getSyncData: function (response) {
            if (!downloadFileTaskId) {
                downloadFileTaskId = response.data.taskId
            }
            downloadUrl = response.data.downloadUrl
            // 导出完成获取url,通过url 获取对应的二进制流
            if (downloadUrl) {
                downloadOk = true
            }
        },
        downloadFileData: function (response) {

        }
    },
    // 进销存同步
    "http://warehouse.westcoal.com.cn/reportForm/saleInventory/list": {
        title: '矿业库房',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/saleInventory/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/invoices/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_JXC/',
        params: function () {
            return "stockStatus=hasStockWithTemp&perPage=500"
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                dataAll.push({
                    material_code: item.product.code,
                    material_name: item.product.name,
                    unit: item.unit.name + '(' + item.unit.code + ')',
                    warehousing_number: item.invoicing.depositQuantity,
                    warehousing_total: Math.round(item.invoicing.depositAmount / 100 * 100) / 100,

                    sales_issue_number: item.invoicing.stockOutQuantity,
                    sales_issue_total: Math.round(item.invoicing.stockOutAmount / 100 * 100) / 100,

                    receipt_return_number: item.invoicing.purchaseReturnQuantity,
                    receipt_return_total: Math.round(item.invoicing.purchaseReturnAmount / 100 * 100) / 100,

                    issue_and_return_number: item.invoicing.refundQuantity,
                    issue_and_return_total: Math.round(item.invoicing.refundAmount / 100 * 100) / 100,
                })
            })
            totalPages = response.data.page.totalPages // 设置总页码
        },
        downloadFileData: function (response) {

        }
    },
    // 库存同步
    "http://warehouse.westcoal.com.cn/warehouseMaterial/stock/list": {
        title: '矿业库房',
        hostUrl: "http://warehouse.westcoal.com.cn/warehouseMaterial/stock/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/stocks/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_KC/',
        params: function () {
            return "stockStatus=hasStockWithTemp&perPage=500"
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                dataAll.push({
                    material_code: item.product.code, inventory_quantity: item.stockQuantity
                })
            })
            totalPages = response.data.page.totalPages // 设置总页码
        },
        downloadFileData: function (response) {

        }
    },
    // 矿业库房退库
    "http://warehouse.westcoal.com.cn/reportForm/backStock/list": {
        title: '矿业库房',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/backStock/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/refund_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_KYKF_TK/',
        params: function () {
            return "dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let url = 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/?page=1&perPage=100&stockOutBatchNo=' + item.stockOutBatchNo + '&dateStr=' + getDateStr(new Date().setFullYear(new Date().getFullYear() - 1)) + '%2000:00:00,' + getDateStr() + '%2023:59:59&statusTag=refunded'
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        "Content-Type": "application/json", "Authorization": "JWT " + getCookie('material-buyer')
                    },
                    onload: function (newResponse) {
                        newResponse = JSON.parse(newResponse.response)
                        let pickingOrderNo = ''
                        newResponse.data.items.map(newItem => {
                            if (newItem.stockOutItem.refundedQuantity === item.refundItem.quantity && newItem.product.code === item.product.code) {
                                pickingOrderNo = newItem.consumeOrder && newItem.consumeOrder.orderNo
                            }
                        })
                        dataAll.push({
                            return_order_no: item.refundBatch.batchNo,
                            material_code: item.product.code,
                            delivery_order_no: item.stockOutBatchNo,
                            picking_order_no: pickingOrderNo,
                            inventory_quantity: item.refundItem.quantity,
                            completion_time: item.refundBatch.endAt
                        })
                    }
                })
            })
            //上边异步方法执行完毕之后 会执行这里的方法
            totalPages = response.data.page.totalPages // 设置总页码
            pageCount = response.data.page.pageCount // 设置总个数
        },
        downloadFileData: function (response) {
        }
    },
    // 区队库房退库
    "http://warehouse.westcoal.com.cn/reportForm/backStock/lis": {
        title: '区队库房',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/backStock/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/refund_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_QDKF_TK/',
        params: function () {
            return "dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let url = 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/?page=1&perPage=100&stockOutBatchNo=' + item.stockOutBatchNo + '&dateStr=' + getDateStr(new Date().setFullYear(new Date().getFullYear() - 1)) + '%2000:00:00,' + getDateStr() + '%2023:59:59&statusTag=refunded'
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        "Content-Type": "application/json", "Authorization": "JWT " + getCookie('material-buyer')
                    },
                    onload: function (newResponse) {
                        newResponse = JSON.parse(newResponse.response)
                        let pickingOrderNo = ''
                        newResponse.data.items.map(newItem => {
                            if (newItem.stockOutItem.refundedQuantity === item.refundItem.quantity && newItem.product.code === item.product.code) {
                                pickingOrderNo = newItem.consumeOrder && newItem.consumeOrder.orderNo
                            }
                        })
                        dataAll.push({
                            return_order_no: item.refundBatch.batchNo,
                            material_code: item.product.code,
                            delivery_order_no: item.stockOutBatchNo,
                            picking_order_no: pickingOrderNo,
                            inventory_quantity: item.refundItem.quantity,
                            completion_time: item.refundBatch.endAt
                        })
                    }
                })
            })
            //上边异步方法执行完毕之后 会执行这里的方法
            totalPages = response.data.page.totalPages // 设置总页码
            pageCount = response.data.page.pageCount // 设置总个数
        },
        downloadFileData: function (response) {

        }
    },
    // 煤业物资工厂退库
    "http://warehouse.westcoal.com.cn/reportForm/backStock/l": {
        title: '煤业物资榆通红柳林供应站工厂',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/backStock/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/refund_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_MYWZ_TK/',
        params: function () {
            return "dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let url = 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/?page=1&perPage=100&stockOutBatchNo=' + item.stockOutBatchNo + '&dateStr=' + getDateStr(new Date().setFullYear(new Date().getFullYear() - 1)) + '%2000:00:00,' + getDateStr() + '%2023:59:59&statusTag=refunded'
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        "Content-Type": "application/json", "Authorization": "JWT " + getCookie('material-buyer')
                    },
                    onload: function (newResponse) {
                        newResponse = JSON.parse(newResponse.response)
                        let pickingOrderNo = ''
                        newResponse.data.items.map(newItem => {
                            if (newItem.stockOutItem.refundedQuantity === item.refundItem.quantity && newItem.product.code === item.product.code) {
                                pickingOrderNo = newItem.consumeOrder && newItem.consumeOrder.orderNo
                            }
                        })
                        dataAll.push({
                            return_order_no: item.refundBatch.batchNo,
                            material_code: item.product.code,
                            delivery_order_no: item.stockOutBatchNo,
                            picking_order_no: pickingOrderNo,
                            inventory_quantity: item.refundItem.quantity,
                            completion_time: item.refundBatch.endAt
                        })
                    }
                })
            })
            //上边异步方法执行完毕之后 会执行这里的方法
            totalPages = response.data.page.totalPages // 设置总页码
            pageCount = response.data.page.pageCount // 设置总个数
        },
        downloadFileData: function (response) {

        }
    },
    // 供应站工厂退库
    "http://warehouse.westcoal.com.cn/reportForm/backStock/li": {
        title: '供应站工厂',
        hostUrl: "http://warehouse.westcoal.com.cn/reportForm/backStock/list",
        domain: "http://10.3.149.117:8009",
        baseUrl: 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/refund_items/', // 云仓项目url
        getUpdateDateUrl: 'http://10.3.149.117:8009/api/api/approve/spider/HSD_GYZ_TK/',
        params: function () {
            return "dateStr=" + dateStr
        },
        getSyncData: function (response) {
            response.data.items.map(item => {
                let url = 'http://warehouseapi.westcoal.com.cn/v1/warehouse/report/stock_out_items/?page=1&perPage=100&stockOutBatchNo=' + item.stockOutBatchNo + '&dateStr=' + getDateStr(new Date().setFullYear(new Date().getFullYear() - 1)) + '%2000:00:00,' + getDateStr() + '%2023:59:59&statusTag=refunded'
                GM_xmlhttpRequest({
                    method: "get",
                    url: url,
                    headers: {
                        "Content-Type": "application/json", "Authorization": "JWT " + getCookie('material-buyer')
                    },
                    onload: function (newResponse) {
                        newResponse = JSON.parse(newResponse.response)
                        let pickingOrderNo = ''
                        newResponse.data.items.map(newItem => {
                            if (newItem.stockOutItem.refundedQuantity === item.refundItem.quantity && newItem.product.code === item.product.code) {
                                pickingOrderNo = newItem.consumeOrder && newItem.consumeOrder.orderNo
                            }
                        })
                        dataAll.push({
                            return_order_no: item.refundBatch.batchNo,
                            material_code: item.product.code,
                            delivery_order_no: item.stockOutBatchNo,
                            picking_order_no: pickingOrderNo,
                            inventory_quantity: item.refundItem.quantity,
                            completion_time: item.refundBatch.endAt
                        })
                    }
                })
            })
            //上边异步方法执行完毕之后 会执行这里的方法
            totalPages = response.data.page.totalPages // 设置总页码
            pageCount = response.data.page.pageCount // 设置总个数
        },
        downloadFileData: function (response) {

        }
    },
}

/**
 * 不足补0
 */
function padleft0(obj) {
    return obj.toString().replace(/^[0-9]{1}$/, "0" + obj);
}

/**
 * 获取当前时间
 */
function getNowTime() {
    var nowtime = new Date();
    var year = nowtime.getFullYear();
    var month = padleft0(nowtime.getMonth() + 1);
    var day = padleft0(nowtime.getDate());
    var hour = padleft0(nowtime.getHours());
    var minute = padleft0(nowtime.getMinutes());
    var second = padleft0(nowtime.getSeconds());
    return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}

function updateLoadingTitle() {
    if (startState) {
        loadingEle.innerHTML = '<div class="el-loading-mask is-fullscreen" style="background-color: rgba(0, 0, 0, 0.7); z-index: 2011;"><div class="el-loading-spinner"><i class="el-icon-loading"></i><p class="el-loading-text">正在进行同步数据请稍等...</p><br><p class="el-loading-text">[正在进行 ' + currentPage + '页 / 总' + totalPages + '页]</p></div></div>'
    } else {
        loadingEle.innerHTML = ''
    }
}

/**
 * 创建 Loading 窗口
 */
function createLoadingEle(hide = false) {
    if (hide) { // 隐藏 Loading
        if (loadingEle) {
            loadingEle.innerHtml = ''
        }
        return
    }
    if (loadingEle) {
        loadingEle.innerHtml = ''
    } else {
        loadingEle = document.createElement("span");
    }
    // loadingEle.innerHTML = '<div class="el-loading-mask is-fullscreen" style="z-index: 2005;"><div class="el-loading-spinner"><svg viewBox="25 25 50 50" class="circular"><circle cx="50" cy="50" r="20" fill="none" class="path"></circle></svg></div></div>'
    loadingEle.innerHTML = '<div class="el-loading-mask is-fullscreen" style="background-color: rgba(0, 0, 0, 0.7); z-index: 2011;"><div class="el-loading-spinner"><i class="el-icon-loading"></i><p class="el-loading-text">正在进行同步数据请稍等...</p></div></div>'
    let ele = document.getElementsByClassName("html-body")
    if (ele.length === 0) {
        ele = document.getElementsByClassName("app-wrapper")
    }
    ele = ele[ele.length - 1]
    ele.insertBefore(loadingEle, ele.childNodes[ele.length - 1])
}

/**
 * 时间添加
 * @param datetime 时间字符串
 * @param s 需要加的时间,可以为负数
 * @returns {string}
 */
function getUpdateDateAdd(datetime, s = 0) {
    datetime = new Date(datetime)
    var nowtime = new Date(datetime.valueOf() + s * 1000);
    var year = nowtime.getFullYear();
    var month = padleft0(nowtime.getMonth() + 1);
    var day = padleft0(nowtime.getDate());
    var hour = padleft0(nowtime.getHours());
    var minute = padleft0(nowtime.getMinutes());
    var second = padleft0(nowtime.getSeconds());
    return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}

/**
 * js将post请求的参数对象转换成get的形式拼接在url上
 * @param param
 * @returns {string}
 */
function changeParam(param) {
    return JSON.stringify(param).replace(/:/g, '=').replace(/,/g, '&').replace(/{/g, '?').replace(/}/g, '').replace(/"/g, '');
}

/**
 * 从回收单系统获取更新时间
 * @returns {string}
 */
function getUpdateDate() {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "get", url: getUpdateDateUrl, headers: {
                "Content-Type": "application/json"
            }, onload: function (response) {
                return resolve(JSON.parse(response.response))
            }, onerror: function (response) {
                return reject(response)
            }
        })
    })
}

function init() {
    currentPage = 1 // 当前页面
    totalPages = 1 // 总页码
    startState = false
    isGet2DeliveryOrderNo = false
    dataAll = []
    materialList = []
    materialInfo = []
    createLoadingEle(true)
}

function initType() {
    init()
    hostUrl = ""
    title = ""
    domain = ""
    baseUrl = '' // 云仓项目url
    getUpdateDateUrl = ''
    params = function () {
        return ""
    }
    getSyncData = function () {
        return ""
    }
    createLoadingEle(true)
}


function runUpdateData(res) {
    // 如果状态为0退出不同步
    if (res.can_spider === 0) {
        alert("当前有其他人正在同步请5分钟稍后重试")
        return
    }
    update_time = res.update_time
    if (!update_time) {
        alert("更新时间为空,终止同步!")
        return;
    }
    postResponseUrl = res.url
    if (!postResponseUrl) {
        alert("请求回收单系统地址为空,终止同步!")
        return;
    }
    GM_setValue("KykfRkGetUpdateDate", JSON.stringify(res))
    // 获取云仓从最后一次同步时间到当前时间段前5分钟的所有数据
    // dateStr = "2022-11-01 00:00:00,2022-11-08 23:59:59"
    dateStr = getUpdateDateAdd(update_time, 1) + "," + getUpdateDateAdd(getNowTime(), 0)
    // 2. 模拟接口请求,进行数据获取
    init()
    startState = true
    createLoadingEle()
    if (title === '大市场') {
        let ele = document.getElementsByClassName('el-button--default')
        ele = ele[ele.length - 1]
        ele.click()
    } else if (hostUrl === 'http://warehouse.westcoal.com.cn/warehouseMaterial/stock/list') { // 库存同步
        $('.float-right .el-button--primary').click()
    } else if (hostUrl === 'http://warehouse.westcoal.com.cn/reportForm/saleInventory/list') { // 库存同步
        $('.float-right .el-button--primary').click()
    } else {
        $("button[type=submit]").click()
    }
}

/**
 * 创建同步数据按钮
 * @returns {string}
 */
function createElement() {
    let ele = document.getElementsByClassName("el-form-item__content")
    let innerHTML = '<button data-v-4343f066="" type="button" class="el-button el-button--primary el-button--mini"><span>同步数据</span></button>'
    let newButtonHtml = ''
    if (ele.length === 0) {
        ele = document.getElementsByClassName("action-item")
        innerHTML = '<button data-v-4343f066="" type="button" class="el-button el-button--warning el-button--mini"><span>同步数据</span></button>'
        newButtonHtml = `<button data-v-4343f066="" type="button" class="el-button el-button--primary el-button--mini"><span>新同步数据</span></button>`
    }
    ele = ele[ele.length - 1]
    const swa = document.createElement("span");
    swa.style["margin-left"] = '20px'
    swa.innerHTML = innerHTML
    ele.insertBefore(swa, ele.childNodes[ele.length - 1])
    swa.addEventListener('click', function () {
        alert('开始同步...');
        // 点击后开始同步
        // 1. 先从后端获取同步时间
        // 2. 调用接口,进行数据获取
        // 3. 所有数据获取到后,发送到后端
        // 4. 结束同步
        let updateDate = GM_getValue("KykfRkGetUpdateDate")
        if (updateDate) {
            updateDate = JSON.parse(updateDate)
            // 计算时间差,如果差5分钟则删除缓存数据,并重新请求
            if ((new Date() - new Date(updateDate.update_time)) / 1000 < 300) {
                runUpdateData(updateDate)
            } else {
                GM_setValue("KykfRkGetUpdateDate", "")
                getUpdateDate().then(res => {
                    runUpdateData(res)
                })
            }
        } else {
            getUpdateDate().then(res => {
                runUpdateData(res)
            })
        }

    })
    element = swa
    const newButtonSwa = document.createElement("span");
    newButtonSwa.innerHTML = newButtonHtml
    ele.insertBefore(newButtonSwa, ele.childNodes[ele.length - 1])
    newButtonSwa.addEventListener('click', function () {
        var startTime = document.getElementsByClassName("el-range-input")[0].value
        var endTime = document.getElementsByClassName("el-range-input")[1].value
        if (!startTime || !endTime) {
            alert('请选择时间范围');
        } else {
            if (confirm("确定要同步 " + startTime + " 至 " + endTime + " 数据吗?")) {
                alert("同步中");
                init()
                isDscNew = true
                startState = true
                createLoadingEle(false)
                let ele = document.getElementsByClassName('el-button--default')
                ele = ele[ele.length - 1]
                ele.click()
            }
        }

    })
}

/**
 * 推送信息到服务端
 * @returns {string}
 */
function putSyncData(data) {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: "post", url: postResponseUrl, data: JSON.stringify(data), headers: {
                "Content-Type": "application/json"
            }, onload: function (response) {
                return resolve(response.data)
            }, onerror: function (response) {
                return reject(response)
            }
        })
    })

}

/**
 * 开始监听路由
 * @returns {string}
 */
function run() {
    const originOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (_, url) {
        const xhr = this;
        const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "response").get;
        Object.defineProperty(xhr, "responseText", {
                get: () => {
                    let result = getter.call(xhr);
                    if (!baseUrl || window.location.href.indexOf(hostUrl) === -1) {
                        element = ''
                        return result
                    }
                    try {
                        if (url.indexOf(baseUrl) !== -1 && title && (title === '大市场' || $('.warehouse')[0].textContent.indexOf(title) !== -1)) {
                            if (!element) {
                                createElement()
                            }
                            // 开始同步存入全局数据中
                            if (startState) {
                                getSyncData(JSON.parse(result))
                                // 拦截下载excel文件
                                if (title === '大市场') {
                                    if (downloadOk) {
                                        // 下载二进制流文件
                                        GM_xmlhttpRequest({
                                            url: downloadUrl, // url为请求接口连接
                                            method: 'get', headers: {
                                                'Accept': 'application/json',
                                            }, responseType: 'blob', // 与上一行一样,'blob'或者'arraybuffer'两个值都可以,二选一
                                            onload: function (res) {
                                                if (isDscNew) { // 新大市场同步
                                                    var startTime = document.getElementsByClassName("el-range-input")[0].value
                                                    var endTime = document.getElementsByClassName("el-range-input")[1].value
                                                    let fornData = new FormData();
                                                    fornData.append('file', res.response);
                                                    fornData.append('start_datetime', startTime);
                                                    fornData.append('end_datetime', endTime);
                                                    GM_xmlhttpRequest({
                                                        url: 'http://10.3.149.117:8009/api/api/approve/sync_new_dsc_data/',
                                                        method: 'post',
                                                        data: fornData, //直接把对象放在data后面
                                                        contentType: false,  //不需要指定如何编码格式,django会自动识别FormData对象
                                                        processData: false, //告诉你的浏览器不要对传过去的数据进行处理,保持原样
                                                        onload: function () {
                                                            startState = false
                                                            downloadOk = false
                                                            downloadUrl = ''
                                                            downloadFileTaskId = ''
                                                            createLoadingEle(true)
                                                            updateLoadingTitle()
                                                            alert("同步成功!")
                                                        }, onerror: function (err) {
                                                            console.log('err', err)
                                                            alert("同步失败!", err)
                                                            startState = false
                                                            downloadOk = false
                                                            downloadUrl = ''
                                                            downloadFileTaskId = ''
                                                            createLoadingEle(true)
                                                            updateLoadingTitle()
                                                        }
                                                    })
                                                    return
                                                }
                                                // 发送请求到后端
                                                let fornData = new FormData();
                                                fornData.append('file', res.response);
                                                fornData.append('update_datetime', getUpdateDateAdd(update_time, 1));
                                                fornData.append('new_datetime', getUpdateDateAdd(getNowTime(), -120));
                                                GM_xmlhttpRequest({
                                                    url: postResponseUrl, method: 'post', data: fornData, //直接把对象放在data后面
                                                    contentType: false,  //不需要指定如何编码格式,django会自动识别FormData对象
                                                    processData: false, //告诉你的浏览器不要对传过去的数据进行处理,保持原样
                                                    onload: function () {
                                                        startState = false
                                                        downloadOk = false
                                                        downloadUrl = ''
                                                        downloadFileTaskId = ''
                                                        createLoadingEle(true)
                                                        updateLoadingTitle()
                                                        GM_setValue("KykfRkGetUpdateDate", "")
                                                        alert("同步成功!")
                                                    }, onerror: function (err) {
                                                        console.log(err)
                                                        alert("同步失败!", err)
                                                        startState = false
                                                        downloadOk = false
                                                        downloadUrl = ''
                                                        downloadFileTaskId = ''
                                                        createLoadingEle(true)
                                                        updateLoadingTitle()
                                                        GM_setValue("KykfRkGetUpdateDate", "")
                                                    }
                                                })
                                            }, onerror: function (response) {
                                                console.log("error", response)
                                                isDscNew = false
                                            }
                                        });
                                    }
                                }
                                // 进销存同步
                                else if (hostUrl === 'http://warehouse.westcoal.com.cn/reportForm/saleInventory/list') {
                                    if (currentPage < totalPages) {
                                        currentPage += 1
                                        updateLoadingTitle()
                                    } else {
                                        // 发送请求到后端
                                        putSyncData(dataAll).then(res => {
                                            startState = false
                                            createLoadingEle(true)
                                            updateLoadingTitle()
                                            alert("同步成功!", res)
                                        }).catch(err => {
                                            alert("同步失败!", err)
                                            startState = false
                                            createLoadingEle(true)
                                            updateLoadingTitle()

                                        })
                                    }

                                }
                                // 库存同步
                                else if (hostUrl === 'http://warehouse.westcoal.com.cn/warehouseMaterial/stock/list') {
                                    if (currentPage < totalPages) {
                                        currentPage += 1
                                        updateLoadingTitle()
                                    } else {
                                        // 发送请求到后端
                                        putSyncData(dataAll).then(res => {
                                            startState = false
                                            createLoadingEle(true)
                                            updateLoadingTitle()
                                            alert("同步成功!", res)
                                        }).catch(err => {
                                            alert("同步失败!", err)
                                            startState = false
                                            createLoadingEle(true)
                                            updateLoadingTitle()

                                        })
                                    }

                                }
                                // 同步退库问题
                                else if (hostUrl === 'http://warehouse.westcoal.com.cn/reportForm/backStock/list') {
                                    if (currentPage < totalPages && !$('button[class="btn-next"]').disabled) {
                                        currentPage += 1
                                        setTimeout(() => {
                                            updateLoadingTitle()
                                            // 模拟点击分页
                                            $('button[class="btn-next"]').click()
                                        }, frequency);
                                    } else {
                                        var setIntervalObj = setInterval(function () {
                                            if (dataAll.length >= pageCount) {
                                                putSyncData(dataAll).then(res => {
                                                    clearInterval(setIntervalObj)
                                                    let type = ''
                                                    if ($('.warehouse')[0].textContent.indexOf('区队库房') !== -1) {
                                                        type = 'qd'
                                                    } else if ($('.warehouse')[0].textContent.indexOf('矿业库房') !== -1) {
                                                        type = 'ky'
                                                    } else if ($('.warehouse')[0].textContent.indexOf('煤业物资榆通红柳林供应站工厂') !== -1) {
                                                        type = 'mywz'
                                                    } else if ($('.warehouse')[0].textContent.indexOf('供应站工厂') !== -1) {
                                                        type = 'qyz'
                                                    }
                                                    // 获取有个多条退库对应一个出库的数据内容
                                                    get2DeliveryOrderNo(type)
                                                    var setIntervalObj1 = setInterval(function () {
                                                        if (isGet2DeliveryOrderNo) {
                                                            startState = false
                                                            createLoadingEle(true)
                                                            updateLoadingTitle()
                                                            clearInterval(setIntervalObj1)
                                                            alert("同步成功!")
                                                        }
                                                    }, 1000);
                                                }).catch(err => {
                                                    clearInterval(setIntervalObj)
                                                    startState = false
                                                    createLoadingEle(true)
                                                    updateLoadingTitle()
                                                    alert("同步失败!", err)
                                                })
                                            }
                                        }, 1000);
                                    }
                                }
                                // 判断总页数是否等于当前页
                                else if (currentPage < totalPages && !$('button[class="btn-next"]').disabled) {
                                    currentPage += 1
                                    setTimeout(() => {
                                        updateLoadingTitle()
                                        // 模拟点击分页
                                        $('button[class="btn-next"]').click()
                                    }, frequency);
                                } else {
                                    updateLoadingTitle()

                                    // 发送请求到后端
                                    putSyncData(dataAll).then(res => {
                                        // 获取有个多条退库对应一个出库的数据内容
                                        startState = false
                                        createLoadingEle(true)
                                        updateLoadingTitle()
                                        GM_setValue("KykfRkGetUpdateDate", "")
                                        // 同步物料编码
                                        if (materialInfo.length > 0) {
                                            GM_xmlhttpRequest({
                                                method: "post",
                                                url: materialDomain + '/api/api/approve/material/batch_update/',
                                                data: JSON.stringify({data: materialInfo}),
                                                headers: {
                                                    "Content-Type": "application/json"
                                                }
                                            })
                                        }
                                        alert("同步成功!", res)

                                    }).catch(err => {
                                        alert("同步失败!", err)
                                        startState = false
                                        createLoadingEle(true)
                                        updateLoadingTitle()

                                    })
                                }
                            }
                        }
                        return result;
                    } catch (e) {
                        return result;
                    }
                },
            }
        )
        ;
        // 如果路由不一致,表示切换路由,则重新初始化
        if (!hostUrl || window.location.href.indexOf(hostUrl) === -1) {
            initType()
            element = ""
            data = ""
            if (window.location.href.split('?')[0] === 'http://warehouse.westcoal.com.cn/reportForm/backStock/list' && $('.warehouse')[0].textContent.indexOf('区队库房') !== -1) {
                data = typeDict['http://warehouse.westcoal.com.cn/reportForm/backStock/lis']
            } else if (window.location.href.split('?')[0] === 'http://warehouse.westcoal.com.cn/reportForm/backStock/list' && $('.warehouse')[0].textContent.indexOf('煤业物资榆通红柳林供应站工厂') !== -1) {
                data = typeDict['http://warehouse.westcoal.com.cn/reportForm/backStock/l']
            } else if (window.location.href.split('?')[0] === 'http://warehouse.westcoal.com.cn/reportForm/backStock/list' && $('.warehouse')[0].textContent.indexOf('供应站工厂') !== -1) {
                data = typeDict['http://warehouse.westcoal.com.cn/reportForm/backStock/li']
            } else {
                data = typeDict[window.location.href.split('?')[0]]
            }
            if (data) {
                title = data.title
                hostUrl = data.hostUrl
                domain = data.domain
                baseUrl = data.baseUrl // 云仓项目url
                getUpdateDateUrl = data.getUpdateDateUrl
                getSyncData = data.getSyncData
                params = data.params
            }
        }
        // 大市场同步
        if (url.indexOf(baseUrl + 'excel/') !== -1 && hostUrl && window.location.href.indexOf(hostUrl) !== -1 && title === '大市场') {
            if (startState && dateStr || (startState && isDscNew)) {
                if (!downloadFileTaskId) {
                    if (isDscNew) {
                        const startTime = document.getElementsByClassName("el-range-input")[0].value
                        const endTime = document.getElementsByClassName("el-range-input")[1].value
                        url = baseUrl + "excel/?delivery=true&dateBegin=" + startTime + "&dateEnd=" + endTime
                    } else {
                        url = baseUrl + "excel/?" + params()
                    }
                } else {
                    url = baseUrl + "excel/" + downloadFileTaskId
                }
            }
        }
        // 请求拦截
        else if (url.indexOf(baseUrl) !== -1 && hostUrl && window.location.href.indexOf(hostUrl) !== -1 && title && (title === '大市场' || $('.warehouse')[0].textContent.indexOf(title) !== -1)) {
            // 如果开始同步,并且同步时间获取到,则说明是自动化同步,进行url 参数修改
            if (startState && dateStr) {
                if (hostUrl === 'http://warehouse.westcoal.com.cn/warehouseMaterial/stock/list') {
                    url = baseUrl + (baseUrl.endsWith('?') ? 'page=' : "?page=") + currentPage + "&perPage=500" + '&' + params()
                } else if (hostUrl === 'http://warehouse.westcoal.com.cn/reportForm/backStock/list') {
                    url = baseUrl + (baseUrl.endsWith('?') ? 'page=' : "?page=") + currentPage + "&perPage=500" + '&' + params()
                } else if (hostUrl === 'http://warehouse.westcoal.com.cn/reportForm/saleInventory/list') {
                    // url = url
                } else {
                    url = baseUrl + (baseUrl.endsWith('?') ? 'page=' : "?page=") + currentPage + "&perPage=20" + '&' + params()
                }
            }
        }
        originOpen.apply(this, arguments);
    };

}

/**
 * 获取Cookie值
 * @returns {string}
 */
function getCookie(objname) {//获取指定名称的cookie的值
    var arrstr = document.cookie.split("; ");
    for (var i = 0; i < arrstr.length; i++) {
        var temp = arrstr[i].split("=");
        if (temp[0] === objname) return unescape(temp[1]);
    }
}


(function () {
    'use strict';
    run()
    // Your code here...
})();