| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- ä¸å®¡æ¹å表详æ
å¼¹çªä¸è´ --> |
| | | <template> |
| | | <el-dialog |
| | | v-model="visible" |
| | | :title="title" |
| | | width="920px" |
| | | append-to-body |
| | | destroy-on-close |
| | | class="approve-detail-dialog" |
| | | @closed="emit('closed')" |
| | | > |
| | | <div class="approve-detail-body"> |
| | | <ApproveDetailPanel :row="row" /> |
| | | <div class="detail-block"> |
| | | <div class="detail-block-title"> |
| | | å®¡æ¹æµç¨ï¼{{ row?.tasks?.length || row?.flowNodes?.length || 0 }} é¡¹ï¼ |
| | | </div> |
| | | <InstanceFlowDisplay :tasks="row?.tasks" :nodes="row?.flowNodes" /> |
| | | </div> |
| | | <div class="detail-block"> |
| | | <div class="detail-block-title">审æ¹è®°å½</div> |
| | | <el-timeline v-if="row?.approvalRecords?.length" class="approve-record-timeline"> |
| | | <el-timeline-item |
| | | v-for="(rec, i) in row.approvalRecords" |
| | | :key="rec.id ?? i" |
| | | :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'" |
| | | :timestamp="formatRecordTime(rec.time)" |
| | | placement="top" |
| | | > |
| | | <div class="record-item"> |
| | | <span class="record-operator">{{ rec.operatorName || "â" }}</span> |
| | | <el-tag |
| | | size="small" |
| | | :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'info'" |
| | | effect="plain" |
| | | > |
| | | {{ approvalActionLabel(rec.result) }} |
| | | </el-tag> |
| | | <p class="record-opinion">{{ rec.opinion || "æ æè§" }}</p> |
| | | </div> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | <el-empty v-else description="ææ å®¡æ¹è®°å½" :image-size="48" /> |
| | | </div> |
| | | </div> |
| | | <template #footer> |
| | | <el-button v-if="canEditRow(row)" @click="emit('edit', row)">ä¿® æ¹</el-button> |
| | | <el-button @click="visible = false">å
³ é</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed } from "vue"; |
| | | import { canEditBusinessInstanceRow } from "../../approve-list/approveListConstants.js"; |
| | | import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js"; |
| | | import ApproveDetailPanel from "../../approve-list/components/ApproveDetailPanel.vue"; |
| | | import InstanceFlowDisplay from "../../approve-list/components/InstanceFlowDisplay.vue"; |
| | | |
| | | function canEditRow(row) { |
| | | return canEditBusinessInstanceRow(row); |
| | | } |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { type: Boolean, default: false }, |
| | | row: { type: Object, default: () => ({}) }, |
| | | title: { type: String, default: "审æ¹è¯¦æ
" }, |
| | | }); |
| | | |
| | | const emit = defineEmits(["update:modelValue", "edit", "closed"]); |
| | | |
| | | const visible = computed({ |
| | | get: () => props.modelValue, |
| | | set: (v) => emit("update:modelValue", v), |
| | | }); |
| | | |
| | | function approvalActionLabel(result) { |
| | | if (result === "approved") return "éè¿"; |
| | | if (result === "rejected") return "驳å"; |
| | | return "å¾
å¤ç"; |
| | | } |
| | | |
| | | function formatRecordTime(time) { |
| | | return formatDisplayTime(time) || "â"; |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .approve-detail-dialog :deep(.el-dialog__body) { |
| | | padding-top: 16px; |
| | | max-height: 70vh; |
| | | overflow-y: auto; |
| | | } |
| | | .approve-detail-body .detail-block { |
| | | margin-top: 20px; |
| | | } |
| | | .detail-block-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | color: var(--el-text-color-primary); |
| | | margin: 0 0 12px; |
| | | padding-left: 10px; |
| | | border-left: 3px solid var(--el-color-primary); |
| | | line-height: 1.4; |
| | | } |
| | | .approve-record-timeline { |
| | | padding-left: 4px; |
| | | } |
| | | .record-item { |
| | | padding: 4px 0 2px; |
| | | } |
| | | .record-operator { |
| | | font-weight: 600; |
| | | margin-right: 8px; |
| | | color: var(--el-text-color-primary); |
| | | } |
| | | .record-opinion { |
| | | margin: 8px 0 0; |
| | | font-size: 13px; |
| | | color: var(--el-text-color-regular); |
| | | line-height: 1.5; |
| | | } |
| | | </style> |