refactor(wms/coil): 抽象排产单组件,复用排产单展示逻辑

1.  新增PlanSheetViewer通用排产单展示组件,支持图片、excel、普通文件预览和空状态
2.  改造TimeInput组件,修复绑定属性写法
3.  替换typing.vue、stepSplit.vue、split.vue、merge.vue中的旧排产单代码,统一使用新组件
4.  删除冗余的排产单相关API调用和本地数据逻辑
This commit is contained in:
2026-06-08 10:22:30 +08:00
parent 857a3948d6
commit f6a74e58ea
6 changed files with 207 additions and 357 deletions

View File

@@ -14,42 +14,8 @@
<!-- 最近排产单 -->
<div class="plan-sheet-container">
<div v-if="planSheetList.length > 0" class="plan-sheet-section">
<el-descriptions :column="1" border title="最近排产单(酸轧线)" size="small" />
<el-tabs v-model="activePlanSheetId" type="card" size="mini">
<el-tab-pane v-for="sheet in planSheetList" :key="sheet.planSheetId" :name="sheet.planSheetId"
:label="sheet.planCode || ('排产单' + sheet.planSheetId)" />
</el-tabs>
<el-table v-loading="planSheetLoading" :data="activePlanSheetDetails" border stripe size="mini"
max-height="300">
<el-table-column type="index" label="序号" width="50" />
<el-table-column label="订单信息" header-align="center">
<el-table-column prop="contractCode" label="合同号" width="140" show-overflow-tooltip />
<el-table-column prop="customerName" label="客户" width="120" show-overflow-tooltip />
<el-table-column prop="salesman" label="业务员" width="100" show-overflow-tooltip />
</el-table-column>
<el-table-column label="成品信息" header-align="center">
<el-table-column prop="productName" label="成品名称" width="140" show-overflow-tooltip />
<el-table-column prop="productMaterial" label="材质" width="100" />
<el-table-column prop="coatingG" label="镀层g" width="80" />
<el-table-column prop="productWidth" label="成品宽度" width="100" />
<el-table-column prop="rollingThick" label="轧制厚度" width="100" />
<el-table-column prop="markCoatThick" label="标丝厚度" width="100" />
<el-table-column prop="tonSteelLengthRange" label="长度区间(m)" width="120" />
<el-table-column prop="planQty" label="数量" width="80" />
<el-table-column prop="planWeight" label="重量" width="100" />
<el-table-column prop="surfaceTreatment" label="表面处理" width="110" show-overflow-tooltip />
<el-table-column prop="widthReq" label="切边要求" width="110" show-overflow-tooltip />
<el-table-column prop="productPackaging" label="包装要求" width="100" show-overflow-tooltip />
<el-table-column prop="productEdgeReq" label="宽度要求" width="100" show-overflow-tooltip />
<el-table-column prop="usageReq" label="用途" width="100" show-overflow-tooltip />
</el-table-column>
<el-table-column prop="remark" label="备注" width="140" show-overflow-tooltip />
</el-table>
</div>
<div v-else-if="!planSheetLoading" class="plan-sheet-section">
<el-descriptions :column="1" border title="最近排产单(酸轧线)" size="small" />
<el-empty description="今天暂无排产单" :image-size="60" />
<div class="plan-sheet-section">
<PlanSheetViewer :line-name="planSheetLineName" />
</div>
</div>
@@ -211,13 +177,13 @@
<div class="form-row">
<el-form-item label="毛重(t)" required class="form-item-half">
<el-input-number precision="3" :controls="false" v-model="item.grossWeight" placeholder="请输入毛重"
<el-input-number :precision="3" :controls="false" v-model="item.grossWeight" placeholder="请输入毛重"
:step="0.01" :disabled="readonly">
<template slot="append"></template>
</el-input-number>
</el-form-item>
<el-form-item label="净重(t)" required class="form-item-half">
<el-input-number precision="3" :controls="false" v-model="item.netWeight" placeholder="请输入净重"
<el-input-number :precision="3" :controls="false" v-model="item.netWeight" placeholder="请输入净重"
:step="0.01" :disabled="readonly">
<template slot="append"></template>
</el-input-number>
@@ -404,14 +370,13 @@ import { getMaterialCoil, splitMaterialCoil, getFirstHeatCoilMaterial } from '@/
import { listCoilAbnormal } from '@/api/wms/coilAbnormal';
import { listWarehouse } from '@/api/wms/warehouse';
import { completeAction, getPendingAction } from '@/api/wms/pendingAction';
import { listPlanSheet } from '@/api/aps/planSheet'
import { listPlanDetail } from '@/api/aps/planDetail'
import ActualWarehouseSelect from "@/components/KLPService/ActualWarehouseSelect";
import RawMaterialSelect from "@/components/KLPService/RawMaterialSelect";
import ProductSelect from "@/components/KLPService/ProductSelect";
import WarehouseSelect from "@/components/KLPService/WarehouseSelect";
import TimeInput from "@/components/TimeInput";
import AbnormalForm from './components/AbnormalForm';
import PlanSheetViewer from './components/PlanSheetViewer.vue';
import { generateCoilNoPrefix } from "@/utils/coil/coilNo";
import ContractSelect from "@/components/KLPService/ContractSelect";
import { addCoilContractRel } from "@/api/wms/coilContractRel";
@@ -425,7 +390,8 @@ export default {
WarehouseSelect,
TimeInput,
AbnormalForm,
ContractSelect
ContractSelect,
PlanSheetViewer,
},
dicts: ['coil_quality_status', 'coil_abnormal_position', 'coil_abnormal_code', 'coil_abnormal_degree', 'coil_business_purpose'],
data() {
@@ -508,12 +474,6 @@ export default {
},
// 最早热轧卷板材质
firstHeatMaterial: null,
// 排产单相关
actionTypeCode: '',
planSheetList: [],
planSheetDetailMap: {},
planSheetLoading: false,
activePlanSheetId: null,
// 异常继承
inheritDialogVisible: false,
inheritLoading: false,
@@ -530,9 +490,6 @@ export default {
const d = new Date()
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
},
activePlanSheetDetails() {
return this.planSheetDetailMap[this.activePlanSheetId] || []
},
selectedInheritCount() {
let count = 0
for (const parent of this.parentCoils) {
@@ -554,12 +511,6 @@ export default {
const coilId = this.$route.query.coilId;
const actionId = this.$route.query.actionId;
const readonly = this.$route.query.readonly;
const actionTypeCode = this.$route.query.actionTypeCode;
if (actionTypeCode) {
this.actionTypeCode = actionTypeCode;
}
this.fetchPlanSheets();
// 获取待操作详情
getPendingAction(actionId).then(res => {
@@ -1012,33 +963,6 @@ export default {
return item ? item.label : code;
},
// 查询最近排产单(酸轧线)
async fetchPlanSheets() {
this.planSheetLoading = true
try {
const res = await listPlanSheet({
lineName: '酸轧线',
pageSize: 3, pageNum: 1,
})
this.planSheetList = res.rows || []
this.planSheetDetailMap = {}
if (this.planSheetList.length > 0) {
this.activePlanSheetId = this.planSheetList[0].planSheetId
for (const sheet of this.planSheetList) {
this.fetchPlanSheetDetail(sheet.planSheetId)
}
}
} catch (e) { console.error('查询排产单失败', e) }
finally { this.planSheetLoading = false }
},
async fetchPlanSheetDetail(planSheetId) {
try {
const res = await listPlanDetail({ planSheetId, pageSize: 100, pageNum: 1 })
const details = (res.rows || []).sort((a, b) => (parseInt(a.bizSeqNo) || 0) - (parseInt(b.bizSeqNo) || 0))
this.$set(this.planSheetDetailMap, planSheetId, details)
} catch (e) { console.error('查询排产单明细失败', e) }
},
// 异常继承
handleInheritAbnormal(subCoilIndex) {
const parentId = this.motherCoil.coilId