refactor(售后工单页面): 全面优化页面UI与功能体验

1.  api层优化:新增驳回接口,优化提交接口过滤无用参数
2.  页面重构:统一页面布局为左右分栏拖拽面板,替换原有弹窗模式
3.  样式升级:采用类Word文档风格重构所有页面样式,新增中英双语标题
4.  功能新增:添加流程总览组件,新增PDF导出功能,新增驳回操作
5.  交互优化:调整卡片布局与间距,优化空状态提示,统一标签样式
This commit is contained in:
2026-06-24 14:59:23 +08:00
parent 8d2d22de50
commit fc537a1aa6
13 changed files with 1397 additions and 522 deletions

View File

@@ -0,0 +1,147 @@
<template>
<div v-if="enabled" class="section-container">
<div class="section-title">
<i class="el-icon-s-order"></i>
<span>流程总览 <span class="en-sub">· Process Overview</span></span>
</div>
<el-steps :active="activeStep" align-center class="flow-steps">
<el-step title="待审核" icon="el-icon-document" />
<el-step title="意见填写" icon="el-icon-edit-outline" />
<el-step title="汇总方案" icon="el-icon-s-data" />
<el-step title="执行反馈" icon="el-icon-s-promotion" />
<el-step title="执行完成" icon="el-icon-success" />
<el-step title="全部办结" icon="el-icon-circle-check" />
</el-steps>
<div class="current-status">
<span class="status-label">当前阶段</span>
<el-tag :type="tagType" size="small">{{ flowStatusText }}</el-tag>
</div>
</div>
</template>
<script>
export default {
name: 'FlowOverviewSection',
props: {
enabled: {
type: Boolean,
default: true
},
flowStatus: {
type: [Number, String],
default: undefined
}
},
computed: {
/**
* el-steps 的 active 属性是从 0 开始索引的。
* 当 status=1 时 active=0待审核高亮
* status=2 时 active=1已完成待审核+意见填写中高亮),依此类推。
* status=5执行完成和 status=6全部办结共享第5步作为已完成状态。
*/
activeStep() {
if (this.flowStatus == null) return -1;
const v = Number(this.flowStatus);
if (v >= 6) return 5; // 全部办结 -> 第5步已完成
return v - 1;
},
flowStatusText() {
const map = {
1: '待审核',
2: '意见填写中',
3: '待汇总方案',
4: '执行反馈中',
5: '执行完成',
6: '全部办结'
};
return map[this.flowStatus] || '未知';
},
tagType() {
const map = {
1: 'info',
2: 'warning',
3: '',
4: 'warning',
5: 'success',
6: 'success'
};
return map[this.flowStatus] || '';
}
}
}
</script>
<style scoped>
.section-container {
margin-bottom: 6px;
}
.section-title {
font-family: 'Georgia', 'Times New Roman', 'Noto Serif SC', 'SimSun', serif;
width: 100%;
font-size: 15px;
font-weight: 700;
color: #1a1a1a;
margin: 32px 0 16px 0;
padding: 0 0 10px 0;
border-bottom: 1px solid #d4d0c8;
display: flex;
align-items: center;
gap: 10px;
letter-spacing: 0.3px;
}
.section-title .en-sub {
font-size: 11px;
font-weight: 400;
color: #8c8c8c;
letter-spacing: 0.5px;
font-family: 'Georgia', 'Times New Roman', serif;
font-style: italic;
}
.section-title i {
font-size: 16px;
color: #1a3c6e;
}
.flow-steps {
padding: 8px 0 4px;
}
.flow-steps >>> .el-step.is-wait .el-step__icon-inner,
.flow-steps >>> .el-step.is-wait .el-step__title {
color: #c0c4cc;
}
.flow-steps >>> .el-step.is-process .el-step__icon-inner,
.flow-steps >>> .el-step.is-process .el-step__title {
color: #409eff;
}
.flow-steps >>> .el-step.is-finish .el-step__icon-inner,
.flow-steps >>> .el-step.is-finish .el-step__title {
color: #67c23a;
}
.flow-steps >>> .el-step__description {
display: none;
}
.current-status {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 6px;
margin-top: 6px;
padding-top: 8px;
border-top: 1px dashed #e0dcd6;
}
.status-label {
font-family: 'Georgia', 'Times New Roman', serif;
font-size: 11px;
color: #8c8c8c;
letter-spacing: 0.3px;
}
</style>