feat(钢卷管理): 添加成品钢卷的质量状态、切边要求等字段

在钢卷管理的分条、合卷和基础信息页面中,为成品类型的钢卷新增质量状态、切边要求、打包状态和包装要求字段
同时移除未使用的采购计划相关代码
This commit is contained in:
砂糖
2025-11-14 09:49:33 +08:00
parent 6f448faa45
commit bbbe7cefd8
6 changed files with 266 additions and 346 deletions

View File

@@ -1,61 +0,0 @@
import request from '@/utils/request'
// 查询采购计划主列表
export function listPurchasePlan(query) {
return request({
url: '/wms/purchasePlan/list',
method: 'get',
params: query
})
}
// 查询采购计划主详细
export function getPurchasePlan(planId) {
return request({
url: '/wms/purchasePlan/' + planId,
method: 'get'
})
}
// 新增采购计划主
export function addPurchasePlan(data) {
return request({
url: '/wms/purchasePlan',
method: 'post',
data: data
})
}
// 修改采购计划主
export function updatePurchasePlan(data) {
return request({
url: '/wms/purchasePlan',
method: 'put',
data: data
})
}
// 删除采购计划主
export function delPurchasePlan(planId) {
return request({
url: '/wms/purchasePlan/' + planId,
method: 'delete'
})
}
// 获取推荐的采购计划
export function recommendPurchasePlan(orderId) {
return request({
url: '/wms/purchasePlan/recommend/' + orderId,
method: 'get'
})
}
// 创建采购计划(含明细)
export function createPurchasePlan(data) {
return request({
url: '/wms/purchasePlan/addWithDetails',
method: 'post',
data
})
}

View File

