吉安感知网项目-前端
张含笑
2026-01-21 9eb8bb59b802ceef1f52d334c8e577f2bf02c90e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<template>
  <div class="audit-record-container">
    <div class="label">审批记录</div>
    <el-steps :active="activeStep" direction="vertical" align-center>
      <el-step v-for="(step, index) in displayedSteps" :key="step.status" :title="step.title">
        <template #description>
          <div class="step-person">{{ step.person }}</div>
          <div class="step-time">{{ step.time }}</div>
        </template>
      </el-step>
    </el-steps>
  </div>
</template>
 
<script setup>
import { ref, watch, computed } from 'vue'
import { gdSupplyDemandAuditListApi } from '@/views/orderView/orderDataManage/supplyAdd/supplyAddApi'
 
const props = defineProps({
  demandId: {
    type: [String, Number],
    required: true
  }
})
const detailDemandStatus = inject('detailDemandStatus')
const reasonForRejection = inject('reasonForRejection')
 
// 所有可能的步骤配置
const allStepConfigs = ref([
  { title: '需求申请', status: '0', person: '', time: '' },
  { title: '审核通过', status: '1', person: '', time: '' },
  { title: '拒绝申请', status: '2', person: '', time: '' }
])
 
// 步骤条数据
const stepResponse = ref([])
 
// 当前激活步骤
const activeStep = ref(0)
 
// 计算要显示的步骤
const displayedSteps = computed(() => {
  // 创建一个映射,将状态映射到审核记录
  const statusToRecord = {};
  stepResponse.value.forEach(record => {
    statusToRecord[record.auditStatus] = record;
  });
  
  // 根据审核记录筛选并构建要显示的步骤
  return allStepConfigs.value.filter(stepConfig => {
    // 如果是需求申请步骤,始终显示
    if (stepConfig.status === '0') {
      return true;
    }
    // 其他步骤只有在有对应状态的审核记录时才显示
    return statusToRecord.hasOwnProperty(stepConfig.status);
  }).map(stepConfig => {
    // 获取对应状态的审核记录
    const record = statusToRecord[stepConfig.status];
    if (record) {
      // 如果有审核记录,使用记录中的信息
      return {
        ...stepConfig,
        person: record.createUser ? `${record.createUser}` : '',
        time: record.createTime ? record.createTime : ''
      };
    }
    // 如果没有审核记录,使用默认信息
    return stepConfig;
  });
})
 
// 计算当前激活步骤
const calculateCurrentStep = () => {
  if (stepResponse.value.length === 0) {
    return 0;
  }
  
  // 获取最新的审核记录
  const latestRecord = stepResponse.value[stepResponse.value.length - 1];
  // 查找最新状态在显示步骤中的索引
  const stepIndex = displayedSteps.value.findIndex(step => step.status === latestRecord.auditStatus);
  return stepIndex !== -1 ? stepIndex : 0;
}
 
// 监听 demandId 变化
watch(() => props.demandId, (newVal) => {
  if (newVal) {
    loadAuditRecords(newVal)
  }
}, { immediate: true })
 
// 加载审核记录
async function loadAuditRecords(demandId) {
  try {
    const res = await gdSupplyDemandAuditListApi({ demandId })
    const auditRecords = res?.data?.data ?? []
    
    // 按创建时间排序(最新的在最后)
    stepResponse.value = [...auditRecords].sort((a, b) => new Date(a.createTime) - new Date(b.createTime))
    
    // 查找拒绝原因(auditStatus为2的记录的auditOpinion)
    const rejectedRecord = stepResponse.value.find(record => record.auditStatus === '2')
    reasonForRejection.value = rejectedRecord?.auditOpinion || ''
 
    // 计算当前激活步骤
    activeStep.value = calculateCurrentStep()
  } catch (error) {
    console.error('加载审核记录失败:', error)
    // 重置步骤数据
    stepResponse.value = []
    activeStep.value = 0
    reasonForRejection.value = ''
  }
}
 
defineExpose({
  loadAuditRecords
})
</script>
 
<style scoped lang="scss">
.audit-record-container {
  .label {
    font-weight: 500;
    margin-bottom: 8px;
    color: #333;
  }
}
 
/* 步骤条样式 */
:deep(.el-steps) {
  align-items: flex-start;
}
 
:deep(.el-step) {
  margin-bottom: 20px;
}
 
:deep(.el-step__title) {
  font-size: 14px;
  font-weight: 500;
  margin-bottom: 8px;
}
 
/* 步骤描述 */
.step-person {
  font-size: 13px;
  color: #333;
  margin-bottom: 4px;
}
 
.step-time {
  font-size: 12px;
  color: #909399;
}
</style>