feat(入库出库): 优化毛坯扫描逻辑并增加箱数统计功能

- 更新manifest.json版本号至2.7.2
- 新增boxCountTotal计算属性统计总箱数
- 优化扫描逻辑,相同blankNumber的毛坯自动合并并累加数量和箱数
- 改进重复箱校验逻辑,支持originalCodes数组检查
- 移除生产批次显示,优化界面展示
This commit is contained in:
赵正易 2025-10-17 17:14:45 +08:00
parent caf17c67c8
commit 8103890993
3 changed files with 334 additions and 52 deletions

View File

@ -2,8 +2,8 @@
"name" : "上海干巷涂装PDA",
"appid" : "__UNI__A67E78B",
"description" : "",
"versionName" : "2.7.0",
"versionCode" : 270,
"versionName" : "2.7.2",
"versionCode" : 272,
"transformPx" : false,
"sassImplementationName" : "node-sass",
"app-plus" : {

View File

@ -13,7 +13,7 @@
</view> -->
<view class="row">
<span class="col">已扫货物数{{ quantityTotal }}</span>
<span class="col">已扫箱数{{ newMaterialList.length }}</span>
<span class="col">已扫箱数{{ boxCountTotal }}</span>
</view>
<view>
<!-- <view v-if="searchType === 1" class="color1 aciton-box">请扫仓库码</view> -->
@ -52,8 +52,8 @@
<view class="quantity-edit-container">
<text class="package-card-quantity-label">数量{{ item.quantity }}</text>
</view>
<view class="package-card-patch">生产批次</view>
<view class="package-card-patch">{{ item.productionTime }}</view>
<!-- <view class="package-card-patch">生产批次</view>
<view class="package-card-patch">{{ item.productionTime }}</view> -->
</view>
</view>
@ -164,6 +164,14 @@ export default {
num += this.newMaterialList[index].quantity * 1;
}
return num;
},
//
boxCountTotal() {
let count = 0;
for (let index = 0; index < this.newMaterialList.length; index++) {
count += (this.newMaterialList[index].boxCount || 0);
}
return count;
}
},
methods: {
@ -205,7 +213,47 @@ export default {
return;
}
this.loading = true;
this.newMaterialList.push(data);
// blankNumber
const existingIndex = this.newMaterialList.findIndex(item => item.blankNumber === data.blankNumber);
if (existingIndex !== -1) {
// blankNumber
const existingItem = this.newMaterialList[existingIndex];
// originalCodes
if (!existingItem.originalCodes || !Array.isArray(existingItem.originalCodes)) {
existingItem.originalCodes = [];
// originalCode
if (existingItem.originalCode) {
existingItem.originalCodes.push(existingItem.originalCode);
}
}
// originalCode
if (data.originalCode && !existingItem.originalCodes.includes(data.originalCode)) {
existingItem.originalCodes.push(data.originalCode);
}
//
existingItem.quantity += data.quantity || 1;
existingItem.boxCount = (existingItem.boxCount || 0) + 1;
//
// uni.showToast({
// icon: 'none',
// title: `${data.blankNumber}${existingItem.quantity}${existingItem.boxCount}`,
// duration: 1500
// });
} else {
// blankNumber
const newItem = { ...data };
// originalCodesboxCount
newItem.originalCodes = [];
if (newItem.originalCode) {
newItem.originalCodes.push(newItem.originalCode);
}
newItem.boxCount = 1; // 1
this.newMaterialList.push(newItem);
}
this.loading = false;
}
},
@ -259,14 +307,14 @@ export default {
return;
}
// this.isPackageRepeat()
if (this.isPackageRepeat()) {
showOperationConfirm('重复箱校验', '检测到存在重复箱,是否自动清除?', true).then((res) => {
if (res.confirm) {
this.clearRepeatPackage();
}
});
return;
}
// if (this.isPackageRepeat()) {
// showOperationConfirm('', '?', true).then((res) => {
// if (res.confirm) {
// this.clearRepeatPackage();
// }
// });
// return;
// }
showOperationConfirm('出库操作', '是否确认出库?', true).then((res) => {
if (res.confirm) {
@ -326,15 +374,29 @@ export default {
});
},
// ,
// 使Map
// 使Set
isPackageRepeat() {
let oldList = this.newMaterialList;
let seen = new Map();
let seenOriginalCodes = new Set();
for (let item of oldList) {
if (seen.has(item.originalCode)) {
return true;
// originalCode
if (item.originalCode) {
if (seenOriginalCodes.has(item.originalCode)) {
return true;
}
seenOriginalCodes.add(item.originalCode);
}
// originalCodescode
if (item.originalCodes && Array.isArray(item.originalCodes)) {
for (let code of item.originalCodes) {
if (seenOriginalCodes.has(code)) {
return true;
}
seenOriginalCodes.add(code);
}
}
seen.set(item.originalCode, true);
}
return false;
},
@ -342,22 +404,103 @@ export default {
clearRepeatPackage() {
let oldArray = this.newMaterialList;
let newArray = [];
let seen = new Map();
let seenOriginalCodes = new Set(); // originalCode
let repeatPackage = [];
oldArray.forEach((item) => {
// 使originalCode
if (!seen.has(item.originalCode)) {
seen.set(item.originalCode, true);
// blankNumber
const blankGroups = {};
oldArray.forEach(item => {
const blankNumber = item.blankNumber || '';
if (!blankGroups[blankNumber]) {
blankGroups[blankNumber] = [];
}
blankGroups[blankNumber].push(item);
});
// blankNumber
Object.values(blankGroups).forEach(group => {
if (group.length === 1) {
// originalCode
const item = group[0];
newArray.push(item);
if (item.originalCode) {
seenOriginalCodes.add(item.originalCode);
}
// originalCodescode
if (item.originalCodes && Array.isArray(item.originalCodes)) {
item.originalCodes.forEach(code => {
seenOriginalCodes.add(code);
});
}
// boxCount
if (!item.boxCount) {
item.boxCount = 1;
}
} else {
repeatPackage.push(item.patchCode);
// blankNumber
let mergedItem = { ...group[0] };
let totalQuantity = mergedItem.quantity || 0;
let totalBoxCount = mergedItem.boxCount || 0;
let allOriginalCodes = new Set();
// originalCode
if (mergedItem.originalCode) {
allOriginalCodes.add(mergedItem.originalCode);
seenOriginalCodes.add(mergedItem.originalCode);
}
// originalCodes
if (mergedItem.originalCodes && Array.isArray(mergedItem.originalCodes)) {
mergedItem.originalCodes.forEach(code => {
allOriginalCodes.add(code);
seenOriginalCodes.add(code);
});
}
//
for (let i = 1; i < group.length; i++) {
const item = group[i];
//
totalQuantity += item.quantity || 1;
totalBoxCount += item.boxCount || 0;
// originalCode
if (item.originalCode) {
if (allOriginalCodes.has(item.originalCode)) {
repeatPackage.push(item.patchCode || item.originalCode);
} else {
allOriginalCodes.add(item.originalCode);
seenOriginalCodes.add(item.originalCode);
}
}
// originalCodes
if (item.originalCodes && Array.isArray(item.originalCodes)) {
item.originalCodes.forEach(code => {
if (allOriginalCodes.has(code)) {
repeatPackage.push(item.patchCode || code);
} else {
allOriginalCodes.add(code);
seenOriginalCodes.add(code);
}
});
}
}
//
mergedItem.quantity = totalQuantity;
mergedItem.boxCount = totalBoxCount;
mergedItem.originalCodes = Array.from(allOriginalCodes);
newArray.push(mergedItem);
}
});
this.newMaterialList = newArray;
//
showOperationConfirm(
'重复箱清除',
`检测到${repeatPackage.length}个重复箱,已自动清除。原箱数:${oldArray.length} 现箱数:${newArray.length} 重复箱:${repeatPackage.join(', ')}`,
'重复箱处理',
`已处理${oldArray.length}个毛坯项相同blankNumber已合并。现箱数${newArray.length} 重复标签:${repeatPackage.length > 0 ? repeatPackage.join(', ') : '无'}`,
false
);
}

View File

@ -13,7 +13,7 @@
</view> -->
<view class="row">
<span class="col">已扫货物数{{ quantityTotal }}</span>
<span class="col">已扫箱数{{ newMaterialList.length }}</span>
<span class="col">已扫箱数{{ boxCountTotal }}</span>
</view>
<view>
<!-- <view v-if="searchType === 1" class="color1 aciton-box">请扫仓库码</view> -->
@ -52,8 +52,8 @@
<view class="quantity-edit-container">
<text class="package-card-quantity-label">数量{{ item.quantity }}</text>
</view>
<view class="package-card-patch">生产批次</view>
<view class="package-card-patch">{{ item.productionTime }}</view>
<!-- <view class="package-card-patch">日期</view>
<view class="package-card-patch">{{ item.productionTime }}</view> -->
</view>
</view>
@ -164,6 +164,14 @@ export default {
num += this.newMaterialList[index].quantity * 1;
}
return num;
},
//
boxCountTotal() {
let count = 0;
for (let index = 0; index < this.newMaterialList.length; index++) {
count += (this.newMaterialList[index].boxCount || 0);
}
return count;
}
},
methods: {
@ -205,7 +213,43 @@ export default {
return;
}
this.loading = true;
this.newMaterialList.push(data);
// blankNumber
const existingIndex = this.newMaterialList.findIndex(item =>
item.blankNumber === data.blankNumber
);
if (existingIndex >= 0) {
// blankNumber
const existingItem = this.newMaterialList[existingIndex];
// originalCodes
if (!existingItem.originalCodes) {
existingItem.originalCodes = [existingItem.originalCode];
}
// originalCode
if (!existingItem.originalCodes.includes(data.originalCode)) {
existingItem.originalCodes.push(data.originalCode);
}
//
const newQuantity = (existingItem.quantity || 0) + (data.quantity || 1);
const newBoxCount = (existingItem.boxCount || 0) + 1; // +1
this.$set(this.newMaterialList, existingIndex, {
...existingItem,
quantity: newQuantity,
boxCount: newBoxCount
});
// showOperationConfirm('', `${existingItem.blankNumber} ${newQuantity}${newBoxCount}`, false);
} else {
// blankNumber
// originalCodesboxCount
const newItem = {
...data,
originalCodes: [data.originalCode],
boxCount: 1 // 1
};
this.newMaterialList.push(newItem);
}
this.loading = false;
}
},
@ -259,14 +303,14 @@ export default {
return;
}
// this.isPackageRepeat()
if (this.isPackageRepeat()) {
showOperationConfirm('重复箱校验', '检测到存在重复箱,是否自动清除?', true).then((res) => {
if (res.confirm) {
this.clearRepeatPackage();
}
});
return;
}
// if (this.isPackageRepeat()) {
// showOperationConfirm('', '?', true).then((res) => {
// if (res.confirm) {
// this.clearRepeatPackage();
// }
// });
// return;
// }
showOperationConfirm('入库操作', '是否确认入库?', true).then((res) => {
if (res.confirm) {
@ -326,15 +370,29 @@ export default {
});
},
// ,
// 使Map
// 使Set
isPackageRepeat() {
let oldList = this.newMaterialList;
let seen = new Map();
let seenOriginalCodes = new Set();
for (let item of oldList) {
if (seen.has(item.originalCode)) {
return true;
// originalCode
if (item.originalCode) {
if (seenOriginalCodes.has(item.originalCode)) {
return true;
}
seenOriginalCodes.add(item.originalCode);
}
// originalCodescode
if (item.originalCodes && Array.isArray(item.originalCodes)) {
for (let code of item.originalCodes) {
if (seenOriginalCodes.has(code)) {
return true;
}
seenOriginalCodes.add(code);
}
}
seen.set(item.originalCode, true);
}
return false;
},
@ -342,22 +400,103 @@ export default {
clearRepeatPackage() {
let oldArray = this.newMaterialList;
let newArray = [];
let seen = new Map();
let seenOriginalCodes = new Set(); // originalCode
let repeatPackage = [];
oldArray.forEach((item) => {
// 使originalCode
if (!seen.has(item.originalCode)) {
seen.set(item.originalCode, true);
// blankNumber
const blankGroups = {};
oldArray.forEach(item => {
const blankNumber = item.blankNumber || '';
if (!blankGroups[blankNumber]) {
blankGroups[blankNumber] = [];
}
blankGroups[blankNumber].push(item);
});
// blankNumber
Object.values(blankGroups).forEach(group => {
if (group.length === 1) {
// originalCode
const item = group[0];
newArray.push(item);
if (item.originalCode) {
seenOriginalCodes.add(item.originalCode);
}
// originalCodescode
if (item.originalCodes && Array.isArray(item.originalCodes)) {
item.originalCodes.forEach(code => {
seenOriginalCodes.add(code);
});
}
// boxCount
if (!item.boxCount) {
item.boxCount = 1;
}
} else {
repeatPackage.push(item.patchCode);
// blankNumber
let mergedItem = { ...group[0] };
let totalQuantity = mergedItem.quantity || 0;
let totalBoxCount = mergedItem.boxCount || 0;
let allOriginalCodes = new Set();
// originalCode
if (mergedItem.originalCode) {
allOriginalCodes.add(mergedItem.originalCode);
seenOriginalCodes.add(mergedItem.originalCode);
}
// originalCodes
if (mergedItem.originalCodes && Array.isArray(mergedItem.originalCodes)) {
mergedItem.originalCodes.forEach(code => {
allOriginalCodes.add(code);
seenOriginalCodes.add(code);
});
}
//
for (let i = 1; i < group.length; i++) {
const item = group[i];
//
totalQuantity += item.quantity || 1;
totalBoxCount += item.boxCount || 0;
// originalCode
if (item.originalCode) {
if (allOriginalCodes.has(item.originalCode)) {
repeatPackage.push(item.patchCode || item.originalCode);
} else {
allOriginalCodes.add(item.originalCode);
seenOriginalCodes.add(item.originalCode);
}
}
// originalCodes
if (item.originalCodes && Array.isArray(item.originalCodes)) {
item.originalCodes.forEach(code => {
if (allOriginalCodes.has(code)) {
repeatPackage.push(item.patchCode || code);
} else {
allOriginalCodes.add(code);
seenOriginalCodes.add(code);
}
});
}
}
//
mergedItem.quantity = totalQuantity;
mergedItem.boxCount = totalBoxCount;
mergedItem.originalCodes = Array.from(allOriginalCodes);
newArray.push(mergedItem);
}
});
this.newMaterialList = newArray;
//
showOperationConfirm(
'重复箱清除',
`检测到${repeatPackage.length}个重复箱,已自动清除。原箱数:${oldArray.length} 现箱数:${newArray.length} 重复箱:${repeatPackage.join(', ')}`,
'重复箱处理',
`已处理${oldArray.length}个毛坯项相同blankNumber已合并。现箱数${newArray.length} 重复标签:${repeatPackage.length > 0 ? repeatPackage.join(', ') : '无'}`,
false
);
}