feat(order-service): 增加资料提交后自定义说明
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -593,6 +593,7 @@ export type OrderServiceItem = {
|
||||
description: string
|
||||
submitText: string
|
||||
successText: string
|
||||
postSubmitText: string
|
||||
state: string
|
||||
stateLabel: string
|
||||
message: string
|
||||
|
||||
@@ -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 秒、页面重新可见或窗口重新聚焦时刷新状态。
|
||||
|
||||
客户状态文案:
|
||||
|
||||
Reference in New Issue
Block a user