refactor(盘库流程): 重构盘库流程页面与组件,完善排产明细功能
1. 重构盘库流程的步骤与状态映射,调整流程节点顺序与名称 2. 拆分通用盘库详情组件PlanDetailPanel,复用各流程页面 3. 新增计划审批、盘库执行页面,完善差异审批页面 4. 为排产单明细添加增删改查API与前端操作功能 5. 为排产日期添加格式化注解,完善参数接收格式
This commit is contained in:
@@ -13,8 +13,8 @@
|
||||
<div class="doc-tabs-content">
|
||||
<div v-for="(wh, idx) in warehouseList" :key="wh.relId" v-show="activeIdx === idx">
|
||||
|
||||
<!-- ====== 草稿 (0):操作台 ====== -->
|
||||
<template v-if="planStatus === 0">
|
||||
<!-- ====== 盘库执行中 (2):操作台 ====== -->
|
||||
<template v-if="planStatus === 2">
|
||||
<div class="console-section">
|
||||
<div class="console-steps">
|
||||
<div class="console-step" :class="{ done: wh.snapshotCoilLogic }">
|
||||
@@ -73,12 +73,34 @@
|
||||
</div>
|
||||
|
||||
<div style="text-align:right;margin-bottom:8px;">
|
||||
<el-button type="primary" size="small" icon="el-icon-s-promotion" @click="$emit('submit-approval')">提交审批</el-button>
|
||||
<el-button type="primary" size="small" icon="el-icon-s-promotion" @click="$emit('submit-disc-approval')">提交差异审批</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- ====== 概览卡片(状态 0/1/4) ====== -->
|
||||
<div v-if="planStatus !== 3" class="wh-overview">
|
||||
<!-- ====== 草稿 (0) / 计划待审批 (1):库区清单 ====== -->
|
||||
<template v-if="planStatus === 0 || planStatus === 1">
|
||||
<div class="wh-detail-list">
|
||||
<div class="wh-detail-row">
|
||||
<span class="wh-detail-label">逻辑库区</span>
|
||||
<span class="wh-detail-value">{{ wh.warehouseName || '-' }}</span>
|
||||
</div>
|
||||
<div class="wh-detail-row">
|
||||
<span class="wh-detail-label">实际库区</span>
|
||||
<span class="wh-detail-value">{{ wh.actualWarehouseName || '-' }}</span>
|
||||
</div>
|
||||
<div class="wh-detail-row">
|
||||
<span class="wh-detail-label">出入库查询起始</span>
|
||||
<span class="wh-detail-value">{{ wh.ioStartTime ? formatTime(wh.ioStartTime) : '-' }}</span>
|
||||
</div>
|
||||
<div class="wh-detail-row">
|
||||
<span class="wh-detail-label">出入库查询截止</span>
|
||||
<span class="wh-detail-value">{{ wh.ioEndTime ? formatTime(wh.ioEndTime) : '-' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- ====== 概览卡片(状态 2/3/4/5) ====== -->
|
||||
<div v-if="planStatus >= 2" class="wh-overview">
|
||||
<div class="wh-box">
|
||||
<div class="wh-box-title">盘点范围</div>
|
||||
<div class="wh-box-body">
|
||||
@@ -108,19 +130,28 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ===== 待审批操作 ===== -->
|
||||
<!-- ===== 计划待审批 (1) 操作 ===== -->
|
||||
<div v-if="planStatus === 1" style="text-align:right;margin-bottom:8px;">
|
||||
<el-button size="small" type="danger" icon="el-icon-close" @click="$emit('reject')">驳回</el-button>
|
||||
<el-button size="small" type="primary" icon="el-icon-check" @click="$emit('approve')">审批通过</el-button>
|
||||
</div>
|
||||
|
||||
<!-- ===== 差异审批中 (3) 操作 ===== -->
|
||||
<div v-if="planStatus === 3" style="text-align:right;margin-bottom:8px;">
|
||||
<el-button size="small" type="danger" icon="el-icon-close" @click="$emit('reject')">驳回</el-button>
|
||||
<el-button size="small" type="primary" icon="el-icon-check" @click="$emit('diff-approve')">审批通过</el-button>
|
||||
</div>
|
||||
|
||||
<!-- ===== 差异处理中 (4) 操作 ===== -->
|
||||
<div v-if="planStatus === 4" style="text-align:right;margin-bottom:8px;">
|
||||
<el-button size="small" type="success" icon="el-icon-circle-check" @click="$emit('archive')">归档封存</el-button>
|
||||
</div>
|
||||
|
||||
<!-- ====== 差异明细表格 ====== -->
|
||||
<!-- ====== 差异明细表格(状态 2+) ====== -->
|
||||
<template v-if="planStatus >= 2">
|
||||
<div class="section-title">差异明细</div>
|
||||
|
||||
<template v-if="planStatus === 0">
|
||||
<template v-if="planStatus === 2">
|
||||
<div style="display:flex;justify-content:flex-end;margin-bottom:4px;">
|
||||
<el-button size="mini" type="danger" plain icon="el-icon-delete" :disabled="discSelected.length === 0" @click="batchDelDisc(wh)">批量删除</el-button>
|
||||
</div>
|
||||
@@ -167,21 +198,31 @@
|
||||
<el-table-column label="处理建议" align="center" min-width="100">
|
||||
<template slot-scope="ds">{{ ds.row.processSuggestion || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="需处理" align="center" width="80">
|
||||
<template slot-scope="ds">
|
||||
<el-tag v-if="ds.row.processStatus === 1" type="warning" size="mini">是</el-tag>
|
||||
<el-tag v-else type="info" size="mini">否</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="80">
|
||||
<template slot-scope="ds">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="$emit('mark-disc', ds.row)">标记</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
<template v-else-if="planStatus === 3">
|
||||
<el-table v-loading="discLoadingMap[wh.relId]" :data="discMap[wh.relId] || []" border size="small" style="width:100%" height="300">
|
||||
<el-table-column label="类型" align="center" width="80">
|
||||
<template slot-scope="ds">
|
||||
<el-tag v-if="ds.row.discrepancyType === 1" type="success" size="mini">盘盈</el-tag>
|
||||
<el-tag v-else-if="ds.row.discrepancyType === 2" type="danger" size="mini">盘亏</el-tag>
|
||||
<el-tag v-else-if="ds.row.discrepancyType === 3" type="warning" size="mini">不符</el-tag>
|
||||
<el-tag v-else size="mini">偏差</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="钢卷号" align="center" prop="enterCoilNo" width="140" />
|
||||
<el-table-column label="差异详情" align="center" prop="discrepancyDetail" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="原因分析" align="center" min-width="100">
|
||||
<template slot-scope="ds">{{ ds.row.reasonAnalysis || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="处理建议" align="center" min-width="100">
|
||||
<template slot-scope="ds">{{ ds.row.processSuggestion || '-' }}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
<template v-else-if="planStatus === 4">
|
||||
<el-table v-loading="discLoadingMap[wh.relId]" :data="discMap[wh.relId] || []" border size="small" style="width:100%" height="300">
|
||||
<el-table-column label="类型" align="center" width="80">
|
||||
<template slot-scope="ds">
|
||||
@@ -219,7 +260,7 @@
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
<template v-else-if="planStatus === 4">
|
||||
<template v-else-if="planStatus === 5">
|
||||
<el-table v-loading="discLoadingMap[wh.relId]" :data="discMap[wh.relId] || []" border size="small" style="width:100%" height="300">
|
||||
<el-table-column label="类型" align="center" width="80">
|
||||
<template slot-scope="ds">
|
||||
@@ -257,6 +298,7 @@
|
||||
<div v-else style="text-align:right;padding:4px 0;">
|
||||
<el-pagination background layout="prev, pager, next, total" :total="discTotalMap[wh.relId] || 0" :page-size="discPageSize" :current-page="discPageMap[wh.relId] || 1" @current-change="function(p) { loadDisc(wh.relId, p); }" small />
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -402,8 +444,11 @@ export default {
|
||||
listCountDiscrepancy({ relId, pageNum: pageNum, pageSize: this.discPageSize }).then(function(r) {
|
||||
self.$set(self.discMap, relId, (r.rows || []).map(function(item) {
|
||||
if (item._processResult === undefined) item._processResult = item.processResult || '';
|
||||
if (item._needResolve === undefined) item._needResolve = item.processStatus === 1;
|
||||
if (item._approveRemark === undefined) item._approveRemark = item.remark || '';
|
||||
return item;
|
||||
}));
|
||||
self.$set(self.discTotalMap, relId, r.total || 0);
|
||||
}).finally(function() { self.$set(self.discLoadingMap, relId, false); });
|
||||
},
|
||||
loadAllDisc() { var self = this; this.warehouseList.forEach(function(wh) { self.loadDisc(wh.relId); }); },
|
||||
@@ -507,6 +552,10 @@ export default {
|
||||
if (!row || !row.discrepancyId) return;
|
||||
updateCountDiscrepancy({ discrepancyId: row.discrepancyId, reasonAnalysis: row.reasonAnalysis, processSuggestion: row.processSuggestion }).catch(function() {});
|
||||
},
|
||||
saveDiscMark(row) {
|
||||
if (!row || !row.discrepancyId) return;
|
||||
updateCountDiscrepancy({ discrepancyId: row.discrepancyId, processStatus: row._needResolve ? 1 : 0, remark: row._approveRemark }).catch(function() {});
|
||||
},
|
||||
|
||||
// ===== 对比 =====
|
||||
async doCompare(wh) {
|
||||
@@ -568,6 +617,11 @@ export default {
|
||||
<style scoped>
|
||||
.wh-panel { }
|
||||
.wh-empty { padding: 16px 0; color: #909399; font-size: 13px; }
|
||||
.wh-detail-list { margin: 8px 0 16px; border: 1px solid #e8e4de; border-radius: 2px; overflow: hidden; }
|
||||
.wh-detail-row { display: flex; padding: 8px 14px; font-size: 13px; border-bottom: 1px solid #f0ece6; }
|
||||
.wh-detail-row:last-child { border-bottom: none; }
|
||||
.wh-detail-label { width: 120px; flex-shrink: 0; color: #606266; font-weight: 500; }
|
||||
.wh-detail-value { color: #303133; }
|
||||
.doc-tabs-header { display: flex; border-bottom: 1px solid #d4d0c8; margin-bottom: 12px; }
|
||||
.doc-tab-item { padding: 8px 16px; cursor: pointer; color: #8c8c8c; font-size: 13px; font-weight: 500; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color 0.2s, border-color 0.2s; display: flex; align-items: center; gap: 6px; user-select: none; }
|
||||
.doc-tab-item:hover { color: #1a3c6e; }
|
||||
|
||||
Reference in New Issue
Block a user