refactor(wms/coil): 优化代码格式并新增热轧卷材质自动填充功能

1. 格式化多个vue文件的模板代码,调整长标签换行规范
2. 新增getFirstHeatCoilMaterial接口调用,从接口获取最早热轧卷板材质
3. 在分条、酸洗页面中自动将packingStatus填充为获取到的热轧材质
4. 调整typing页面的布局结构,优化表单排版
This commit is contained in:
2026-05-12 10:40:02 +08:00
parent a69b931b94
commit 1e62425fb8
3 changed files with 368 additions and 418 deletions

View File

@@ -25,7 +25,8 @@
<el-descriptions :column="2" border title="待分条钢卷信息">
<template slot="extra">
<el-button v-if="showSplitForm" type="info" @click="copyFromSourceCoil" icon="el-icon-document-copy">复制源卷信息</el-button>
<el-button v-if="showSplitForm" type="info" @click="copyFromSourceCoil"
icon="el-icon-document-copy">复制源卷信息</el-button>
</template>
<el-descriptions-item label="入场钢卷号">{{ coilInfo.enterCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前钢卷号">{{ coilInfo.currentCoilNo || '-' }}</el-descriptions-item>
@@ -244,7 +245,7 @@
<!-- 分条钢卷详情选中列表项时显示 -->
<div class="split-detail-card" v-else-if="selectedSplitItem">
<el-card title="分条钢卷详情" shadow="hover">
<CoilInfoRender :coilInfo="selectedSplitItem" :column="2" border/>
<CoilInfoRender :coilInfo="selectedSplitItem" :column="2" border />
</el-card>
</div>
@@ -271,17 +272,28 @@
<el-alert title="检测到您之前有暂存的分条数据,是否恢复使用?" type="info" show-icon :closable="false"></el-alert>
<el-divider content-position="left">暂存的表单数据</el-divider>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="入场钢卷号">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.enterCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前钢卷号">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.currentCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="所在库位">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.warehouseId || '-' }}</el-descriptions-item>
<el-descriptions-item label="班组">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.team || '-' }}</el-descriptions-item>
<el-descriptions-item label="材料类型">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.materialType || '-' }}</el-descriptions-item>
<el-descriptions-item label="质量状态">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.qualityStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="净重">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.netWeight || '-' }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ parsedCacheData && parsedCacheData.splitForm && parsedCacheData.splitForm.remark || '-' }}</el-descriptions-item>
<el-descriptions-item label="入场钢卷号">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.enterCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前钢卷号">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.currentCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="所在库位">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.warehouseId || '-' }}</el-descriptions-item>
<el-descriptions-item label="班组">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.team
|| '-' }}</el-descriptions-item>
<el-descriptions-item label="材料类型">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.materialType || '-' }}</el-descriptions-item>
<el-descriptions-item label="质量状态">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.qualityStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="净重">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.netWeight || '-' }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ parsedCacheData && parsedCacheData.splitForm &&
parsedCacheData.splitForm.remark || '-' }}</el-descriptions-item>
</el-descriptions>
<el-divider v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0" content-position="left">暂存的异常信息 ({{ parsedCacheData.abnormals.length }})</el-divider>
<div v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0" class="abnormal-container" style="margin-bottom: 20px;">
<el-divider v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0"
content-position="left">暂存的异常信息 ({{ parsedCacheData.abnormals.length }})</el-divider>
<div v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0"
class="abnormal-container" style="margin-bottom: 20px;">
<div v-for="(abnormal, index) in parsedCacheData.abnormals" :key="index" class="abnormal-item">
<div class="abnormal-content">
<div class="abnormal-info">
@@ -302,7 +314,7 @@
</template>
<script>
import { getMaterialCoil, listMaterialCoil, createSpecialChild, completeSpecialSplit, updateMaterialCoilSimple, checkCoilNo, delMaterialCoil } from '@/api/wms/coil'
import { getMaterialCoil, listMaterialCoil, createSpecialChild, completeSpecialSplit, updateMaterialCoilSimple, checkCoilNo, delMaterialCoil, getFirstHeatCoilMaterial } from '@/api/wms/coil'
import { completeAction, getPendingAction, updatePendingAction } from '@/api/wms/pendingAction'
import { saveCoilCache, getCoilCacheByCoilId, delCoilCache } from '@/api/wms/coilCache'
import { getGalvanize1TypingPrefill } from '@/api/pocket/acidTyping';
@@ -440,6 +452,8 @@ export default {
cacheDialogVisible: false,
currentCache: null,
parsedCacheData: null,
// 最早的热轧卷板材质
firstHeatMaterial: '',
}
},
computed: {
@@ -486,6 +500,16 @@ export default {
const res = await getMaterialCoil(this.coilId)
if (res.code === 200) {
this.coilInfo = res.data || {}
// 获取最早的热轧卷板材质
try {
const firstHeatMaterial = await getFirstHeatCoilMaterial(this.coilId);
if (firstHeatMaterial.code === 200 && firstHeatMaterial.msg) {
this.firstHeatMaterial = firstHeatMaterial.msg
}
} catch {
}
} else {
this.$message.error('查询钢卷信息失败:' + res.msg)
}
@@ -610,7 +634,7 @@ export default {
itemId: '',
qualityStatus: '',
trimmingRequirement: '',
packingStatus: '',
packingStatus: this.firstHeatMaterial || '',
packagingRequirement: '',
grossWeight: '',
netWeight: '',

View File

@@ -193,8 +193,8 @@
</el-input-number>
</el-form-item>
<el-form-item label="长度(m)">
<el-input-number :controls="false" v-model="item.length" placeholder="请输入长度" type="number" :step="0.01"
:disabled="readonly">
<el-input-number :controls="false" v-model="item.length" placeholder="请输入长度" type="number"
:step="0.01" :disabled="readonly">
<template slot="append"></template>
</el-input-number>
</el-form-item>
@@ -205,8 +205,8 @@
</el-input-number>
</el-form-item>
<el-form-item label="实测厚度(mm)" prop="actualThickness" class="form-item-half">
<el-input-number :controls="false" v-model="item.actualThickness" placeholder="请输入实测厚度"
type="number" :step="0.01" :disabled="readonly">
<el-input-number :controls="false" v-model="item.actualThickness" placeholder="请输入实测厚度" type="number"
:step="0.01" :disabled="readonly">
<template slot="append">mm</template>
</el-input-number>
</el-form-item>
@@ -229,7 +229,8 @@
<MemoInput storageKey="coatingType" v-model="item.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="item.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
<MemoInput storageKey="surfaceTreatmentDesc" v-model="item.coilSurfaceTreatment"
placeholder="请输入钢卷表面处理" />
</el-form-item>
<el-form-item label="逻辑库区" required>
<WarehouseSelect v-model="item.warehouseId" placeholder="请选择逻辑库区" :disabled="readonly" />
@@ -239,10 +240,12 @@
:disabled="readonly" />
</el-form-item> -->
<el-form-item label="生产开始时间">
<TimeInput v-model="item.productionStartTime" @input="() => calculateProductionDuration(item)" :disabled="readonly" />
<TimeInput v-model="item.productionStartTime" @input="() => calculateProductionDuration(item)"
:disabled="readonly" />
</el-form-item>
<el-form-item label="生产结束时间">
<TimeInput v-model="item.productionEndTime" @input="() => calculateProductionDuration(item)" :disabled="readonly" :show-now-button="true" />
<TimeInput v-model="item.productionEndTime" @input="() => calculateProductionDuration(item)"
:disabled="readonly" :show-now-button="true" />
</el-form-item>
<el-form-item label="生产耗时">
<el-input v-model="item.formattedDuration" placeholder="自动计算" disabled />
@@ -257,30 +260,18 @@
<el-form-item label="异常信息">
<div class="abnormal-container">
<div
v-for="(abnormal, abnormalIndex) in item.abnormals"
:key="abnormalIndex"
class="abnormal-item"
@click="editAbnormal(index, abnormalIndex)"
>
<div v-for="(abnormal, abnormalIndex) in item.abnormals" :key="abnormalIndex" class="abnormal-item"
@click="editAbnormal(index, abnormalIndex)">
<div class="abnormal-content">
<div class="abnormal-info">
<div class="abnormal-position">{{ getAbnormalPositionText(abnormal.position) }}</div>
<div class="abnormal-code">{{ getAbnormalCodeText(abnormal.defectCode) }}</div>
</div>
<el-button
type="danger"
size="mini"
icon="el-icon-close"
class="abnormal-delete"
@click.stop="deleteAbnormal(index, abnormalIndex)"
></el-button>
<el-button type="danger" size="mini" icon="el-icon-close" class="abnormal-delete"
@click.stop="deleteAbnormal(index, abnormalIndex)"></el-button>
</div>
</div>
<div
class="abnormal-add"
@click="addAbnormal(index)"
>
<div class="abnormal-add" @click="addAbnormal(index)">
<i class="el-icon-plus"></i>
</div>
</div>
@@ -293,16 +284,9 @@
</div>
<!-- 异常表单弹窗 -->
<el-dialog
:title="currentAbnormalIndex === -1 ? '新增异常' : '编辑异常'"
:visible.sync="abnormalDialogVisible"
width="600px"
>
<abnormal-form
ref="abnormalForm"
v-model="abnormalForm"
:show-coil-selector="false"
></abnormal-form>
<el-dialog :title="currentAbnormalIndex === -1 ? '新增异常' : '编辑异常'" :visible.sync="abnormalDialogVisible"
width="600px">
<abnormal-form ref="abnormalForm" v-model="abnormalForm" :show-coil-selector="false"></abnormal-form>
<div slot="footer" class="dialog-footer">
<el-button @click="abnormalDialogVisible = false"> </el-button>
<el-button type="primary" @click="saveAbnormal"> </el-button>
@@ -312,7 +296,7 @@
</template>
<script>
import { getMaterialCoil, splitMaterialCoil } from '@/api/wms/coil';
import { getMaterialCoil, splitMaterialCoil, getFirstHeatCoilMaterial } from '@/api/wms/coil';
import { listWarehouse } from '@/api/wms/warehouse';
import { completeAction, getPendingAction } from '@/api/wms/pendingAction';
import ActualWarehouseSelect from "@/components/KLPService/ActualWarehouseSelect";
@@ -414,7 +398,9 @@ export default {
defectCode: null,
degree: null,
remark: null
}
},
// 最早热轧卷板材质
firstHeatMaterial: null,
};
},
computed: {
@@ -549,6 +535,21 @@ export default {
itemMaterial: data?.material || '',
itemSpecification: data?.specification || '',
};
// 获取最早的热轧卷板材质
try {
const firstHeatMaterial = await getFirstHeatCoilMaterial(this.motherCoil.enterCoilNo);
if (firstHeatMaterial.code === 200 && firstHeatMaterial.msg) {
this.firstHeatMaterial = firstHeatMaterial.msg
}
for (const item of this.splitList) {
item.packingStatus = this.firstHeatMaterial || ''
}
} catch (error) {
// console.error('获取最早的热轧卷板材质失败', error);
}
}
} catch (error) {
this.$message.error('加载母卷信息失败');
@@ -585,7 +586,7 @@ export default {
actualWarehouseId: null,
qualityStatus: '',
packagingRequirement: '',
packingStatus: '',
packingStatus: this.firstHeatMaterial || '',
trimmingRequirement: '',
temperGrade: '',
coatingType: '',
@@ -690,7 +691,7 @@ export default {
coilId,
contractId: this.splitList[index].contractId
}))
.filter(req => req.contractId);
.filter(req => req.contractId);
// 为每个子卷添加合同关联
Promise.all(requests.map(async (req, index) => {
addCoilContractRel(req);
@@ -750,26 +751,26 @@ export default {
// 格式化毫秒值为xx天xx小时xx分钟
formatDuration(milliseconds) {
if (!milliseconds || milliseconds < 0) return '';
const seconds = Math.floor(milliseconds / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
const remainingHours = hours % 24;
const remainingMinutes = minutes % 60;
let result = '';
if (days > 0) result += `${days}`;
if (remainingHours > 0) result += `${remainingHours}小时`;
if (remainingMinutes > 0) result += `${remainingMinutes}分钟`;
return result || '0分钟';
},
// 计算生产耗时
calculateProductionDuration(item) {
if (!item) return;
const { productionStartTime, productionEndTime } = item;
if (productionStartTime && productionEndTime) {
const start = new Date(productionStartTime).getTime();
@@ -792,7 +793,7 @@ export default {
this.$set(item, 'formattedDuration', '');
}
},
// 新增异常
addAbnormal(subCoilIndex) {
this.currentSubCoilIndex = subCoilIndex;
@@ -809,7 +810,7 @@ export default {
};
this.abnormalDialogVisible = true;
},
// 编辑异常
editAbnormal(subCoilIndex, abnormalIndex) {
this.currentSubCoilIndex = subCoilIndex;
@@ -817,14 +818,14 @@ export default {
this.abnormalForm = { ...this.splitList[subCoilIndex].abnormals[abnormalIndex] };
this.abnormalDialogVisible = true;
},
// 保存异常
saveAbnormal() {
this.$refs.abnormalForm.validate(valid => {
if (valid) {
// 计算缺陷长度
this.abnormalForm.length = this.abnormalForm.endPosition - this.abnormalForm.startPosition;
if (this.currentAbnormalIndex === -1) {
// 新增异常
this.splitList[this.currentSubCoilIndex].abnormals.push({ ...this.abnormalForm });
@@ -832,12 +833,12 @@ export default {
// 编辑异常
this.splitList[this.currentSubCoilIndex].abnormals[this.currentAbnormalIndex] = { ...this.abnormalForm };
}
this.abnormalDialogVisible = false;
}
});
},
// 删除异常
deleteAbnormal(subCoilIndex, abnormalIndex) {
this.$confirm('确定要删除这个异常信息吗?', '提示', {
@@ -848,7 +849,7 @@ export default {
this.splitList[subCoilIndex].abnormals.splice(abnormalIndex, 1);
});
},
// 获取异常位置文本
getAbnormalPositionText(position) {
if (!position) return '';
@@ -857,7 +858,7 @@ export default {
const item = dict.find(item => item.value === position);
return item ? item.label : position;
},
// 获取异常代码文本
getAbnormalCodeText(code) {
if (!code) return '';

View File

@@ -1,15 +1,24 @@
<template>
<div class="typing-coil-container">
<!-- 顶部操作栏 -->
<div class="header-bar">
<!-- <div class="header-bar">
<div class="header-title">
<i class="el-icon-edit"></i>
<span>钢卷信息更新</span>
</div>
<div class="header-actions">
<el-button size="small" @click="saveTemp" :loading="loading">暂存内容</el-button>
<el-button type="primary" size="small" @click="handleSave" :loading="loading">保存更新</el-button>
</div>
</div> -->
<div>
<CoilInfoRender title="原料信息" :coilInfo="currentInfo" border>
<template slot="extra">
<el-button type="text" size="mini" @click="copyFromCurrent" icon="el-icon-document-copy">
复制源卷信息
</el-button>
</template>
</CoilInfoRender>
</div>
<el-alert v-if="acidPrefill.visible" :title="acidPrefill.title" :type="acidPrefill.type" :closable="false" show-icon
@@ -17,238 +26,248 @@
<!-- 主内容区 - 左右布局 -->
<div class="content-wrapper">
<!-- 左侧当前信息 -->
<div class="left-panel">
<el-card class="info-card">
<!-- 左侧酸轧信息推荐 -->
<div>
<!-- 酸连轧最近10条记录展示 -->
<el-card class="recent-records-card" v-if="acidRecentRecords && acidRecentRecords.length > 0">
<div slot="header" class="card-header">
<span><i class="el-icon-info"></i> 当前信息</span>
<span><i class="el-icon-time"></i> 酸连轧最近记录</span>
</div>
<div class="info-section">
<div class="info-row">
<span class="info-label">入场钢卷号</span>
<span class="info-value">{{ currentInfo.enterCoilNo || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">当前钢卷号</span>
<span class="info-value">{{ currentInfo.currentCoilNo || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">厂家原料卷号</span>
<span class="info-value">{{ currentInfo.supplierCoilNo || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">班组</span>
<span class="info-value">{{ currentInfo.team || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">物品类型</span>
<span class="info-value">{{ getItemTypeText(currentInfo.itemType) }}</span>
</div>
<div class="info-row">
<span class="info-label">物料名称</span>
<span class="info-value">{{ currentInfo.itemName || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">规格</span>
<span class="info-value">{{ currentInfo.specification || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">材质</span>
<span class="info-value">{{ currentInfo.material || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">原料材质</span>
<span class="info-value">{{ currentInfo.packingStatus || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">钢卷表面处理</span>
<span class="info-value">{{ currentInfo.coilSurfaceTreatment || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">厂家</span>
<span class="info-value">{{ currentInfo.manufacturer || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">表面处理</span>
<span class="info-value">{{ currentInfo.surfaceTreatmentDesc || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">毛重</span>
<span class="info-value">{{ currentInfo.grossWeight ? currentInfo.grossWeight + ' t' : '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">净重</span>
<span class="info-value">{{ currentInfo.netWeight ? currentInfo.netWeight + ' t' : '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">长度</span>
<span class="info-value">{{ currentInfo.length ? currentInfo.length + ' m' : '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">调制度</span>
<span class="info-value">{{ currentInfo.temperGrade || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">镀层种类</span>
<span class="info-value">{{ currentInfo.coatingType || '—' }}</span>
</div>
<div class="info-row">
<span class="info-label">逻辑库区</span>
<span class="info-value">{{ currentInfo.warehouseName || '—' }}</span>
</div>
<div class="info-row" v-if="currentInfo.remark">
<span class="info-label">备注</span>
<span class="info-value">{{ currentInfo.remark }}</span>
</div>
</div>
<el-table :data="acidRecentRecords" stripe size="small" @row-click="handleClickRecord">
<el-table-column prop="currentCoilNo" label="加工前卷号" show-overflow-tooltip></el-table-column>
<el-table-column prop="excoilId" label="出口卷号" show-overflow-tooltip></el-table-column>
<el-table-column prop="exitWeight" label="出口重量(t)" width="100">
<template slot-scope="scope">
{{ scope.row.exitWeight ? scope.row.exitWeight + ' t' : '—' }}
</template>
</el-table-column>
<el-table-column prop="team" label="班组" width="80"></el-table-column>
</el-table>
</el-card>
</div>
<!-- 右侧更新表单 -->
<div class="right-panel">
<div>
<el-card class="form-card">
<div slot="header" class="card-header">
<span><i class="el-icon-edit-outline"></i> {{ '更新信息' }}</span>
<el-button type="text" size="mini" @click="copyFromCurrent" icon="el-icon-document-copy">
复制源卷信息
</el-button>
<div>
<el-button size="small" @click="saveTemp" :loading="loading">暂存内容</el-button>
<el-button type="primary" size="small" @click="handleSave" :loading="loading">保存更新</el-button>
</div>
</div>
<el-form ref="updateForm" :model="updateForm" :rules="rules" label-width="80px" size="small">
<el-form-item label="当前钢卷号" prop="currentCoilNo">
<el-input v-model="updateForm.currentCoilNo" placeholder="请输入当前钢卷号">
<template slot="prepend">
<i class="el-icon-document"></i>
</template>
</el-input>
<current-coil-no :current-coil-no="updateForm.currentCoilNo"></current-coil-no>
</el-form-item>
<el-form ref="updateForm" :model="updateForm" :rules="rules" label-width="86px" size="small">
<el-row>
<el-col :span="16">
<el-form-item label="当前钢卷号" prop="currentCoilNo">
<el-input v-model="updateForm.currentCoilNo" placeholder="请输入当前钢卷号">
<template slot="prepend">
<i class="el-icon-document"></i> <current-coil-no
:current-coil-no="updateForm.currentCoilNo"></current-coil-no>
</template>
</el-input>
</el-form-item>
</el-col>
<el-form-item label="班组" prop="team">
<el-select v-model="updateForm.team" placeholder="请选择班组" style="width: 100%">
<el-option key="甲" label="甲" value="甲" />
<el-option key="" label="" value="" />
</el-select>
</el-form-item>
<el-col :span="8">
<el-form-item label="班组" prop="team">
<el-select v-model="updateForm.team" placeholder="请选择班组" style="width: 100%">
<el-option key="" label="" value="" />
<el-option key="乙" label="乙" value="乙" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="材料类型" prop="materialType">
<el-select v-model="updateForm.materialType" placeholder="请选择材料类型" style="width: 100%" @change="handleMaterialTypeChange">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
</el-select>
</el-form-item>
<el-form-item :label="getItemLabel" prop="itemId" :rules="rules.itemId">
<RawMaterialSelect v-if="updateForm.materialType === '原料'" v-model="updateForm.itemId" placeholder="请选择原料"
style="width: 100%" clearable :disabled="!updateForm.materialType" />
<ProductSelect v-else-if="updateForm.materialType === '成品'" v-model="updateForm.itemId"
placeholder="请选择成品" style="width: 100%" clearable :disabled="!updateForm.materialType" />
<div v-else>请先选择物料类型</div>
</el-form-item>
<el-form-item label="质量状态" prop="qualityStatus">
<el-select v-model="updateForm.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="材料类型" prop="materialType">
<el-select v-model="updateForm.materialType" placeholder="请选择材料类型" style="width: 100%"
@change="handleMaterialTypeChange">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="getItemLabel" prop="itemId" :rules="rules.itemId">
<RawMaterialSelect v-if="updateForm.materialType === '原料'" v-model="updateForm.itemId"
placeholder="请选择原料" style="width: 100%" clearable :disabled="!updateForm.materialType" />
<ProductSelect v-else-if="updateForm.materialType === '成品'" v-model="updateForm.itemId"
placeholder="请选择成品" style="width: 100%" clearable :disabled="!updateForm.materialType" />
<div v-else>请先选择物料类型</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="原料材质" prop="packingStatus">
<el-input v-model="updateForm.packingStatus" placeholder="请输入原料材质">
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="切边要求" prop="trimmingRequirement">
<el-select v-model="updateForm.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-option label="净边料" value="净边料" />
<el-option label="毛边料" value="毛边料" />
</el-select>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="质量状态" prop="qualityStatus">
<el-select v-model="updateForm.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="切边要求" prop="trimmingRequirement">
<el-select v-model="updateForm.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-option label="净边料" value="净边料" />
<el-option label="毛边料" value="毛边料" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="包装要求" prop="packagingRequirement">
<el-select v-model="updateForm.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-option label="裸包" value="裸包" />
<el-option label="普包" value="普包" />
<el-option label="简包" value="简包" />
<el-option label="精包" value="精包" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="原料材质" prop="packingStatus">
<el-input v-model="updateForm.packingStatus" placeholder="请输入原料材质">
</el-input>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="质量状态" prop="qualityStatus">
<el-select v-model="updateForm.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="切边要求" prop="trimmingRequirement">
<el-select v-model="updateForm.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-option label="净边料" value="净边料" />
<el-option label="毛边料" value="毛边料" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="包装要求" prop="packagingRequirement">
<el-select v-model="updateForm.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-option label="裸包" value="裸包" />
<el-option label="普包" value="普包" />
<el-option label="简包" value="简包" />
<el-option label="精包" value="精包" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="包装要求" prop="packagingRequirement">
<el-select v-model="updateForm.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-option label="裸包" value="裸包" />
<el-option label="普包" value="普包" />
<el-option label="简包" value="简包" />
<el-option label="精包" value="精包" />
</el-select>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="毛重(t)" prop="grossWeight">
<el-input-number :precision="3" :controls="false" v-model="updateForm.grossWeight" placeholder="请输入毛重"
type="number" :step="0.01">
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="净重(t)" prop="netWeight">
<el-input-number :precision="3" :controls="false" v-model="updateForm.netWeight" placeholder="请输入净重"
type="number" :step="0.001">
<template slot="append"></template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="参考长度(m)" prop="length">
<el-input-number :controls="false" v-model="updateForm.length" placeholder="请输入参考长度" type="number"
:step="0.001">
<template slot="append"></template>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="毛重(t)" prop="grossWeight">
<el-input-number :precision="3" :controls="false" v-model="updateForm.grossWeight" placeholder="请输入毛重"
type="number" :step="0.01">
</el-input-number>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="实测长度(m)" prop="actualLength">
<el-input-number :controls="false" v-model="updateForm.actualLength" placeholder="请输入实测长度"
type="number" :step="0.001">
<template slot="append">m</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实测厚度(mm)" prop="actualThickness" class="form-item-half">
<el-input-number :controls="false" v-model="updateForm.actualThickness" placeholder="请输入实测厚度"
type="number" :step="0.01">
<template slot="append">mm</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实测宽度(mm)" prop="actualWidth">
<el-input-number :controls="false" v-model="updateForm.actualWidth" placeholder="请输入实测宽度"
type="number" :step="0.001">
<template slot="append">mm</template>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="净重(t)" prop="netWeight">
<el-input-number :precision="3" :controls="false" v-model="updateForm.netWeight" placeholder="请输入净重"
type="number" :step="0.001">
<template slot="append"></template>
</el-input-number>
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="updateForm.businessPurpose" placeholder="请选择业务目的" style="width: 100%">
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="updateForm.temperGrade" placeholder="请输入调制度" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="updateForm.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="参考长度(m)" prop="length">
<el-input-number :controls="false" v-model="updateForm.length" placeholder="请输入参考长度" type="number"
:step="0.001">
<template slot="append"></template>
</el-input-number>
</el-form-item>
<el-form-item label="实测长度(m)" prop="actualLength">
<el-input-number :controls="false" v-model="updateForm.actualLength" placeholder="请输入实测长度" type="number"
:step="0.001">
<template slot="append">m</template>
</el-input-number>
</el-form-item>
<el-form-item label="实测厚度(mm)" prop="actualThickness" class="form-item-half">
<el-input-number :controls="false" v-model="updateForm.actualThickness" placeholder="请输入实测厚度"
type="number" :step="0.01">
<template slot="append">mm</template>
</el-input-number>
</el-form-item>
<el-form-item label="实测宽度(mm)" prop="actualWidth">
<el-input-number :controls="false" v-model="updateForm.actualWidth" placeholder="请输入实测宽度" type="number"
:step="0.001">
<template slot="append">mm</template>
</el-input-number>
</el-form-item>
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="updateForm.businessPurpose" placeholder="请选择业务目的" style="width: 100%">
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="updateForm.temperGrade" placeholder="请输入调制度" />
</el-form-item>
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="updateForm.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="updateForm.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
</el-form-item>
<el-form-item label="逻辑库区" prop="warehouseId">
<WarehouseSelect v-model="updateForm.warehouseId" placeholder="请选择逻辑库区" />
</el-form-item>
<el-form-item label="真实库区" prop="actualWarehouseId">
<ActualWarehouseSelect :clearInput="false" clearable v-model="updateForm.actualWarehouseId" placeholder="请选择真实库区" block />
</el-form-item>
<el-row>
<el-col :span="8">
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="updateForm.coilSurfaceTreatment"
placeholder="请输入钢卷表面处理" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="逻辑库区" prop="warehouseId">
<WarehouseSelect v-model="updateForm.warehouseId" placeholder="请选择逻辑库区" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="真实库区" prop="actualWarehouseId">
<ActualWarehouseSelect :clearInput="false" clearable v-model="updateForm.actualWarehouseId"
placeholder="请选择真实库区" block />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="生产开始时间" prop="productionStartTime">
<TimeInput v-model="updateForm.productionStartTime" @input="calculateProductionDuration" />
</el-form-item>
<el-form-item label="生产结束时间" prop="productionEndTime">
<TimeInput v-model="updateForm.productionEndTime" @input="calculateProductionDuration" :show-now-button="true" />
<TimeInput v-model="updateForm.productionEndTime" @input="calculateProductionDuration"
:show-now-button="true" />
</el-form-item>
<el-form-item label="生产耗时" prop="productionDuration">
@@ -266,68 +285,31 @@
<el-form-item label="异常信息">
<div class="abnormal-container">
<div
v-for="(abnormal, index) in abnormals"
:key="index"
class="abnormal-item"
@click="editAbnormal(index)"
>
<div v-for="(abnormal, index) in abnormals" :key="index" class="abnormal-item"
@click="editAbnormal(index)">
<div class="abnormal-content">
<div class="abnormal-info">
<div class="abnormal-position">{{ getAbnormalPositionText(abnormal.position) }}</div>
<div class="abnormal-code">{{ getAbnormalCodeText(abnormal.defectCode) }}</div>
</div>
<el-button
type="danger"
size="mini"
icon="el-icon-close"
class="abnormal-delete"
@click.stop="deleteAbnormal(index)"
></el-button>
<el-button type="danger" size="mini" icon="el-icon-close" class="abnormal-delete"
@click.stop="deleteAbnormal(index)"></el-button>
</div>
</div>
<div
class="abnormal-add"
@click="addAbnormal"
>
<div class="abnormal-add" @click="addAbnormal">
<i class="el-icon-plus"></i>
</div>
</div>
</el-form-item>
</el-form>
</el-card>
<!-- 酸连轧最近10条记录展示 -->
<el-card class="recent-records-card" v-if="acidRecentRecords && acidRecentRecords.length > 0">
<div slot="header" class="card-header">
<span><i class="el-icon-time"></i> 酸连轧最近记录</span>
</div>
<el-table :data="acidRecentRecords" stripe size="small" @row-click="handleClickRecord">
<el-table-column prop="currentCoilNo" label="加工前卷号" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="excoilId" label="出口卷号" width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="exitWeight" label="出口重量(t)" width="100">
<template slot-scope="scope">
{{ scope.row.exitWeight ? scope.row.exitWeight + ' t' : '—' }}
</template>
</el-table-column>
<el-table-column prop="team" label="班组" width="80"></el-table-column>
</el-table>
</el-card>
</div>
</div>
<!-- 异常表单弹窗 -->
<el-dialog
:title="currentAbnormalIndex === -1 ? '新增异常' : '编辑异常'"
:visible.sync="abnormalDialogVisible"
width="600px"
>
<abnormal-form
ref="abnormalForm"
v-model="abnormalForm"
:show-coil-selector="false"
></abnormal-form>
<el-dialog :title="currentAbnormalIndex === -1 ? '新增异常' : '编辑异常'" :visible.sync="abnormalDialogVisible"
width="600px">
<abnormal-form ref="abnormalForm" v-model="abnormalForm" :show-coil-selector="false"></abnormal-form>
<div slot="footer" class="dialog-footer">
<el-button @click="abnormalDialogVisible = false"> </el-button>
<el-button type="primary" @click="saveAbnormal"> </el-button>
@@ -340,15 +322,23 @@
<el-alert title="检测到您之前有暂存的钢卷信息,是否恢复使用?" type="info" show-icon :closable="false"></el-alert>
<el-divider content-position="left">暂存的表单数据</el-divider>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="当前钢卷号">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.currentCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="班组">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.team || '-' }}</el-descriptions-item>
<el-descriptions-item label="材料类型">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.materialType || '-' }}</el-descriptions-item>
<el-descriptions-item label="质量状态">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.qualityStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="净重">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.netWeight || '-' }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ parsedCacheData && parsedCacheData.updateForm && parsedCacheData.updateForm.remark || '-' }}</el-descriptions-item>
<el-descriptions-item label="当前钢卷号">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.currentCoilNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="班组">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.team || '-' }}</el-descriptions-item>
<el-descriptions-item label="材料类型">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.materialType || '-' }}</el-descriptions-item>
<el-descriptions-item label="质量状态">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.qualityStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="净重">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.netWeight || '-' }}</el-descriptions-item>
<el-descriptions-item label="备注">{{ parsedCacheData && parsedCacheData.updateForm &&
parsedCacheData.updateForm.remark || '-' }}</el-descriptions-item>
</el-descriptions>
<el-divider v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0" content-position="left">暂存的异常信息{{ parsedCacheData.abnormals.length }}</el-divider>
<div v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0" class="abnormal-container" style="margin-bottom: 20px;">
<el-divider v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0"
content-position="left">暂存的异常信息{{ parsedCacheData.abnormals.length }}</el-divider>
<div v-if="parsedCacheData && parsedCacheData.abnormals && parsedCacheData.abnormals.length > 0"
class="abnormal-container" style="margin-bottom: 20px;">
<div v-for="(abnormal, index) in parsedCacheData.abnormals" :key="index" class="abnormal-item">
<div class="abnormal-content">
<div class="abnormal-info">
@@ -369,9 +359,9 @@
</template>
<script>
import { getMaterialCoil, updateMaterialCoil, getMaterialCoilTrace } from '@/api/wms/coil';
import { getMaterialCoil, updateMaterialCoil, getFirstHeatCoilMaterial } from '@/api/wms/coil';
import { completeAction, getPendingAction } from '@/api/wms/pendingAction';
import { listWarehouse } from '@/api/wms/warehouse';
// import { getTimingPlanList } from '@/api/l2/timing'
import { getAcidTypingPrefill } from '@/api/pocket/acidTyping';
import { saveCoilCache, getCoilCacheByCoilId, delCoilCache } from '@/api/wms/coilCache';
import ActualWarehouseSelect from "@/components/KLPService/ActualWarehouseSelect";
@@ -384,6 +374,7 @@ import { generateCoilNoPrefix } from "@/utils/coil/coilNo";
import { addCoilContractRel } from "@/api/wms/coilContractRel";
import ContractSelect from "@/components/KLPService/ContractSelect";
export default {
name: 'TypingCoil',
components: {
@@ -457,21 +448,6 @@ export default {
}
}, trigger: 'blur'
},
// 仅在新增的时候校验
// {
// validator: (rule, value, callback) => {
// // 没有coilId则为新增 触发校验
// checkCoilNo({ currentCoilNo: value, coilId: this.updateForm.coilId }).then(res => {
// const { duplicateType } = res.data;
// if (duplicateType === 'current' || duplicateType === 'both') {
// // alert('当前钢卷号重复,请重新输入');
// callback(new Error('当前钢卷号重复,请重新输入'));
// } else {
// callback();
// }
// })
// }, trigger: 'blur'
// }
],
team: [
{ required: true, message: '请输入班组', trigger: 'blur' }
@@ -583,16 +559,6 @@ export default {
const prefillRes = await getAcidTypingPrefill(currentCoilNo)
const prefill = prefillRes && prefillRes.data
// this.acidRecentRecords = [
// {
// currentCoilNo: '12345678',
// excoilId: '12345678',
// exitWeight: 245.567,
// exitLength: 1490,
// team: '甲'
// }
// ]
// return;
if (!prefill || prefill.length === 0) {
this.acidPrefill.type = 'info'
this.acidPrefill.title = '未在二级系统中查找到对应信息,请自行填写'
@@ -703,6 +669,7 @@ export default {
handleClickRecord(row) {
this.updateForm = {
...this.updateForm,
currentCoilNo: row.excoilId,
team: row.team,
netWeight: row.exitWeight,
@@ -724,6 +691,13 @@ export default {
...data,
};
const firstHeatMaterial = await getFirstHeatCoilMaterial(this.currentInfo.enterCoilNo);
console.log(firstHeatMaterial)
if (firstHeatMaterial.code === 200 && firstHeatMaterial.msg) {
this.$set(this.updateForm, 'packingStatus', firstHeatMaterial.msg)
}
// 填充时间相关字段
if (data.productionStartTime) {
this.updateForm.productionStartTime = data.productionStartTime;
@@ -743,54 +717,12 @@ export default {
}
},
// 获取物品类型文本
getItemTypeText(itemType) {
if (itemType === 'raw_material') return '原材料';
if (itemType === 'product') return '产品';
return '—';
},
// 格式化物品名称(添加规格和参数信息)
formatItemName(item) {
if (!item) return '';
// 获取名称(原材料或产品)
const name = item.rawMaterialName || item.productName || '';
if (!name) return '';
let displayName = name;
const specs = [];
// 1. 优先显示规格从对象的specification字段
if (item.specification) {
specs.push(item.specification);
}
// 2. 添加参数参数最多2个
if (item.bomItems && item.bomItems.length > 0) {
const bomParams = item.bomItems
.filter(bomItem => bomItem.attrKey && bomItem.attrValue)
.slice(0, 2); // 最多2个参数参数
bomParams.forEach(param => {
specs.push(`${param.attrKey}:${param.attrValue}`);
});
}
// 3. 拼接成最终格式
if (specs.length > 0) {
displayName += `${specs.join(' ')}`;
}
return displayName;
},
// 复制当前信息到更新表单
copyFromCurrent() {
// 复制除了指定字段之外的其他字段
const excludeFields = ['enterCoilNo', 'currentCoilNo', 'coilId', 'createTime', 'createBy'];
// 构建要复制的字段
const copiedFields = {
team: this.currentInfo.team,
@@ -816,14 +748,13 @@ export default {
productionDuration: this.currentInfo.productionDuration,
formattedDuration: this.currentInfo.productionDuration ? this.formatDuration(this.currentInfo.productionDuration * 60 * 1000) : ''
};
// 合并到更新表单
this.updateForm = {
...this.updateForm,
...copiedFields
};
// materialType 会触发 watch自动设置 itemType 并加载物品列表
this.$message.success('已复制源卷信息,请根据需要修改');
},
@@ -908,20 +839,20 @@ export default {
// 格式化毫秒值为xx天xx小时xx分钟
formatDuration(milliseconds) {
if (!milliseconds || milliseconds < 0) return '';
const seconds = Math.floor(milliseconds / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
const remainingHours = hours % 24;
const remainingMinutes = minutes % 60;
let result = '';
if (days > 0) result += `${days}`;
if (remainingHours > 0) result += `${remainingHours}小时`;
if (remainingMinutes > 0) result += `${remainingMinutes}分钟`;
return result || '0分钟';
},
// 计算生产耗时
@@ -952,7 +883,7 @@ export default {
handleCancel() {
this.$router.back();
},
// 新增异常
addAbnormal() {
this.currentAbnormalIndex = -1;
@@ -968,21 +899,21 @@ export default {
};
this.abnormalDialogVisible = true;
},
// 编辑异常
editAbnormal(index) {
this.currentAbnormalIndex = index;
this.abnormalForm = { ...this.abnormals[index] };
this.abnormalDialogVisible = true;
},
// 保存异常
saveAbnormal() {
this.$refs.abnormalForm.validate(valid => {
if (valid) {
// 计算缺陷长度
this.abnormalForm.length = this.abnormalForm.endPosition - this.abnormalForm.startPosition;
if (this.currentAbnormalIndex === -1) {
// 新增异常
this.abnormals.push({ ...this.abnormalForm });
@@ -990,12 +921,12 @@ export default {
// 编辑异常
this.abnormals[this.currentAbnormalIndex] = { ...this.abnormalForm };
}
this.abnormalDialogVisible = false;
}
});
},
// 删除异常
deleteAbnormal(index) {
this.$confirm('确定要删除这个异常信息吗?', '提示', {
@@ -1006,7 +937,7 @@ export default {
this.abnormals.splice(index, 1);
});
},
// 获取异常位置文本
getAbnormalPositionText(position) {
if (!position) return '';
@@ -1015,7 +946,7 @@ export default {
const item = dict.find(item => item.value === position);
return item ? item.label : position;
},
// 获取异常代码文本
getAbnormalCodeText(code) {
if (!code) return '';
@@ -1118,7 +1049,8 @@ export default {
/* 主内容区 */
.content-wrapper {
display: grid;
grid-template-columns: 300px 1fr;
margin-top: 10px;
grid-template-columns: 600px 1fr;
gap: 10px;
align-items: stretch; // 改为stretch让子元素高度一致
}
@@ -1130,13 +1062,6 @@ export default {
flex-direction: column;
}
/* 右侧面板 */
.right-panel {
min-width: 0;
display: flex;
gap: 10px; // 添加间距
}
/* 确保两侧卡片高度一致 */
.info-card,
.form-card {