refactor(wms/post): 优化售后与流程页面功能

1. 调整售后列表页拖拽面板初始尺寸与标题
2. 新增部门参数传递与处理逻辑到售后相关页面
3. 移除售后意见页的部门切换 tabs 相关代码
4. 新增盘库、排产、设备维修流程文档
This commit is contained in:
2026-06-23 14:35:45 +08:00
parent 2490f487fd
commit 6265292cbb
4 changed files with 92 additions and 50 deletions

View File

@@ -106,6 +106,83 @@ graph TD
classDef s5 fill:#fff1f0,stroke:#f5222d,color:#303133,stroke-width:2px
classDef dec fill:#f9f0ff,stroke:#722ed1,color:#303133,stroke-width:2px
linkStyle default stroke:#bfbfbf,stroke-width:2px
`,
inventoryCheck: `
graph TD
A["<b>创建盘库单</b><br/>填写盘库单基本信息<br/>添加盘库计划"]:::c1
A --> B["<b>盘库计划</b><br/>设定起止时间<br/>选择库区类型"]:::c2
B --> C{"<b>库区类型?</b>"}:::cdec
C -->|逻辑库| D["<b>获取库存快照</b><br/>记录当前时间节点<br/>库存情况"]:::c3
C -->|物理库| E["<b>获取库存快照</b><br/>记录当前时间节点<br/>库存情况"]:::c3
E --> F["<b>记录吞吐记录</b><br/>额外记录物理库<br/>出入库流水明细"]:::c4
D --> G["<b>人工实地盘库</b><br/>按盘库计划执行<br/>录入实际库存数据"]:::c5
F --> G
G --> H["<b>系统自动对照</b><br/>快照库存 vs 实际库存<br/>逐项比对查找差异"]:::c6
H --> I["<b>盘亏明细</b><br/>系统有 实际无<br/>库存缺失项"]:::loss
H --> J["<b>盘盈明细</b><br/>实际有 系统无<br/>库存多出项"]:::gain
H --> K["<b>明细差异</b><br/>数据不一致<br/>数量/规格偏差"]:::diff
I --> L["<b>生成盘库差异报告</b><br/>汇总盘亏/盘盈/差异<br/>存储差异记录"]:::c7
J --> L
K --> L
L --> M(["<b>盘库单封存</b><br/>流程结束"]):::cend
classDef c1 fill:#409eff,stroke:#337ecc,color:#fff,stroke-width:2px
classDef c2 fill:#e6fffa,stroke:#13c2c2,color:#303133,stroke-width:2px
classDef cdec fill:#f9f0ff,stroke:#722ed1,color:#303133,stroke-width:2px
classDef c3 fill:#f0f5ff,stroke:#597ef7,color:#303133,stroke-width:2px
classDef c4 fill:#fff7e6,stroke:#fa8c16,color:#303133,stroke-width:2px
classDef c5 fill:#e6f7ff,stroke:#1890ff,color:#303133,stroke-width:2px
classDef c6 fill:#fffbe6,stroke:#fadb14,color:#303133,stroke-width:2px
classDef loss fill:#fff1f0,stroke:#f5222d,color:#303133,stroke-width:2px
classDef gain fill:#f6ffed,stroke:#52c41a,color:#303133,stroke-width:2px
classDef diff fill:#fff0f6,stroke:#eb2f96,color:#303133,stroke-width:2px
classDef c7 fill:#f0f5ff,stroke:#597ef7,color:#303133,stroke-width:2px
classDef cend fill:#dcf7e8,stroke:#52c41a,color:#303133,stroke-width:2px,rx:10,ry:10
linkStyle default stroke:#bfbfbf,stroke-width:2px
`,
productionSchedule: `
stateDiagram-v2
[*] --> 创建排产单: 填写基本信息
创建排产单 --> 关联合同获取需求: 选择合同
关联合同获取需求 --> 选择需求合并明细: 选取需求<br/>合并相同条目
选择需求合并明细 --> 提交审批
提交审批 --> 审批驳回: 审批不通过
提交审批 --> 审批通过: 审批通过
审批驳回 --> 选择需求合并明细: 退回修改后重新提交
审批通过 --> 车间接收执行单: 转为执行单推送车间
车间接收执行单 --> 执行生产: 车间接收
车间接收执行单 --> 审批驳回: 车间打回拒绝
执行生产 --> [*]: 排产完结
`,
equipmentRepair: `
stateDiagram-v2
[*] --> 创建维修计划: 点选异常巡检记录<br/>绑定记录与异常设备
创建维修计划 --> 审批维修计划
审批维修计划 --> 审批驳回: 审批不通过
审批维修计划 --> 审批通过: 审批通过
审批驳回 --> 创建维修计划: 退回修改后重新提交
审批通过 --> 逐设备维修记录: 逐一执行设备维修<br/>记录维修过程与结果
逐设备维修记录 --> 逐设备维修记录: 存在未维修设备
逐设备维修记录 --> [*]: 全部设备维修完成<br/>流程结束
`
}
@@ -118,6 +195,9 @@ export default {
tabs: [
{ key: 'steelFullChain', label: '生产全链路流程', icon: 'el-icon-s-operation' },
{ key: 'afterSales', label: '售后处理流程', icon: 'el-icon-s-claim' },
{ key: 'inventoryCheck', label: '盘库流程', icon: 'el-icon-s-check' },
{ key: 'productionSchedule', label: '排产流程', icon: 'el-icon-s-order' },
{ key: 'equipmentRepair', label: '设备维修流程', icon: 'el-icon-s-tools' },
],
svgCache: {},
selectedNode: null,

View File

@@ -1,12 +1,12 @@
<template>
<div class="app-container objection-container">
<DragResizePanel :initialSize="380" :minSize="280" :maxSize="600">
<DragResizePanel :initialSize="280" :minSize="280" :maxSize="600">
<template #panelA>
<div class="left-panel">
<div class="panel-header">
<div class="header-title">
<i class="el-icon-s-claim"></i>
<span>售后单列表</span>
<span>售后单</span>
<el-button size="mini" type="text" icon="el-icon-refresh" @click="getList" style="margin-left:4px;"
title="刷新列表"></el-button>
</div>

View File

@@ -1,11 +1,6 @@
<template>
<div class="app-container">
<div class="filter-bar">
<div class="dept-tabs">
<span v-for="tab in deptTabs" :key="tab.key" class="dept-tab" :class="{ active: activeDept === tab.key }" @click="switchDept(tab.key)">
{{ tab.label }}
</span>
</div>
<el-form :model="queryParams" ref="queryForm" size="small" class="filter-form">
<el-form-item label="售后编号">
<el-input v-model="queryParams.complaintNo" placeholder="请输入售后编号" clearable @keyup.enter.native="handleQuery" />
@@ -125,17 +120,11 @@ export default {
coilLoading: false,
submitLoading: false,
total: 0,
activeDept: 'production',
deptTabs: [
{ key: 'production', label: '生产部' },
{ key: 'quality', label: '质量部' },
{ key: 'sales', label: '销售部' }
],
deptMap: { production: 1, quality: 2, sales: 3 },
queryParams: {
pageNum: 1,
pageSize: 10,
deptId: 1,
deptId: undefined,
complaintNo: undefined,
taskStatus: undefined
},
@@ -149,15 +138,10 @@ export default {
};
},
created() {
this.queryParams.deptId = this.$route.query.deptId != null ? Number(this.$route.query.deptId) : 1;
this.getList();
},
methods: {
switchDept(key) {
this.activeDept = key;
this.queryParams.deptId = this.deptMap[key];
this.queryParams.pageNum = 1;
this.getList();
},
getList() {
this.loading = true;
const params = { ...this.queryParams };
@@ -213,8 +197,8 @@ export default {
}).finally(() => { this.coilLoading = false; });
},
getDeptLabel() {
const map = { production: '生产部', quality: '质量部', sales: '销售部' };
return map[this.activeDept] || '';
const map = { 1: '生产部', 2: '质量部', 3: '销售部' };
return map[this.queryParams.deptId] || '';
},
canEdit(row) {
const status = (row.acceptInfo || {}).flowStatus;
@@ -255,33 +239,6 @@ export default {
gap: 20px;
flex-wrap: wrap;
}
.dept-tabs {
display: flex;
gap: 0;
}
.dept-tab {
padding: 6px 20px;
cursor: pointer;
font-size: 13px;
color: #606266;
background: #fff;
border: 1px solid #dcdfe6;
transition: all 0.2s;
}
.dept-tab:first-child {
border-radius: 4px 0 0 4px;
}
.dept-tab:last-child {
border-radius: 0 4px 4px 0;
}
.dept-tab.active {
color: #fff;
background: #409eff;
border-color: #409eff;
}
.dept-tab:hover:not(.active) {
color: #409eff;
}
.filter-form {
display: flex;
flex-wrap: wrap;

View File

@@ -126,6 +126,7 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
deptId: undefined,
complaintNo: undefined,
executeStatus: undefined
},
@@ -140,6 +141,7 @@ export default {
};
},
created() {
this.queryParams.deptId = this.$route.query.deptId != null ? Number(this.$route.query.deptId) : undefined;
this.getList();
},
methods: {
@@ -149,6 +151,9 @@ export default {
if (params.executeStatus === '' || params.executeStatus === undefined) {
delete params.executeStatus;
}
if (params.deptId === '' || params.deptId === undefined || params.deptId === null) {
delete params.deptId;
}
let complaintNoFilter = params.complaintNo;
delete params.complaintNo;
listPlanExecuteRel(params).then(response => {