一、功能概述
订单批量打印是生鲜电商系统中提高订单处理效率的关键功能,允许运营人员一次性选择多个订单并打印配送单、发票或标签等文档。
二、技术实现方案
1. 前端实现
```javascript
// 示例:Vue.js实现批量选择与打印
<script>
export default {
data() {
return {
orders: [], // 从API获取的订单列表
selectedOrders: [],
selectAll: false
}
},
methods: {
toggleAll() {
if (this.selectAll) {
// 获取所有订单ID
this.selectedOrders = this.orders.map(o => o.id);
} else {
this.selectedOrders = [];
}
},
async batchPrint() {
if (this.selectedOrders.length === 0) return;
try {
const response = await api.getOrderPrintData(this.selectedOrders);
this.openPrintWindow(response.data);
} catch (error) {
console.error(批量打印失败:, error);
}
},
openPrintWindow(printData) {
const printWindow = window.open(, _blank);
printWindow.document.write(`
批量打印 <style>
@page { size: auto; margin: 5mm; }
.print-item { page-break-after: always; }
${printData.map(item => `
美菜生鲜配送单
订单号: ${item.orderNo}
客户: ${item.customerName}
地址: ${item.address}
商品列表:
${item.products.map(p => `- ${p.name} × ${p.quantity}
`).join()}
`).join()}
<script>
window.onload = function() {
window.print();
window.close();
};
<\/script>
`);
}
}
}
```
2. 后端实现(Node.js示例)
```javascript
// 订单批量打印API
const express = require(express);
const router = express.Router();
const OrderService = require(../services/orderService);
const PrintTemplate = require(../utils/printTemplate);
// 获取批量打印数据
router.get(/orders/print, async (req, res) => {
try {
const orderIds = req.query.orderIds.split(,);
const orders = await OrderService.getOrdersByIds(orderIds);
// 生成打印HTML
const printHtml = orders.map(order => {
return PrintTemplate.generateDeliveryNote(order);
}).join();
res.json({
success: true,
data: printHtml
});
} catch (error) {
console.error(批量打印错误:, error);
res.status(500).json({ success: false, message: 获取打印数据失败 });
}
});
module.exports = router;
```
3. 打印模板生成(PrintTemplate.js)
```javascript
class PrintTemplate {
static generateDeliveryNote(order) {
return `
美菜生鲜配送单
订单号:${order.orderNo}
客户:${order.customerName}
电话:${order.customerPhone}
地址:${order.deliveryAddress}
配送时间:${order.deliveryTime}
商品名称 |
规格 |
数量 |
单价 |
|---|
${order.items.map(item => `
${item.productName} |
${item.specification} |
${item.quantity} |
¥${item.price.toFixed(2)} |
`).join()}
总计:¥${order.totalAmount.toFixed(2)}
备注:${order.remark || 无}
`;
}
}
module.exports = PrintTemplate;
```
三、高级功能实现
1. 打印预览与自定义
```javascript
// 打印预览组件
const PrintPreview = {
template: `
`,
props: [printData],
data() {
return {
settings: {
showBarcode: true,
showPrice: true
}
}
},
mounted() {
this.renderPreview();
},
methods: {
renderPreview() {
const content = this.printData.map(order => {
let html = `
`;
html += `
美菜生鲜配送单
`;
if (this.settings.showBarcode) {
html += `
${this.generateBarcode(order.orderNo)}
`;
}
// 其他内容...
html += `
`;
return html;
}).join();
this.$refs.previewContent.innerHTML = content;
},
generateBarcode(text) {
// 使用JSBarcode等库生成条形码
return `
`;
},
print() {
const printWindow = window.open(, _blank);
printWindow.document.write(`
打印 <style>
@media print {
.print-page { page-break-after: always; }
/* 其他打印样式 */
}
${this.$refs.previewContent.innerHTML}
<script>
window.onload = function() {
window.print();
window.close();
};
<\/script>
`);
},
close() {
this.$emit(close);
}
}
}
```
2. 打印任务队列管理
```javascript
// 打印队列服务
class PrintQueue {
constructor() {
this.queue = [];
this.isPrinting = false;
}
async addToQueue(printJob) {
this.queue.push(printJob);
if (!this.isPrinting) {
await this.processQueue();
}
}
async processQueue() {
if (this.queue.length === 0) {
this.isPrinting = false;
return;
}
this.isPrinting = true;
const job = this.queue.shift();
try {
await this.executePrint(job);
// 打印成功后的回调
if (job.successCallback) {
job.successCallback();
}
} catch (error) {
console.error(打印失败:, error);
// 打印失败后的回调
if (job.errorCallback) {
job.errorCallback(error);
}
} finally {
await this.processQueue(); // 处理下一个任务
}
}
executePrint(job) {
return new Promise((resolve, reject) => {
// 实际打印逻辑,可能是调用浏览器打印API或发送到打印服务器
const printWindow = window.open(, _blank);
printWindow.document.write(job.htmlContent);
// 模拟打印完成
setTimeout(() => {
printWindow.close();
Math.random() > 0.2 ? resolve() : reject(new Error(模拟打印失败));
}, 1000);
});
}
}
// 使用示例
const printQueue = new PrintQueue();
// 添加打印任务
printQueue.addToQueue({
htmlContent:
订单内容...
,
successCallback: () => console.log(打印成功),
errorCallback: (err) => console.error(打印失败:, err)
});
```
四、部署与优化建议
1. 打印服务器方案:
- 对于大规模生鲜企业,建议部署专门的打印服务
- 使用Node.js + Express搭建打印服务
- 支持WebSocket实时打印通知
2. 打印优化措施:
- 实现打印模板的热更新(无需重启服务)
- 添加打印日志记录
- 支持打印任务的重试机制
3. 浏览器兼容性处理:
- 检测浏览器打印支持情况
- 提供备用打印方案(如PDF导出)
4. 性能优化:
- 批量获取订单数据时使用分页或流式处理
- 打印内容生成时使用虚拟DOM提高性能
- 对于大量订单,实现分批打印功能
五、完整实现流程
1. 用户选择多个订单
2. 前端收集选中订单ID并发送到后端
3. 后端查询订单详细信息并生成打印HTML
4. 前端接收HTML内容并打开打印预览窗口
5. 用户确认后触发浏览器打印对话框
6. 打印完成后记录打印日志
以上方案可根据美菜生鲜的实际业务需求和技术栈进行调整和扩展。