// ==UserScript==
// @name dxm
// @namespace https://greasyfork.org/zh-CN/scripts/462551
// @version 2.0
// @description 统计当前订单件数 & 针对区域定价的报关金额进行批量填充
// @author Huang
// @match https://www.dianxiaomi.com/order/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=dianxiaomi.com
// @grant GM_addStyle
// @license MIT
// @downloadURL none
// ==/UserScript==
(function () {
class Utils {
// 模拟input
static tEvent (b, a) {
if (b) {
window.newhtmlevents = window.newhtmlevents || document.createEvent("HTMLEvents");
newhtmlevents.initEvent(a, true, true);
return b.dispatchEvent(newhtmlevents)
}
}
static simulateInput (ele, val) {
this.tEvent(ele, 'click')
this.tEvent(ele, 'input')
ele.value = val
this.tEvent(ele, "keyup")
this.tEvent(ele, "change")
this.tEvent(ele, "blur")
}
static htmlParser (htmlString) {
let parser = new DOMParser();
let doc = parser.parseFromString(htmlString, 'text/html');
return doc
}
}
class LookDetail {
constructor(responseTags) {
this.DETAIL_PAGE_URL = `https://csp.aliexpress.com/apps/order/detail?orderId=`;
this.detailTags = Utils.htmlParser(responseTags)
this.main()
}
main () {
// 查找所有的strong元素
var strongElements = this.detailTags.querySelectorAll('strong');
// 遍历所有strong标签,查找包含特定文本的元素
strongElements.forEach(ele => {
let text = ele.textContent
if (text.includes('站点')) {
if (text.includes('半托管')) {
this.uniFeature(strongElements, '平台编号')
} else {//不是半托,目前为pop单
this.uniFeature(strongElements, '订单号')
}
}
});
}
uniFeature (strongElements, splitText) {
strongElements.forEach(viceEle => {
let orderNumTag = viceEle.textContent
if (orderNumTag.includes(splitText)) {
let orderId = orderNumTag.split(splitText)[1].replace(':', '')
let url = `${this.DETAIL_PAGE_URL}${orderId}`
$('#orderDetailClose1').click()
window.open(url)
}
})
}
}
class Summary {
constructor() {
this.compute()
}
// 统计订单件数
compute () {
let titleRows = document.querySelectorAll('.goodsId')
titleRows.forEach(titleRow => {
let total = 0;
let nextElement = titleRow.nextElementSibling;
this.lookFreight(nextElement, titleRow)
while (nextElement && !nextElement.classList.contains('goodsId')) {
let numBoxes = nextElement.querySelectorAll('[class^="circularSpan"]')
for (let numBox of numBoxes) {
let num = parseInt(numBox.textContent)
total += num
}
nextElement = nextElement.nextElementSibling;
}
titleRow.insertAdjacentHTML("beforeend", `
${total}件
`)
})
}
// 查看运费
lookFreight (contentRow, titleRow) {
let orderId = contentRow.querySelector('.tableOrderId a').innerText
titleRow.insertAdjacentHTML("beforeend", `查看运费`)
}
}
class Declare {
static finalDeclareValues = []
static init () {
// 从 批量操作 -> 批量报关信息 操作时的步骤
$(document).off('click', `a[onclick="showBatchCustoms();"]`)
$(document).on('click', `a[onclick="showBatchCustoms();"]`, () => {
Declare.prepareData()
})
// 直接申请运单号时的步骤
Declare.applyTrackingDirect()
}
static applyTrackingDirect () {
// 移除原有的申请运单号事件
$(`button[onclick="batchMoveProcessed();"]`).each(function () {
$(this).attr('onclick', null)
})
// 添加自动化流程
$(document).off('click', "[id^='moveProcessBtn']")
$(document).on('click', "[id^='moveProcessBtn']", () => {
let isCheckedAnyone = $(`#showSelCheckboxNum`).length > 0
if (!isCheckedAnyone) {
$.fn.message({ type: "error", msg: "请至少选择一个订单ya" })
return
}
Declare.prepareData()
showBatchCustoms()
setTimeout(() => {
executeBatchCustom(1)
// https://www.dianxiaomi.com/static/js/orderIndex.js?v=vh72.03 4708行
// $("#orderbatchCustomsInfo").customModal("hide")
$('a[data-close="modal"]').click()
}, 1000)
})
}
// 准备要在报关列表用到的数据
static prepareData () {
let t = [], that = this
$(`input[name='packageId']`).each(function () {
if ($(this).prop('checked')) {
let eleList = $(this).closest('tr').next().children().eq(0).find('tr')
if (eleList.length == 1) {//当前订单只有一件时以订单总金额为准
let singlePrice = $(eleList[0]).closest('td').next().text().replace(/[^0-9.]/g, "")
t.push(singlePrice)
} else {
eleList.each((i, e) => t.push($(e).find("p:contains('USD')").text().replace(/[^0-9.]/g, "")))
}
that.finalDeclareValues = t
}
})
}
static fillValues () {
let that = this
const [chsName, engName, weight] = ['狗衣服', 'Dog Clothes', 50]
$(`input[name="declaredValues"]`).each(function (index) {
Utils.simulateInput($(this).get(0), that.finalDeclareValues[index])
})
$(`input[name="nameChs"]`).each(function (index) {
if ($(this).val() == '') Utils.simulateInput($(this).get(0), chsName)
})
$(`input[name="nameEns"]`).each(function (index) {
if ($(this).val() == '') Utils.simulateInput($(this).get(0), engName)
})
$(`input[name="weights"]`).each(function (index) {
let curVal = $(this).val()
if (curVal == '' || curVal == 0) Utils.simulateInput($(this).get(0), weight)
})
}
}
jQuery.ajaxPrefilter(function (options, originalOptions, jqXHR) {
const { url } = options
const keywords = ['list.htm', 'splitList.htm', 'mergeList.htm', 'searchPackage.htm']
const delay = 50
jqXHR.done(function (data) {
if (!data) return
Declare.init()
// 命中以下请求才统计件数
if (keywords.some(u => url.includes(u))) {
setTimeout(() => new Summary(), delay);
}
if (url.includes('showBatchCustoms.htm')) setTimeout(() => Declare.fillValues(), delay)
if (url.includes('detail.htm')) setTimeout(() => new LookDetail(data), delay);
})
})
let css = `
h3.total-num {
color: #007bff;
position: absolute;
left: 200px;
top: 7px;
font-size:13px;
}
#orderListTable tr.goodsId {
position: relative;
}
.look-freight{
color: #28a745;
position: absolute;
left: 300px;
top: 4px;
font-size:13px;
}
#dxmOrderDetailDiv{
display:none
}
`
GM_addStyle(css)
})()