修复更新资料未修改接单价格
This commit is contained in:
@@ -1473,16 +1473,6 @@ export async function submitAdminWorkOrderMaterial(
|
|||||||
errorCode: 'work_order_material_status_invalid',
|
errorCode: 'work_order_material_status_invalid',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
workOrder.sharing_enabled === true &&
|
|
||||||
Number(workOrder.active_share_quantity || 0) > 0 &&
|
|
||||||
payload.rewardAmount !== undefined
|
|
||||||
) {
|
|
||||||
throw createHttpError('拼单订单的份额奖励已锁定,不能在更新资料时修改价格', {
|
|
||||||
statusCode: 409,
|
|
||||||
errorCode: 'work_order_material_reward_sharing_invalid',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const fields = resolveRequirementFields(workOrder)
|
const fields = resolveRequirementFields(workOrder)
|
||||||
const submittedFields = normalizeSubmittedFields(payload.fields || payload.material || payload)
|
const submittedFields = normalizeSubmittedFields(payload.fields || payload.material || payload)
|
||||||
@@ -1491,12 +1481,13 @@ export async function submitAdminWorkOrderMaterial(
|
|||||||
)
|
)
|
||||||
const now = nowIso()
|
const now = nowIso()
|
||||||
const screenshots = normalizeUploadedFiles(payload.screenshots || payload.files)
|
const screenshots = normalizeUploadedFiles(payload.screenshots || payload.files)
|
||||||
const rewardAmount =
|
const hasActiveShares = Number(workOrder.active_share_quantity || 0) > 0
|
||||||
workOrder.sharing_enabled === true &&
|
const rewardAmount = resolveAdminMaterialRewardAmount({
|
||||||
Number(workOrder.active_share_quantity || 0) > 0 &&
|
currentRewardAmount: Number(workOrder.reward_amount || 0),
|
||||||
payload.rewardAmount !== undefined
|
requestedRewardAmount: payload.rewardAmount,
|
||||||
? normalizeAmountFen(payload.rewardAmount, workOrder.reward_amount)
|
sharingEnabled: workOrder.sharing_enabled === true,
|
||||||
: workOrder.reward_amount
|
activeShareQuantity: Number(workOrder.active_share_quantity || 0),
|
||||||
|
})
|
||||||
const material = {
|
const material = {
|
||||||
...safeParseJson(workOrder.material_json),
|
...safeParseJson(workOrder.material_json),
|
||||||
collect: {
|
collect: {
|
||||||
@@ -1507,7 +1498,6 @@ export async function submitAdminWorkOrderMaterial(
|
|||||||
source: 'admin',
|
source: 'admin',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
const hasActiveShares = Number(workOrder.active_share_quantity || 0) > 0
|
|
||||||
const nextStatus =
|
const nextStatus =
|
||||||
hasActiveShares || workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
|
hasActiveShares || workOrder.status === WORK_ORDER_STATUS.IN_PROGRESS
|
||||||
? workOrder.status
|
? workOrder.status
|
||||||
@@ -1530,7 +1520,12 @@ export async function submitAdminWorkOrderMaterial(
|
|||||||
: 'material_completed',
|
: 'material_completed',
|
||||||
fromStatus: workOrder.status,
|
fromStatus: workOrder.status,
|
||||||
toStatus: nextStatus,
|
toStatus: nextStatus,
|
||||||
payloadJson: JSON.stringify({ fields: submittedFields, complete, rewardAmount }),
|
payloadJson: JSON.stringify({
|
||||||
|
fields: submittedFields,
|
||||||
|
complete,
|
||||||
|
previousRewardAmount: Number(workOrder.reward_amount || 0),
|
||||||
|
rewardAmount,
|
||||||
|
}),
|
||||||
now,
|
now,
|
||||||
})
|
})
|
||||||
if (nextStatus !== WORK_ORDER_STATUS.PENDING_MATERIAL) {
|
if (nextStatus !== WORK_ORDER_STATUS.PENDING_MATERIAL) {
|
||||||
@@ -1543,6 +1538,23 @@ export async function submitAdminWorkOrderMaterial(
|
|||||||
return { order: mapWorkOrderAdmin(updated || workOrder), complete }
|
return { order: mapWorkOrderAdmin(updated || workOrder), complete }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 更新资料时仅普通接单可改价;已有参与者的拼单必须保留份额价格快照。 */
|
||||||
|
export function resolveAdminMaterialRewardAmount(input: {
|
||||||
|
currentRewardAmount: number
|
||||||
|
requestedRewardAmount: unknown
|
||||||
|
sharingEnabled: boolean
|
||||||
|
activeShareQuantity: number
|
||||||
|
}): number {
|
||||||
|
if (input.requestedRewardAmount === undefined) return input.currentRewardAmount
|
||||||
|
if (input.sharingEnabled && input.activeShareQuantity > 0) {
|
||||||
|
throw createHttpError('拼单订单的份额奖励已锁定,不能在更新资料时修改价格', {
|
||||||
|
statusCode: 409,
|
||||||
|
errorCode: 'work_order_material_reward_sharing_invalid',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return normalizeAmountFen(input.requestedRewardAmount, input.currentRewardAmount)
|
||||||
|
}
|
||||||
|
|
||||||
export async function createAdminMockWorkOrder(payload: JsonObject = {}) {
|
export async function createAdminMockWorkOrder(payload: JsonObject = {}) {
|
||||||
const defaults = await ensureWorkerPlatformDefaults()
|
const defaults = await ensureWorkerPlatformDefaults()
|
||||||
const now = nowIso()
|
const now = nowIso()
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import {
|
|||||||
mapWorkOrderAdmin,
|
mapWorkOrderAdmin,
|
||||||
maskWorkerLeaderboardDisplayName,
|
maskWorkerLeaderboardDisplayName,
|
||||||
resolveCollectSubmitTargetWorkOrder,
|
resolveCollectSubmitTargetWorkOrder,
|
||||||
|
resolveAdminMaterialRewardAmount,
|
||||||
resolveMatchingProductRuleDecision,
|
resolveMatchingProductRuleDecision,
|
||||||
resolveWorkerPermissions,
|
resolveWorkerPermissions,
|
||||||
resolveSkuNameQuantity,
|
resolveSkuNameQuantity,
|
||||||
@@ -741,6 +742,50 @@ test('拼单份额撤单只允许未验收份额并让母工单回到大厅状
|
|||||||
assert.equal(resolveWorkOrderShareCancellationStatus('open', 'cancelled'), null)
|
assert.equal(resolveWorkOrderShareCancellationStatus('open', 'cancelled'), null)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('后台更新资料时普通接单可以修改接单价格', () => {
|
||||||
|
assert.equal(
|
||||||
|
resolveAdminMaterialRewardAmount({
|
||||||
|
currentRewardAmount: 1280,
|
||||||
|
requestedRewardAmount: 15.5,
|
||||||
|
sharingEnabled: false,
|
||||||
|
activeShareQuantity: 0,
|
||||||
|
}),
|
||||||
|
1550,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('后台更新资料未提交价格时保留原接单价格', () => {
|
||||||
|
assert.equal(
|
||||||
|
resolveAdminMaterialRewardAmount({
|
||||||
|
currentRewardAmount: 1280,
|
||||||
|
requestedRewardAmount: undefined,
|
||||||
|
sharingEnabled: false,
|
||||||
|
activeShareQuantity: 0,
|
||||||
|
}),
|
||||||
|
1280,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('后台更新资料禁止修改已有参与者的拼单价格', () => {
|
||||||
|
assert.throws(
|
||||||
|
() =>
|
||||||
|
resolveAdminMaterialRewardAmount({
|
||||||
|
currentRewardAmount: 3840,
|
||||||
|
requestedRewardAmount: 15.5,
|
||||||
|
sharingEnabled: true,
|
||||||
|
activeShareQuantity: 3,
|
||||||
|
}),
|
||||||
|
(error: unknown) =>
|
||||||
|
Boolean(
|
||||||
|
error &&
|
||||||
|
typeof error === 'object' &&
|
||||||
|
(error as { statusCode?: number }).statusCode === 409 &&
|
||||||
|
(error as { errorCode?: string }).errorCode ===
|
||||||
|
'work_order_material_reward_sharing_invalid',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
test('resolveCollectSubmitTargetWorkOrder returns the only pending work order when no id is provided', () => {
|
test('resolveCollectSubmitTargetWorkOrder returns the only pending work order when no id is provided', () => {
|
||||||
const workOrder = buildWorkOrderRow()
|
const workOrder = buildWorkOrderRow()
|
||||||
const selected = resolveCollectSubmitTargetWorkOrder('ORDER-001', [workOrder], '')
|
const selected = resolveCollectSubmitTargetWorkOrder('ORDER-001', [workOrder], '')
|
||||||
|
|||||||
@@ -513,16 +513,26 @@ export default function WorkOrdersPanel() {
|
|||||||
|
|
||||||
async function submitMaterial(values: MaterialFormValues) {
|
async function submitMaterial(values: MaterialFormValues) {
|
||||||
if (!materialOrder) return
|
if (!materialOrder) return
|
||||||
|
const requestedRewardAmount =
|
||||||
|
materialOrder.status === 'in_progress' && !materialOrder.sharing?.enabled
|
||||||
|
? Number(values.rewardAmount || 0)
|
||||||
|
: undefined
|
||||||
const succeeded = await runAction(
|
const succeeded = await runAction(
|
||||||
() =>
|
async () => {
|
||||||
submitAdminWorkOrderMaterial(
|
const response = await submitAdminWorkOrderMaterial(
|
||||||
materialOrder.workOrderId,
|
materialOrder.workOrderId,
|
||||||
values.fields || {},
|
values.fields || {},
|
||||||
materialScreenshots,
|
materialScreenshots,
|
||||||
materialOrder.status === 'in_progress' && !materialOrder.sharing?.enabled
|
requestedRewardAmount,
|
||||||
? Number(values.rewardAmount || 0)
|
)
|
||||||
: undefined,
|
if (
|
||||||
),
|
requestedRewardAmount !== undefined &&
|
||||||
|
Number(response.data.order.rewardAmount || 0) !== Math.round(requestedRewardAmount * 100)
|
||||||
|
) {
|
||||||
|
throw new Error('接单价格保存未生效,请刷新后重试')
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
},
|
||||||
materialOrder.status === 'in_progress' ? '订单资料已更新' : '订单资料已保存',
|
materialOrder.status === 'in_progress' ? '订单资料已更新' : '订单资料已保存',
|
||||||
)
|
)
|
||||||
if (!succeeded) return
|
if (!succeeded) return
|
||||||
|
|||||||
Reference in New Issue
Block a user