feat: 优化合同选择组件与钢卷修正页面功能

1. 重构ContractSelect组件,新增all模式支持远程搜索
2. 修正钢卷修正弹窗布局为两列排版,扩大弹窗宽度
3. 为钢卷修正页面添加合同绑定功能,支持新增/更新合同关联关系
This commit is contained in:
2026-06-19 12:45:07 +08:00
parent c8c2523fe7
commit 66838b6c69
3 changed files with 598 additions and 287 deletions

View File

@@ -1,7 +1,14 @@
<template> <template>
<div> <div>
<div style="display: flex; align-items: center; margin-bottom: 0px;"> <div style="display: flex; align-items: center; margin-bottom: 0px;">
<el-select v-model="selectedValue" placeholder="请选择合同" style="width: 100%" clearable> <!-- all模式远程搜索 -->
<el-select v-if="mode == 'all'" v-model="selectedValue" placeholder="请选择合同" style="width: 100%" clearable
filterable remote :remote-method="handleRemoteSearch" :loading="selectLoading">
<el-option v-for="item in contractList" :key="item.orderId" :value="item.orderId"
:label="item.contractCode" />
</el-select>
<!-- today模式本地 -->
<el-select v-else v-model="selectedValue" placeholder="请选择合同" style="width: 100%" clearable filterable>
<el-option v-for="item in contractList" :key="item.orderId" :value="item.orderId" <el-option v-for="item in contractList" :key="item.orderId" :value="item.orderId"
:label="item.contractCode" /> :label="item.contractCode" />
</el-select> </el-select>
@@ -133,6 +140,8 @@ export default {
allPageNum: 1, allPageNum: 1,
allPageSize: 20, allPageSize: 20,
allTotal: 0, allTotal: 0,
selectLoading: false,
selectTimer: null,
} }
}, },
computed: { computed: {
@@ -152,7 +161,7 @@ export default {
if (this.mode == "today") { if (this.mode == "today") {
this.loadFromLocalStorage(); this.loadFromLocalStorage();
} else { } else {
this.loadContractList(); this.handleRemoteSearch('');
} }
}, },
methods: { methods: {
@@ -182,36 +191,26 @@ export default {
} }
}, },
// 加载合同列表 // 加载合同列表today模式
async loadContractList(keyword) { async loadContractList() {
if (this.mode == "all") { const res = await listTodayOrder();
const res = await listOrder({ // 获取现有手动添加的合同
pageNum: 1, const existingManualContracts = this.contractList.filter(item => item.isManual);
pageSize: 1000, // 将接口返回的合同标记为非手动添加
keyword: keyword || undefined, const apiContracts = (res.data || []).map(item => ({
}); ...item,
this.contractList = res.rows || []; isManual: false
} }));
else if (this.mode == "today") { // 合并合同列表,保留手动添加的合同
const res = await listTodayOrder(); this.contractList = [...apiContracts, ...existingManualContracts];
// 获取现有手动添加的合同 // 去重,避免重复合同
const existingManualContracts = this.contractList.filter(item => item.isManual); this.contractList = this.contractList.filter((item, index, self) =>
// 将接口返回的合同标记为非手动添加 index === self.findIndex(t => t.orderId === item.orderId)
const apiContracts = (res.data || []).map(item => ({ );
...item, // 上一次选择的合同放在列表第一位
isManual: false this.sortLastSelectedToFirst();
})); // 保存到localStorage
// 合并合同列表,保留手动添加的合同 this.saveToLocalStorage();
this.contractList = [...apiContracts, ...existingManualContracts];
// 去重,避免重复合同
this.contractList = this.contractList.filter((item, index, self) =>
index === self.findIndex(t => t.orderId === item.orderId)
);
// 上一次选择的合同放在列表第一位
this.sortLastSelectedToFirst();
// 保存到localStorage
this.saveToLocalStorage();
}
}, },
// 将上一次选择的合同排到列表第一位 // 将上一次选择的合同排到列表第一位
@@ -282,7 +281,54 @@ export default {
// 刷新合同列表 // 刷新合同列表
handleRefresh() { handleRefresh() {
this.loadContractList(); if (this.mode == 'all') {
this.handleRemoteSearch('');
} else {
this.loadContractList();
}
},
// all模式远程搜索
handleRemoteSearch(query) {
if (this.selectTimer) {
clearTimeout(this.selectTimer);
}
if (!query) {
this.selectTimer = null;
this.doRemoteSearch('');
return;
}
this.selectLoading = true;
this.selectTimer = setTimeout(() => {
this.doRemoteSearch(query);
}, 300);
},
async doRemoteSearch(query) {
try {
const res = await listOrder({
pageNum: 1,
pageSize: 100,
keyword: query || undefined,
});
this.contractList = res.rows || [];
// 初始加载时,确保已选中的合同在列表中
if (!query && this.value && !this.contractList.some(item => String(item.orderId) === String(this.value))) {
const res2 = await listOrder({
pageNum: 1,
pageSize: 100,
keyword: this.value,
});
const found = (res2.rows || []).find(item => String(item.orderId) === String(this.value));
if (found) {
this.contractList.unshift(found);
}
}
} catch (error) {
console.error('Failed to search contracts:', error);
} finally {
this.selectLoading = false;
}
}, },
} }
} }

