OrderStatusMachineCell.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <template>
  2. <view class="order-status-cell">
  3. <!-- 状态标签 -->
  4. <view class="status-badge" :class="statusClass">
  5. {{ statusText }}
  6. </view>
  7. <!-- 取消按钮 -->
  8. <view v-if="showCancelBtn" class="cancel-btn">
  9. <span class="state btn crm-cursor" @click="handleCancel">
  10. {{ t('Btn.Cancel') }}
  11. </span>
  12. </view>
  13. </view>
  14. </template>
  15. <script setup>
  16. import { computed } from 'vue'
  17. import { createOrderStatusMachine } from '../composables/statusMachine'
  18. import { useI18n } from 'vue-i18n';
  19. const { t } = useI18n();
  20. const orderStatusMap = computed(() => ({
  21. 1: t('State.ToBeProcessed'),
  22. 2: t('State.Completed'),
  23. 3: t('State.InTheProcessing'),
  24. 4: t('State.Refused'),
  25. 5: t('State.expireTime'),
  26. 6: t('State.Cancelled')
  27. }));
  28. const props = defineProps({
  29. row: {
  30. type: Object,
  31. required: true
  32. },
  33. currentTime: {
  34. type: Number,
  35. default: () => Date.now()
  36. }
  37. })
  38. const emit = defineEmits(['cancel', 'cancelBackstage'])
  39. // 创建状态机实例
  40. const machine = computed(() => {
  41. return createOrderStatusMachine(props.row, props.currentTime)
  42. })
  43. // 状态信息
  44. const statusInfo = computed(() => {
  45. return machine.value.getStatusInfo()
  46. })
  47. // 状态文本
  48. const statusText = computed(() => {
  49. return orderStatusMap.value[statusInfo.value.value]
  50. })
  51. // 状态样式类
  52. const statusClass = computed(() => {
  53. const value = statusInfo.value.value
  54. const classMap = {
  55. 1: 'status-warning', // 待处理 - 使用橙色/琥珀色
  56. 2: 'status-success', // 已完成 - 使用绿色
  57. 3: 'status-processing', // 进行中 - 使用蓝色/天蓝
  58. 4: 'status-danger', // 已拒绝 - 使用红色/玫瑰色
  59. 5: 'status-expired', // 已过期 - 使用石板灰
  60. 6: 'status-cancelled' // 已取消 - 使用石板灰
  61. }
  62. return classMap[value] || ''
  63. })
  64. // 是否显示取消按钮
  65. const showCancelBtn = computed(() => {
  66. return machine.value.canCancel() || machine.value.canCancelBackstage()
  67. })
  68. // 处理取消
  69. const handleCancel = () => {
  70. if (machine.value.canCancelBackstage()) {
  71. emit('cancelBackstage', props.row.id)
  72. } else {
  73. emit('cancel', props.row.id)
  74. }
  75. }
  76. </script>