Files
smart-crop-ui/src/ISSUE_STATUS_LOCALIZATION.md

14 KiB
Raw Blame History

问题管理状态中文化更新

📅 更新时间

2025-10-16

🎯 更新概述

将驾驶员任务管理-问题管理页面的状态显示统一为中文解决了之前英文状态值pending/processing/resolved直接显示的问题。

主要改进

1. 新增状态转换函数

添加了 getStatusText() 函数,统一处理状态的中英文转换:

// 状态转换为中文
const getStatusText = (status: string) => {
  switch (status) {
    case 'pending':
      return '待处理';
    case 'processing':
      return '处理中';
    case 'resolved':
      return '已解决';
    case '待处理':
    case '处理中':
    case '已解决':
      return status;
    default:
      return status;
  }
};

特点:

  • 兼容英文状态值pending/processing/resolved
  • 兼容中文状态值(待处理/处理中/已解决)
  • 统一返回中文显示
  • 未知状态原样返回

2. 状态对照表

英文值 中文显示 颜色 图标
pending 待处理 🟠 橙色 AlertCircle
processing 处理中 🔵 蓝色 Clock
resolved 已解决 🟢 绿色 CheckCircle

3. 应用场景

问题列表表格

<TableCell>
  <Badge variant="secondary" className={getStatusColor(issue.status)}>
    {getStatusText(issue.status)}  {/* 使用转换函数 */}
  </Badge>
</TableCell>

显示效果:

数据库值: "pending"    → 页面显示: "待处理" 🟠
数据库值: "processing" → 页面显示: "处理中" 🔵
数据库值: "resolved"   → 页面显示: "已解决" 🟢
数据库值: "待处理"     → 页面显示: "待处理" 🟠

问题详情对话框

<Badge variant="secondary" className={getStatusColor(selectedIssue.status)}>
  {getStatusText(selectedIssue.status)}  {/* 统一显示中文 */}
</Badge>

📊 修改前后对比

修改前

问题列表显示:
┌──────────────────────────────────────┐
│ 状态                                  │
├──────────────────────────────────────┤
│ pending      ← 直接显示英文           │
│ processing   ← 直接显示英文           │
│ resolved     ← 直接显示英文           │
│ 待处理       ← 中文状态正常           │
└──────────────────────────────────────┘

问题:
❌ 英文状态值直接显示,不友好
❌ 中英文混杂,不统一
❌ 用户体验差

修改后

问题列表显示:
┌──────────────────────────────────────┐
│ 状态                                  │
├──────────────────────────────────────┤
│ 待处理 🟠  ← 统一中文显示            │
│ 处理中 🔵  ← 统一中文显示            │
│ 已解决 🟢  ← 统一中文显示            │
│ 待处理 🟠  ← 中文状态保持            │
└──────────────────────────────────────┘

优势:
✅ 所有状态统一中文显示
✅ 界面清晰友好
✅ 用户体验优秀
✅ 兼容新旧数据

🎨 状态视觉设计

状态徽章样式

待处理pending

<Badge className="bg-orange-100 text-orange-800">
  待处理
</Badge>
  • 颜色: 🟠 橙色(警告色)
  • 含义: 需要关注和处理
  • 图标: AlertCircle

处理中processing

<Badge className="bg-blue-100 text-blue-800">
  处理中
</Badge>
  • 颜色: 🔵 蓝色(进行中)
  • 含义: 正在处理
  • 图标: Clock

已解决resolved

<Badge className="bg-green-100 text-green-800">
  已解决
</Badge>
  • 颜色: 🟢 绿色(成功色)
  • 含义: 问题已解决
  • 图标: CheckCircle

📁 修改文件

核心文件

  1. /components/machinery/driver/IssueManagement.tsx

修改内容

1. 新增状态转换函数

// 位置: 第 142 行
const getStatusText = (status: string) => {
  switch (status) {
    case 'pending':
      return '待处理';
    case 'processing':
      return '处理中';
    case 'resolved':
      return '已解决';
    case '待处理':
    case '处理中':
    case '已解决':
      return status;
    default:
      return status;
  }
};

2. 更新表格状态显示

// 位置: 第 342-346 行
<TableCell>
  <Badge variant="secondary" className={getStatusColor(issue.status)}>
    {getStatusText(issue.status)}  {/* 更新 */}
  </Badge>
</TableCell>

3. 更新详情对话框状态显示

