feat:核销打印兑换券

This commit is contained in:
dzc committed 2026-09-04 17:34:02 +08:00
1 parent fb90b477b9
commit d517f45f38
11 files changed
+1560 -75

No files matched your search

@@ -168,7 +168,18 @@ void main() {
order: _order(),
items: _items(),
errorMessage: '',
printStatus: OrderRecordDetailLoadStatus.success,
printRecords: const [],
printErrorMessage: '',
evidenceStatus: OrderRecordDetailLoadStatus.success,
evidenceImages: const [],
evidenceErrorMessage: '',
canReprintVoucher: false,
isReprintingVoucher: false,
onRetry: () {},
onRefreshPrintRecords: () {},
onRefreshEvidence: () {},
onReprintVoucher: () {},
onClose: () {},
),
],
@@ -188,6 +199,90 @@ void main() {
expect(find.text('鲜肉烧麦'), findsOneWidget);
expect(find.text('实际扣款'), findsOneWidget);
});
testWidgets('完整详情展示打印和识别凭证并提供兑换券重打入口', (tester) async {
tester.view.physicalSize = const Size(1920, 1080);
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetDevicePixelRatio);
var requestedReprint = false;
await tester.pumpWidget(
_terminalApp(
Stack(
fit: StackFit.expand,
children: [
const ColoredBox(color: XfjDesignTokens.canvas),
VerificationOrderDetailDrawer(
record: _record(),
status: OrderRecordDetailLoadStatus.success,
order: _order(),
items: _items(),
errorMessage: '',
printStatus: OrderRecordDetailLoadStatus.success,
printRecords: [
ServicePrintRecord(
id: '100',
orderId: '2094302933091917826',
hardId: '10',
hardName: '一号食堂终端',
printerHardId: '20',
printerHardName: '一号打印机',
printType: '2',
printNo: 1,
retryVersion: 0,
attemptCount: 1,
status: '2',
printedAt: DateTime(2026, 8, 31, 16, 41, 12),
createTime: DateTime(2026, 8, 31, 16, 41, 9),
),
],
printErrorMessage: '',
evidenceStatus: OrderRecordDetailLoadStatus.success,
evidenceImages: [
ServiceOrderEvidenceImage(
id: '200',
evidenceType: OrderEvidenceType.faceRecognition.code,
evidenceRole: OrderEvidenceRole.faceLive.code,
sequenceNo: 0,
status: 'UNAVAILABLE',
similarity: 0.9234,
hardId: '10',
capturedAt: DateTime(2026, 8, 31, 16, 40, 58),
failureReason: '终端现场图片已过保留期',
),
],
evidenceErrorMessage: '',
canReprintVoucher: true,
isReprintingVoucher: false,
onRetry: () {},
onRefreshPrintRecords: () {},
onRefreshEvidence: () {},
onReprintVoucher: () => requestedReprint = true,
onClose: () {},
),
],
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('打印与核销凭证(1)'));
await tester.pumpAndSettle();
expect(find.text('打印与核销凭证'), findsOneWidget);
expect(find.text('兑换券'), findsOneWidget);
expect(find.text('重新打印兑换券'), findsOneWidget);
await tester.tap(find.text('重新打印兑换券'));
expect(requestedReprint, isTrue);
await tester.tap(find.text('识别凭证(1)'));
await tester.pumpAndSettle();
expect(find.text('识别凭证'), findsOneWidget);
expect(find.text('现场识别图'), findsOneWidget);
expect(find.textContaining('92.34%'), findsOneWidget);
expect(find.textContaining('终端现场图片已过保留期'), findsOneWidget);
expect(tester.takeException(), isNull);
});
}
/// 跳过远程加载,让完整页面测试只验证根布局和既有静态数据渲染。
@@ -83,4 +83,48 @@ void main() {
expect(car.totalPrice, 1238);
expect(car.toJson()['totalPrice'], '1238');
});
test('服务端打印记录兼容历史空类型、序号和尝试次数字段', () {
final record = ServicePrintRecord.fromJson({
'id': 100,
'orderId': '200',
'status': null,
'printType': null,
'printNo': null,
'retryVersion': null,
'attemptCount': null,
});
expect(record.id, '100');
expect(record.orderId, '200');
expect(record.printType, '1');
expect(record.printNo, 1);
expect(record.retryVersion, 0);
expect(record.attemptCount, 0);
expect(record.status, '');
});
test('识别凭证解析服务端相似度、中文名称和采集设备字段', () {
final evidence = ServiceOrderEvidenceImage.fromJson({
'id': 300,
'evidenceType': 'FACE_RECOGNITION',
'evidenceTypeName': '人脸识别',
'evidenceRole': 'FACE_LIVE',
'evidenceRoleName': '现场图',
'sequenceNo': 0,
'status': 'AVAILABLE',
'statusName': '已保存',
'similarity': '0.9234',
'similarityThreshold': 0.8,
'hardId': 10,
'capturedAt': '2026-08-31T16:40:58',
});
expect(evidence.id, '300');
expect(evidence.evidenceRoleName, '现场图');
expect(evidence.similarity, 0.9234);
expect(evidence.similarityThreshold, 0.8);
expect(evidence.hardId, '10');
expect(evidence.capturedAt, DateTime(2026, 8, 31, 16, 40, 58));
});
}