This commit is contained in:
2026-09-03 15:05:30 +08:00
parent 0bf4f5781a
commit 664d4844c3
4 changed files with 42 additions and 24 deletions
@@ -336,6 +336,7 @@ describe('UnifiedOrdersView contract', () => {
it('shows the matched dimension addition and enabled multiplier in calculation choices', () => {
expect(source).toContain('getCustomerDimensionConfig')
expect(source).toContain('matchingDimensionRule')
expect(source).toContain('|| rules[rules.length - 1]')
expect(source).toContain('`原尺寸 + ${values[0]}cm`')
expect(source).toContain('`原尺寸 × ${rule.lengthFactor}`')
expect(source).toContain('label="箱规尺寸" value="ADD"')
@@ -353,10 +354,13 @@ describe('UnifiedOrdersView contract', () => {
expect(source).toContain('calculatedMeasurementRow(row, measurementSectionModes.customer, true)')
expect(source).toContain('calculatedMeasurementRow(source, measurementSectionModes.outer)')
expect(source).toContain('calculatedMeasurementRow(row as unknown as Record<string, unknown>, measurementSectionModes.actual)')
expect(source).toContain("return Number(hasOuterOverride && override != null && override !== '' ? override : value)")
expect(source).toContain('rawDimensions.map((value) => value + rule.edgeAdditionCm)')
expect(source).toContain('matchedSpecificationCoefficient(chargeRule, calculationSource)')
expect(source).toContain('listCustomerChargeRules(customerId, tenantId)')
expect(source).toContain('matchedDimensions.map((value) => roundedUp(value * specificationCoefficient, 3))')
expect(source).toContain("const selectedMode: 'ADD' | 'MULTIPLY' = measurementSectionModes.outer === 'MULTIPLY'")
expect(source).toContain('? selectedMode')
expect(source).not.toContain('[chargeRule.lengthFactor, chargeRule.widthFactor, chargeRule.heightFactor]')
expect(source).not.toContain('column.key === \'coefficientMode\'')
expect(source).not.toContain('@change="updateMeasurementCalculationMode(null, $event)"')
@@ -277,15 +277,16 @@ function sortedDimensions(row: Record<string, unknown>) {
function matchingDimensionRule(row: Record<string, unknown>): CustomerDimensionRule | null {
const measured = sortedDimensions(row)
if (!measured) return null
return [...(measurementDimensionConfig.value?.rules || [])]
const rules = [...(measurementDimensionConfig.value?.rules || [])]
.sort((left, right) => (
left.innerLengthCm * left.innerWidthCm * left.innerHeightCm
- right.innerLengthCm * right.innerWidthCm * right.innerHeightCm
))
.find((rule) => {
if (!rules.length) return null
return rules.find((rule) => {
const inner = [rule.innerLengthCm, rule.innerWidthCm, rule.innerHeightCm].sort((left, right) => right - left)
return measured.every((value, index) => value <= inner[index])
}) || null
}) || rules[rules.length - 1]
}
function addCoefficientLabel(row?: Record<string, unknown>) {
@@ -333,9 +334,20 @@ function calculatedMeasurementRow(
mode: MeasurementCalculationMode,
customerSource = false,
) {
const calculationSource = source
const outerOverrides = [source.outerLengthCm, source.outerWidthCm, source.outerHeightCm]
const hasOuterOverride = !customerSource && mode !== 'ACTUAL'
&& outerOverrides.some((value) => value != null && value !== '')
const rawDimensions = [source.lengthCm, source.widthCm, source.heightCm].map((value, index) => {
const override = outerOverrides[index]
return Number(hasOuterOverride && override != null && override !== '' ? override : value)
})
const calculationSource = {
...source,
lengthCm: rawDimensions[0],
widthCm: rawDimensions[1],
heightCm: rawDimensions[2],
}
const rule = matchingDimensionRule(calculationSource)
const rawDimensions = [Number(calculationSource.lengthCm), Number(calculationSource.widthCm), Number(calculationSource.heightCm)]
if (!rawDimensions.every((value) => Number.isFinite(value) && value > 0)) return { ...source }
const matchedDimensions = mode === 'ADD' && rule
@@ -346,13 +358,7 @@ function calculatedMeasurementRow(
? matchedSpecificationCoefficient(chargeRule, calculationSource)
: 1
const strategyDimensions = matchedDimensions.map((value) => roundedUp(value * specificationCoefficient, 3))
const outerOverrides = [source.outerLengthCm, source.outerWidthCm, source.outerHeightCm]
const hasOuterOverride = !customerSource && mode !== 'ACTUAL'
&& outerOverrides.some((value) => value != null && value !== '')
const [lengthCm, widthCm, heightCm] = strategyDimensions.map((value, index) => {
const override = outerOverrides[index]
return hasOuterOverride && override != null && override !== '' ? Number(override) : value
})
const [lengthCm, widthCm, heightCm] = strategyDimensions
const packageCount = Number(source.packageCount)
const unitVolumeCbm = mode === 'ADD' && rule && !hasOuterOverride
? Math.round((lengthCm * widthCm * heightCm / 1_000_000) * 1000) / 1000
@@ -886,6 +892,12 @@ async function saveWarehouseOuterDimensions(row: Record<string, unknown>) {
ElMessage.warning('仓库修改外箱尺寸必须大于 0')
return
}
const selectedMode: 'ADD' | 'MULTIPLY' = measurementSectionModes.outer === 'MULTIPLY'
? 'MULTIPLY'
: 'ADD'
const selectedChargeRuleId = selectedMode === 'MULTIPLY'
? activeMeasurementChargeRule.value?.id || null
: null
measurementOuterSavingId.value = String(row.id)
try {
await saveInboundMeasurementDraft(String(summary.tenantId), String(summary.inboundId), {
@@ -909,8 +921,10 @@ async function saveWarehouseOuterDimensions(row: Record<string, unknown>) {
outerLengthCm: String(item.id) === String(row.id) ? dimensions[0] : item.outerLengthCm,
outerWidthCm: String(item.id) === String(row.id) ? dimensions[1] : item.outerWidthCm,
outerHeightCm: String(item.id) === String(row.id) ? dimensions[2] : item.outerHeightCm,
chargeRuleId: item.chargeRuleId,
coefficientMode: item.coefficientMode || 'ADD',
chargeRuleId: String(item.id) === String(row.id) ? selectedChargeRuleId : item.chargeRuleId,
coefficientMode: String(item.id) === String(row.id)
? selectedMode
: item.coefficientMode || 'ADD',
remark: item.remark,
})),
})