From 6eb320c2029e2508d8f1d2646c7a28ca409dc99c Mon Sep 17 00:00:00 2001 From: TraeAI Date: Sat, 7 Mar 2026 15:14:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=BF=90=E8=B4=B9?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=99=A8=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E4=B8=AA=E8=A7=84=E6=A0=BC=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=92=8C=E8=87=AA=E5=8A=A8=E5=8C=B9=E9=85=8D=E8=BD=A6=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/freight-calculator/index.js | 189 ++++++++++++++++++++++++---- pages/freight-calculator/index.wxml | 10 +- 2 files changed, 176 insertions(+), 23 deletions(-) diff --git a/pages/freight-calculator/index.js b/pages/freight-calculator/index.js index e00fc1f..5e75e7b 100644 --- a/pages/freight-calculator/index.js +++ b/pages/freight-calculator/index.js @@ -49,6 +49,10 @@ Page({ selectedGoods: {}, // 选中的规格索引 selectedSpecIndex: 0, + // 规格列表 + specList: [], + // 格式化后的规格列表(用于 picker 显示) + formattedSpecList: [], // 计算结果 calculationResult: null, // 地址选择器状态 @@ -170,22 +174,56 @@ Page({ try { const goodsInfo = JSON.parse(options.goodsInfo); let weight = goodsInfo.grossWeight || ''; - if (!weight && goodsInfo.netWeight && goodsInfo.quantity) { - // 计算总重量:净重(斤) * 件数 / 2(换算为公斤) - weight = (parseFloat(goodsInfo.netWeight) * parseInt(goodsInfo.quantity)) / 2; - } else if (!weight && (goodsInfo.spec || goodsInfo.specification || goodsInfo.specs) && goodsInfo.quantity) { - // 从规格中提取重量数字并计算总重量 - weight = this.calculateWeightFromSpec(goodsInfo); - } - - // 计算体积 let volume = ''; - if (goodsInfo.quantity) { - volume = this.calculateVolumeFromPackaging(goodsInfo); + let specList = []; + let selectedSpecIndex = 0; + + // 检查是否有多个规格 + if (goodsInfo.weightQuantityData && goodsInfo.weightQuantityData.length > 0) { + specList = goodsInfo.weightQuantityData; + // 选择第一个规格作为默认值 + const firstSpec = specList[0]; + if (firstSpec) { + // 从规格中提取重量和体积 + if (firstSpec.weightSpec) { + // 从重量规格中提取数字 + const weightMatch = firstSpec.weightSpec.match(/(\d+(?:\.\d+)?)/); + if (weightMatch && weightMatch.length > 1) { + const weightPerUnit = parseFloat(weightMatch[1]); + const quantity = parseInt(firstSpec.soldQuantity || goodsInfo.quantity) || 1; + weight = (weightPerUnit * quantity) / 2; // 换算为公斤 + } + } + // 计算体积 + if (goodsInfo.producting && (goodsInfo.quantity || firstSpec.soldQuantity)) { + const quantity = parseInt(firstSpec.soldQuantity || goodsInfo.quantity) || 1; + volume = this.calculateVolumeFromPackaging({ ...goodsInfo, quantity: quantity }); + } + } + } else { + // 单个规格的情况 + if (!weight && goodsInfo.netWeight && goodsInfo.quantity) { + // 计算总重量:净重(斤) * 件数 / 2(换算为公斤) + weight = (parseFloat(goodsInfo.netWeight) * parseInt(goodsInfo.quantity)) / 2; + } else if (!weight && (goodsInfo.spec || goodsInfo.specification || goodsInfo.specs) && goodsInfo.quantity) { + // 从规格中提取重量数字并计算总重量 + weight = this.calculateWeightFromSpec(goodsInfo); + } + + // 计算体积 + if (goodsInfo.quantity) { + volume = this.calculateVolumeFromPackaging(goodsInfo); + } } + // 生成格式化后的规格列表(用于 picker 显示) + const formattedSpecList = specList.map((item, index) => item.weightSpec || '规格' + (index + 1)); + this.setData({ selectedGoods: goodsInfo, + specList: specList, + formattedSpecList: formattedSpecList, + selectedSpecIndex: selectedSpecIndex, 'goodsInfo.weight': weight, 'goodsInfo.volume': volume, 'goodsInfo.quantity': goodsInfo.quantity || 1, @@ -221,22 +259,56 @@ Page({ } let weight = goodsData.grossWeight || ''; - if (!weight && goodsData.netWeight && goodsData.quantity) { - // 计算总重量:净重(斤) * 件数 / 2(换算为公斤) - weight = (parseFloat(goodsData.netWeight) * parseInt(goodsData.quantity)) / 2; - } else if (!weight && (goodsData.spec || goodsData.specification || goodsData.specs) && goodsData.quantity) { - // 从规格中提取重量数字并计算总重量 - weight = this.calculateWeightFromSpec(goodsData); - } - - // 计算体积 let volume = ''; - if (goodsData.quantity) { - volume = this.calculateVolumeFromPackaging(goodsData); + let specList = []; + let selectedSpecIndex = 0; + + // 检查是否有多个规格 + if (goodsData.weightQuantityData && goodsData.weightQuantityData.length > 0) { + specList = goodsData.weightQuantityData; + // 选择第一个规格作为默认值 + const firstSpec = specList[0]; + if (firstSpec) { + // 从规格中提取重量和体积 + if (firstSpec.weightSpec) { + // 从重量规格中提取数字 + const weightMatch = firstSpec.weightSpec.match(/(\d+(?:\.\d+)?)/); + if (weightMatch && weightMatch.length > 1) { + const weightPerUnit = parseFloat(weightMatch[1]); + const quantity = parseInt(firstSpec.soldQuantity || goodsData.quantity) || 1; + weight = (weightPerUnit * quantity) / 2; // 换算为公斤 + } + } + // 计算体积 + if (goodsData.producting && (goodsData.quantity || firstSpec.soldQuantity)) { + const quantity = parseInt(firstSpec.soldQuantity || goodsData.quantity) || 1; + volume = this.calculateVolumeFromPackaging({ ...goodsData, quantity: quantity }); + } + } + } else { + // 单个规格的情况 + if (!weight && goodsData.netWeight && goodsData.quantity) { + // 计算总重量:净重(斤) * 件数 / 2(换算为公斤) + weight = (parseFloat(goodsData.netWeight) * parseInt(goodsData.quantity)) / 2; + } else if (!weight && (goodsData.spec || goodsData.specification || goodsData.specs) && goodsData.quantity) { + // 从规格中提取重量数字并计算总重量 + weight = this.calculateWeightFromSpec(goodsData); + } + + // 计算体积 + if (goodsData.quantity) { + volume = this.calculateVolumeFromPackaging(goodsData); + } } + // 生成格式化后的规格列表(用于 picker 显示) + const formattedSpecList = specList.map((item, index) => item.weightSpec || '规格' + (index + 1)); + this.setData({ selectedGoods: goodsData, + specList: specList, + formattedSpecList: formattedSpecList, + selectedSpecIndex: selectedSpecIndex, 'goodsInfo.weight': weight, 'goodsInfo.volume': volume, 'goodsInfo.quantity': goodsData.quantity || 1, @@ -331,6 +403,33 @@ Page({ volume = this.calculateVolumeFromPackaging(goodsItem); } + // 检查是否有多个规格 + let specList = []; + let selectedSpecIndex = 0; + + if (goodsItem.weightQuantityData && goodsItem.weightQuantityData.length > 0) { + specList = goodsItem.weightQuantityData; + // 选择第一个规格作为默认值 + const firstSpec = specList[0]; + if (firstSpec) { + // 从规格中提取重量和体积 + if (firstSpec.weightSpec) { + // 从重量规格中提取数字 + const weightMatch = firstSpec.weightSpec.match(/(\d+(?:\.\d+)?)/); + if (weightMatch && weightMatch.length > 1) { + const weightPerUnit = parseFloat(weightMatch[1]); + const quantity = parseInt(firstSpec.soldQuantity || goodsItem.quantity) || 1; + weight = (weightPerUnit * quantity) / 2; // 换算为公斤 + } + } + // 计算体积 + if (goodsItem.producting && (goodsItem.quantity || firstSpec.soldQuantity)) { + const quantity = parseInt(firstSpec.soldQuantity || goodsItem.quantity) || 1; + volume = this.calculateVolumeFromPackaging({ ...goodsItem, quantity: quantity }); + } + } + } + // 设置重量和体积 if (weight) { this.setData({ @@ -345,6 +444,16 @@ Page({ }); } + // 生成格式化后的规格列表(用于 picker 显示) + const formattedSpecList = specList.map((item, index) => item.weightSpec || '规格' + (index + 1)); + + // 设置规格列表 + this.setData({ + specList: specList, + formattedSpecList: formattedSpecList, + selectedSpecIndex: selectedSpecIndex + }); + // 自动匹配车型和车长 if (weight && volume) { this.autoMatchVehicle(weight, volume); @@ -551,6 +660,42 @@ Page({ this.setData({ selectedSpecIndex: index }); + + // 根据选择的规格更新重量和体积 + const selectedSpec = this.data.specList[index]; + if (selectedSpec) { + let weight = ''; + let volume = ''; + + // 从规格中提取重量 + if (selectedSpec.weightSpec) { + const weightMatch = selectedSpec.weightSpec.match(/(\d+(?:\.\d+)?)/); + if (weightMatch && weightMatch.length > 1) { + const weightPerUnit = parseFloat(weightMatch[1]); + const quantity = parseInt(selectedSpec.soldQuantity || this.data.goodsInfo.quantity) || 1; + weight = (weightPerUnit * quantity) / 2; // 换算为公斤 + } + } + + // 计算体积 + if (this.data.selectedGoods.producting && (this.data.goodsInfo.quantity || selectedSpec.soldQuantity)) { + const quantity = parseInt(selectedSpec.soldQuantity || this.data.goodsInfo.quantity) || 1; + volume = this.calculateVolumeFromPackaging({ ...this.data.selectedGoods, quantity: quantity }); + } + + // 更新重量和体积 + this.setData({ + 'goodsInfo.weight': weight, + 'goodsInfo.volume': volume, + weight: weight, // 同步到运输参数的重量输入框 + volume: volume // 同步到运输参数的体积输入框 + }); + + // 自动匹配车型和车长 + if (weight && volume) { + this.autoMatchVehicle(weight, volume); + } + } }, diff --git a/pages/freight-calculator/index.wxml b/pages/freight-calculator/index.wxml index b69647c..c937291 100644 --- a/pages/freight-calculator/index.wxml +++ b/pages/freight-calculator/index.wxml @@ -73,7 +73,15 @@ - + + + 规格选择 + + + {{formattedSpecList[selectedSpecIndex]}} + + +