feat(order-service): 增加资料提交后自定义说明

This commit is contained in:
yml2213
2026-11-04 12:42:42 +08:00
parent 1a80521057
commit a276256d84
11 changed files with 60 additions and 3 deletions
@@ -0,0 +1,9 @@
-- 135_order_service_post_submit_text.sql
-- 客户提交资料后,页面底部展示的自定义说明。
ALTER TABLE order_service_profiles
ADD COLUMN IF NOT EXISTS post_submit_text TEXT NOT NULL
DEFAULT '资料提交后如需修改,请联系客服。';
COMMENT ON COLUMN order_service_profiles.post_submit_text IS
'客户资料页底部的提交后说明,支持多行文本';
@@ -15,6 +15,7 @@ export type OrderServiceProfileRow = {
material_confirmation_json: Record<string, unknown>
submit_text: string
success_text: string
post_submit_text: string
status: string
current_version_id: number | null
current_version_no: number | null
@@ -102,6 +103,7 @@ export async function upsertOrderServiceProfile(input: {
materialConfirmation: Record<string, unknown>
submitText: string
successText: string
postSubmitText: string
adminUserId: number | null
}): Promise<OrderServiceProfileRow> {
const result = await query<OrderServiceProfileRow>(
@@ -110,11 +112,11 @@ export async function upsertOrderServiceProfile(input: {
category_id, name, title, description,
guide_image_json, fields_json, screenshots_json, auto_publish_json,
material_confirmation_json,
submit_text, success_text, status, created_by_admin_user_id
submit_text, success_text, post_submit_text, status, created_by_admin_user_id
) VALUES (
$1, $2, $3, $4,
$5::jsonb, $6::jsonb, $7::jsonb, $8::jsonb, $9::jsonb,
$10, $11, 'draft', $12
$10, $11, $12, 'draft', $13
)
ON CONFLICT (category_id) DO UPDATE SET
name = EXCLUDED.name,
@@ -127,6 +129,7 @@ export async function upsertOrderServiceProfile(input: {
material_confirmation_json = EXCLUDED.material_confirmation_json,
submit_text = EXCLUDED.submit_text,
success_text = EXCLUDED.success_text,
post_submit_text = EXCLUDED.post_submit_text,
current_version_id = CASE
WHEN order_service_profiles.status = 'archived' THEN NULL
ELSE order_service_profiles.current_version_id
@@ -147,6 +150,7 @@ export async function upsertOrderServiceProfile(input: {
JSON.stringify(input.materialConfirmation),
input.submitText,
input.successText,
input.postSubmitText,
input.adminUserId,
],
)
@@ -86,6 +86,14 @@ test('订单服务游戏 ID:标准化为纯数字字符串校验', () => {
assert.equal(normalized.fields[0]?.validation, 'digits')
})
test('订单服务提交后说明:旧配置使用默认文案,新配置支持多行自定义', () => {
assert.equal(config().postSubmitText, '资料提交后如需修改,请联系客服。')
assert.equal(
config({ postSubmitText: '资料提交后不可修改。\n如填写错误,请联系客服。' }).postSubmitText,
'资料提交后不可修改。\n如填写错误,请联系客服。',
)
})
test('订单服务提交确认:旧配置默认展示不可修改与资料错误免责声明', () => {
const normalized = config()
assert.deepEqual(normalized.materialConfirmation, {
@@ -68,6 +68,7 @@ export type OrderServiceProfileConfig = {
materialConfirmation: OrderServiceMaterialConfirmation
submitText: string
successText: string
postSubmitText: string
}
export type OrderServiceProfileSnapshot = {
@@ -96,6 +97,8 @@ export const DEFAULT_ORDER_SERVICE_MATERIAL_CONFIRMATION: OrderServiceMaterialCo
cancelText: '返回检查',
}
export const DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT = '资料提交后如需修改,请联系客服。'
export async function listAdminOrderServiceProfiles() {
const [categories, profiles] = await Promise.all([
listAllWorkCategories(),
@@ -153,6 +156,7 @@ export async function saveAdminOrderServiceProfile(payload: JsonObject = {}) {
materialConfirmation,
submitText: text(payload.submitText, 30) || '提交资料',
successText: text(payload.successText, 80) || '资料已提交,请等待处理',
postSubmitText: text(payload.postSubmitText, 500) || DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
adminUserId,
})
return { profile: mapAdminProfile(saved) }
@@ -231,6 +235,7 @@ function mapAdminProfile(row: OrderServiceProfileRow) {
materialConfirmation: normalizeMaterialConfirmation(row.material_confirmation_json),
submitText: row.submit_text,
successText: row.success_text,
postSubmitText: buildProfileConfig(row).postSubmitText,
status: row.status,
currentVersionId: row.current_version_id,
currentVersionNo: row.current_version_no,
@@ -250,6 +255,7 @@ export function buildProfileConfig(row: {
material_confirmation_json: unknown
submit_text: string
success_text: string
post_submit_text: string
}): OrderServiceProfileConfig & { guideImage: Record<string, unknown> } {
return {
name: row.name,
@@ -262,6 +268,7 @@ export function buildProfileConfig(row: {
materialConfirmation: normalizeMaterialConfirmation(row.material_confirmation_json),
submitText: row.submit_text || '提交资料',
successText: row.success_text || '资料已提交,请等待处理',
postSubmitText: text(row.post_submit_text, 500) || DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
}
}
@@ -314,6 +321,7 @@ export function normalizeProfileConfig(value: JsonObject): OrderServiceProfileCo
materialConfirmation: normalizeMaterialConfirmation(value.materialConfirmation),
submitText: text(value.submitText, 30) || '提交资料',
successText: text(value.successText, 80) || '资料已提交,请等待处理',
postSubmitText: text(value.postSubmitText, 500) || DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
}
}
@@ -33,6 +33,7 @@ import {
} from './work-order-material-link-service.js'
import {
DEFAULT_ORDER_SERVICE_MATERIAL_CONFIRMATION,
DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
getOrderServiceProfileSnapshotByVersion,
normalizeProfileConfig,
type OrderServiceField,
@@ -74,6 +75,7 @@ export type OrderServicePublicItem = {
description: string
submitText: string
successText: string
postSubmitText: string
state: string
stateLabel: string
message: string
@@ -371,6 +373,7 @@ async function mapPublicOrderItem(order: WorkOrderRow): Promise<OrderServicePubl
description: profile?.description || '',
submitText: profile?.submitText || '提交资料',
successText: profile?.successText || '资料已提交,请等待处理',
postSubmitText: profile?.postSubmitText || DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
state: order.status,
stateLabel: resolveOrderServiceStatusLabel(order.status, state.statusLabel),
message: resolveOrderServiceStatusMessage({
@@ -446,6 +449,7 @@ async function resolveProfileConfig(
materialConfirmation: DEFAULT_ORDER_SERVICE_MATERIAL_CONFIRMATION,
submitText: '提交资料',
successText: '资料已提交,请等待处理',
postSubmitText: DEFAULT_ORDER_SERVICE_POST_SUBMIT_TEXT,
}
}
return null
@@ -72,6 +72,7 @@ type OrderServiceFormValues = {
description: string
submitText: string
successText: string
postSubmitText: string
screenshots: ScreenshotForm
autoPublish: AutoPublishForm
materialConfirmation: OrderServiceMaterialConfirmation
@@ -101,6 +102,8 @@ const DEFAULT_MATERIAL_CONFIRMATION: OrderServiceMaterialConfirmation = {
cancelText: '返回检查',
}
const DEFAULT_POST_SUBMIT_TEXT = '资料提交后如需修改,请联系客服。'
type FieldPreset = Omit<OrderServiceField, 'sortOrder'>
const FIELD_PRESETS: Record<string, FieldPreset> = {
@@ -280,6 +283,7 @@ export default function OrderServicePanel() {
description: nextProfile?.description || '',
submitText: nextProfile?.submitText || '提交资料',
successText: nextProfile?.successText || '资料已提交,请等待处理',
postSubmitText: nextProfile?.postSubmitText || DEFAULT_POST_SUBMIT_TEXT,
screenshots: nextProfile?.screenshots || DEFAULT_SCREENSHOTS,
autoPublish: nextProfile?.autoPublish || DEFAULT_AUTO_PUBLISH,
materialConfirmation: nextProfile?.materialConfirmation || DEFAULT_MATERIAL_CONFIRMATION,
@@ -393,6 +397,7 @@ export default function OrderServicePanel() {
materialConfirmation: values.materialConfirmation,
submitText: values.submitText,
successText: values.successText,
postSubmitText: values.postSubmitText,
})
message.success('草稿已保存;点击“发布新版本”后才会影响新工单')
await refresh()
@@ -651,6 +656,20 @@ export default function OrderServicePanel() {
<Input />
</Form.Item>
</Col>
<Col span={24}>
<Form.Item
label="提交后说明"
name="postSubmitText"
extra="显示在客户页底部,支持换行;适合填写资料修改、客服联系等说明。"
>
<Input.TextArea
autoSize={{ minRows: 2, maxRows: 5 }}
maxLength={500}
showCount
placeholder="资料提交后如需修改,请联系客服。"
/>
</Form.Item>
</Col>
</Row>
</div>
<div className="order-service-guide">
@@ -360,7 +360,7 @@ export default function OrderServicePage() {
)}
<Text type="secondary" className="collect-link-footnote">
资料提交后如需修改,请联系客服。
{pageConfig?.postSubmitText || '资料提交后如需修改,请联系客服。'}
</Text>
</Space>
) : null}
@@ -1153,6 +1153,7 @@ export type AdminOrderServiceProfile = {
materialConfirmation: OrderServiceMaterialConfirmation
submitText: string
successText: string
postSubmitText: string
status: 'draft' | 'published' | 'archived' | string
currentVersionNo: number | null
updatedAt: string
@@ -1200,6 +1201,7 @@ export function saveAdminOrderServiceProfile(payload: {
materialConfirmation: OrderServiceMaterialConfirmation
submitText?: string
successText?: string
postSubmitText?: string
}) {
return apiPost<{ profile: AdminOrderServiceProfile }>(
'/api/v1/admin/worker-platform/order-service/profiles',
+1
View File
@@ -593,6 +593,7 @@ export type OrderServiceItem = {
description: string
submitText: string
successText: string
postSubmitText: string
state: string
stateLabel: string
message: string
+1
View File
@@ -729,6 +729,7 @@
display: block;
text-align: center;
font-size: 12px;
white-space: pre-wrap;
}
@media (max-width: 720px) {
@@ -104,6 +104,7 @@ work_orders.service_profile_snapshot_json
- 提交资料确认弹窗,先逐项汇总用户填写的字段值和截图缩略图,再展示可配置的标题、正文、确认/取消按钮文字;旧配置默认提示资料提交后不可修改,并说明资料填写错误的免责规则。
- 图片截图规则,必填时最少 1 张。
- 提交后禁止再次修改。
- 客户页底部可配置多行“提交后说明”,旧配置默认显示资料修改需联系客服。
- 每 15 秒、页面重新可见或窗口重新聚焦时刷新状态。
客户状态文案: