From a276256d84781e00f255370b02ee029fccf23e1e Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 4 Nov 2026 12:42:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(order-service):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=B5=84=E6=96=99=E6=8F=90=E4=BA=A4=E5=90=8E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../135_order_service_post_submit_text.sql | 9 +++++++++ .../order-service-profile-repo.ts | 8 ++++++-- .../order-service-profile-service.test.ts | 8 ++++++++ .../order-service-profile-service.ts | 8 ++++++++ .../order-service-public-service.ts | 4 ++++ .../pages/admin/panels/OrderServicePanel.tsx | 19 +++++++++++++++++++ .../src/pages/public/OrderServicePage.tsx | 2 +- .../src/services/admin/worker-platform.ts | 2 ++ apps/frontend/src/services/worker.ts | 1 + apps/frontend/src/styles/client.css | 1 + docs/订单服务收集与状态页设计-2026-11-03.md | 1 + 11 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 apps/backend/src/db/migrations/135_order_service_post_submit_text.sql diff --git a/apps/backend/src/db/migrations/135_order_service_post_submit_text.sql b/apps/backend/src/db/migrations/135_order_service_post_submit_text.sql new file mode 100644 index 00000000..254edfaf --- /dev/null +++ b/apps/backend/src/db/migrations/135_order_service_post_submit_text.sql @@ -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 + '客户资料页底部的提交后说明,支持多行文本'; diff --git a/apps/backend/src/repositories/worker-platform/order-service-profile-repo.ts b/apps/backend/src/repositories/worker-platform/order-service-profile-repo.ts index 60d437c7..4b075bd7 100644 --- a/apps/backend/src/repositories/worker-platform/order-service-profile-repo.ts +++ b/apps/backend/src/repositories/worker-platform/order-service-profile-repo.ts @@ -15,6 +15,7 @@ export type OrderServiceProfileRow = { material_confirmation_json: Record 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 submitText: string successText: string + postSubmitText: string adminUserId: number | null }): Promise { const result = await query( @@ -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, ], ) diff --git a/apps/backend/src/services/worker-platform/order-service-profile-service.test.ts b/apps/backend/src/services/worker-platform/order-service-profile-service.test.ts index 9486b0e6..57c06114 100644 --- a/apps/backend/src/services/worker-platform/order-service-profile-service.test.ts +++ b/apps/backend/src/services/worker-platform/order-service-profile-service.test.ts @@ -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, { diff --git a/apps/backend/src/services/worker-platform/order-service-profile-service.ts b/apps/backend/src/services/worker-platform/order-service-profile-service.ts index 949e239f..9dad4dcc 100644 --- a/apps/backend/src/services/worker-platform/order-service-profile-service.ts +++ b/apps/backend/src/services/worker-platform/order-service-profile-service.ts @@ -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 } { 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, } } diff --git a/apps/backend/src/services/worker-platform/order-service-public-service.ts b/apps/backend/src/services/worker-platform/order-service-public-service.ts index 605ac8c4..e226a381 100644 --- a/apps/backend/src/services/worker-platform/order-service-public-service.ts +++ b/apps/backend/src/services/worker-platform/order-service-public-service.ts @@ -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 const FIELD_PRESETS: Record = { @@ -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() { + + + + +
diff --git a/apps/frontend/src/pages/public/OrderServicePage.tsx b/apps/frontend/src/pages/public/OrderServicePage.tsx index 80eb650a..4ad6d940 100644 --- a/apps/frontend/src/pages/public/OrderServicePage.tsx +++ b/apps/frontend/src/pages/public/OrderServicePage.tsx @@ -360,7 +360,7 @@ export default function OrderServicePage() { )} - 资料提交后如需修改,请联系客服。 + {pageConfig?.postSubmitText || '资料提交后如需修改,请联系客服。'} ) : null} diff --git a/apps/frontend/src/services/admin/worker-platform.ts b/apps/frontend/src/services/admin/worker-platform.ts index 8ae30dd9..8e501fcb 100644 --- a/apps/frontend/src/services/admin/worker-platform.ts +++ b/apps/frontend/src/services/admin/worker-platform.ts @@ -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', diff --git a/apps/frontend/src/services/worker.ts b/apps/frontend/src/services/worker.ts index 0a761b95..47af10b0 100644 --- a/apps/frontend/src/services/worker.ts +++ b/apps/frontend/src/services/worker.ts @@ -593,6 +593,7 @@ export type OrderServiceItem = { description: string submitText: string successText: string + postSubmitText: string state: string stateLabel: string message: string diff --git a/apps/frontend/src/styles/client.css b/apps/frontend/src/styles/client.css index 016251fd..657e4c39 100644 --- a/apps/frontend/src/styles/client.css +++ b/apps/frontend/src/styles/client.css @@ -729,6 +729,7 @@ display: block; text-align: center; font-size: 12px; + white-space: pre-wrap; } @media (max-width: 720px) { diff --git a/docs/订单服务收集与状态页设计-2026-11-03.md b/docs/订单服务收集与状态页设计-2026-11-03.md index 156dc3c6..f4c4d389 100644 --- a/docs/订单服务收集与状态页设计-2026-11-03.md +++ b/docs/订单服务收集与状态页设计-2026-11-03.md @@ -104,6 +104,7 @@ work_orders.service_profile_snapshot_json - 提交资料确认弹窗,先逐项汇总用户填写的字段值和截图缩略图,再展示可配置的标题、正文、确认/取消按钮文字;旧配置默认提示资料提交后不可修改,并说明资料填写错误的免责规则。 - 图片截图规则,必填时最少 1 张。 - 提交后禁止再次修改。 +- 客户页底部可配置多行“提交后说明”,旧配置默认显示资料修改需联系客服。 - 每 15 秒、页面重新可见或窗口重新聚焦时刷新状态。 客户状态文案: