feat(wms/receive/plan): 添加入库计划差异对比配置与重量差异校验

1. 新增差异对比阈值配置面板,支持设置重量差异阈值
2. 调整材质字段映射关系,修复字段匹配错误
3. 新增数值字段差异校验逻辑,支持基于阈值对比重量差异
4. 增加重新计算差异的按钮和配置说明文案
This commit is contained in:
2026-05-14 16:34:19 +08:00
parent 337d9a35df
commit c10cdfd022

View File

@@ -164,6 +164,17 @@
</el-table>
</el-tab-pane>
<el-tab-pane label="差异对比" name="diff">
<div class="diff-config">
<el-form :model="diffConfig" inline>
<el-form-item label="重量差异阈值(kg)">
<el-input-number v-model="diffConfig.weightThreshold" :precision="2" :step="0.1" :min="0" style="width: 120px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" size="mini" @click="calculateDiff">重新计算差异</el-button>
</el-form-item>
</el-form>
<span class="config-tip">重量差异在此阈值内视为相同超出则标记为不一致</span>
</div>
<el-row :gutter="16" class="diff-row">
<el-col :span="12">
<div class="diff-section">
@@ -461,6 +472,9 @@ export default {
missingCoils: [],
extraCoils: [],
diffCoils: [],
diffConfig: {
weightThreshold: 0.5
},
importOpen: false,
file: null,
@@ -666,8 +680,8 @@ export default {
const compareFields = [
{ planField: 'goodsName', actualField: 'itemName', fieldName: '名称' },
{ planField: 'spec', actualField: 'specification', fieldName: '规格' },
{ planField: 'materialType', actualField: 'materialType', fieldName: '材质' },
{ planField: 'weight', actualField: 'netWeight', fieldName: '重量' },
{ planField: 'materialType', actualField: 'material', fieldName: '材质' },
{ planField: 'weight', actualField: 'netWeight', fieldName: '重量', isNumber: true },
{ planField: 'manufacturer', actualField: 'manufacturer', fieldName: '生产厂家' },
{ planField: 'zincCoating', actualField: 'zincLayer', fieldName: '锌层' }
];
@@ -678,9 +692,19 @@ export default {
if (actualItem) {
const diffs = [];
compareFields.forEach(field => {
const planValue = String(planItem[field.planField] || '');
const actualValue = String(actualItem[field.actualField] || '');
if (planValue !== actualValue) {
let planValue = String(planItem[field.planField] || '');
let actualValue = String(actualItem[field.actualField] || '');
if (field.isNumber) {
planValue = Number(planValue);
actualValue = Number(actualValue);
}
let isDiff = false;
if (field.isNumber) {
isDiff = Math.abs(planValue - actualValue) > this.diffConfig.weightThreshold;
} else {
isDiff = planValue !== actualValue;
}
if (isDiff) {
diffs.push({
fieldName: field.fieldName,
planValue,
@@ -1123,6 +1147,22 @@ export default {
margin-bottom: 20px;
}
.diff-config {
background: #fff;
border-radius: 8px;
padding: 12px 16px;
margin-bottom: 16px;
border: 1px solid #e4e7ed;
display: flex;
align-items: center;
gap: 16px;
}
.config-tip {
font-size: 12px;
color: #909399;
}
.diff-section {
background: #fafafa;
border-radius: 8px;