feat(ticket): 添加水票功能支持

- 在订单模型中增加formId字段用于标识商品ID
- 更新统一扫码组件以支持水票和礼品卡核销
- 实现水票列表页面,包含我的水票和核销记录两个标签页
- 添加水票核销二维码生成功能
- 支持水票的分页加载和搜索功能
- 实现水票核销记录的展示
- 添加水票状态变更历史追踪
- 更新订单状态判断逻辑以支持特定商品完成状态
- 扩展扫码验证功能以处理水票业务类型
This commit is contained in:
2026-02-04 11:00:54 +08:00
parent a3c952d092
commit f96918bf86
7 changed files with 484 additions and 90 deletions

View File

@@ -43,7 +43,7 @@ const UnifiedQRPage: React.FC = () => {
setTimeout(() => {
Taro.showModal({
title: '核销成功',
content: '是否继续扫码核销其他礼品卡?',
content: '是否继续扫码核销其他水票/礼品卡?',
success: (res) => {
if (res.confirm) {
handleStartScan();
@@ -179,7 +179,7 @@ const UnifiedQRPage: React.FC = () => {
</Text>
<Text className="text-gray-600 mb-6 block">
{scanType === ScanType.LOGIN ? '正在确认登录' :
scanType === ScanType.VERIFICATION ? '正在核销礼品卡' : '正在处理'}
scanType === ScanType.VERIFICATION ? '正在核销' : '正在处理'}
</Text>
</>
)}
@@ -192,12 +192,29 @@ const UnifiedQRPage: React.FC = () => {
</Text>
{result.type === ScanType.VERIFICATION && result.data && (
<View className="bg-green-50 rounded-lg p-3 mb-4">
<Text className="text-sm text-green-800 block">
{result.data.goodsName || '未知商品'}
</Text>
<Text className="text-sm text-green-800 block">
¥{result.data.faceValue}
</Text>
{result.data.businessType === 'gift' && result.data.gift && (
<>
<Text className="text-sm text-green-800 block">
{result.data.gift.goodsName || result.data.gift.name || '未知'}
</Text>
<Text className="text-sm text-green-800 block">
¥{result.data.gift.faceValue}
</Text>
</>
)}
{result.data.businessType === 'ticket' && result.data.ticket && (
<>
<Text className="text-sm text-green-800 block">
{result.data.ticket.templateName || '水票'}
</Text>
<Text className="text-sm text-green-800 block">
{result.data.qty || 1}
</Text>
<Text className="text-sm text-green-800 block">
{result.data.ticket.availableQty ?? 0}
</Text>
</>
)}
</View>
)}
<View className="mt-2">
@@ -278,9 +295,14 @@ const UnifiedQRPage: React.FC = () => {
<Text className="text-sm text-gray-800">
{record.success ? record.message : record.error}
</Text>
{record.success && record.type === ScanType.VERIFICATION && record.data && (
{record.success && record.type === ScanType.VERIFICATION && record.data?.businessType === 'gift' && record.data?.gift && (
<Text className="text-xs text-gray-500">
{record.data.goodsName} - ¥{record.data.faceValue}
{record.data.gift.goodsName || record.data.gift.name} - ¥{record.data.gift.faceValue}
</Text>
)}
{record.success && record.type === ScanType.VERIFICATION && record.data?.businessType === 'ticket' && record.data?.ticket && (
<Text className="text-xs text-gray-500">
{record.data.ticket.templateName || '水票'} - {record.data.qty || 1}
</Text>
)}
</View>
@@ -304,7 +326,7 @@ const UnifiedQRPage: React.FC = () => {
</Text>
<Text className="text-xs text-blue-700 block mb-1">
/
</Text>
<Text className="text-xs text-blue-700 block">