68 lines
3.0 KiB
JavaScript
68 lines
3.0 KiB
JavaScript
/**
|
||
* 生成订单批量下单标准模板 Excel
|
||
* 基于 /api/order/parcel/create 接口结构
|
||
* 运行: node scripts/generate-order-template.js
|
||
*/
|
||
import * as XLSX from 'xlsx'
|
||
import { fileURLToPath } from 'url'
|
||
import { dirname, join } from 'path'
|
||
import { mkdirSync, existsSync } from 'fs'
|
||
|
||
const VERBOSE_SCRIPT_LOGS = process.env.DEBUG_SCRIPT_LOGS === 'true'
|
||
if (!VERBOSE_SCRIPT_LOGS) {
|
||
console.log = () => {}
|
||
console.warn = () => {}
|
||
}
|
||
|
||
const __filename = fileURLToPath(import.meta.url)
|
||
const __dirname = dirname(__filename)
|
||
|
||
// 表头:订单+件重尺+发件人+收件人+申报明细(单条)
|
||
const headers = [
|
||
// 订单信息 t_order
|
||
['客户单号', '跟踪号', '运单号', '产品代码', '渠道代码', '货物属性', '仓库ID', '客户ID', '是否COD', 'COD币种', 'COD金额'],
|
||
// 件重尺 t_order_weight
|
||
['长(cm)', '宽(cm)', '高(cm)', '实重(kg)', '体积重(kg)', '计费重(kg)', '立方(m³)'],
|
||
// 发件人 t_order_sender
|
||
['发件人姓名', '发件人公司', '发件人手机', '发件人电话', '发件人邮箱', '发件人国家', '发件人省州', '发件人城市', '发件人邮编', '发件人地址1', '发件人地址2', '发件人地址3', '发件人门牌号'],
|
||
// 收件人 t_order_recipient
|
||
['收件人姓名', '收件人公司', '收件人手机', '收件人电话', '收件人邮箱', '收件人国家', '收件人省州', '收件人城市', '收件人门牌号', '收件人地址1', '收件人地址2', '收件人地址3', '收件人邮编', '税号类型', '税号', '证件类型', '证件号码', 'EORI', 'VAT'],
|
||
// 申报明细 t_order_declaration(首条)
|
||
['品名-中', '品名-英', 'SKU', '单位', '单价', '单重(kg)', '数量', '总金额', '总重量(kg)', 'HS编码', '图片URL', '类别', '品牌', '品牌类型', '是否带磁带电', '配货信息', '材质', '英文材质', '用途', '属性', '原产国', '销售链接', '型号', '规格', '备注'],
|
||
].flat()
|
||
|
||
// 示例行(空值,供用户填写)
|
||
const exampleRow = headers.map(() => '')
|
||
|
||
// 说明行
|
||
const noteRow = ['请勿修改表头,按列填写数据。货物属性填:普货、3c&带电、敏感货。多件申报时,同一订单可多行,订单/发件人/收件人信息重复填写。']
|
||
|
||
function generateTemplate() {
|
||
const wb = XLSX.utils.book_new()
|
||
const wsData = [
|
||
noteRow,
|
||
headers,
|
||
exampleRow,
|
||
exampleRow,
|
||
]
|
||
const ws = XLSX.utils.aoa_to_sheet(wsData)
|
||
|
||
// 列宽
|
||
ws['!cols'] = headers.map((_, i) => ({ wch: Math.min(18, Math.max(10, (headers[i] || '').length + 2)) }))
|
||
|
||
// 冻结首行和表头行
|
||
ws['!freeze'] = { xSplit: 0, ySplit: 2, topLeftCell: 'A3', state: 'frozen' }
|
||
|
||
XLSX.utils.book_append_sheet(wb, ws, '批量下单模板')
|
||
|
||
const outDir = join(__dirname, '../public/templates')
|
||
if (!existsSync(outDir)) {
|
||
mkdirSync(outDir, { recursive: true })
|
||
}
|
||
const outPath = join(outDir, 'order-standard-template.xlsx')
|
||
XLSX.writeFile(wb, outPath)
|
||
console.log('Generated:', outPath)
|
||
}
|
||
|
||
generateTemplate()
|