| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- import { AppUser, PageMeta } from './models';
- export type FormValue = string | number | boolean | null;
- export type FormValues = Record<string, FormValue>;
- export interface FormSubmissionContext {
- uid?: number;
- id?: string;
- user?: AppUser | null;
- loaded?: Record<string, unknown>;
- addon?: unknown;
- }
- export interface FormSubmission {
- action: string;
- payload: Record<string, unknown>;
- }
- const image = (url: FormValue, name = '') => ({ url: String(url ?? ''), name, desc: '', link: '' });
- const asObject = (value: unknown): Record<string, unknown> => value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
- const gallery = (value: FormValue): Array<{ url: string; name: string; desc: string; link: string }> => {
- const raw = String(value ?? '').trim();
- if (!raw) return [];
- try {
- const parsed = JSON.parse(raw) as Array<{ url?: string; name?: string; desc?: string; link?: string }>;
- if (Array.isArray(parsed)) return parsed.filter((item) => item?.url).map((item) => ({ url: String(item.url), name: item.name ?? '', desc: item.desc ?? '', link: item.link ?? '' }));
- } catch { /* A single uploaded path is also valid. */ }
- return [image(raw)];
- };
- export function buildFormSubmission(meta: PageMeta, values: FormValues, context: FormSubmissionContext): FormSubmission | null {
- const loaded = context.loaded ?? {};
- const recordId = context.id || String(loaded['ID'] ?? loaded['id'] ?? '') || undefined;
- const saveAction = resolveSaveAction(meta.saveAction, Boolean(recordId));
- if (!saveAction) return null;
- const uid = context.uid;
- const id = recordId;
- const user = context.user;
- let action = saveAction;
- let payload: Record<string, unknown> = { id, ...values, uid };
- switch (meta.path) {
- case 'components/bytedesk_kefu/rate':
- payload = {
- model: JSON.stringify({ UserID: uid, Title: '客服满意度评价', TContent: values['content'], Score: values['score'], Cateid: 22 }),
- };
- break;
- case 'components/bytedesk_kefu/leavemsg':
- payload = {
- model: JSON.stringify({ UserID: uid, Title: `客服留言 ${values['mobile'] ?? ''}`, TContent: values['content'], Cateid: 22 }),
- };
- break;
- case 'pages/shop/order_appeal': {
- const pubid = Number(values['type'] || 10);
- const orderId = loaded['id'] ?? loaded['ID'] ?? id;
- const pictures = gallery(values['images']);
- payload = {
- uid,
- pubid,
- model: JSON.stringify({
- PubTitle: `${user?.honeyName || user?.userName || '会员'}的${pubid === 10 ? '退货' : '换货'}申请`,
- OrderNo: loaded['OrderNo'] ?? '',
- Concat: values['concat'],
- PubContent: values['reason'],
- Pics: JSON.stringify(pictures),
- PubIsTrue: 1,
- PubContentid: orderId,
- }),
- };
- break;
- }
- case 'pages/shop/order_comment_add': {
- const addon = asObject(context.addon);
- const carts = Array.isArray(addon['cart']) ? addon['cart'] as Record<string, unknown>[] : [];
- const product = carts.find((item) => String(item['ProID']) === String(values['proId'])) ?? carts[0] ?? {};
- const pictures = gallery(values['images']);
- payload = {
- model: JSON.stringify({
- UserID: uid,
- Title: values['title'],
- Score: values['score'],
- MsgContent: values['content'],
- Imgs: pictures.map((item) => item.url).join('|'),
- IsAnonymous: values['anonymous'] ? 1 : 0,
- OrderID: loaded['id'] ?? loaded['ID'] ?? id,
- ProID: product['ProID'] ?? values['proId'],
- OrderDate: loaded['AddTime'] ?? '',
- }),
- };
- break;
- }
- case 'pages/member/settings':
- payload = { uid, mu: JSON.stringify({ ...user, ...values }), inviCode: values['inviCode'] ?? '' };
- break;
- case 'pages/member/wxauth_after':
- payload = { uid, login: values['passwd'], pay: values['paypwd'] };
- break;
- case 'pages/member/receaddr_add': {
- const [provinceName = '', cityName = '', countyName = ''] = String(values['Provinces'] ?? '').trim().split(/\s+/);
- payload = {
- uid,
- id,
- provinceName,
- cityName,
- countyName,
- userName: values['ReceivName'],
- telNumber: values['MobileNum'],
- detailInfo: values['Street'],
- postalCode: values['Zipcode'],
- };
- break;
- }
- case 'pages/member/invoice_add':
- payload = {
- uid,
- id,
- aud: values['InvType'] ?? 0,
- name: values['InvHead'],
- idnum: values['UserCode'],
- mobile: values['UserMobile'],
- email: values['UserEmail'],
- address: values['UserAddress'],
- bankname: values['UserBankName'],
- bankusr: values['UserBankAccount'],
- };
- break;
- case 'pages/member/acc_destory':
- payload = {
- pubid: 7,
- uid,
- model: JSON.stringify({
- PubTitle: `申请人:${user?.userName || ''}`,
- PubContent: `联系方式:${values['concat'] ?? ''}`,
- PubRemind: values['remark'],
- PubIsTrue: 1,
- }),
- };
- break;
- case 'pages/member/group_join':
- if (values['mode'] === 'invite') {
- payload = {
- uid,
- pubid: 9,
- model: JSON.stringify({ PubTitle: values['mobile'], PubContent: values['tips'], CallName: values['call'] }),
- };
- } else {
- const certificates = gallery(values['license']).map((item, index) => ({ ...item, name: `证书文件之${index + 1}` }));
- payload = {
- uid,
- pubid: 8,
- model: JSON.stringify({
- PubTitle: values['name'],
- PubContent: values['remark'],
- BankAccount: values['bankacc'],
- CertImgs: JSON.stringify(certificates),
- }),
- };
- }
- break;
- case 'pages/member/myshop_add': {
- const pictures = gallery(values['pics'] || String(loaded['pics'] ?? ''));
- const model: Record<string, unknown> = { ...loaded, ...values, ID: id || loaded['ID'] || 0, Nodeid: values['Nodeid'] };
- delete model['pics'];
- payload = { uid, id, model: JSON.stringify(model), addon: JSON.stringify({ pics: JSON.stringify(pictures) }) };
- break;
- }
- case 'pages/member/myshop_add_procon':
- action = id ? 'product_upd' : 'product_add';
- payload = { uid, id, model: JSON.stringify({ ID: id || 0, Procontent: values['Procontent'] }), addon: JSON.stringify({}) };
- break;
- case 'pages/member/feedback':
- payload = {
- model: JSON.stringify({ UserID: uid, Title: `【${values['requestType'] === 'leave' ? '休假申请' : '意见反馈'}】${String(values['name'] ?? '').trim()}`, TContent: values['content'], Cateid: 22 }),
- };
- break;
- case 'pages/member/passwd':
- case 'pages/member/passwd2':
- payload = {
- uid,
- vcode: values['vcode'],
- newPass: values[meta.path.endsWith('passwd2') ? 'paypwd' : 'passwd'],
- reNewPass: values[meta.path.endsWith('passwd2') ? 'paypwd2' : 'passwd2'],
- };
- break;
- case 'pages/member/rnauth':
- payload = {
- uid,
- realName: values['realName'],
- idCard: values['idCard'],
- idCardPics: JSON.stringify([image(values['front']), image(values['back']), image(values['handheld'])]),
- mobile: values['mobile'] ?? user?.mobile ?? '',
- address: values['address'] ?? '',
- };
- break;
- }
- return { action, payload };
- }
- function resolveSaveAction(action: string | undefined, hasId: boolean): string | undefined {
- if (!action || !hasId) return action;
- const updateMap: Record<string, string> = {
- receaddr_add: 'receaddr_upd',
- invoice_add: 'invoice_upd',
- user_rnauth_add: 'user_rnauth_upd',
- product_add: 'product_upd',
- };
- return updateMap[action] ?? action;
- }
|