View File

@@ -142,134 +142,218 @@
<label-render :content="labelRender.data" :labelType="labelRender.type" /> <label-render :content="labelRender.data" :labelType="labelRender.type" />
</el-dialog> </el-dialog>
<el-dialog :title="title" :visible.sync="correctVisible" width="600px"> <el-dialog :title="title" :visible.sync="correctVisible" width="1200px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="入场钢卷号" prop="enterCoilNo"> <el-row :gutter="20">
<el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="form.coilId" /> <el-col :span="12">
</el-form-item> <el-form-item label="入场钢卷号" prop="enterCoilNo">
<el-form-item label="当前钢卷号" prop="currentCoilNo"> <el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="!!form.coilId" />
<el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="厂家原料卷号" prop="supplierCoilNo"> <el-col :span="12">
<el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" /> <el-form-item label="当前钢卷号" prop="currentCoilNo">
</el-form-item> <el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" />
<el-form-item label="所在库位" prop="warehouseId"> </el-form-item>
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable /> </el-col>
</el-form-item> </el-row>
<el-form-item label="实际库区" prop="actualWarehouseId"> <el-row :gutter="20">
<actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;" <el-col :span="12">
clearable /> <el-form-item label="厂家原料卷号" prop="supplierCoilNo">
</el-form-item> <el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" />
<el-form-item label="班组" prop="team"> </el-form-item>
<el-select v-model="form.team" placeholder="请选择班组" style="width: 100%"> </el-col>
<el-option key="甲" label="甲" value="甲" /> <el-col :span="12">
<el-option key="乙" label="乙" value="乙" /> <el-form-item label="所在库位" prop="warehouseId">
</el-select> <warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item> </el-form-item>
<el-form-item label="材料类型" prop="materialType"> </el-col>
<el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange"> </el-row>
<el-option label="成品" value="成品" /> <el-row :gutter="20">
<el-option label="原料" value="原料" /> <el-col :span="12">
</el-select> <el-form-item label="实际库区" prop="actualWarehouseId">
</el-form-item> <actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;"
<el-form-item :label="getItemLabel" prop="itemId"> clearable />
<product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品" </el-form-item>
style="width: 100%;" clearable /> </el-col>
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料" <el-col :span="12">
style="width: 100%;" clearable /> <el-form-item label="班组" prop="team">
<div v-else>请先选择材料类型</div> <el-select v-model="form.team" placeholder="请选择班组" style="width: 100%">
</el-form-item> <el-option key="甲" label="甲" value="甲" />
<el-form-item label="质量状态" prop="qualityStatus"> <el-option key="乙" label="乙" value="乙" />
<el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%"> </el-select>
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" </el-form-item>
:value="item.value" /> </el-col>
</el-select> </el-row>
</el-form-item> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="切边要求" prop="trimmingRequirement"> <el-form-item label="材料类型" prop="materialType">
<el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%"> <el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange">
<el-option label="净边料" value="净边料" /> <el-option label="成品" value="成品" />
<el-option label="毛边料" value="毛边料" /> <el-option label="料" value="料" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="原料材质" prop="packingStatus"> <el-col :span="12">
<el-input v-model="form.packingStatus" placeholder="请输入原料材质"> <el-form-item :label="getItemLabel" prop="itemId">
</el-input> <product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品"
</el-form-item> style="width: 100%;" clearable />
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料"
<el-form-item label="包装要求" prop="packagingRequirement"> style="width: 100%;" clearable />
<el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%"> <div v-else>请先选择材料类型</div>
<el-option label="裸包" value="裸包" /> </el-form-item>
<el-option label="普包" value="普包" /> </el-col>
<el-option label="简包" value="简包" /> </el-row>
<el-option label="精包" value="精包" /> <el-row :gutter="20">
</el-select> <el-col :span="12">
</el-form-item> <el-form-item label="质量状态" prop="qualityStatus">
<el-form-item label="毛重" prop="grossWeight"> <el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" /> <el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
</el-form-item> :value="item.value" />
<el-form-item label="净重" prop="netWeight"> </el-select>
<el-input v-model="form.netWeight" placeholder="请输入净重" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="实测长度(mm)" prop="actualLength"> <el-col :span="12">
<el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number" <el-form-item label="切边要求" prop="trimmingRequirement">
:step="0.01" /> <el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
</el-form-item> <el-option label="净边料" value="净边料" />
<el-form-item label="实测宽度(mm)" prop="actualWidth"> <el-option label="毛边料" value="毛边料" />
<el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number" </el-select>
:step="0.01" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="实测厚度(mm)" prop="actualThickness"> </el-row>
<el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number" <el-row :gutter="20">
:step="0.01" /> <el-col :span="12">
</el-form-item> <el-form-item label="原料材质" prop="packingStatus">
<el-form-item label="业务目的" prop="businessPurpose"> <el-input v-model="form.packingStatus" placeholder="请输入原料材质" />
<el-select v-model="form.businessPurpose" placeholder="请选择业务目的" style="width: 100%"> </el-form-item>
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value" </el-col>
:label="item.label" /> <el-col :span="12">
</el-select> <el-form-item label="包装要求" prop="packagingRequirement">
</el-form-item> <el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-form-item label="调制度" prop="temperGrade"> <el-option label="裸包" value="裸包" />
<el-input v-model="form.temperGrade" placeholder="请输入调制度" /> <el-option label="普包" value="普包" />
</el-form-item> <el-option label="简包" value="简包" />
<el-form-item label="镀层种类" prop="coatingType"> <el-option label="精包" value="精包" />
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" /> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment"> </el-col>
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" /> </el-row>
</el-form-item> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="排产厚度(mm)" prop="scheduleThickness"> <el-form-item label="毛重" prop="grossWeight">
<el-input-number :controls="false" v-model="form.scheduleThickness" placeholder="请输入排产厚度" type="number" <el-input v-model="form.grossWeight" placeholder="请输入毛重" />
:step="0.001" style="width: 100%;" /> </el-form-item>
</el-form-item> </el-col>
<el-col :span="12">
<el-form-item label="生产开始时间" prop="productionStartTime"> <el-form-item label="净重" prop="netWeight">
<TimeInput v-model="form.productionStartTime" @input="calculateProductionDuration" /> <el-input v-model="form.netWeight" placeholder="请输入净重" />
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="生产结束时间" prop="productionEndTime"> </el-row>
<TimeInput v-model="form.productionEndTime" @input="calculateProductionDuration" :show-now-button="true" /> <el-row :gutter="20">
</el-form-item> <el-col :span="12">
<el-form-item label="实测长度(mm)" prop="actualLength">
<el-form-item label="生产耗时" prop="productionDuration"> <el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number"
<el-input v-model="form.formattedDuration" placeholder="自动计算" disabled /> :step="0.01" />
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="备注" prop="remark"> <el-col :span="12">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-form-item label="实测宽度(mm)" prop="actualWidth">
</el-form-item> <el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number"
<el-form-item label="创建时间" prop="createTime" v-if="form.coilId"> :step="0.01" />
<el-date-picker v-model="form.createTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" </el-form-item>
placeholder="请选择创建时间" style="width: 100%;" /> </el-col>
</el-form-item> </el-row>
<el-form-item label="创建人" prop="createBy" v-if="form.coilId"> <el-row :gutter="20">
<el-select v-model="form.createBy" placeholder="请选择创建人" style="width: 100%;" clearable filterable> <el-col :span="12">
<el-option v-for="item in userList" :key="item.userName" :label="item.nickName" :value="item.userName" /> <el-form-item label="实测厚度(mm)" prop="actualThickness">
</el-select> <el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number"
<!-- <el-input v-model="form.createBy" placeholder="请输入创建人" /> --> :step="0.01" />
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="form.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-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="form.temperGrade" placeholder="请输入调制度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排产厚度(mm)" prop="scheduleThickness">
<el-input-number :controls="false" v-model="form.scheduleThickness" placeholder="请输入排产厚度" type="number"
:step="0.001" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产开始时间" prop="productionStartTime">
<TimeInput v-model="form.productionStartTime" @input="calculateProductionDuration" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产结束时间" prop="productionEndTime">
<TimeInput v-model="form.productionEndTime" @input="calculateProductionDuration" :show-now-button="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产耗时" prop="productionDuration">
<el-input v-model="form.formattedDuration" placeholder="自动计算" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="form.createTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择创建时间" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建人" prop="createBy">
<el-select v-model="form.createBy" placeholder="请选择创建人" style="width: 100%;" clearable filterable>
<el-option v-for="item in userList" :key="item.userName" :label="item.nickName" :value="item.userName" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="24">
<el-form-item label="绑定合同" prop="contractId">
<div style="display: flex; gap: 10px; width: 100%;">
<contract-select v-model="form.contractId" placeholder="请选择合同" style="flex: 1;" clearable mode="all" />
<el-button type="success" :loading="contractLoading" @click="saveContractRel">保存合同</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
@@ -288,6 +372,7 @@
<script> <script>
import { listMaterialCoil, getMaterialCoilTrace, updateMaterialCoilSimple, checkCoilNo, delMaterialCoil, restoreMaterialCoil, addMaterialCoil } from '@/api/wms/coil' import { listMaterialCoil, getMaterialCoilTrace, updateMaterialCoilSimple, checkCoilNo, delMaterialCoil, restoreMaterialCoil, addMaterialCoil } from '@/api/wms/coil'
import { listCoilContractRel, addCoilContractRel, updateCoilContractRel } from '@/api/wms/coilContractRel'
import { listUser } from '@/api/system/user' import { listUser } from '@/api/system/user'
import { listPendingAction, startProcess, cancelAction, delPendingAction } from '@/api/wms/pendingAction' import { listPendingAction, startProcess, cancelAction, delPendingAction } from '@/api/wms/pendingAction'
import { parseTime } from '@/utils/klp' import { parseTime } from '@/utils/klp'
@@ -464,6 +549,8 @@ export default {
form: {}, form: {},
correctVisible: false, correctVisible: false,
buttonLoading: false, buttonLoading: false,
contractLoading: false,
contractRelId: null,
userList: [], userList: [],
floatLayerConfig: { floatLayerConfig: {
columns: [ columns: [
@@ -876,13 +963,59 @@ export default {
handleCorrectMaterial(row) { handleCorrectMaterial(row) {
this.form = { this.form = {
...row, ...row,
contractId: row.contractId || null,
}; };
if (this.form.productionDuration) { if (this.form.productionDuration) {
this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000); this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000);
} }
this.title = "钢卷信息修正"; this.title = "钢卷信息修正";
this.correctVisible = true this.correctVisible = true
this.loadContractRel(row.coilId)
}, },
/** 加载合同绑定关系 */
loadContractRel(coilId) {
if (!coilId) {
this.contractRelId = null
this.$set(this.form, 'contractId', null)
return
}
listCoilContractRel({ coilId }).then(res => {
const rows = res.rows || []
if (rows.length > 0) {
this.contractRelId = rows[0].relId
this.$set(this.form, 'contractId', rows[0].contractId)
} else {
this.contractRelId = null
this.$set(this.form, 'contractId', null)
}
})
},
/** 保存合同绑定 */
saveContractRel() {
this.contractLoading = true
listCoilContractRel({ coilId: this.form.coilId }).then(res => {
const rows = res.rows || []
if (rows.length > 0) {
return updateCoilContractRel({
relId: rows[0].relId,
coilId: this.form.coilId,
contractId: this.form.contractId
})
} else {
return addCoilContractRel({
coilId: this.form.coilId,
contractId: this.form.contractId
})
}
}).then(() => {
this.$message.success('合同绑定保存成功')
}).finally(() => {
this.contractLoading = false
})
},
cancel() { cancel() {
this.correctVisible = false this.correctVisible = false
}, },

View File

@@ -227,134 +227,218 @@
<label-render ref="labelRender" v-show="false" :content="labelRender.data" :labelType="labelRender.type" /> <label-render ref="labelRender" v-show="false" :content="labelRender.data" :labelType="labelRender.type" />
<!-- 钢卷修正对话框 --> <!-- 钢卷修正对话框 -->
<el-dialog :title="title" :visible.sync="correctVisible" width="600px"> <el-dialog :title="title" :visible.sync="correctVisible" width="1200px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="入场钢卷号" prop="enterCoilNo"> <el-row :gutter="20">
<el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="form.coilId" /> <el-col :span="12">
</el-form-item> <el-form-item label="入场钢卷号" prop="enterCoilNo">
<el-form-item label ="当前钢卷号" prop="currentCoilNo"> <el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="!!form.coilId" />
<el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="厂家原料卷号" prop="supplierCoilNo"> <el-col :span="12">
<el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" /> <el-form-item label="当前钢卷号" prop="currentCoilNo">
</el-form-item> <el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" />
<el-form-item label="所在库位" prop="warehouseId"> </el-form-item>
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable /> </el-col>
</el-form-item> </el-row>
<el-form-item label="实际库区" prop="actualWarehouseId"> <el-row :gutter="20">
<actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;" <el-col :span="12">
clearable /> <el-form-item label="厂家原料卷号" prop="supplierCoilNo">
</el-form-item> <el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" />
<el-form-item label="班组" prop="team"> </el-form-item>
<el-select v-model="form.team" placeholder="请选择班组" style="width: 100%"> </el-col>
<el-option key="甲" label="甲" value="甲" /> <el-col :span="12">
<el-option key="乙" label="乙" value="乙" /> <el-form-item label="所在库位" prop="warehouseId">
</el-select> <warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item> </el-form-item>
<el-form-item label="材料类型" prop="materialType"> </el-col>
<el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange"> </el-row>
<el-option label="成品" value="成品" /> <el-row :gutter="20">
<el-option label="原料" value="原料" /> <el-col :span="12">
</el-select> <el-form-item label="实际库区" prop="actualWarehouseId">
</el-form-item> <actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;"
<el-form-item :label="getItemLabel" prop="itemId"> clearable />
<product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品" </el-form-item>
style="width: 100%;" clearable /> </el-col>
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料" <el-col :span="12">
style="width: 100%;" clearable /> <el-form-item label="班组" prop="team">
<div v-else>请先选择材料类型</div> <el-select v-model="form.team" placeholder="请选择班组" style="width: 100%">
</el-form-item> <el-option key="甲" label="甲" value="甲" />
<el-form-item label="质量状态" prop="qualityStatus"> <el-option key="乙" label="乙" value="乙" />
<el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%"> </el-select>
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" </el-form-item>
:value="item.value" /> </el-col>
</el-select> </el-row>
</el-form-item> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="切边要求" prop="trimmingRequirement"> <el-form-item label="材料类型" prop="materialType">
<el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%"> <el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange">
<el-option label="净边料" value="净边料" /> <el-option label="成品" value="成品" />
<el-option label="毛边料" value="毛边料" /> <el-option label="料" value="料" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="原料材质" prop="packingStatus"> <el-col :span="12">
<el-input v-model="form.packingStatus" placeholder="请输入原料材质"> <el-form-item :label="getItemLabel" prop="itemId">
</el-input> <product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品"
</el-form-item> style="width: 100%;" clearable />
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料"
<el-form-item label="包装要求" prop="packagingRequirement"> style="width: 100%;" clearable />
<el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%"> <div v-else>请先选择材料类型</div>
<el-option label="裸包" value="裸包" /> </el-form-item>
<el-option label="普包" value="普包" /> </el-col>
<el-option label="简包" value="简包" /> </el-row>
<el-option label="精包" value="精包" /> <el-row :gutter="20">
</el-select> <el-col :span="12">
</el-form-item> <el-form-item label="质量状态" prop="qualityStatus">
<el-form-item label="毛重" prop="grossWeight"> <el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" /> <el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
</el-form-item> :value="item.value" />
<el-form-item label="净重" prop="netWeight"> </el-select>
<el-input v-model="form.netWeight" placeholder="请输入净重" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="实测长度(m)" prop="actualLength"> <el-col :span="12">
<el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number" <el-form-item label="切边要求" prop="trimmingRequirement">
:step="0.01" /> <el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
</el-form-item> <el-option label="净边料" value="净边料" />
<el-form-item label="实测宽度(mm)" prop="actualWidth"> <el-option label="毛边料" value="毛边料" />
<el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number" </el-select>
:step="0.01" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="实测厚度(mm)" prop="actualThickness"> </el-row>
<el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number" <el-row :gutter="20">
:step="0.01" /> <el-col :span="12">
</el-form-item> <el-form-item label="原料材质" prop="packingStatus">
<el-form-item label="业务目的" prop="businessPurpose"> <el-input v-model="form.packingStatus" placeholder="请输入原料材质" />
<el-select v-model="form.businessPurpose" placeholder="业务目的" filterable> </el-form-item>
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value" </el-col>
:label="item.label" /> <el-col :span="12">
</el-select> <el-form-item label="包装要求" prop="packagingRequirement">
</el-form-item> <el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-form-item label="调制度" prop="temperGrade"> <el-option label="裸包" value="裸包" />
<el-input v-model="form.temperGrade" placeholder="请输入调制度" /> <el-option label="普包" value="普包" />
</el-form-item> <el-option label="简包" value="简包" />
<el-form-item label="镀层种类" prop="coatingType"> <el-option label="精包" value="精包" />
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" /> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment"> </el-col>
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" /> </el-row>
</el-form-item> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="排产厚度(mm)" prop="scheduleThickness"> <el-form-item label="毛重" prop="grossWeight">
<el-input-number :controls="false" v-model="form.scheduleThickness" placeholder="请输入排产厚度" type="number" <el-input v-model="form.grossWeight" placeholder="请输入毛重" />
:step="0.001" style="width: 100%;" /> </el-form-item>
</el-form-item> </el-col>
<el-col :span="12">
<el-form-item label="生产开始时间" prop="productionStartTime"> <el-form-item label="净重" prop="netWeight">
<TimeInput v-model="form.productionStartTime" @input="calculateProductionDuration" /> <el-input v-model="form.netWeight" placeholder="请输入净重" />
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="生产结束时间" prop="productionEndTime"> </el-row>
<TimeInput v-model="form.productionEndTime" @input="calculateProductionDuration" :show-now-button="true" /> <el-row :gutter="20">
</el-form-item> <el-col :span="12">
<el-form-item label="实测长度(m)" prop="actualLength">
<el-form-item label="生产耗时" prop="productionDuration"> <el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number"
<el-input v-model="form.formattedDuration" placeholder="自动计算" disabled /> :step="0.01" />
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="备注" prop="remark"> <el-col :span="12">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-form-item label="实测宽度(mm)" prop="actualWidth">
</el-form-item> <el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number"
<el-form-item label="创建时间" prop="createTime" v-if="form.coilId"> :step="0.01" />
<el-date-picker v-model="form.createTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" </el-form-item>
placeholder="请选择创建时间" style="width: 100%;" /> </el-col>
</el-form-item> </el-row>
<el-form-item label="创建人" prop="createBy" v-if="form.coilId"> <el-row :gutter="20">
<el-select v-model="form.createBy" placeholder="请选择创建人" style="width: 100%;" clearable filterable> <el-col :span="12">
<el-option v-for="item in userList" :key="item.userName" :label="item.nickName" :value="item.userName" /> <el-form-item label="实测厚度(mm)" prop="actualThickness">
</el-select> <el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number"
<!-- <el-input v-model="form.createBy" placeholder="请输入创建人" /> --> :step="0.01" />
</el-form-item> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="form.businessPurpose" placeholder="业务目的" filterable>
<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-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="form.temperGrade" placeholder="请输入调制度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排产厚度(mm)" prop="scheduleThickness">
<el-input-number :controls="false" v-model="form.scheduleThickness" placeholder="请输入排产厚度" type="number"
:step="0.001" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产开始时间" prop="productionStartTime">
<TimeInput v-model="form.productionStartTime" @input="calculateProductionDuration" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产结束时间" prop="productionEndTime">
<TimeInput v-model="form.productionEndTime" @input="calculateProductionDuration" :show-now-button="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产耗时" prop="productionDuration">
<el-input v-model="form.formattedDuration" placeholder="自动计算" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="form.createTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择创建时间" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建人" prop="createBy">
<el-select v-model="form.createBy" placeholder="请选择创建人" style="width: 100%;" clearable filterable>
<el-option v-for="item in userList" :key="item.userName" :label="item.nickName" :value="item.userName" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="24">
<el-form-item label="绑定合同" prop="contractId">
<div style="display: flex; gap: 10px; width: 100%;">
<contract-select v-model="form.contractId" placeholder="请选择合同" style="flex: 1;" clearable mode="all" />
<el-button type="success" :loading="contractLoading" @click="saveContractRel">保存合同</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
@@ -371,6 +455,7 @@
<script> <script>
import { listMaterialCoil, getMaterialCoilTrace, updateMaterialCoilSimple, checkCoilNo, restoreMaterialCoil } from '@/api/wms/coil' import { listMaterialCoil, getMaterialCoilTrace, updateMaterialCoilSimple, checkCoilNo, restoreMaterialCoil } from '@/api/wms/coil'
import { listCoilContractRel, addCoilContractRel, updateCoilContractRel } from '@/api/wms/coilContractRel'
import { listPendingAction, getPendingAction, delPendingAction, addPendingAction, updatePendingAction, startProcess, cancelAction, restorePendingAction } from '@/api/wms/pendingAction' import { listPendingAction, getPendingAction, delPendingAction, addPendingAction, updatePendingAction, startProcess, cancelAction, restorePendingAction } from '@/api/wms/pendingAction'
import { listUser } from '@/api/system/user' import { listUser } from '@/api/system/user'
import { parseTime } from '@/utils/klp' import { parseTime } from '@/utils/klp'
@@ -440,6 +525,8 @@ export default {
form: {}, form: {},
correctVisible: false, correctVisible: false,
buttonLoading: false, buttonLoading: false,
contractLoading: false,
contractRelId: null,
userList: [], userList: [],
floatLayerConfig: { floatLayerConfig: {
@@ -849,12 +936,57 @@ export default {
handleCorrectMaterial(row) { handleCorrectMaterial(row) {
this.form = { this.form = {
...row, ...row,
contractId: row.contractId || null,
}; };
if (this.form.productionDuration) { if (this.form.productionDuration) {
this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000); this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000);
} }
this.title = "钢卷信息修正"; this.title = "钢卷信息修正";
this.correctVisible = true this.correctVisible = true
this.loadContractRel(row.coilId)
},
/** 加载合同绑定关系 */
loadContractRel(coilId) {
if (!coilId) {
this.contractRelId = null
this.$set(this.form, 'contractId', null)
return
}
listCoilContractRel({ coilId }).then(res => {
const rows = res.rows || []
if (rows.length > 0) {
this.contractRelId = rows[0].relId
this.$set(this.form, 'contractId', rows[0].contractId)
} else {
this.contractRelId = null
this.$set(this.form, 'contractId', null)
}
})
},
/** 保存合同绑定 */
saveContractRel() {
this.contractLoading = true
listCoilContractRel({ coilId: this.form.coilId }).then(res => {
const rows = res.rows || []
if (rows.length > 0) {
return updateCoilContractRel({
relId: rows[0].relId,
coilId: this.form.coilId,
contractId: this.form.contractId
})
} else {
return addCoilContractRel({
coilId: this.form.coilId,
contractId: this.form.contractId
})
}
}).then(() => {
this.$message.success('合同绑定保存成功')
}).finally(() => {
this.contractLoading = false
})
}, },
/** 取消按钮 */ /** 取消按钮 */