// 位置: 第 435-437 行
<Badge variant="secondary" className={getStatusColor(selectedIssue.status)}>
  {getStatusText(selectedIssue.status)}  {/* 更新 */}
</Badge>

🔄 数据兼容性

兼容策略

新数据:

// 保存时使用英文值
issue.status = 'pending'     // 数据库存储
issue.status = 'processing'  // 数据库存储
issue.status = 'resolved'    // 数据库存储

// 显示时自动转换为中文
getStatusText('pending')     // → '待处理'
getStatusText('processing')  // → '处理中'
getStatusText('resolved')    // → '已解决'

旧数据:

// 如果已经是中文,直接返回
getStatusText('待处理')  // → '待处理'
getStatusText('处理中')  // → '处理中'
getStatusText('已解决')  // → '已解决'

混合场景:

// 筛选器仍然兼容两种格式
stats.pending = allIssues.filter(
  i => i.status === 'pending' || i.status === '待处理'
).length;

💡 使用示例

场景1: 显示问题列表

function IssueList({ issues }) {
  return (
    <Table>
      <TableBody>
        {issues.map(issue => (
          <TableRow key={issue.id}>
            <TableCell>
              {/* 自动转换为中文 */}
              <Badge className={getStatusColor(issue.status)}>
                {getStatusText(issue.status)}
              </Badge>
            </TableCell>
          </TableRow>
        ))}
      </TableBody>
    </Table>
  );
}

// 示例数据
const issues = [
  { id: 1, status: 'pending' },     // 显示: 待处理 🟠
  { id: 2, status: 'processing' },  // 显示: 处理中 🔵
  { id: 3, status: 'resolved' },    // 显示: 已解决 🟢
  { id: 4, status: '待处理' },      // 显示: 待处理 🟠
];

场景2: 问题详情

function IssueDetail({ issue }) {
  return (
    <div>
      <h3>问题状态</h3>
      {/* 统一中文显示 */}
      <Badge className={getStatusColor(issue.status)}>
        {getStatusText(issue.status)}
      </Badge>
      
      {/* 根据状态显示不同操作 */}
      {(issue.status === 'pending' || issue.status === '待处理') && (
        <Button>立即处理</Button>
      )}
    </div>
  );
}

场景3: 统计信息

const stats = {
  pending: allIssues.filter(
    i => i.status === 'pending' || i.status === '待处理'
  ).length,
  processing: allIssues.filter(
    i => i.status === 'processing' || i.status === '处理中'
  ).length,
  resolved: allIssues.filter(
    i => i.status === 'resolved' || i.status === '已解决'
  ).length,
};

// 显示统计
<Card>
  <div>待处理: {stats.pending}</div>
  <div>处理中: {stats.processing}</div>
  <div>已解决: {stats.resolved}</div>
</Card>

🎯 最佳实践

1. 数据存储

推荐做法 :

// 使用英文值存储,便于国际化
const newIssue = {
  status: 'pending',     // 存储英文
  // ...
};

不推荐 :

// 直接存储中文,不利于国际化
const newIssue = {
  status: '待处理',  // 不推荐
  // ...
};

2. 状态判断

推荐做法 :

// 兼容两种格式
if (issue.status === 'pending' || issue.status === '待处理') {
  // 处理待处理状态
}

简化写法 :

// 使用辅助函数
const isPending = (status) => 
  status === 'pending' || status === '待处理';

if (isPending(issue.status)) {
  // 处理待处理状态
}

3. 状态更新

推荐做法 :

// 更新状态时使用英文
const handleResolve = () => {
  updateIssue({
    ...issue,
    status: 'resolved',  // 使用英文
  });
};

4. 筛选器

推荐做法 :

<Select value={filterStatus} onValueChange={setFilterStatus}>
  <SelectContent>
    <SelectItem value="all">全部状态</SelectItem>
    <SelectItem value="待处理">待处理</SelectItem>
    <SelectItem value="pending">待处理</SelectItem>  {/* 兼容 */}
    <SelectItem value="处理中">处理中</SelectItem>
    <SelectItem value="processing">处理中</SelectItem>  {/* 兼容 */}
    <SelectItem value="已解决">已解决</SelectItem>
    <SelectItem value="resolved">已解决</SelectItem>  {/* 兼容 */}
  </SelectContent>
</Select>

🐛 常见问题

Q1: 为什么使用英文值存储?

