feat(consignment): 寄售数量支持关闭修改,固定为 1

This commit is contained in:
2026-11-07 13:46:28 +08:00
parent 6e3eb9669b
commit 8758270591
6 changed files with 105 additions and 19 deletions
@@ -13,6 +13,7 @@ import {
normalizeConsignmentSpecValues,
normalizeConsignmentSpecs,
parseConsignmentSpecValues,
resolveConsignmentPublishQuantity,
resolveLegacyConsignmentColumns,
resolveWorkerConsignmentPrice,
type ConsignmentPricingConfig,
@@ -511,6 +512,17 @@ test('合并迁移 147 必须包含动态规格的 JSON、匹配 key、文本与
}
})
test('发布数量:关闭「允许修改寄售数量」时固定为 1,开启时按 1~1000 取整', () => {
assert.equal(resolveConsignmentPublishQuantity(false, 5), 1, '关闭时必须固定 1')
assert.equal(resolveConsignmentPublishQuantity(false, undefined), 1, '关闭时缺省 1')
assert.equal(resolveConsignmentPublishQuantity(false, 0), 1, '关闭时 0 也回落 1')
assert.equal(resolveConsignmentPublishQuantity(true, 3), 3, '开启时按填写值')
assert.equal(resolveConsignmentPublishQuantity(true, 0), 1, '非法值回落 1')
assert.equal(resolveConsignmentPublishQuantity(true, Number.NaN), 1, 'NaN 回落 1')
assert.equal(resolveConsignmentPublishQuantity(true, 1001), 1000, '上限 1000')
assert.equal(resolveConsignmentPublishQuantity(true, 1.6), 2, '四舍五入')
})
test('合并迁移 147 必须为苏尔南手枪写入已发布的五个单选字段配置', async () => {
const sql = await readFile(
new URL('../../db/migrations/147_consignment_platform.sql', import.meta.url),
@@ -678,6 +678,20 @@ function isNumericSpecField(field: ConsignmentSpecField): boolean {
return field.type === 'number' || field.key === 'diamondLevel' || field.key === 'brillianceCount'
}
/**
* 发布数量口径:分类关闭「允许修改寄售数量」时固定为 1;
* 否则按 1~1000 取整,非法值回落 1(防止旧客户端/直接调接口绕过前端禁用)。
*/
export function resolveConsignmentPublishQuantity(
allowQuantityEdit: boolean,
rawQuantity: unknown,
): number {
if (!allowQuantityEdit) return 1
const parsed = Number(rawQuantity)
if (!Number.isFinite(parsed) || parsed < 1) return 1
return Math.min(1000, Math.max(1, Math.round(parsed)))
}
/** 只取参与匹配的字段生成稳定 key(按字段 key 排序,避免字段顺序影响)。 */
export function buildConsignmentSpecKey(
specs: ConsignmentSpecField[],
@@ -47,6 +47,7 @@ import {
computeConsignmentPrice,
normalizeConsignmentIntakeValues,
normalizeConsignmentSpecValues,
resolveConsignmentPublishQuantity,
resolveLegacyConsignmentColumns,
resolveWorkerConsignmentPrice,
type ConsignmentSpecField,
@@ -314,7 +315,11 @@ export async function publishWorkerConsignment(workerId: number, payload: JsonOb
errorCode: 'consignment_profile_unavailable',
})
}
const quantity = Math.max(1, Math.min(1000, Math.round(Number(payload.quantity || 1))))
// 「允许修改寄售数量」关闭时固定 1 件:前端会禁用输入框,这里再兜一层防绕过。
const quantity = resolveConsignmentPublishQuantity(
profile?.config.fields.quantity !== false,
payload.quantity,
)
if (profile?.config.inventoryLimit.enabled) {
const activeQuantity = await countWorkerActiveConsignmentQuantity(workerId)
if (activeQuantity + quantity > profile.config.inventoryLimit.maxActiveQuantity) {