diff --git a/admin/node_modules/.vue-global-types/vue_99_0.d.ts b/admin/node_modules/.vue-global-types/vue_99_0.d.ts index e00c616..f0fe46c 100644 --- a/admin/node_modules/.vue-global-types/vue_99_0.d.ts +++ b/admin/node_modules/.vue-global-types/vue_99_0.d.ts @@ -15,13 +15,13 @@ export {}; type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; type __VLS_SpreadMerge = Omit & B; type __VLS_WithComponent = - N1 extends keyof LocalComponents ? N1 extends N0 ? Pick : { [K in N0]: LocalComponents[N1] } : - N2 extends keyof LocalComponents ? N2 extends N0 ? Pick : { [K in N0]: LocalComponents[N2] } : - N3 extends keyof LocalComponents ? N3 extends N0 ? Pick : { [K in N0]: LocalComponents[N3] } : + N1 extends keyof LocalComponents ? { [K in N0]: LocalComponents[N1] } : + N2 extends keyof LocalComponents ? { [K in N0]: LocalComponents[N2] } : + N3 extends keyof LocalComponents ? { [K in N0]: LocalComponents[N3] } : Self extends object ? { [K in N0]: Self } : - N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } : - N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } : - N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } : + N1 extends keyof __VLS_GlobalComponents ? { [K in N0]: __VLS_GlobalComponents[N1] } : + N2 extends keyof __VLS_GlobalComponents ? { [K in N0]: __VLS_GlobalComponents[N2] } : + N3 extends keyof __VLS_GlobalComponents ? { [K in N0]: __VLS_GlobalComponents[N3] } : {}; type __VLS_FunctionalComponentCtx = __VLS_PickNotAny<'__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? NonNullable : never : any @@ -83,6 +83,10 @@ export {}; } > >; + type __VLS_EmitsToProps = __VLS_PrettifyGlobal<{ + [K in string & keyof T as `on${Capitalize}`]?: + (...args: T[K] extends (...args: infer P) => any ? P : T[K] extends null ? any[] : never) => any; + }>; type __VLS_ResolveEmits< Comp, Emits, @@ -90,10 +94,16 @@ export {}; NormalizedEmits = __VLS_NormalizeEmits extends infer E ? string extends keyof E ? {} : E : never, > = __VLS_SpreadMerge; type __VLS_ResolveDirectives = { - [K in Exclude & string as `v${Capitalize}`]: T[K]; + [K in keyof T & string as `v${Capitalize}`]: T[K]; }; type __VLS_PrettifyGlobal = { [K in keyof T as K]: T[K]; } & {}; + type __VLS_WithDefaultsGlobal = { + [K in keyof P as K extends keyof D ? K : never]-?: P[K]; + } & { + [K in keyof P as K extends keyof D ? never : K]: P[K]; + }; type __VLS_UseTemplateRef = Readonly>; + type __VLS_ProxyRefs = import('vue').ShallowUnwrapRef; function __VLS_getVForSourceType>(source: T): [ item: T extends number ? number @@ -115,7 +125,6 @@ export {}; : T extends (...args: any) => any ? T : (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void; - function __VLS_makeOptional(t: T): { [K in keyof T]?: T[K] }; function __VLS_asFunctionalComponent any ? InstanceType : unknown>(t: T, instance?: K): T extends new (...args: any) => any ? __VLS_FunctionalComponent : T extends () => any ? (props: {}, ctx?: any) => ReturnType diff --git a/admin/src/views/consult/ConsultList.vue b/admin/src/views/consult/ConsultList.vue index ab3ce5d..a7bac88 100644 --- a/admin/src/views/consult/ConsultList.vue +++ b/admin/src/views/consult/ConsultList.vue @@ -64,7 +64,13 @@ async function fetch(){ } function reset(){ q.status='open'; q.kw=''; fetch() } function openReply(row: any){ visible.value = true; current.value = row; reply.value='' } -async function sendReply(){ await post(`/api/admin/consults/${current.value.id}/reply`, { content: reply.value }); visible.value=false; await fetch() } +async function sendReply(){ + const data = await post(`/api/admin/consults/${current.value.id}/reply`, { content: reply.value }) + visible.value=false + // 若后端返回状态,立即更新当前行展示 + if (current.value && data && data.status) current.value.status = data.status + await fetch() +} async function resolve(row: any){ await put(`/api/admin/consults/${row.id}/resolve`, {}); row.status = 'resolved' } function viewReply(row: any){ ElMessageBox.alert(row.replyContent || '无', '已回复内容', { confirmButtonText: '知道了' }) } diff --git a/admin/src/views/parts/Submissions.vue b/admin/src/views/parts/Submissions.vue index 9f762e6..c3c5ae9 100644 --- a/admin/src/views/parts/Submissions.vue +++ b/admin/src/views/parts/Submissions.vue @@ -28,7 +28,19 @@
- + + + + @@ -66,36 +78,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
@@ -142,6 +126,8 @@ const loading = ref(false) const exporting = ref(false) const detail = reactive({ visible: false, id: 0, data: null as any, images: [] as string[], parameterText: '', template: null as any }) +const expand = reactive }>>({}) +const expanded = ref([]) const paramRows = ref([]) const jsonPlaceholder = '{"key":"value"}' const saving = ref(false) @@ -179,6 +165,9 @@ async function fetchList(){ const res = await get('/api/admin/parts/submissions', params) rows.value = Array.isArray(res?.list) ? res.list : [] total.value = Number(res?.total || rows.value.length) + // 默认展开全部并预加载参数 + expanded.value = rows.value.map((r:any)=>Number(r.id)).filter((x:number)=>!!x) + for (const r of rows.value) { await ensureExpand(r) } } catch (e:any) { ElMessage.error(e.message || '加载失败') } finally { @@ -194,6 +183,33 @@ function reset(){ } function onPage(p:number){ query.page = p; fetchList() } +async function ensureExpand(row:any){ + const id = Number(row?.id) + if (!id) return + if (expand[id] && !expand[id].loading && (expand[id].rows||[]).length) return + expand[id] = { loading: true, templateName: '', rows: [] } + try { + const data = await get(`/api/admin/parts/submissions/${id}`) + const params = data?.parameters || {} + if (data?.templateId) { + try { + const t = await get(`/api/admin/part-templates/${data.templateId}`) + expand[id].templateName = t?.name || '' + const defs = (t?.params||[]) + expand[id].rows = defs.map((p:any)=>({ label: p.fieldLabel + (p.unit?` (${p.unit})`:''), value: params[p.fieldKey] ?? '' })) + } catch { + expand[id].rows = Object.keys(params).map(k=>({ label: k, value: params[k] })) + } + } else { + expand[id].rows = Object.keys(params).map(k=>({ label: k, value: params[k] })) + } + } finally { + if (expand[id]) expand[id].loading = false + } +} + +function onExpandChange(row:any){ ensureExpand(row) } + async function openDetail(id:number){ try { const data = await get(`/api/admin/parts/submissions/${id}`) @@ -319,4 +335,7 @@ onMounted(fetchList) .thumb-list { display:flex; flex-wrap:wrap; gap:12px; } .thumb { width: 120px; display:flex; flex-direction: column; gap: 8px; } .thumb .el-image { width: 120px; height: 120px; border-radius: 8px; } +.expand-wrap { padding: 8px 12px; background: rgba(255,255,255,0.02); } +.expand-line { margin-bottom: 6px; font-size: 13px; color: #ddd; } +.expand-loading { padding: 8px 0; color:#999; } diff --git a/admin/src/views/parts/Templates.vue b/admin/src/views/parts/Templates.vue index c62768e..3de0346 100644 --- a/admin/src/views/parts/Templates.vue +++ b/admin/src/views/parts/Templates.vue @@ -36,7 +36,7 @@ - + @@ -60,20 +60,14 @@ - - - - + @@ -83,15 +77,25 @@ - - + + + + - - + + - - + + +