@@ -28,14 +28,8 @@
<div class="source-info">
<div class="source-id">{{ item.currentCoilNo || '待选择' }}</div>
</div>
<el-button
v-if="!readonly"
type="text"
size="mini"
icon="el-icon-delete"
@click="removeSourceCoil(index)"
class="btn-remove"
></el-button>
<el-button v-if="!readonly" type="text" size="mini" icon="el-icon-delete" @click="removeSourceCoil(index)"
class="btn-remove"></el-button>
</div>
<div class="source-coil-body">
<template v-if="item.coilId">
@@ -76,12 +70,8 @@
<template v-else-if="index === 1 && !readonly">
<div class="pending-list-title">待合卷钢卷列表</div>
<div class="pending-coil-list" v-if="pendingMergeList.length > 0">
<div
class="pending-coil-item"
v-for="pending in pendingMergeList"
:key="pending.actionId"
@click="selectPendingCoil(pending, index)"
>
<div class="pending-coil-item" v-for="pending in pendingMergeList" :key="pending.actionId"
@click="selectPendingCoil(pending, index)">
<div class="pending-coil-no">{{ pending.currentCoilNo }}</div>
<div class="pending-coil-info">
<span class="pending-label">扫码时间</span>
@@ -110,19 +100,10 @@
<div class="merge-arrow-container">
<svg width="120" height="100%" viewBox="0 0 120 400" xmlns="http://www.w3.org/2000/svg">
<!-- 多条线汇聚到一点 -->
<line
v-for="(item, index) in sourceCoils"
:key="index"
:x1="0"
:y1="50 + index * 80"
:x2="100"
:y2="200"
stroke="#0066cc"
stroke-width="2"
stroke-dasharray="5,5"
/>
<line v-for="(item, index) in sourceCoils" :key="index" :x1="0" :y1="50 + index * 80" :x2="100" :y2="200"
stroke="#0066cc" stroke-width="2" stroke-dasharray="5,5" />
<!-- 箭头 -->
<polygon points="100,200 110,195 110,205" fill="#0066cc"/>
<polygon points="100,200 110,195 110,205" fill="#0066cc" />
</svg>
</div>
<div class="flow-label">
@@ -148,12 +129,8 @@
<el-input v-model="targetCoil.team" placeholder="请输入班组名称" :disabled="readonly"></el-input>
</el-form-item>
<el-form-item label="材料类型">
<el-select
v-model="targetCoil.materialType"
placeholder="请选择材料类型"
style="width: 100%"
:disabled="readonly"
@change="handleMaterialTypeChange">
<el-select v-model="targetCoil.materialType" placeholder="请选择材料类型" style="width: 100%"
:disabled="readonly" @change="handleMaterialTypeChange">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
<el-option label="废品" value="废品" />
@@ -161,66 +138,60 @@
</el-form-item>
<!-- 物品类型由材料类型自动联动隐藏此选择框 -->
<el-form-item v-if="targetCoil.materialType === '成品'" label="质量状态" prop="qualityStatus">
<el-input v-model="targetCoil.qualityStatus"
placeholder="请输入质量状态" :disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="targetCoil.materialType === '成品'" label="切边要求" prop="trimmingRequirement">
<el-input v-model="targetCoil.trimmingRequirement"
placeholder="请输入切边要求" :disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="targetCoil.materialType === '成品'" label="打包状态" prop="packingStatus">
<el-input v-model="targetCoil.packingStatus"
placeholder="请输入打包状态" :disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="targetCoil.materialType === '成品'" label="包装要求" prop="packagingRequirement">
<el-input v-model="targetCoil.packagingRequirement"
placeholder="请输入包装要求" :disabled="readonly">
</el-input>
</el-form-item>
<el-form-item :label="getItemLabel">
<el-select
v-model="targetCoil.itemId"
:placeholder="getItemPlaceholder"
filterable
remote
:remote-method="searchItems"
:loading="itemSearchLoading"
style="width: 100%"
:disabled="readonly || !targetCoil.materialType"
>
<el-option
v-for="item in currentItemList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
<el-select v-model="targetCoil.itemId" :placeholder="getItemPlaceholder" filterable remote
:remote-method="searchItems" :loading="itemSearchLoading" style="width: 100%"
:disabled="readonly || !targetCoil.materialType">
<el-option v-for="item in currentItemList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="毛重(t)">
<el-input
v-model.number="targetCoil.grossWeight"
placeholder="请输入毛重"
type="number"
step="0.01"
:disabled="readonly"
>
<el-input v-model.number="targetCoil.grossWeight" placeholder="请输入毛重" type="number" step="0.01"
:disabled="readonly">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="净重(t)">
<el-input
v-model.number="targetCoil.netWeight"
placeholder="请输入净重"
type="number"
step="0.01"
:disabled="readonly"
>
<el-input v-model.number="targetCoil.netWeight" placeholder="请输入净重" type="number" step="0.01"
:disabled="readonly">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="逻辑库区">
<el-select v-model="targetCoil.warehouseId" placeholder="请选择逻辑库区" style="width: 100%" filterable :disabled="readonly">
<el-option
v-for="warehouse in warehouseList"
:key="warehouse.warehouseId"
:label="warehouse.warehouseName"
:value="warehouse.warehouseId"
/>
<el-select v-model="targetCoil.warehouseId" placeholder="请选择逻辑库区" style="width: 100%" filterable
:disabled="readonly">
<el-option v-for="warehouse in warehouseList" :key="warehouse.warehouseId"
:label="warehouse.warehouseName" :value="warehouse.warehouseId" />
</el-select>
</el-form-item>
<el-form-item label="真实库区">
<actual-warehouse-select
v-model="targetCoil.actualWarehouseId"
placeholder="请选择"
style="width: 100%"
clearable
:disabled="readonly"
/>
<actual-warehouse-select v-model="targetCoil.actualWarehouseId" placeholder="请选择" style="width: 100%"
clearable :disabled="readonly" />
</el-form-item>
</el-form>
</div>
@@ -242,10 +213,7 @@
</div>
<!-- 钢卷选择器 -->
<coil-selector
:visible.sync="coilSelectorVisible"
@select="handleCoilSelect"
/>
<coil-selector :visible.sync="coilSelectorVisible" @select="handleCoilSelect" />
</div>
</template>
@@ -1288,4 +1256,3 @@ export default {
}
}
</style>

View File

