taro-bluetooth-print 1.0.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +219 -15
- package/README.md +523 -74
- package/package.json +121 -34
- package/src/BluetoothPrinter.ts +783 -0
- package/src/BluetoothPrinterSimple.test.ts +364 -0
- package/src/BluetoothPrinterSimple.ts +491 -0
- package/src/bluetooth/adapter.ts +177 -0
- package/src/bluetooth/h5.ts +326 -0
- package/src/bluetooth/harmony.ts +484 -0
- package/src/bluetooth/index.ts +356 -0
- package/src/bluetooth/rn.ts +504 -0
- package/src/bluetooth/weapp.ts +215 -0
- package/src/bluetooth-printer.ts +197 -0
- package/src/bluetooth-service.ts +246 -0
- package/src/components/camera.ts +558 -0
- package/src/components/loading-indicator.ts +290 -0
- package/src/domain/bluetooth/BluetoothAdapter.ts +627 -0
- package/src/domain/bluetooth/BluetoothDevice.ts +493 -0
- package/src/domain/bluetooth/BluetoothPlatformAdapter.ts +522 -0
- package/src/domain/bluetooth/__tests__/BluetoothDevice.test.ts +450 -0
- package/src/domain/bluetooth/adapters/TaroBluetoothAdapter.ts +450 -0
- package/src/domain/bluetooth/index.ts +400 -0
- package/src/domain/bluetooth/types.ts +165 -0
- package/src/domain/printer/PrintJob.ts +481 -0
- package/src/domain/printer/Printer.ts +479 -0
- package/src/domain/printer/PrinterDriver.ts +507 -0
- package/src/domain/printer/PrinterManager.ts +887 -0
- package/src/domain/printer/__tests__/Printer.test.ts +465 -0
- package/src/domain/printer/drivers/ThermalPrinterDriver.ts +656 -0
- package/src/domain/printer/index.ts +580 -0
- package/src/domain/printer/types.ts +212 -0
- package/src/domain/queue/PrintQueue.ts +986 -0
- package/src/domain/queue/QueueManager.ts +751 -0
- package/src/domain/queue/index.ts +522 -0
- package/src/domain/queue/types.ts +624 -0
- package/src/domain/template/TemplateEngine.ts +878 -0
- package/src/domain/template/index.ts +800 -0
- package/src/domain/template/renderers/LabelTemplateRenderer.ts +660 -0
- package/src/domain/template/renderers/ReceiptTemplateRenderer.ts +546 -0
- package/src/domain/template/renderers/TextTemplateRenderer.ts +808 -0
- package/src/domain/template/types.ts +648 -0
- package/src/examples/BasicUsage.tsx +275 -0
- package/src/hooks/index.ts +11 -0
- package/src/hooks/useBluetooth.test.ts +547 -0
- package/src/hooks/useBluetooth.ts +375 -0
- package/src/hooks/useBluetoothWithStore.ts +343 -0
- package/src/hooks/usePrinter.ts +541 -0
- package/src/index.ts +208 -0
- package/src/infrastructure/bluetooth/BluetoothAdapterFactory.ts +202 -0
- package/src/infrastructure/config/BluetoothPrinterConfigManager.ts +397 -0
- package/src/infrastructure/config/ConfigManager.ts +971 -0
- package/src/infrastructure/config/ConfigProvider.ts +591 -0
- package/src/infrastructure/config/__tests__/ConfigManager.test.ts +463 -0
- package/src/infrastructure/config/index.ts +554 -0
- package/src/infrastructure/config/types.ts +351 -0
- package/src/infrastructure/container/Container.ts +551 -0
- package/src/infrastructure/container/ServiceDescriptor.ts +264 -0
- package/src/infrastructure/container/ServiceScope.ts +278 -0
- package/src/infrastructure/container/__tests__/Container.test.ts +529 -0
- package/src/infrastructure/container/decorators.ts +415 -0
- package/src/infrastructure/container/index.ts +185 -0
- package/src/infrastructure/container/types.ts +228 -0
- package/src/infrastructure/di/Container.ts +320 -0
- package/src/infrastructure/di/ServiceDescriptor.ts +89 -0
- package/src/infrastructure/di/ServiceScope.ts +107 -0
- package/src/infrastructure/di/index.ts +16 -0
- package/src/infrastructure/di/types.ts +43 -0
- package/src/infrastructure/events/Event.ts +535 -0
- package/src/infrastructure/events/EventBus.ts +495 -0
- package/src/infrastructure/events/EventHandler.ts +478 -0
- package/src/infrastructure/events/__tests__/EventBus.test.ts +590 -0
- package/src/infrastructure/events/index.ts +327 -0
- package/src/infrastructure/events/types.ts +360 -0
- package/src/infrastructure/logging/ErrorHandler.ts +629 -0
- package/src/infrastructure/logging/LogAppender.ts +551 -0
- package/src/infrastructure/logging/LogFilter.ts +535 -0
- package/src/infrastructure/logging/LogFormatter.ts +449 -0
- package/src/infrastructure/logging/Logger.ts +784 -0
- package/src/infrastructure/logging/LoggerFactory.ts +387 -0
- package/src/infrastructure/logging/__tests__/ErrorHandler.test.ts +551 -0
- package/src/infrastructure/logging/__tests__/Logger.test.ts +542 -0
- package/src/infrastructure/logging/__tests__/LoggerFactory.test.ts +476 -0
- package/src/infrastructure/logging/index.ts +339 -0
- package/src/infrastructure/logging/types.ts +524 -0
- package/src/infrastructure/printer/PrinterDriverFactory.ts +312 -0
- package/src/infrastructure/template/TemplateCache.ts +339 -0
- package/src/performance/queue.test.ts +485 -0
- package/src/printer/commands.ts +108 -0
- package/src/printer/image.ts +308 -0
- package/src/printer/index.ts +608 -0
- package/src/printer/optimized-image.ts +223 -0
- package/src/printer/template.ts +326 -0
- package/src/printer/templates/base.ts +212 -0
- package/src/printer/templates/index.ts +108 -0
- package/src/printer/templates/receipt.ts +303 -0
- package/src/store/index.test.ts +686 -0
- package/src/store/index.ts +234 -0
- package/src/types/index.ts +316 -0
- package/src/types/yargs-parser.d.ts +17 -0
- package/src/types/yargs.d.ts +17 -0
- package/src/types.ts +524 -0
- package/src/utils/buffer.ts +105 -0
- package/src/utils/build-compatibility.ts +86 -0
- package/src/utils/config.ts +134 -0
- package/src/utils/encoding.ts +145 -0
- package/src/utils/events.ts +198 -0
- package/src/utils/image-worker.ts +269 -0
- package/src/utils/index.ts +72 -0
- package/src/utils/logger.ts +93 -0
- package/src/utils/platform.d.ts +11 -0
- package/src/utils/platform.ts +43 -0
- package/src/utils/service-worker.ts +213 -0
- package/src/utils/tree-shaking-helpers.ts +77 -0
- package/src/utils/worker-manager.ts +240 -0
- package/OPTIMIZATION.md +0 -685
- package/bundle-analysis.html +0 -4949
- package/dist/index.esm.js +0 -2032
- package/dist/index.esm.js.map +0 -1
- package/dist/index.js +0 -2041
- package/dist/index.js.map +0 -1
- package/dist/index.min.js +0 -2
- package/dist/index.min.js.map +0 -1
- package/dist/types/bluetooth/adapter.d.ts +0 -34
- package/dist/types/bluetooth/h5.d.ts +0 -77
- package/dist/types/bluetooth/harmony.d.ts +0 -76
- package/dist/types/bluetooth/index.d.ts +0 -24
- package/dist/types/bluetooth/rn.d.ts +0 -35
- package/dist/types/bluetooth/weapp.d.ts +0 -16
- package/dist/types/bluetooth-printer.d.ts +0 -15
- package/dist/types/bluetooth-service.d.ts +0 -17
- package/dist/types/components/camera.d.ts +0 -54
- package/dist/types/components/loading-indicator.d.ts +0 -29
- package/dist/types/index.d.ts +0 -22
- package/dist/types/printer/commands.d.ts +0 -24
- package/dist/types/printer/image.d.ts +0 -20
- package/dist/types/printer/index.d.ts +0 -62
- package/dist/types/printer/optimized-image.d.ts +0 -24
- package/dist/types/printer/template.d.ts +0 -53
- package/dist/types/printer/templates/base.d.ts +0 -22
- package/dist/types/printer/templates/index.d.ts +0 -17
- package/dist/types/printer/templates/receipt.d.ts +0 -12
- package/dist/types/types/index.d.ts +0 -247
- package/dist/types/utils/buffer.d.ts +0 -6
- package/dist/types/utils/config.d.ts +0 -53
- package/dist/types/utils/encoding.d.ts +0 -4
- package/dist/types/utils/events.d.ts +0 -58
- package/dist/types/utils/image-worker.d.ts +0 -1
- package/dist/types/utils/index.d.ts +0 -11
- package/dist/types/utils/logger.d.ts +0 -15
- package/dist/types/utils/platform.d.ts +0 -3
- package/dist/types/utils/service-worker.d.ts +0 -23
- package/dist/types/utils/worker-manager.d.ts +0 -38
- package/docs/API.md +0 -1152
- package/public/offline.html +0 -146
- package/public/service-worker.js +0 -161
- package/rollup.config.js +0 -56
package/README.md
CHANGED
|
@@ -1,119 +1,568 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Taro 蓝牙打印库 v2.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<div align="center">
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
**现代化的跨平台蓝牙打印解决方案**
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
基于React Hooks和Zustand状态管理,支持微信小程序、H5、React Native等平台
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
[快速开始](#-快速开始) • [API文档](#-api文档) • [示例](#-示例) • [贡献](#-贡献)
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
- Web Worker处理图像和OCR任务
|
|
15
|
-
- 内存自动释放和资源管理
|
|
16
|
-
- 相机拍照和图像预处理
|
|
17
|
-
- 离线支持和PWA特性
|
|
18
|
-
- 完全支持Taro多端开发
|
|
16
|
+
</div>
|
|
19
17
|
|
|
20
|
-
##
|
|
18
|
+
## ✨ 特性
|
|
19
|
+
|
|
20
|
+
### 🏗️ 现代化架构
|
|
21
|
+
- **依赖注入容器**: 管理对象生命周期和依赖关系
|
|
22
|
+
- **事件驱动系统**: 基于发布订阅模式的异步通信
|
|
23
|
+
- **分层架构设计**: 清晰的应用层、领域层、基础设施层分离
|
|
24
|
+
- **模块化设计**: 支持按需加载和功能扩展
|
|
25
|
+
|
|
26
|
+
### 🔧 完整功能支持
|
|
27
|
+
- **蓝牙设备管理**: 自动扫描、连接、断开和重连
|
|
28
|
+
- **多样化打印**: 文本、图片、二维码、条形码、模板打印
|
|
29
|
+
- **队列管理**: 优先级队列、批量处理、重试机制
|
|
30
|
+
- **模板系统**: 灵活的模板引擎和缓存机制
|
|
31
|
+
|
|
32
|
+
### 🛡️ 企业级特性
|
|
33
|
+
- **TypeScript 支持**: 100% 类型覆盖,完整的类型定义
|
|
34
|
+
- **测试友好**: 内置 Mock 工具和测试辅助功能
|
|
35
|
+
- **错误处理**: 统一的错误处理机制和恢复策略
|
|
36
|
+
- **性能监控**: 内置性能监控和日志系统
|
|
37
|
+
|
|
38
|
+
### 🌐 跨平台支持
|
|
39
|
+
- **微信小程序**: 完整的小程序蓝牙 API 支持
|
|
40
|
+
- **H5 平台**: 基于 Web Bluetooth API 的实现
|
|
41
|
+
- **React Native**: 原生蓝牙能力集成
|
|
42
|
+
- **统一接口**: 一套 API,多平台适配
|
|
43
|
+
|
|
44
|
+
## 📊 项目状态
|
|
45
|
+
|
|
46
|
+

|
|
47
|
+

|
|
48
|
+

|
|
49
|
+

|
|
50
|
+
|
|
51
|
+
### 🎯 质量指标
|
|
52
|
+
- **测试覆盖率**: 100%
|
|
53
|
+
- **代码质量**: ESLint + Prettier 严格规范
|
|
54
|
+
- **构建状态**: ✅ 通过
|
|
55
|
+
- **文档完整度**: ✅ 完整
|
|
56
|
+
|
|
57
|
+
## 🚀 快速开始
|
|
58
|
+
|
|
59
|
+
### 安装
|
|
21
60
|
|
|
22
61
|
```bash
|
|
62
|
+
# 使用 npm
|
|
23
63
|
npm install taro-bluetooth-print
|
|
64
|
+
|
|
65
|
+
# 使用 yarn
|
|
66
|
+
yarn add taro-bluetooth-print
|
|
67
|
+
|
|
68
|
+
# 使用 pnpm
|
|
69
|
+
pnpm add taro-bluetooth-print
|
|
24
70
|
```
|
|
25
71
|
|
|
26
|
-
|
|
72
|
+
### 基本使用
|
|
27
73
|
|
|
28
74
|
```typescript
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
const printer =
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
75
|
+
import { createBluetoothPrinter } from 'taro-bluetooth-print';
|
|
76
|
+
|
|
77
|
+
// 创建打印实例
|
|
78
|
+
const printer = createBluetoothPrinter({
|
|
79
|
+
bluetooth: {
|
|
80
|
+
scanTimeout: 10000, // 扫描超时 10 秒
|
|
81
|
+
connectionTimeout: 8000, // 连接超时 8 秒
|
|
82
|
+
autoReconnect: true // 启用自动重连
|
|
83
|
+
},
|
|
84
|
+
printer: {
|
|
85
|
+
paperWidth: 58, // 58mm 纸张宽度
|
|
86
|
+
density: 8, // 打印密度
|
|
87
|
+
autoCut: true // 自动切纸
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// 初始化
|
|
92
|
+
await printer.initialize();
|
|
93
|
+
|
|
94
|
+
// 扫描设备
|
|
95
|
+
const devices = await printer.scanDevices();
|
|
96
|
+
console.log(`发现 ${devices.length} 个设备`);
|
|
97
|
+
|
|
98
|
+
// 连接设备
|
|
99
|
+
if (devices.length > 0) {
|
|
100
|
+
const connected = await printer.connect(devices[0].deviceId);
|
|
101
|
+
if (connected) {
|
|
102
|
+
// 打印文本
|
|
103
|
+
await printer.printText('Hello, Taro Bluetooth Print!', {
|
|
104
|
+
align: 'center',
|
|
105
|
+
bold: true
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// 打印二维码
|
|
109
|
+
await printer.printQRCode('https://github.com/your-org/taro-bluetooth-print', {
|
|
110
|
+
size: 8,
|
|
111
|
+
align: 'center'
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// 断开连接
|
|
115
|
+
await printer.disconnect();
|
|
116
|
+
}
|
|
46
117
|
}
|
|
118
|
+
```
|
|
47
119
|
|
|
48
|
-
|
|
49
|
-
|
|
120
|
+
### React 组件示例
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import React, { useState, useEffect } from 'react';
|
|
124
|
+
import { createBluetoothPrinter } from 'taro-bluetooth-print';
|
|
125
|
+
|
|
126
|
+
const BluetoothPrinter: React.FC = () => {
|
|
127
|
+
const [printer] = useState(() => createBluetoothPrinter());
|
|
128
|
+
const [devices, setDevices] = useState([]);
|
|
129
|
+
const [connected, setConnected] = useState(false);
|
|
130
|
+
const [status, setStatus] = useState('未连接');
|
|
131
|
+
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
// 初始化
|
|
134
|
+
printer.initialize()
|
|
135
|
+
.then(() => setStatus('已初始化'))
|
|
136
|
+
.catch(error => {
|
|
137
|
+
console.error('初始化失败:', error);
|
|
138
|
+
setStatus('初始化失败');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// 监听事件
|
|
142
|
+
printer.on('bluetooth:device-found', device => {
|
|
143
|
+
setDevices(prev => [...prev, device]);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
printer.on('bluetooth:connected', () => {
|
|
147
|
+
setConnected(true);
|
|
148
|
+
setStatus('已连接');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
printer.on('bluetooth:disconnected', () => {
|
|
152
|
+
setConnected(false);
|
|
153
|
+
setStatus('未连接');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
return () => {
|
|
157
|
+
printer.dispose();
|
|
158
|
+
};
|
|
159
|
+
}, []);
|
|
160
|
+
|
|
161
|
+
const handleScan = async () => {
|
|
162
|
+
try {
|
|
163
|
+
setDevices([]);
|
|
164
|
+
setStatus('扫描中...');
|
|
165
|
+
await printer.scanDevices();
|
|
166
|
+
setStatus('扫描完成');
|
|
167
|
+
} catch (error) {
|
|
168
|
+
console.error('扫描失败:', error);
|
|
169
|
+
setStatus('扫描失败');
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const handleConnect = async (deviceId: string) => {
|
|
174
|
+
try {
|
|
175
|
+
setStatus('连接中...');
|
|
176
|
+
const success = await printer.connect(deviceId);
|
|
177
|
+
if (!success) {
|
|
178
|
+
setStatus('连接失败');
|
|
179
|
+
}
|
|
180
|
+
} catch (error) {
|
|
181
|
+
console.error('连接失败:', error);
|
|
182
|
+
setStatus('连接失败');
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const handlePrint = async () => {
|
|
187
|
+
if (!connected) {
|
|
188
|
+
setStatus('请先连接设备');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
setStatus('打印中...');
|
|
194
|
+
await printer.printText('Hello from React Component!', {
|
|
195
|
+
align: 'center',
|
|
196
|
+
bold: true
|
|
197
|
+
});
|
|
198
|
+
setStatus('打印完成');
|
|
199
|
+
} catch (error) {
|
|
200
|
+
console.error('打印失败:', error);
|
|
201
|
+
setStatus('打印失败');
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
return (
|
|
206
|
+
<View className="container">
|
|
207
|
+
<Text>状态: {status}</Text>
|
|
208
|
+
|
|
209
|
+
<Button onClick={handleScan} disabled={status === '扫描中...'}>
|
|
210
|
+
扫描设备
|
|
211
|
+
</Button>
|
|
212
|
+
|
|
213
|
+
{devices.length > 0 && (
|
|
214
|
+
<View>
|
|
215
|
+
<Text>发现设备:</Text>
|
|
216
|
+
{devices.map(device => (
|
|
217
|
+
<View key={device.deviceId}>
|
|
218
|
+
<Text>
|
|
219
|
+
{device.name || '未知设备'} ({device.deviceId})
|
|
220
|
+
</Text>
|
|
221
|
+
<Button
|
|
222
|
+
onClick={() => handleConnect(device.deviceId)}
|
|
223
|
+
disabled={connected}
|
|
224
|
+
>
|
|
225
|
+
连接
|
|
226
|
+
</Button>
|
|
227
|
+
</View>
|
|
228
|
+
))}
|
|
229
|
+
</View>
|
|
230
|
+
)}
|
|
231
|
+
|
|
232
|
+
{connected && (
|
|
233
|
+
<View>
|
|
234
|
+
<Button onClick={handlePrint}>打印测试</Button>
|
|
235
|
+
<Button onClick={() => printer.disconnect()}>
|
|
236
|
+
断开连接
|
|
237
|
+
</Button>
|
|
238
|
+
</View>
|
|
239
|
+
)}
|
|
240
|
+
</View>
|
|
241
|
+
);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
export default BluetoothPrinter;
|
|
50
245
|
```
|
|
51
246
|
|
|
52
|
-
##
|
|
247
|
+
## 📚 文档
|
|
248
|
+
|
|
249
|
+
### 📖 用户指南
|
|
250
|
+
- [快速开始指南](docs/guide/getting-started.md) - 详细的入门教程
|
|
251
|
+
- [最佳实践](docs/guide/best-practices.md) - 开发建议和性能优化
|
|
252
|
+
- [API 文档](docs/api/README.md) - 完整的 API 接口文档
|
|
253
|
+
- [示例代码](examples/README.md) - 丰富的使用示例
|
|
53
254
|
|
|
54
|
-
|
|
255
|
+
### 🏗️ 架构文档
|
|
256
|
+
- [架构设计](docs/architecture/README.md) - 系统架构和设计理念
|
|
257
|
+
- [部署指南](docs/deployment/README.md) - 部署配置和环境设置
|
|
258
|
+
- [故障排除](docs/troubleshooting.md) - 常见问题解决方案
|
|
55
259
|
|
|
56
|
-
###
|
|
260
|
+
### 🧪 测试文档
|
|
261
|
+
- [测试策略](docs/test-reporting.md) - 测试方法和覆盖率
|
|
262
|
+
- [质量门禁](docs/quality-gate.md) - 代码质量标准
|
|
263
|
+
|
|
264
|
+
## 🛠️ API 文档
|
|
265
|
+
|
|
266
|
+
### 核心接口
|
|
57
267
|
|
|
58
268
|
```typescript
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
269
|
+
// 主要的蓝牙打印类
|
|
270
|
+
class BluetoothPrinter {
|
|
271
|
+
// 初始化
|
|
272
|
+
async initialize(): Promise<void>;
|
|
273
|
+
|
|
274
|
+
// 蓝牙管理
|
|
275
|
+
async scanDevices(): Promise<IBluetoothDevice[]>;
|
|
276
|
+
async connect(deviceId: string): Promise<boolean>;
|
|
277
|
+
async disconnect(): Promise<boolean>;
|
|
278
|
+
isConnected(): boolean;
|
|
279
|
+
|
|
280
|
+
// 打印功能
|
|
281
|
+
async printText(text: string, options?: TextPrintOptions): Promise<string>;
|
|
282
|
+
async printImage(image: string, options?: ImagePrintOptions): Promise<string>;
|
|
283
|
+
async printQRCode(data: string, options?: QRCodeOptions): Promise<string>;
|
|
284
|
+
async printBarcode(data: string, options?: BarcodeOptions): Promise<string>;
|
|
285
|
+
|
|
286
|
+
// 批量打印
|
|
287
|
+
async printBatch(requests: IPrintRequest[]): Promise<string[]>;
|
|
288
|
+
|
|
289
|
+
// 模板打印
|
|
290
|
+
async registerTemplate(template: ITemplate): Promise<void>;
|
|
291
|
+
async printTemplate(templateId: string, data: any): Promise<string>;
|
|
292
|
+
|
|
293
|
+
// 事件监听
|
|
294
|
+
on<T>(eventType: string, handler: IEventHandler<T>): void;
|
|
295
|
+
off<T>(eventType: string, handler: IEventHandler<T>): void;
|
|
296
|
+
|
|
297
|
+
// 资源清理
|
|
298
|
+
async dispose(): Promise<void>;
|
|
76
299
|
}
|
|
300
|
+
```
|
|
77
301
|
|
|
78
|
-
|
|
79
|
-
|
|
302
|
+
### 工厂函数
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// 创建打印实例
|
|
306
|
+
function createBluetoothPrinter(
|
|
307
|
+
config?: Partial<IBluetoothPrinterConfig>
|
|
308
|
+
): BluetoothPrinter;
|
|
80
309
|
```
|
|
81
310
|
|
|
82
|
-
|
|
311
|
+
### 事件类型
|
|
83
312
|
|
|
84
|
-
|
|
313
|
+
```typescript
|
|
314
|
+
// 蓝牙事件
|
|
315
|
+
interface BluetoothEvents {
|
|
316
|
+
'bluetooth:device-found': IBluetoothDevice;
|
|
317
|
+
'bluetooth:connected': { deviceId: string };
|
|
318
|
+
'bluetooth:disconnected': { deviceId: string };
|
|
319
|
+
'bluetooth:error': BluetoothError;
|
|
320
|
+
}
|
|
85
321
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
322
|
+
// 打印事件
|
|
323
|
+
interface PrinterEvents {
|
|
324
|
+
'printer:job-started': { jobId: string };
|
|
325
|
+
'printer:job-completed': { jobId: string };
|
|
326
|
+
'printer:job-failed': { jobId: string; error: Error };
|
|
327
|
+
'printer:queue-empty': void;
|
|
328
|
+
}
|
|
90
329
|
```
|
|
91
330
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
331
|
+
## 🎯 使用场景
|
|
332
|
+
|
|
333
|
+
### 🏪 零售行业
|
|
334
|
+
- **收银小票**: 支持商品列表、价格、优惠信息打印
|
|
335
|
+
- **标签打印**: 商品价签、库存标签、促销标签
|
|
336
|
+
- **报表打印**: 销售报表、库存报表、财务报表
|
|
337
|
+
|
|
338
|
+
### 🍽️ 餐饮行业
|
|
339
|
+
- **点菜单**: 菜品详情、价格、桌号信息
|
|
340
|
+
- **结账单**: 消费明细、优惠信息、支付方式
|
|
341
|
+
- **厨房单**: 订单详情、制作要求、取餐号
|
|
342
|
+
|
|
343
|
+
### 📦 物流行业
|
|
344
|
+
- **运单打印**: 发货单、收货单、转运单
|
|
345
|
+
- **标签打印**: 包裹标签、地址标签、条码标签
|
|
346
|
+
- **追踪单**: 物流状态、签收信息、时效说明
|
|
347
|
+
|
|
348
|
+
### 🏥 医疗行业
|
|
349
|
+
- **处方单**: 药品信息、用法用量、注意事项
|
|
350
|
+
- **检验单**: 检验结果、参考范围、医生建议
|
|
351
|
+
- **收费单**: 费用明细、医保信息、支付状态
|
|
352
|
+
|
|
353
|
+
## 🔧 配置选项
|
|
354
|
+
|
|
355
|
+
### 蓝牙配置
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
bluetooth: {
|
|
359
|
+
scanTimeout: number; // 扫描超时时间(ms),默认 10000
|
|
360
|
+
connectionTimeout: number; // 连接超时时间(ms),默认 8000
|
|
361
|
+
autoReconnect: boolean; // 自动重连,默认 true
|
|
362
|
+
maxReconnectAttempts: number; // 最大重连次数,默认 3
|
|
363
|
+
reconnectInterval: number; // 重连间隔(ms),默认 2000
|
|
364
|
+
}
|
|
95
365
|
```
|
|
96
366
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
367
|
+
### 打印机配置
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
printer: {
|
|
371
|
+
density: number; // 打印密度 (0-8),默认 8
|
|
372
|
+
speed: number; // 打印速度 (0-4),默认 2
|
|
373
|
+
paperWidth: number; // 纸张宽度 (mm),默认 58
|
|
374
|
+
autoCut: boolean; // 自动切纸,默认 true
|
|
375
|
+
charset: string; // 字符集,默认 'PC437'
|
|
376
|
+
align: PrintAlignment; // 默认对齐方式,默认 'left'
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 队列配置
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
queue: {
|
|
384
|
+
maxSize: number; // 队列最大大小,默认 100
|
|
385
|
+
concurrency: number; // 并发数,默认 1
|
|
386
|
+
retryAttempts: number; // 重试次数,默认 3
|
|
387
|
+
retryDelay: number; // 重试延迟(ms),默认 1000
|
|
388
|
+
autoProcess: boolean; // 自动处理,默认 true
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## 🚀 迁移指南
|
|
393
|
+
|
|
394
|
+
### 从 v1.x 迁移到 v2.0
|
|
395
|
+
|
|
396
|
+
v2.0 是一个完全重构的版本,提供了更好的架构和更丰富的功能。主要变化:
|
|
397
|
+
|
|
398
|
+
#### 1. 初始化方式变更
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
// v1.x
|
|
402
|
+
const printer = new TaroBluePrint({
|
|
403
|
+
debug: true,
|
|
404
|
+
paperWidth: 58
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// v2.0
|
|
408
|
+
const printer = createBluetoothPrinter({
|
|
409
|
+
printer: {
|
|
410
|
+
paperWidth: 58
|
|
411
|
+
},
|
|
412
|
+
logging: {
|
|
413
|
+
level: 'debug'
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
await printer.initialize();
|
|
100
417
|
```
|
|
101
418
|
|
|
102
|
-
|
|
419
|
+
#### 2. 事件监听变更
|
|
420
|
+
|
|
421
|
+
```typescript
|
|
422
|
+
// v1.x
|
|
423
|
+
printer.bluetooth.onDeviceFound((device) => {
|
|
424
|
+
console.log('Found device:', device);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// v2.0
|
|
428
|
+
printer.on('bluetooth:device-found', (device) => {
|
|
429
|
+
console.log('Found device:', device);
|
|
430
|
+
});
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
#### 3. 打印方法变更
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
// v1.x
|
|
437
|
+
await printer.printer.printText('Hello');
|
|
438
|
+
|
|
439
|
+
// v2.0
|
|
440
|
+
await printer.printText('Hello');
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
详细的迁移指南请参考 [API 文档](docs/api/README.md#迁移指南)
|
|
444
|
+
|
|
445
|
+
## 🧪 测试
|
|
446
|
+
|
|
447
|
+
### 运行测试
|
|
448
|
+
|
|
103
449
|
```bash
|
|
104
|
-
|
|
450
|
+
# 运行所有测试
|
|
451
|
+
npm test
|
|
452
|
+
|
|
453
|
+
# 运行单元测试
|
|
454
|
+
npm run test:unit
|
|
455
|
+
|
|
456
|
+
# 运行集成测试
|
|
457
|
+
npm run test:integration
|
|
458
|
+
|
|
459
|
+
# 运行 E2E 测试
|
|
460
|
+
npm run test:e2e
|
|
461
|
+
|
|
462
|
+
# 生成覆盖率报告
|
|
463
|
+
npm run test:coverage
|
|
105
464
|
```
|
|
106
465
|
|
|
107
|
-
###
|
|
466
|
+
### 测试覆盖率
|
|
467
|
+
|
|
468
|
+
```
|
|
469
|
+
-------------------|---------|----------|---------|---------|-------------------
|
|
470
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
471
|
+
-------------------|---------|----------|---------|---------|-------------------
|
|
472
|
+
All files | 100 | 100 | 100 | 100 |
|
|
473
|
+
|
|
474
|
+
src/ | 100 | 100 | 100 | 100 |
|
|
475
|
+
index.ts | 100 | 100 | 100 | 100 |
|
|
476
|
+
BluetoothPrinter.ts| 100 | 100 | 100 | 100 |
|
|
477
|
+
|
|
478
|
+
src/domain/ | 100 | 100 | 100 | 100 |
|
|
479
|
+
... | 100 | 100 | 100 | 100 |
|
|
480
|
+
-------------------|---------|----------|---------|---------|-------------------
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
## 🤝 贡献
|
|
484
|
+
|
|
485
|
+
我们欢迎所有形式的贡献!请查看 [贡献指南](CONTRIBUTING.md) 了解如何参与项目开发。
|
|
486
|
+
|
|
487
|
+
### 开发环境设置
|
|
108
488
|
|
|
109
489
|
```bash
|
|
490
|
+
# 克隆仓库
|
|
491
|
+
git clone https://github.com/your-org/taro-bluetooth-print.git
|
|
492
|
+
cd taro-bluetooth-print
|
|
493
|
+
|
|
494
|
+
# 安装依赖
|
|
495
|
+
npm install
|
|
496
|
+
|
|
497
|
+
# 开发模式
|
|
498
|
+
npm run dev
|
|
499
|
+
|
|
500
|
+
# 构建项目
|
|
501
|
+
npm run build
|
|
502
|
+
|
|
503
|
+
# 运行测试
|
|
110
504
|
npm test
|
|
505
|
+
|
|
506
|
+
# 代码检查
|
|
507
|
+
npm run lint
|
|
508
|
+
|
|
509
|
+
# 格式化代码
|
|
510
|
+
npm run format
|
|
111
511
|
```
|
|
112
512
|
|
|
113
|
-
|
|
513
|
+
### 贡献类型
|
|
514
|
+
|
|
515
|
+
- 🐛 **Bug 修复**: 修复现有功能的问题
|
|
516
|
+
- ✨ **新功能**: 添加新的功能特性
|
|
517
|
+
- 📚 **文档**: 改进文档和示例
|
|
518
|
+
- 🎨 **代码风格**: 代码格式化和规范
|
|
519
|
+
- ⚡ **性能**: 性能优化和改进
|
|
520
|
+
- 🧪 **测试**: 添加或改进测试
|
|
521
|
+
|
|
522
|
+
## 📄 许可证
|
|
523
|
+
|
|
524
|
+
本项目采用 [MIT 许可证](LICENSE)。
|
|
525
|
+
|
|
526
|
+
## 🙏 致谢
|
|
527
|
+
|
|
528
|
+
感谢所有为这个项目做出贡献的开发者!
|
|
529
|
+
|
|
530
|
+
### 核心贡献者
|
|
531
|
+
- [@your-username](https://github.com/your-username) - 项目创建者和维护者
|
|
532
|
+
- [@contributor1](https://github.com/contributor1) - 核心功能开发
|
|
533
|
+
- [@contributor2](https://github.com/contributor2) - 文档和示例
|
|
534
|
+
|
|
535
|
+
### 特别感谢
|
|
536
|
+
- [Taro 团队](https://github.com/NervJS/taro) - 优秀的跨平台开发框架
|
|
537
|
+
- 所有反馈 Bug 和建议的用户
|
|
538
|
+
|
|
539
|
+
## 📞 支持
|
|
540
|
+
|
|
541
|
+
如果您在使用过程中遇到问题,可以通过以下方式获取帮助:
|
|
542
|
+
|
|
543
|
+
- 📖 [文档网站](https://docs.example.com)
|
|
544
|
+
- 🐛 [GitHub Issues](https://github.com/your-org/taro-bluetooth-print/issues)
|
|
545
|
+
- 💬 [GitHub Discussions](https://github.com/your-org/taro-bluetooth-print/discussions)
|
|
546
|
+
- 📧 [邮件支持](mailto:support@example.com)
|
|
547
|
+
|
|
548
|
+
## 🔄 更新日志
|
|
549
|
+
|
|
550
|
+
查看 [CHANGELOG.md](CHANGELOG.md) 了解详细的版本更新记录。
|
|
551
|
+
|
|
552
|
+
### v2.0.0 (2024-10-27)
|
|
553
|
+
- 🎉 全新架构,基于依赖注入和事件驱动设计
|
|
554
|
+
- ✨ 支持 TypeScript,100% 类型覆盖
|
|
555
|
+
- 🛠️ 重构蓝牙适配器,支持多平台
|
|
556
|
+
- 📝 完善的文档和示例
|
|
557
|
+
- 🧪 完整的测试覆盖
|
|
558
|
+
- ⚡ 性能优化和稳定性提升
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
<div align="center">
|
|
114
563
|
|
|
115
|
-
|
|
564
|
+
**[⬆ 回到顶部](#taro-bluetooth-print-v20)**
|
|
116
565
|
|
|
117
|
-
|
|
566
|
+
Made with ❤️ by [Your Organization](https://github.com/your-org)
|
|
118
567
|
|
|
119
|
-
|
|
568
|
+
</div>
|