A: 出于以下考虑:

  • 国际化支持: 便于后续多语言扩展
  • 数据标准: 英文值更标准,不受编码影响
  • 兼容性: 避免中文编码问题
  • 可维护性: 状态值不随语言变化

Q2: 如何处理旧数据中的中文状态?

A: getStatusText() 函数已兼容中文状态:

getStatusText('待处理')  // → '待处理' (原样返回)
getStatusText('pending')  // → '待处理' (转换)

Q3: 筛选器为什么要同时支持中英文?

A: 为了兼容现有数据:

// 筛选器支持两种格式
filterStatus === 'pending' || filterStatus === '待处理'

// 数据库中可能同时存在两种格式
allIssues.filter(i => 
  i.status === 'pending' || i.status === '待处理'
)

Q4: 如何迁移旧数据?

A: 可以编写数据迁移脚本:

// 数据迁移示例
const migrateIssueStatus = () => {
  const tasks = JSON.parse(
    localStorage.getItem('smart_agriculture_driver_tasks') || '[]'
  );
  
  const migratedTasks = tasks.map(task => ({
    ...task,
    issues: task.issues.map(issue => ({
      ...issue,
      status: issue.status === '待处理' ? 'pending' :
              issue.status === '处理中' ? 'processing' :
              issue.status === '已解决' ? 'resolved' :
              issue.status
    }))
  }));
  
  localStorage.setItem(
    'smart_agriculture_driver_tasks',
    JSON.stringify(migratedTasks)
  );
};

Q5: DriverTask.tsx 中的状态显示是否一致?

A: 是的DriverTask.tsx 已经有类似的转换逻辑:

// DriverTask.tsx 中的状态显示
{issue.status === 'pending' ? '待处理' : 
 issue.status === 'processing' ? '处理中' :
 issue.status === 'resolved' ? '已解决' : issue.status}

两个组件的状态显示逻辑一致。

📊 组件间一致性

状态显示对比

组件 状态转换方式 是否统一
IssueManagement.tsx getStatusText() 函数
DriverTask.tsx 三元表达式
两者显示结果 完全一致

建议优化

可以将 getStatusText() 函数提取到共享工具文件:

// /lib/issueUtils.ts
export const getIssueStatusText = (status: string): string => {
  switch (status) {
    case 'pending':
      return '待处理';
    case 'processing':
      return '处理中';
    case 'resolved':
      return '已解决';
    case '待处理':
    case '处理中':
    case '已解决':
      return status;
    default:
      return status;
  }
};

export const getIssueStatusColor = (status: string): string => {
  switch (status) {
    case 'pending':
    case '待处理':
      return 'bg-orange-100 text-orange-800';
    case 'processing':
    case '处理中':
      return 'bg-blue-100 text-blue-800';
    case 'resolved':
    case '已解决':
      return 'bg-green-100 text-green-800';
    default:
      return 'bg-gray-100 text-gray-800';
  }
};

然后在两个组件中导入使用:

import { getIssueStatusText, getIssueStatusColor } from '../../../lib/issueUtils';

验证清单

显示验证

  • 问题列表表格中状态显示为中文
  • 问题详情对话框中状态显示为中文
  • 统计卡片中状态文字为中文
  • 筛选器选项显示为中文

功能验证

  • pending 状态正确显示为"待处理"
  • processing 状态正确显示为"处理中"
  • resolved 状态正确显示为"已解决"
  • 中文状态正常显示
  • 状态筛选功能正常

兼容性验证

  • 英文状态数据正常显示
  • 中文状态数据正常显示
  • 混合状态数据正常显示
  • 状态统计正确
  • 筛选功能兼容两种格式

视觉验证

  • 待处理显示橙色
  • 处理中显示蓝色
  • 已解决显示绿色
  • 徽章样式统一
  • 颜色清晰易识别

🎉 总结

本次更新成功实现了问题管理页面状态的中文化显示:

核心改进

统一中文界面 - 所有状态徽章显示中文
数据兼容 - 支持英文和中文状态值
视觉清晰 - 颜色语义化,易于识别
用户友好 - 界面完全中文化

技术亮点

转换函数 - 统一的状态转换逻辑
兼容性好 - 支持新旧数据格式
易维护 - 集中的状态处理逻辑
可扩展 - 便于未来国际化

现在问题管理页面的状态显示完全中文化,用户体验更加友好!🎊


更新人: AI助手
更新日期: 2025-10-16
版本: v1.1
影响范围: 问题管理页面状态显示