/** * 生成订单批量下单标准模板 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()