131 lines
7.5 KiB
JavaScript
131 lines
7.5 KiB
JavaScript
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
|
|
const html = fs.readFileSync('workbench.html', 'utf8');
|
|
|
|
function extractFunction(name) {
|
|
const start = html.indexOf(`function ${name}(`);
|
|
assert.notEqual(start, -1, `${name} should exist`);
|
|
const bodyStart = html.indexOf('{', start);
|
|
let depth = 0;
|
|
for (let index = bodyStart; index < html.length; index += 1) {
|
|
if (html[index] === '{') depth += 1;
|
|
if (html[index] === '}') depth -= 1;
|
|
if (depth === 0) return html.slice(start, index + 1);
|
|
}
|
|
throw new Error(`Unable to extract ${name}`);
|
|
}
|
|
|
|
const inboundPage = html.match(/<div class="page-content" id="page-inbound">([\s\S]*?)<!-- ========== PAGE: 头程订单详情/)?.[1] || '';
|
|
assert.ok(inboundPage, 'inbound order list should exist');
|
|
assert.match(inboundPage, /onclick="openInboundBatchOrder\(\)"[^>]*>[\s\S]*?批量下单<\/button>/);
|
|
assert.doesNotMatch(inboundPage, /导出订单尾程信息/);
|
|
assert.match(inboundPage, /class="filter-item inbound-destination-filter"[\s\S]*?id="inbound-filter-destination-type"[\s\S]*?onclick="filterInboundOrders\(\)"[\s\S]*?>查询<\/button>/);
|
|
|
|
const modalStart = html.indexOf('<div class="topup-overlay hidden" id="inbound-batch-order-modal"');
|
|
const modalEnd = html.indexOf('<div class="sea-edit-overlay"', modalStart);
|
|
const modal = modalStart >= 0 && modalEnd > modalStart ? html.slice(modalStart, modalEnd) : '';
|
|
assert.ok(modal, 'batch order modal should exist');
|
|
assert.match(modal, /下载模板/);
|
|
assert.match(modal, /id="inbound-batch-order-file"[^>]*accept="\.xlsx,\.xls"/);
|
|
assert.match(modal, /onclick="submitInboundBatchOrder\(\)"[^>]*>提交订单<\/button>/);
|
|
|
|
const getTemplateSheets = vm.runInNewContext(`(${extractFunction('getInboundBatchTemplateSheets')})`);
|
|
const sheets = getTemplateSheets();
|
|
assert.deepEqual(Array.from(sheets, sheet => sheet.name), ['订单信息', '商品信息', '箱子信息']);
|
|
assert.deepEqual(Array.from(sheets, sheet => sheet.headers[0]), ['批次编号*', '批次编号*', '批次编号*']);
|
|
|
|
for (const sheet of sheets) {
|
|
const headers = Array.from(sheet.headers);
|
|
const firstOptional = headers.findIndex(header => !header.endsWith('*'));
|
|
assert.notEqual(firstOptional, -1, `${sheet.name} should include optional fields`);
|
|
assert.ok(headers.slice(0, firstOptional).every(header => header.endsWith('*')), `${sheet.name} required fields should come first`);
|
|
assert.ok(headers.slice(firstOptional).every(header => !header.endsWith('*')), `${sheet.name} optional fields should follow required fields`);
|
|
}
|
|
|
|
assert.ok(sheets[0].headers.includes('取货方式*'));
|
|
assert.ok(sheets[0].headers.includes('目的仓类型*'));
|
|
assert.ok(sheets[0].headers.includes('收货仓*'));
|
|
assert.ok(sheets[0].headers.includes('渠道*'));
|
|
assert.ok(sheets[0].headers.includes('买单/退税*'));
|
|
assert.ok(sheets[0].headers.includes('LX入库单号*'));
|
|
assert.ok(!sheets[0].headers.includes('一件代发仓*'));
|
|
assert.ok(sheets[0].headers.includes('订单备注'));
|
|
assert.ok(sheets[1].headers.includes('SKU NO.*'));
|
|
assert.ok(sheets[1].headers.includes('中文品名'));
|
|
assert.ok(sheets[2].headers.includes('关联 SKU*'));
|
|
assert.ok(sheets[2].headers.includes('箱数*'));
|
|
assert.ok(sheets[2].headers.includes('总体积(m³)'));
|
|
|
|
const validateWorkbookData = vm.runInNewContext(`(${extractFunction('validateInboundBatchWorkbookData')})`, {
|
|
getInboundBatchTemplateSheets: getTemplateSheets
|
|
});
|
|
const valid = validateWorkbookData({
|
|
订单信息: [sheets[0].headers, sheets[0].headers.map(header => header.endsWith('*') ? '示例值' : '')],
|
|
商品信息: [sheets[1].headers, sheets[1].headers.map(header => header.endsWith('*') ? '示例值' : '')],
|
|
箱子信息: [sheets[2].headers, sheets[2].headers.map(header => header.endsWith('*') ? '1' : '')]
|
|
});
|
|
assert.equal(valid.ok, true);
|
|
assert.deepEqual(Array.from(valid.counts), [1, 1, 1]);
|
|
|
|
const invalid = validateWorkbookData({
|
|
订单信息: [sheets[0].headers, sheets[0].headers.map(header => header === '订单备注' ? '测试备注' : '')],
|
|
商品信息: [sheets[1].headers],
|
|
箱子信息: [sheets[2].headers]
|
|
});
|
|
assert.equal(invalid.ok, false);
|
|
assert.match(invalid.message, /订单信息.*第 2 行.*批次编号/);
|
|
|
|
function makeRow(headers, values) {
|
|
return headers.map(header => values[header] || '');
|
|
}
|
|
|
|
const conditionalInvalid = validateWorkbookData({
|
|
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
|
|
'批次编号*':'B001', '取货方式*':'我司提货(有取货费)', '目的仓类型*':'FBA仓', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', 'FBA仓编码*':'ONT8'
|
|
})],
|
|
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B001', 'SKU NO.*':'SKU-01'})],
|
|
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B001', '关联 SKU*':'SKU-01', '箱数*':'2'})]
|
|
});
|
|
assert.equal(conditionalInvalid.ok, false);
|
|
assert.match(conditionalInvalid.message, /提货时间/);
|
|
|
|
const fulfillmentInvalid = validateWorkbookData({
|
|
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
|
|
'批次编号*':'B002', '取货方式*':'自送货', '目的仓类型*':'一件代发', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00'
|
|
})],
|
|
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B002', 'SKU NO.*':'SKU-02'})],
|
|
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B002', '关联 SKU*':'SKU-02', '箱数*':'1'})]
|
|
});
|
|
assert.equal(fulfillmentInvalid.ok, false);
|
|
assert.match(fulfillmentInvalid.message, /LX入库单号/);
|
|
|
|
const createOrders = vm.runInNewContext(`(${extractFunction('createInboundOrdersFromBatchData')})`);
|
|
const orders = createOrders({
|
|
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
|
|
'批次编号*':'B001', '取货方式*':'自送货', '目的仓类型*':'FBA仓', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00', 'FBA仓编码*':'ONT8', '订单备注':'测试订单'
|
|
})],
|
|
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B001', 'SKU NO.*':'SKU-01'})],
|
|
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B001', '关联 SKU*':'SKU-01', '箱数*':'2', '总毛重(kg)':'20', '总净重(kg)':'18', '总体积(m³)':'0.2'})]
|
|
}, new Date('2026-09-04T12:30:00'));
|
|
assert.equal(orders.length, 1);
|
|
assert.equal(orders[0].destinationWarehouse, 'ONT8');
|
|
assert.equal(orders[0].skus, 'SKU-01');
|
|
assert.equal(orders[0].boxes, 2);
|
|
assert.equal(orders[0].grossWeight, '20 kg');
|
|
assert.equal(orders[0].volume, '0.2 m³');
|
|
assert.equal(orders[0].status, '待处理');
|
|
|
|
const fulfillmentOrders = createOrders({
|
|
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
|
|
'批次编号*':'B003', '取货方式*':'自送货', '目的仓类型*':'一件代发', '收货仓*':'深圳仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00', 'LX入库单号*':'LX20260904001'
|
|
})],
|
|
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B003', 'SKU NO.*':'SKU-03'})],
|
|
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B003', '关联 SKU*':'SKU-03', '箱数*':'1'})]
|
|
}, new Date('2026-09-04T12:30:00'));
|
|
assert.equal(fulfillmentOrders[0].destinationWarehouse, 'LX20260904001');
|
|
assert.equal(fulfillmentOrders[0].lxInboundNo, 'LX20260904001');
|
|
|
|
console.log('inbound batch order requirements: ok');
|