feat: 完成售后投诉流程全链路优化与功能完善

本次提交完成了多项核心优化与功能新增:
1.  重构投诉受理流程状态,移除冗余的执行反馈阶段,简化为4个流程节点
2.  新增售后单关联客户、下游用户、工程信息等扩展字段,完善基础信息采集
3.  新增部门结构化意见表单与预览组件,优化部门意见填写与展示流程
4.  新增售后意见汇总页面,支持流程阶段筛选与详情查看
5.  优化合同列表页面,新增重置筛选按钮与默认备注逻辑
6.  新增PDF导出功能,完善钢卷信息展示列
7.  修复逻辑删除级联问题,新增任务过滤逻辑保障数据一致性
This commit is contained in:
2026-06-29 14:58:24 +08:00
parent 9484b64de7
commit da01bfaa48
21 changed files with 1723 additions and 65 deletions

View File

@@ -73,6 +73,10 @@
<BasicInfoSection :data="acceptDetail" />
</template>
<template #flow-overview>
<FlowOverviewSection :flowStatus="acceptDetail.flowStatus" />
</template>
<template #contract-info>
<ContractInfoSection :coilList="dialogCoilList" />
</template>
@@ -80,20 +84,27 @@
<el-divider />
<FlowOverviewSection :flowStatus="acceptDetail.flowStatus" />
<CoilInfoSection :coilList="dialogCoilList" :loading="coilLoading" :editable="false" />
<div v-if="currentTask.taskStatus === 1 && opinionForm.deptOpinion" class="section-gap" />
<div v-if="currentTask.taskStatus === 1 && opinionForm.deptOpinion" class="opinion-preview-wrapper">
<div class="section-title">
<span>已提交意见 <span class="en-sub">· Submitted Opinion</span></span>
</div>
<DeptOpinionPreview :deptId="currentTask.deptId" :jsonData="opinionForm.deptOpinion" />
<div v-if="opinionForm.fillFile" class="opinion-file" style="margin-top:8px;">
<FileList :ossIds="opinionForm.fillFile" />
</div>
</div>
<div v-if="isEditable" class="section-gap" />
<div v-if="isEditable" class="opinion-form-wrapper">
<div class="opinion-form-section">
<div class="section-title">
<span>填写处理意见 <span class="en-sub">· Fill in Opinion</span></span>
<span>{{ currentTask.taskStatus === 1 ? '修改处理意见' : '填写处理意见' }} <span class="en-sub">· {{ currentTask.taskStatus === 1 ? 'Edit Opinion' : 'Fill in Opinion' }}</span></span>
</div>
<el-form ref="opinionForm" :model="opinionForm" label-width="100px">
<el-form-item label="处理意见" prop="deptOpinion">
<editor v-model="opinionForm.deptOpinion" :min-height="200" />
</el-form-item>
<DeptOpinionForm :deptId="currentTask.deptId" :jsonData="opinionForm.deptOpinion" @input="val => opinionForm.deptOpinion = val" />
<el-form-item label="意见文件">
<file-upload v-model="opinionForm.fillFile" />
</el-form-item>
@@ -121,10 +132,13 @@ import BasicInfoSection from "./components/BasicInfoSection.vue";
import CoilInfoSection from "./components/CoilInfoSection.vue";
import ContractInfoSection from "./components/ContractInfoSection.vue";
import FlowOverviewSection from "./components/FlowOverviewSection.vue";
import DeptOpinionForm from "./components/DeptOpinionForm.vue";
import DeptOpinionPreview from "./components/DeptOpinionPreview.vue";
import FileList from "@/components/FileList/index.vue";
export default {
name: "AftermarketOpinion",
components: { DragResizePanel, HeaderControlSection, BasicInfoSection, CoilInfoSection, ContractInfoSection, FlowOverviewSection },
components: { DragResizePanel, HeaderControlSection, BasicInfoSection, CoilInfoSection, ContractInfoSection, FlowOverviewSection, DeptOpinionForm, DeptOpinionPreview, FileList },
data() {
return {
loading: false,
@@ -212,7 +226,7 @@ export default {
},
canEdit(row) {
const status = (row.acceptInfo || {}).flowStatus;
return (status === 2 || status === 3) && row.taskStatus === 0;
return status === 2;
},
confirmCancel() {
this.$modal.confirm('确认取消?已填写的内容将不会保存。').then(() => {
@@ -235,7 +249,14 @@ export default {
}).catch(() => { }).finally(() => { this.rejectLoading = false; });
},
submitOpinion() {
if (!this.opinionForm.deptOpinion) {
try {
const data = JSON.parse(this.opinionForm.deptOpinion || '{}');
const hasContent = Object.values(data).some(v => v);
if (!hasContent) {
this.$modal.msgWarning("请至少填写一项处理意见");
return;
}
} catch (e) {
this.$modal.msgWarning("请填写处理意见");
return;
}
@@ -457,6 +478,10 @@ export default {
padding-top: 4px;
}
.opinion-preview-wrapper {
padding-top: 4px;
}
.opinion-form-section {
margin-bottom: 0;
}