Greasy Fork

Greasy Fork is available in English.

小当导出价格

导出的表格中携带参考价

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

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

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

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

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

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         小当导出价格
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  导出的表格中携带参考价
// @author       hzwang
// @match        https://www.tampermonkey.net/index.php?version=4.19.0&ext=dhdg&updated=true
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @include      *://www.xiaodangjingpai.com/static/*
// @include      *:///www.xiaodangjingpai.com/*
// @require      https://unpkg.com/xlsx/dist/xlsx.full.min.js
// @require      https://unpkg.com/file-saver/dist/FileSaver.min.js
// @connect www.xiaodangjingpai.com
// @grant        GM_xmlhttpRequest
// @grant unsafeWindow
// @license MIT
// ==/UserScript==
(function () {
    'use strict';

    /**
     * 进度
     */
    class Process {
        constructor() {
            this.progressContainer = null
            this.progressBar = null
            this.processElement = null
            this.progressFillValue = null
            this.init();
        }

        init() {
            this.progressContainer = document.createElement("div");
            this.progressContainer.style.position = "fixed";
            this.progressContainer.style.top = "0";
            this.progressContainer.style.left = "0";
            this.progressContainer.style.width = "100%";
            this.progressContainer.style.height = "100%";
            this.progressContainer.style.backgroundColor = "rgba(0, 0, 0, 0.5)";
            this.progressContainer.style.display = "none";
            this.progressContainer.style.zIndex = "1000";

            this.progressBar = document.createElement("div");
            this.progressBar.style.position = "absolute";
            this.progressBar.style.top = "50%";
            this.progressBar.style.left = "50%";
            this.progressBar.style.transform = "translate(-50%, -50%)";
            this.progressBar.style.width = "200px";
            this.progressBar.style.height = "20px";
            this.progressBar.style.backgroundColor = "#f5f5f5";
            this.progressBar.style.borderRadius = "10px";

            this.progressFill = document.createElement("div");
            this.progressFill.style.width = "0";
            this.progressFill.style.height = "100%";
            this.progressFill.style.backgroundColor = "#4caf50";
            this.progressFill.style.borderRadius = "inherit";

            this.progressFillValue = document.createElement("span");
            // this.progressFillValue.textContent = `0/${this.total}`
            this.progressFillValue.style.color = "red"
            this.progressFillValue.style.marginLeft = "100px"

            this.progressBar.appendChild(this.progressFill);
            this.progressBar.appendChild(this.progressFillValue);
            this.progressContainer.appendChild(this.progressBar);

            document.documentElement.appendChild(this.progressContainer);
        }

        // 显示全屏进度条
        showProgressBar() {
            this.progressContainer.style.display = "block";
        }

        // 更新进度条(0-100之间的进度值)
        updateProgressBar(progressCnt, total) {
            this.progressFill.style.width = (progressCnt * 100 / total) + "%";
            this.progressFillValue.textContent = `${progressCnt}/${total}`
        }

        // 隐藏全屏进度条
        hideProgressBar() {
            this.progressContainer.style.display = "none";
        }

    }

    class QueryDataApi {

        constructor() {
        }

        queryList(bidder, biddingNo, pageNum) {
            return new Promise(function (resolve, reject) {
                GM_xmlhttpRequest({
                    url: "https://www.xiaodangjingpai.com/api/dh/sale/bid/bidding/list",
                    method: "POST",
                    synchronous: true,
                    headers: {
                        "content-type": "application/json",
                        "user-agent": navigator.userAgent,
                        'authority': 'www.xiaodangjingpai.com',
                        'accept': 'application/json, text/plain, */*',
                        'accept-language': 'zh-CN,zh;q=0.9',
                        'bversion': '2.2',
                        'cache-control': 'no-cache',
                        'channelid': '700001',
                        'content-type': 'application/json;charset=UTF-8',
                        'eagleeye-pappname': 'hzqilpvzo4@cc28cea285a2501',
                        'eagleeye-sessionid': 'Fal8tknk4tUbkackX4RbwwOa3qnk',
                        'eagleeye-traceid': '4f823d6116894439996801001a2501',
                        'origin': 'https://www.xiaodangjingpai.com',
                        'pragma': 'no-cache',
                        'referer': 'https://www.xiaodangjingpai.com/static/index.html',
                        'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
                        'sec-ch-ua-mobile': '?0',
                        'sec-ch-ua-platform': '"macOS"',
                        'sec-fetch-dest': 'empty',
                        'sec-fetch-mode': 'cors',
                        'sec-fetch-site': 'same-origin',
                    },
                    data: JSON.stringify({ "bidder": bidder, "biddingNo": biddingNo, "bidType": "1", "pageNum": pageNum, "pageSize": 100, "isHasPrice": "", "status": "", "brand": "", "product": "", "evaluationLevel": "" }),
                    responseType: "json",
                    onload(response) {
                        resolve(JSON.parse(response.responseText));
                    },
                });
            })
        }

        queryTypeList() {
            return new Promise((function (resolve, reject) {
                GM_xmlhttpRequest({
                    url: "https://www.xiaodangjingpai.com/api/dh/sale/bid/list/type",
                    method: "POST",
                    synchronous: true,
                    headers: {
                        "user-agent": navigator.userAgent,
                        'authority': 'www.xiaodangjingpai.com',
                        'accept': 'application/json, text/plain, */*',
                        'accept-language': 'zh-CN,zh;q=0.9',
                        'bversion': '2.2',
                        'cache-control': 'no-cache',
                        'channelid': '700001',
                        'content-type': 'application/json;charset=UTF-8',
                        'eagleeye-pappname': 'hzqilpvzo4@cc28cea285a2501',
                        'eagleeye-sessionid': 'R6lhskFX4LRwR0w0wdOmq82yg1sk',
                        'eagleeye-traceid': '2fe3272016894811314141010a2501',
                        'origin': 'https://www.xiaodangjingpai.com',
                        'pragma': 'no-cache',
                        'referer': 'https://www.xiaodangjingpai.com/static/index.html',
                        'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
                        'sec-ch-ua-mobile': '?0',
                        'sec-ch-ua-platform': '"macOS"',
                        'sec-fetch-dest': 'empty',
                        'sec-fetch-mode': 'cors',
                        'sec-fetch-site': 'same-origin',
                        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
                    },
                    data: JSON.stringify({ "status": 2, "gmtStart": "", "gmtExpire": "", "biddingNo": "", "pageNum": 1, "pageSize": excelExport.pageSize, "isChecked": 0, "bidType": 1 }),
                    responseType: "json",
                    onload(response) {
                        resolve(JSON.parse(response.responseText));
                    },
                });
            }));
        }

    }

    class ExcelExport {
        constructor() {
            this.exportData = []
            this.pageSize = 100
        }

        init() {
            this.exportData = []
        }

        addExportDataList(exportDataList) {
            try {
                exportDataList.forEach(item => {
                    this.exportData.push({
                        "场次编号": item.biddingNo,
                        "竞拍物品id": item.id,
                        "品牌": item.brand,
                        "机型": item.product,
                        "物品编号": item.merchandiseId,
                        "IMEI": item.imei,
                        "SKU": item.skuDesc == null ? (item.merchandiseDetectionInformationDTO != null ? this.processDesc(item.merchandiseDetectionInformationDTO.skuDesc) : "") : this.processDesc(item.skuDesc),
                        "附加选项": "",
                        "skuId": item.merchandiseDetectionInformationDTO != null ? item.merchandiseDetectionInformationDTO.skuId : "",
                        "成色": item.merchandiseDetectionInformationDTO != null ? item.merchandiseDetectionInformationDTO.evaluationLevel : "",
                        "机况描述": `正常项:${this.processDesc(item.normalItem)}****瑕疵项:${this.processDesc(item.defectiveItem)}`,
                        "备注": item.merchandiseDetectionInformationDTO != null ? item.merchandiseDetectionInformationDTO.remark : "",
                        "参考价": item.referencePrice,
                    })
                })
            } catch (error) {
                console.log("发生异常: " + error);
            }
        }

        processDesc(sku) {
            let res = ""
            if (sku != null) {
                sku.split(",").forEach(item => {
                    try {
                        if (item != '' && item != null) {
                            res += item.split(":")[1].replace(/&#&[0-9]*\|/g, '、').replace(/^[0-9]*\|/g, '') + "、"
                        }
                    } catch (error) {
                        console.log("发生异常: " + error);
                    }
                })
            }
            return res
        }

        async exportExcel(type) {
            this.init()
            let completeCnt = 0
            process.updateProgressBar(completeCnt, type.bidNum)
            process.showProgressBar();

            let pageNums = Math.ceil(type.bidNum * 1.0 / this.pageSize)
            for (let i = 0; i < pageNums; i++) {
                let items = await queryDataApi.queryList(userInfo.id, type.biddingNo, i + 1).then(value => {
                    return value.data.items;
                })
                completeCnt += this.pageSize
                process.updateProgressBar(completeCnt, type.bidNum)
                excelExport.addExportDataList(items)
            }

            this.exportToExcel(`场次为${type.biddingNo}`)
        }

        // 导出数据为 Excel 文件
        exportToExcel(filename) {
            // 创建工作簿和工作表
            var workbook = XLSX.utils.book_new();
            var sheet = XLSX.utils.json_to_sheet(this.exportData);

            // 将工作表添加到工作簿
            XLSX.utils.book_append_sheet(workbook, sheet, "Sheet1");

            // 将工作簿保存为 Excel 文件
            var wbout = XLSX.write(workbook, { bookType: "xlsx", type: "array" });
            var blob = new Blob([wbout], { type: "application/octet-stream" });
            saveAs(blob, filename + ".xlsx");
            process.hideProgressBar();
        }

        /**
         * 生成下载按钮
         */
        generateDownloadButton(typeList) {
            document.querySelectorAll(".ivu-table-fixed-body .ivu-table-tbody .ivu-table-row").forEach((rowElement, index) => {
                let firstDiv = rowElement.firstElementChild.firstElementChild
                var buttonElementString = `<button type="button" class="ivu-btn ivu-btn-primary ivu-btn-small"><!----><!----><span>导出</span></button>`;
                // 创建一个临时容器元素
                var container = document.createElement('div');
                // 将字符串赋值给容器元素的 innerHTML 属性
                container.innerHTML = buttonElementString;
                // 获取容器中的第一个子元素,即转换后的元素
                var buttonElement = container.firstChild;
                buttonElement.addEventListener('click', function () {
                    excelExport.exportExcel(typeList[index])
                });
                firstDiv.appendChild(buttonElement)
            })

        }
    }

    class Test {
        // 示例:模拟长时间运行的操作
        longRunningOperation() {
            var process = new Process(100);
            process.showProgressBar();

            var progressCnt = 0;
            var interval = setInterval(function () {
                progressCnt += 10;
                process.updateProgressBar(progressCnt);

                if (progressCnt >= 100) {
                    clearInterval(interval);
                    process.hideProgressBar();
                }
            }, 1000);
        }
    }

    let process = new Process();
    let queryDataApi = new QueryDataApi();
    let excelExport = new ExcelExport();
    let userInfo = window.sessionStorage.getItem('userInfo');

    class Application {

        // 等待DOM元素加载完毕的函数
        waitForElementToLoad(selector, callback) {
            var observer = new MutationObserver(function (mutationsList, observer) {
                var element = document.querySelector(selector);
                if (element) {
                    // 停止观察变化
                    observer.disconnect();
                    // 执行回调函数
                    callback();
                }
            });

            observer.observe(document.documentElement, { childList: true, subtree: true });
        }

        // 在DOM元素加载完毕后执行的函数
        scriptAfterDOMLoaded() {
            queryDataApi.queryTypeList().then(value => {
                excelExport.generateDownloadButton(value.data.items);
            });
        }

        main() {
            this.waitForElementToLoad(".ivu-table-fixed-body .ivu-table-tbody .ivu-table-row", this.scriptAfterDOMLoaded);
        }
    }

    let application = new Application();
    application.main();

})();