@@ -16,10 +16,12 @@
</el-select>
</el-form-item> -->
<el-form-item label="所在库位" prop="warehouseId" v-if="!hideWarehouseQuery">
<warehouse-select v-model="queryParams.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%; display: inline-block;" clearable />
<warehouse-select v-model="queryParams.warehouseId" placeholder="请选择仓库/库区/库位"
style="width: 100%; display: inline-block;" clearable />
</el-form-item>
<el-form-item label="实际库区" prop="actualWarehouseId" v-if="!hideWarehouseQuery">
<actual-warehouse-select v-model="queryParams.actualWarehouseId" placeholder="请选择实际库位" style="width: 100%; display: inline-block;" clearable />
<actual-warehouse-select v-model="queryParams.actualWarehouseId" placeholder="请选择实际库位"
style="width: 100%; display: inline-block;" clearable />
</el-form-item>
<el-form-item label="厂家卷号" prop="supplierCoilNo">
<el-input v-model="queryParams.supplierCoilNo" placeholder="请输入厂家原料卷号" clearable
@@ -27,15 +29,16 @@
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option v-for="item in dict.type.product_coil_status" :key="item.value" :value="parseInt(item.value)" :label="item.label" />
<el-option v-for="item in dict.type.product_coil_status" :key="item.value" :value="parseInt(item.value)"
:label="item.label" />
</el-select>
</el-form-item>
<MaterialSelect :hideType="hideType" :itemId.sync="queryParams.itemIds" :itemType.sync="queryParams.itemType" :multiple="true"/>
<MaterialSelect :hideType="hideType" :itemId.sync="queryParams.itemIds" :itemType.sync="queryParams.itemType"
:multiple="true" />
<el-form-item label="班组" prop="team">
<el-input v-model="queryParams.team" placeholder="请输入班组" clearable
@keyup.enter.native="handleQuery" />
<el-input v-model="queryParams.team" placeholder="请输入班组" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="更新时间" prop="updateTime">
<el-date-picker size="mini" v-model="queryParams.updateTime" type="daterange" value-format="yyyy-MM-dd HH:mm:ss"
@@ -71,14 +74,14 @@
<el-table-column label="入场钢卷号" align="center" prop="enterCoilNo" />
<el-table-column label="当前钢卷号" align="center" prop="currentCoilNo" />
<el-table-column label="厂家卷号" align="center" prop="supplierCoilNo" />
<el-table-column label="逻辑库位" align="center" prop="warehouseName" v-if="!hideWarehouseQuery"/>
<el-table-column label="实际库区" align="center" prop="actualWarehouseName" v-if="!hideWarehouseQuery"/>
<el-table-column label="逻辑库位" align="center" prop="warehouseName" v-if="!hideWarehouseQuery" />
<el-table-column label="实际库区" align="center" prop="actualWarehouseName" v-if="!hideWarehouseQuery" />
<!-- <el-table-column label="物料类型" align="center" prop="itemType">
<template slot-scope="scope">
{{ scope.row.itemType == 'raw_material' ? '原料' : '产品' }}
</template>
</el-table-column> -->
<el-table-column label="物料类型" align="center" prop="materialType"/>
</el-table-column> -->
<el-table-column label="物料类型" align="center" prop="materialType" />
<el-table-column label="产品类型" align="center" prop="itemName">
<template slot-scope="scope">
<ProductInfo v-if="scope.row.itemType == 'product'" :productId="scope.row.itemId">
@@ -109,7 +112,8 @@
<el-table-column label="状态" v-if="showStatus" align="center" prop="status">
<template slot-scope="scope">
<el-select v-model="scope.row.status" placeholder="请选择状态" @change="handleStatusChange(scope.row)">
<el-option v-for="item in dict.type.product_coil_status" :key="item.value" :value="parseInt(item.value)" :label="item.label" />
<el-option v-for="item in dict.type.product_coil_status" :key="item.value" :value="parseInt(item.value)"
:label="item.label" />
</el-select>
</template>
</el-table-column>
@@ -162,7 +166,8 @@
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item>
<el-form-item label="实际库区" prop="actualWarehouseId">
<actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;" clearable />
<actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;"
clearable />
</el-form-item>
<el-form-item label="班组" prop="team">
<el-input v-model="form.team" placeholder="请输入班组" />
@@ -181,13 +186,36 @@
style="width: 100%;" clearable />
<div v-else>请先选择材料类型</div>
</el-form-item> -->
<el-form-item v-if="form.materialType === '成品'" label="质量状态" prop="qualityStatus">
<el-input v-model="form.qualityStatus" placeholder="请输入质量状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="form.materialType === '成品'" label="切边要求" prop="trimmingRequirement">
<el-input v-model="form.trimmingRequirement" placeholder="请输入切边要求"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="form.materialType === '成品'" label="打包状态" prop="packingStatus">
<el-input v-model="form.packingStatus" placeholder="请输入打包状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="form.materialType === '成品'" label="包装要求" prop="packagingRequirement">
<el-input v-model="form.packagingRequirement" placeholder="请输入包装要求"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item label="毛重" prop="grossWeight">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" />
</el-form-item>
<el-form-item label="净重" prop="netWeight">
<el-input v-model="form.netWeight" placeholder="请输入净重" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
@@ -357,7 +385,7 @@ export default {
return '原料类型';
}
return '物品类型';
}
},
},
created() {
this.getList();
@@ -378,7 +406,7 @@ export default {
/** 查询钢卷物料列表 */
getList() {
this.loading = true;
const { updateTime ,...query } = {
const { updateTime, ...query } = {
...this.queryParams,
startTime: this.queryParams.updateTime?.[0],
endTime: this.queryParams.updateTime?.[1],

View File

@@ -88,8 +88,10 @@
<div class="flow-section-title">
<span>子卷列表</span>
<div>
<el-button v-if="!readonly" type="text" size="mini" @click="copyToAllSubCoils" icon="el-icon-document-copy">复制到全部</el-button>
<el-button v-if="!readonly" type="text" size="mini" @click="addSplitItem" icon="el-icon-plus">添加子卷</el-button>
<el-button v-if="!readonly" type="text" size="mini" @click="copyToAllSubCoils"
icon="el-icon-document-copy">复制到全部</el-button>
<el-button v-if="!readonly" type="text" size="mini" @click="addSplitItem"
icon="el-icon-plus">添加子卷</el-button>
</div>
</div>
@@ -97,14 +99,8 @@
<div class="sub-coil-card" v-for="(item, index) in splitList" :key="index">
<div class="sub-coil-header">
<span class="sub-coil-number">{{ index + 1 }}</span>
<el-button
v-if="!readonly"
type="text"
size="mini"
icon="el-icon-delete"
@click="removeSplitItem(index)"
class="btn-remove"
></el-button>
<el-button v-if="!readonly" type="text" size="mini" icon="el-icon-delete" @click="removeSplitItem(index)"
class="btn-remove"></el-button>
</div>
<div class="sub-coil-body">
<el-form size="small" label-width="90px">
@@ -116,11 +112,7 @@
</el-form-item>
<el-form-item label="材料类型" required>
<el-select
v-model="item.materialType"
placeholder="请选择材料类型"
style="width: 100%"
:disabled="readonly"
<el-select v-model="item.materialType" placeholder="请选择材料类型" style="width: 100%" :disabled="readonly"
@change="handleMaterialTypeChange(item, index)">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
@@ -128,75 +120,62 @@
</el-select>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="质量状态" prop="qualityStatus">
<el-input v-model="item.qualityStatus" placeholder="请输入质量状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="切边要求" prop="trimmingRequirement">
<el-input v-model="item.trimmingRequirement" placeholder="请输入切边要求"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="打包状态" prop="packingStatus">
<el-input v-model="item.packingStatus" placeholder="请输入打包状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="包装要求" prop="packagingRequirement">
<el-input v-model="item.packagingRequirement" placeholder="请输入包装要求"
:disabled="readonly">
</el-input>
</el-form-item>
<!-- 物品类型由材料类型自动决定不显示选择框 -->
<el-form-item
:label="getItemLabel(item.materialType)"
:required="item.materialType !== '废品'">
<el-select
v-model="item.itemId"
:placeholder="getItemPlaceholder(item.materialType)"
filterable
remote
:remote-method="(query) => searchItemsForSplit(query, index)"
:loading="itemSearchLoading"
style="width: 100%"
:disabled="readonly || !item.materialType"
>
<el-option
v-for="option in getItemListForSplit(item.itemType)"
:key="option.id"
:label="option.name"
:value="option.id"
/>
<el-form-item :label="getItemLabel(item.materialType)" :required="item.materialType !== '废品'">
<el-select v-model="item.itemId" :placeholder="getItemPlaceholder(item.materialType)" filterable
remote :remote-method="(query) => searchItemsForSplit(query, index)" :loading="itemSearchLoading"
style="width: 100%" :disabled="readonly || !item.materialType">
<el-option v-for="option in getItemListForSplit(item.itemType)" :key="option.id"
:label="option.name" :value="option.id" />
</el-select>
</el-form-item>
<el-form-item label="毛重(t)" required>
<el-input
v-model.number="item.grossWeight"
placeholder="请输入毛重"
type="number"
step="0.01"
:disabled="readonly"
>
<el-input v-model.number="item.grossWeight" placeholder="请输入毛重" type="number" step="0.01"
:disabled="readonly">
<template slot="append">吨</template>
</el-input>
</el-form-item>
<el-form-item label="净重(t)" required>
<el-input
v-model.number="item.netWeight"
placeholder="请输入净重"
type="number"
step="0.01"
:disabled="readonly"
>
<el-input v-model.number="item.netWeight" placeholder="请输入净重" type="number" step="0.01"
:disabled="readonly">
<template slot="append">吨</template>
</el-input>
</el-form-item>
<el-form-item label="逻辑库区" required>
<el-select
v-model="item.warehouseId"
placeholder="请选择逻辑库区"
style="width: 100%"
filterable
:disabled="readonly"
>
<el-option
v-for="warehouse in warehouseList"
:key="warehouse.warehouseId"
:label="warehouse.warehouseName"
:value="warehouse.warehouseId"
/>
<el-select v-model="item.warehouseId" placeholder="请选择逻辑库区" style="width: 100%" filterable
:disabled="readonly">
<el-option v-for="warehouse in warehouseList" :key="warehouse.warehouseId"
:label="warehouse.warehouseName" :value="warehouse.warehouseId" />
</el-select>
</el-form-item>
<el-form-item label="真实库区" required>
<ActualWarehouseSelect
v-model="item.actualWarehouseId"
placeholder="请选择真实库区"
style="width: 100%"
filterable
:disabled="readonly"
/>
<ActualWarehouseSelect v-model="item.actualWarehouseId" placeholder="请选择真实库区" style="width: 100%"
filterable :disabled="readonly" />
</el-form-item>
</el-form>
</div>
@@ -214,10 +193,7 @@
</div>
<!-- 钢卷选择器 -->
<coil-selector
:visible.sync="coilSelectorVisible"
@select="handleCoilSelect"
/>
<coil-selector :visible.sync="coilSelectorVisible" @select="handleCoilSelect" />
</div>
</template>
@@ -661,11 +637,11 @@ export default {
}
}
const loadingInstance = this.$loading({
lock: true,
text: '正在分条,请稍后...',
background: 'rgba(0, 0, 0, 0.7)'
})
const loadingInstance = this.$loading({
lock: true,
text: '正在分条,请稍后...',
background: 'rgba(0, 0, 0, 0.7)'
})
try {
this.loading = true;
@@ -1107,4 +1083,3 @@ export default {
}
}
</style>

View File

@@ -94,12 +94,8 @@
</el-form-item>
<el-form-item label="材料类型" prop="materialType">
<el-select
v-model="updateForm.materialType"
placeholder="请选择材料类型"
style="width: 100%"
:disabled="readonly"
@change="handleMaterialTypeChange">
<el-select v-model="updateForm.materialType" placeholder="请选择材料类型" style="width: 100%"
:disabled="readonly" @change="handleMaterialTypeChange">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
<el-option label="废品" value="废品" />
@@ -108,18 +104,34 @@
<!-- 物品类型由材料类型自动决定不显示选择框 -->
<el-form-item
:label="getItemLabel"
:prop="updateForm.materialType === '废品' ? '' : 'itemId'"
<el-form-item v-if="updateForm.materialType === '成品'" label="质量状态" prop="qualityStatus">
<el-input v-model="updateForm.qualityStatus" placeholder="请输入质量状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="切边要求" prop="qualityStatus">
<el-input v-model="updateForm.trimmingRequirement" placeholder="请输入切边要求"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="打包状态" prop="qualityStatus">
<el-input v-model="updateForm.packingStatus" placeholder="请输入打包状态"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item v-if="updateForm.materialType === '成品'" label="包装要求" prop="qualityStatus">
<el-input v-model="updateForm.packagingRequirement" placeholder="请输入包装要求"
:disabled="readonly">
</el-input>
</el-form-item>
<el-form-item :label="getItemLabel" :prop="updateForm.materialType === '废品' ? '' : 'itemId'"
:rules="updateForm.materialType === '废品' ? [] : rules.itemId">
<el-select
v-model="updateForm.itemId"
:placeholder="getItemPlaceholder"
filterable
remote
:remote-method="searchItems"
:loading="itemSearchLoading"
style="width: 100%"
<el-select v-model="updateForm.itemId" :placeholder="getItemPlaceholder" filterable remote
:remote-method="searchItems" :loading="itemSearchLoading" style="width: 100%"
:disabled="readonly || !updateForm.materialType">
<el-option v-for="item in currentItemList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>

View File

@@ -39,7 +39,6 @@ import { listStockIo } from '@/api/wms/stockIo';
import { listStockIoDetail } from '@/api/wms/stockIoDetail';
import { listOrder } from '@/api/wms/order';
import { listOrderDetail } from '@/api/wms/orderDetail';
import { listPurchasePlan } from '@/api/wms/purchasePlan';
import { mapState } from 'vuex';
import { ITEM_TYPE } from '../../../utils/enums';