| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- å·®æ
/è´¹ç¨æ¥éï¼å®¡æ¹å表å
详æ
/审æ¹å¼¹çªå
容ï¼ä¸æ¥é页弹çªä¸è´ï¼ --> |
| | | <template> |
| | | <div v-loading="loading"> |
| | | <TravelDetailPanel v-if="isTravel" :row="reimburseRow" /> |
| | | <CostDetailPanel v-else :row="reimburseRow" /> |
| | | |
| | | <el-divider content-position="left">æµç¨è¿åº¦</el-divider> |
| | | <ApprovalFlowProgress |
| | | :nodes="reimburseRow.approvalFlowProgressNodes ?? reimburseRow.approvalFlowNodes" |
| | | :current-index="reimburseRow.currentNodeIndex ?? 0" |
| | | /> |
| | | |
| | | <template v-if="mode === 'detail'"> |
| | | <el-divider content-position="left">审æ¹è®°å½ï¼å
¨æµç¨ççï¼</el-divider> |
| | | <el-timeline v-if="reimburseRow.approvalRecords?.length"> |
| | | <el-timeline-item |
| | | v-for="(rec, i) in reimburseRow.approvalRecords" |
| | | :key="i" |
| | | :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'" |
| | | :timestamp="rec.time" |
| | | > |
| | | {{ rec.operatorName }} â {{ actionLabel(rec.result) }}ï¼{{ rec.opinion || "æ æè§" }} |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | <el-empty v-else description="ææ å®¡æ¹è®°å½" :image-size="60" /> |
| | | </template> |
| | | |
| | | <el-form v-else label-width="100px" class="mt16"> |
| | | <el-form-item label="å®¡æ¹æè§"> |
| | | <el-input |
| | | :model-value="approveOpinion" |
| | | type="textarea" |
| | | :rows="3" |
| | | maxlength="500" |
| | | show-word-limit |
| | | :placeholder="isTravel ? 'éè¿å¯ç空ï¼é©³å请填ååå ' : 'éè¿å¯ç空ï¼é©³å请填åå
·ä½åå ï¼å¦ï¼å票模ç³ééä¼ ï¼'" |
| | | @update:model-value="$emit('update:approveOpinion', $event)" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed } from "vue"; |
| | | import { isTravelReimbursementType } from "../finReimbursementMappers.js"; |
| | | import ApprovalFlowProgress from "../../travel-reimburse/components/ApprovalFlowProgress.vue"; |
| | | import CostDetailPanel from "../../cost-reimburse/components/DetailPanel.vue"; |
| | | import TravelDetailPanel from "../../travel-reimburse/components/DetailPanel.vue"; |
| | | |
| | | const props = defineProps({ |
| | | mode: { type: String, default: "detail" }, |
| | | moduleKey: { type: String, default: "" }, |
| | | reimburseRow: { type: Object, default: () => ({}) }, |
| | | loading: { type: Boolean, default: false }, |
| | | approveOpinion: { type: String, default: "" }, |
| | | }); |
| | | |
| | | defineEmits(["update:approveOpinion"]); |
| | | |
| | | const isTravel = computed(() => |
| | | isTravelReimbursementType(props.reimburseRow?.reimbursementType ?? props.moduleKey) |
| | | ); |
| | | |
| | | function actionLabel(v) { |
| | | if (v === "approved") return "éè¿"; |
| | | if (v === "rejected") return "驳å"; |
| | | return "æäº¤"; |
| | | } |
| | | </script> |