import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is'; import { dateUtil } from '/@/utils/dateUtil'; import { unref } from 'vue'; import type { Ref, ComputedRef } from 'vue'; import type { FormProps, FormSchema } from '../types/form'; import { cloneDeep, set } from 'lodash-es'; interface UseFormValuesContext { defaultValueRef: Ref; getSchema: ComputedRef; getProps: ComputedRef; formModel: Recordable; } /** * @desription 解构array-link key. */ function tryDeconstructArray(key: string, value: any, target: Recordable) { const pattern = /^\[(.+)\]$/; if (pattern.test(key)) { const match = key.match(pattern); if (match && match[1]) { const keys = match[1].split(','); value = Array.isArray(value) ? value : [value]; keys.forEach((k, index) => { set(target, k.trim(), value[index]); }); return true; } } } /** * @desription 解构 object-link key. 此方法将改变目标. */ function tryDeconstructObject(key: string, value: any, target: Recordable) { const pattern = /^\{(.+)\}$/; if (pattern.test(key)) { const match = key.match(pattern); if (match && match[1]) { const keys = match[1].split(','); value = isObject(value) ? value : {}; keys.forEach((k) => { set(target, k.trim(), value[k.trim()]); }); return true; } } } export function useFormValues({ defaultValueRef, getSchema, formModel, getProps, }: UseFormValuesContext) { // 处理表单值 function handleFormValues(values: Recordable) { if (!isObject(values)) { return {}; } const res: Recordable = {}; for (const item of Object.entries(values)) { let [, value] = item; const [key] = item; if (!key || (isArray(value) && value.length === 0) || isFunction(value)) { continue; } const transformDateFunc = unref(getProps).transformDateFunc; if (isObject(value)) { value = transformDateFunc?.(value); } if (isArray(value) && value[0]?.format && value[1]?.format) { value = value.map((item) => transformDateFunc?.(item)); } // 删除空格 if (isString(value)) { value = value.trim(); } if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) { // 没有解构成功的,按原样赋值 set(res, key, value); } } return handleRangeTimeValue(res); } /** * @description: 处理时间间隔参数 */ function handleRangeTimeValue(values: Recordable) { const fieldMapToTime = unref(getProps).fieldMapToTime; if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) { return values; } for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) { if (!field || !startTimeKey || !endTimeKey) { continue; } if (!values[field]) { Reflect.deleteProperty(values, field); continue; } const [startTime, endTime]: string[] = values[field]; values[startTimeKey] = dateUtil(startTime).format(format); values[endTimeKey] = dateUtil(endTime).format(format); Reflect.deleteProperty(values, field); } return values; } function initDefault() { const schemas = unref(getSchema); const obj: Recordable = {}; schemas.forEach((item) => { const { defaultValue } = item; if (!isNullOrUnDef(defaultValue)) { obj[item.field] = defaultValue; if (formModel[item.field] === undefined) { formModel[item.field] = defaultValue; } } }); defaultValueRef.value = cloneDeep(obj); } return { handleFormValues, initDefault }; }