功能概述 快驴生鲜系统的订单批量打印功能旨在提高订单处理效率,减少人工操作时间,特别适用于高峰期大量订单需要同时处理的场景。 技术实现方案 1.前端实现 ```javascript //示例:批量选择订单并触发打印 functionbatchPrintOrders
功能概述
快驴生鲜系统的订单批量打印功能旨在提高订单处理效率,减少人工操作时间,特别适用于高峰期大量订单需要同时处理的场景。
技术实现方案
1. 前端实现
```javascript
// 示例:批量选择订单并触发打印
function batchPrintOrders() {
const selectedOrders = getSelectedOrders(); // 获取选中的订单ID数组
if (selectedOrders.length === 0) {
alert(请至少选择一个订单);
return;
}
// 调用后端批量打印接口
fetch(/api/orders/batch-print, {
method: POST,
headers: {
Content-Type: application/json,
},
body: JSON.stringify({ orderIds: selectedOrders }),
})
.then(response => response.json())
.then(data => {
if (data.success) {
// 调用浏览器打印功能(或使用打印插件)
printOrders(data.printData);
} else {
alert(批量打印失败: + data.message);
}
});
}
// 打印函数(可根据实际需求调整)
function printOrders(printData) {
const printWindow = window.open(, _blank);
printWindow.document.write(`
订单打印 <style>
/* 添加打印样式 */
.order-print {
page-break-after: always;
font-family: Arial, sans-serif;
}
/* 其他样式... */
${printData.map(order => `
快驴生鲜订单
订单号: ${order.orderNumber}
客户: ${order.customerName}
地址: ${order.address}
电话: ${order.phone}
下单时间: ${order.orderTime}
商品清单
${order.items.map(item => `
- ${item.name} × ${item.quantity} (${item.unit})
`).join()}
总计: ¥${order.totalAmount}
`).join()}
`);
printWindow.document.close();
printWindow.focus();
setTimeout(() => {
printWindow.print();
printWindow.close();
}, 500);
}
```
2. 后端实现(Node.js示例)
```javascript
const express = require(express);
const router = express.Router();
const OrderService = require(../services/orderService);
const PrintTemplateService = require(../services/printTemplateService);
// 批量打印订单接口
router.post(/batch-print, async (req, res) => {
try {
const { orderIds } = req.body;
if (!orderIds || !Array.isArray(orderIds) || orderIds.length === 0) {
return res.status(400).json({
success: false,
message: 无效的订单ID参数
});
}
// 1. 查询订单数据
const orders = await OrderService.getOrdersByIds(orderIds);
if (orders.length === 0) {
return res.status(404).json({
success: false,
message: 未找到指定订单
});
}
// 2. 获取打印模板
const template = await PrintTemplateService.getTemplate(order);
// 3. 生成打印数据(可根据实际模板调整)
const printData = orders.map(order => ({
orderNumber: order.orderNumber,
customerName: order.customer.name,
address: order.deliveryAddress,
phone: order.customer.phone,
orderTime: order.createdAt,
items: order.items.map(item => ({
name: item.product.name,
quantity: item.quantity,
unit: item.product.unit
})),
totalAmount: order.totalAmount
}));
// 4. 返回打印数据(前端处理打印)
// 或者直接生成PDF返回(需要PDF生成库)
res.json({
success: true,
printData
});
} catch (error) {
console.error(批量打印订单失败:, error);
res.status(500).json({
success: false,
message: 服务器错误
});
}
});
module.exports = router;
```
3. 数据库优化
为支持批量查询,确保订单表有适当的索引:
```sql
CREATE INDEX idx_order_ids ON orders (id);
-- 如果经常按订单号查询
CREATE INDEX idx_order_number ON orders (order_number);
```
4. 高级实现方案(PDF生成)
对于更专业的打印需求,可以使用PDF生成库:
```javascript
// 使用pdfkit生成PDF示例
const PDFDocument = require(pdfkit);
const fs = require(fs);
function generateOrderPDF(orders, outputPath) {
return new Promise((resolve, reject) => {
const doc = new PDFDocument({ size: A4, margin: 20 });
const writeStream = fs.createWriteStream(outputPath);
doc.pipe(writeStream);
orders.forEach((order, index) => {
if (index > 0) doc.addPage();
doc.fontSize(20).text(快驴生鲜订单, { align: center });
doc.fontSize(12).text(`订单号: ${order.orderNumber}`, { align: right });
doc.moveDown(0.5);
doc.text(`客户: ${order.customerName}`);
doc.text(`地址: ${order.address}`);
doc.text(`电话: ${order.phone}`);
doc.text(`下单时间: ${order.orderTime}`);
doc.moveDown(1);
doc.text(商品清单, { underline: true });
order.items.forEach(item => {
doc.text(`${item.name} × ${item.quantity} ${item.unit}`);
});
doc.moveDown(1);
doc.text(`总计: ¥${order.totalAmount.toFixed(2)}`, { align: right });
});
doc.end();
writeStream.on(finish, () => resolve(outputPath));
writeStream.on(error, reject);
});
}
```
完整系统架构建议
1. 前端层:
- 订单列表页面添加批量选择功能
- 批量打印按钮
- 打印预览功能(可选)
2. 后端服务层:
- 订单查询服务
- 打印模板管理服务
- PDF生成服务(可选)
3. 数据层:
- 订单数据库
- 打印模板数据库
4. 扩展功能:
- 打印任务队列(处理大量订单时)
- 打印历史记录
- 打印异常重试机制
- 多打印机支持(按配送区域分配打印机)
部署考虑
1. 对于高并发场景,考虑使用消息队列(如RabbitMQ)处理打印任务
2. 打印服务可以独立部署,避免影响主业务系统
3. 考虑使用WebSocket实现打印状态实时反馈
安全考虑
1. 打印权限控制
2. 订单数据加密传输
3. 打印日志记录
以上方案可根据快驴生鲜的实际业务需求和技术栈进行调整优化。