form-payload.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import { AppUser, PageMeta } from './models';
  2. export type FormValue = string | number | boolean | null;
  3. export type FormValues = Record<string, FormValue>;
  4. export interface FormSubmissionContext {
  5. uid?: number;
  6. id?: string;
  7. user?: AppUser | null;
  8. loaded?: Record<string, unknown>;
  9. addon?: unknown;
  10. }
  11. export interface FormSubmission {
  12. action: string;
  13. payload: Record<string, unknown>;
  14. }
  15. const image = (url: FormValue, name = '') => ({ url: String(url ?? ''), name, desc: '', link: '' });
  16. const asObject = (value: unknown): Record<string, unknown> => value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
  17. const gallery = (value: FormValue): Array<{ url: string; name: string; desc: string; link: string }> => {
  18. const raw = String(value ?? '').trim();
  19. if (!raw) return [];
  20. try {
  21. const parsed = JSON.parse(raw) as Array<{ url?: string; name?: string; desc?: string; link?: string }>;
  22. 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 ?? '' }));
  23. } catch { /* A single uploaded path is also valid. */ }
  24. return [image(raw)];
  25. };
  26. export function buildFormSubmission(meta: PageMeta, values: FormValues, context: FormSubmissionContext): FormSubmission | null {
  27. const loaded = context.loaded ?? {};
  28. const recordId = context.id || String(loaded['ID'] ?? loaded['id'] ?? '') || undefined;
  29. const saveAction = resolveSaveAction(meta.saveAction, Boolean(recordId));
  30. if (!saveAction) return null;
  31. const uid = context.uid;
  32. const id = recordId;
  33. const user = context.user;
  34. let action = saveAction;
  35. let payload: Record<string, unknown> = { id, ...values, uid };
  36. switch (meta.path) {
  37. case 'components/bytedesk_kefu/rate':
  38. payload = {
  39. model: JSON.stringify({ UserID: uid, Title: '客服满意度评价', TContent: values['content'], Score: values['score'], Cateid: 22 }),
  40. };
  41. break;
  42. case 'components/bytedesk_kefu/leavemsg':
  43. payload = {
  44. model: JSON.stringify({ UserID: uid, Title: `客服留言 ${values['mobile'] ?? ''}`, TContent: values['content'], Cateid: 22 }),
  45. };
  46. break;
  47. case 'pages/shop/order_appeal': {
  48. const pubid = Number(values['type'] || 10);
  49. const orderId = loaded['id'] ?? loaded['ID'] ?? id;
  50. const pictures = gallery(values['images']);
  51. payload = {
  52. uid,
  53. pubid,
  54. model: JSON.stringify({
  55. PubTitle: `${user?.honeyName || user?.userName || '会员'}的${pubid === 10 ? '退货' : '换货'}申请`,
  56. OrderNo: loaded['OrderNo'] ?? '',
  57. Concat: values['concat'],
  58. PubContent: values['reason'],
  59. Pics: JSON.stringify(pictures),
  60. PubIsTrue: 1,
  61. PubContentid: orderId,
  62. }),
  63. };
  64. break;
  65. }
  66. case 'pages/shop/order_comment_add': {
  67. const addon = asObject(context.addon);
  68. const carts = Array.isArray(addon['cart']) ? addon['cart'] as Record<string, unknown>[] : [];
  69. const product = carts.find((item) => String(item['ProID']) === String(values['proId'])) ?? carts[0] ?? {};
  70. const pictures = gallery(values['images']);
  71. payload = {
  72. model: JSON.stringify({
  73. UserID: uid,
  74. Title: values['title'],
  75. Score: values['score'],
  76. MsgContent: values['content'],
  77. Imgs: pictures.map((item) => item.url).join('|'),
  78. IsAnonymous: values['anonymous'] ? 1 : 0,
  79. OrderID: loaded['id'] ?? loaded['ID'] ?? id,
  80. ProID: product['ProID'] ?? values['proId'],
  81. OrderDate: loaded['AddTime'] ?? '',
  82. }),
  83. };
  84. break;
  85. }
  86. case 'pages/member/settings':
  87. payload = { uid, mu: JSON.stringify({ ...user, ...values }), inviCode: values['inviCode'] ?? '' };
  88. break;
  89. case 'pages/member/wxauth_after':
  90. payload = { uid, login: values['passwd'], pay: values['paypwd'] };
  91. break;
  92. case 'pages/member/receaddr_add': {
  93. const [provinceName = '', cityName = '', countyName = ''] = String(values['Provinces'] ?? '').trim().split(/\s+/);
  94. payload = {
  95. uid,
  96. id,
  97. provinceName,
  98. cityName,
  99. countyName,
  100. userName: values['ReceivName'],
  101. telNumber: values['MobileNum'],
  102. detailInfo: values['Street'],
  103. postalCode: values['Zipcode'],
  104. };
  105. break;
  106. }
  107. case 'pages/member/invoice_add':
  108. payload = {
  109. uid,
  110. id,
  111. aud: values['InvType'] ?? 0,
  112. name: values['InvHead'],
  113. idnum: values['UserCode'],
  114. mobile: values['UserMobile'],
  115. email: values['UserEmail'],
  116. address: values['UserAddress'],
  117. bankname: values['UserBankName'],
  118. bankusr: values['UserBankAccount'],
  119. };
  120. break;
  121. case 'pages/member/acc_destory':
  122. payload = {
  123. pubid: 7,
  124. uid,
  125. model: JSON.stringify({
  126. PubTitle: `申请人:${user?.userName || ''}`,
  127. PubContent: `联系方式:${values['concat'] ?? ''}`,
  128. PubRemind: values['remark'],
  129. PubIsTrue: 1,
  130. }),
  131. };
  132. break;
  133. case 'pages/member/group_join':
  134. if (values['mode'] === 'invite') {
  135. payload = {
  136. uid,
  137. pubid: 9,
  138. model: JSON.stringify({ PubTitle: values['mobile'], PubContent: values['tips'], CallName: values['call'] }),
  139. };
  140. } else {
  141. const certificates = gallery(values['license']).map((item, index) => ({ ...item, name: `证书文件之${index + 1}` }));
  142. payload = {
  143. uid,
  144. pubid: 8,
  145. model: JSON.stringify({
  146. PubTitle: values['name'],
  147. PubContent: values['remark'],
  148. BankAccount: values['bankacc'],
  149. CertImgs: JSON.stringify(certificates),
  150. }),
  151. };
  152. }
  153. break;
  154. case 'pages/member/myshop_add': {
  155. const pictures = gallery(values['pics'] || String(loaded['pics'] ?? ''));
  156. const model: Record<string, unknown> = { ...loaded, ...values, ID: id || loaded['ID'] || 0, Nodeid: values['Nodeid'] };
  157. delete model['pics'];
  158. payload = { uid, id, model: JSON.stringify(model), addon: JSON.stringify({ pics: JSON.stringify(pictures) }) };
  159. break;
  160. }
  161. case 'pages/member/myshop_add_procon':
  162. action = id ? 'product_upd' : 'product_add';
  163. payload = { uid, id, model: JSON.stringify({ ID: id || 0, Procontent: values['Procontent'] }), addon: JSON.stringify({}) };
  164. break;
  165. case 'pages/member/feedback':
  166. payload = {
  167. model: JSON.stringify({ UserID: uid, Title: `【${values['requestType'] === 'leave' ? '休假申请' : '意见反馈'}】${String(values['name'] ?? '').trim()}`, TContent: values['content'], Cateid: 22 }),
  168. };
  169. break;
  170. case 'pages/member/passwd':
  171. case 'pages/member/passwd2':
  172. payload = {
  173. uid,
  174. vcode: values['vcode'],
  175. newPass: values[meta.path.endsWith('passwd2') ? 'paypwd' : 'passwd'],
  176. reNewPass: values[meta.path.endsWith('passwd2') ? 'paypwd2' : 'passwd2'],
  177. };
  178. break;
  179. case 'pages/member/rnauth':
  180. payload = {
  181. uid,
  182. realName: values['realName'],
  183. idCard: values['idCard'],
  184. idCardPics: JSON.stringify([image(values['front']), image(values['back']), image(values['handheld'])]),
  185. mobile: values['mobile'] ?? user?.mobile ?? '',
  186. address: values['address'] ?? '',
  187. };
  188. break;
  189. }
  190. return { action, payload };
  191. }
  192. function resolveSaveAction(action: string | undefined, hasId: boolean): string | undefined {
  193. if (!action || !hasId) return action;
  194. const updateMap: Record<string, string> = {
  195. receaddr_add: 'receaddr_upd',
  196. invoice_add: 'invoice_upd',
  197. user_rnauth_add: 'user_rnauth_upd',
  198. product_add: 'product_upd',
  199. };
  200. return updateMap[action] ?? action;
  201. }