import type { FieldDataType, FormValuesType, SubmitValueType, ContentListType, BasicRadioValueType, BasicCheckboxValueType, BasicSelectValueType, BasicMultSelectValueType, BasicRateValueType, ExpressLogisticsSelectVaueType, BuyerNickInputValueType, BasicDateTimeValueType, BasicCascaderValueType, BasicPictureValueType, AliPayInputValueType, BasicFileValueType, BasicAddressValueType, ReceiverAddressInputValueType, BasicIdentifyAddressFieldValueType, EnterPrisePaymentValueType, IEnterPrisePaymentProps, StatusSelectValueType, ActualPaymentValueType, ActualReceiptPaymentValueType, ItemSelectValueType } from '@/types' import { findLabelBySelectValue, STATUS_MAP } from '@/utils' const getEnterPrisePaymentValue = ( value: EnterPrisePaymentValueType, fieldData: IEnterPrisePaymentProps ) => { let isEmpty = true const res: { uniqueKey: string; content: string; name: string }[] = [] const keyJson = { refundFee: 'enterprisePaymentRefundFee', tid: 'enterprisePaymentTid', buyerNick: 'enterprisePaymentBuyerNick', buyerOpenUid: 'enterprisePaymentBuyerOpenUid', name: 'enterprisePaymentAlipayNick', user: 'enterprisePaymentAlipayNo', status: 'enterprisePaymentStatus' } Object.entries(value).forEach(([key, val]) => { const subFieldKey = key as keyof EnterPrisePaymentValueType // PS: 提交的时候没有打款时间 if (subFieldKey === 'time') return if (val) isEmpty = false res.push({ content: val, uniqueKey: `${fieldData.uniqueKey}_${keyJson[subFieldKey]}`, name: fieldData.name }) }) return { buyer: value.buyerNick || value.buyerOpenUid ? { buyerNick: value.buyerNick, buyerOpenUid: value.buyerOpenUid } : {}, tid: value.tid, contentList: isEmpty ? [] : res } } export const submitDataTransform = ( fieldDataList: FieldDataType[], values: FormValuesType ) => { const workOrderComponents: SubmitValueType[] = [] let buyer: { buyerNick?: string; buyerOpenUid?: string } = {} let tid = '' console.group('******** submit transofrm start ********') fieldDataList.forEach(fieldData => { // 如果值不存在,直接跳过,比如,被显隐规则隐藏的组件,值就是undefined if (typeof values[fieldData.uniqueKey] === 'undefined') return // 将部分组件里的值,提到外面提交 if (fieldData.workOrderComponentType === 'TRADE_ID_INPUT') { tid = values[fieldData.uniqueKey] as string } else if (fieldData.workOrderComponentType === 'BUYER_NICK_INPUT') { const buyerNickValue = values[ fieldData.uniqueKey ] as BuyerNickInputValueType if (buyerNickValue.buyerNick || buyerNickValue.buyerOpenUid) { buyer = { buyerNick: buyerNickValue.buyerNick, buyerOpenUid: buyerNickValue.buyerOpenUid } } } // 不需要提交到后端的直接跳过, 例如动态插入的组件 if (fieldData.componentConfig.submitDisabled) { return } let contentList: ContentListType[] = [] const lowerCaseType = fieldData.workOrderComponentType.toLowerCase() let _value switch (fieldData.workOrderComponentType) { case 'INPUT': case 'TEXTAREA': contentList = values[fieldData.uniqueKey] ? [ { uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}`, content: values[fieldData.uniqueKey] as string, name: fieldData.name } ] : [] break case 'RADIO': contentList = ((values[fieldData.uniqueKey] as BasicRadioValueType) .value as string) ? [ { content: (values[fieldData.uniqueKey] as BasicRadioValueType) .value as string, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}` }, { content: ((values[fieldData.uniqueKey] as BasicRadioValueType) .value as string) === '其他' ? (values[fieldData.uniqueKey] as BasicRadioValueType).other : '', name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}Other` } ] : [] break case 'CHECKBOX': contentList = ( (values[fieldData.uniqueKey] as BasicCheckboxValueType) .value as string[] ).length ? [ { content: (values[fieldData.uniqueKey] as BasicCheckboxValueType) .value as string[], name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}` }, { content: ( (values[fieldData.uniqueKey] as BasicRadioValueType) .value as unknown as string[] ).includes('其他') ? (values[fieldData.uniqueKey] as BasicCheckboxValueType) .other : '', name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}Other` } ] : [] break case 'SELECT': contentList = values[fieldData.uniqueKey] ? [ { uniqueKey: `${fieldData.uniqueKey}_${lowerCaseType}`, content: values[ fieldData.uniqueKey ] as BasicSelectValueType, name: fieldData.name } ] : [] break case 'BASIC_MULT_SELECT': contentList = ( values[fieldData.uniqueKey] as BasicMultSelectValueType ).length ? [ { uniqueKey: `${fieldData.uniqueKey}_basicMultSelect`, content: values[ fieldData.uniqueKey ] as BasicMultSelectValueType, name: fieldData.name } ] : [] break case 'EXPRESS_LOGISTICS_SELECT': contentList = (values[fieldData.uniqueKey] as ExpressLogisticsSelectVaueType) .company || (values[fieldData.uniqueKey] as ExpressLogisticsSelectVaueType).order ? [ { content: ( values[ fieldData.uniqueKey ] as ExpressLogisticsSelectVaueType ).company, uniqueKey: `${fieldData.uniqueKey}_expressLogisticsCompany`, name: fieldData.name }, { content: ( values[ fieldData.uniqueKey ] as ExpressLogisticsSelectVaueType ).order, uniqueKey: `${fieldData.uniqueKey}_expressLogisticsCode`, name: fieldData.name } ] : [] break case 'BUYER_NICK_INPUT': _value = values[fieldData.uniqueKey] as BuyerNickInputValueType if (_value.buyerNick || _value.buyerOpenUid) { contentList = [ { content: _value.buyerNick, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_buyerNick` }, { content: _value.buyerOpenUid, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_buyerOpenUid` } ] } break case 'ALI_PAY_INPUT': _value = values[fieldData.uniqueKey] as AliPayInputValueType contentList = _value.user || _value.name ? [ { content: _value.name, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_alipayName` }, { content: _value.user, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_alipayAccount` } ] : [] break case 'RATE': contentList = (values[fieldData.uniqueKey] as BasicRateValueType).length ? [ { content: JSON.stringify( values[fieldData.uniqueKey] as BasicRateValueType ), uniqueKey: `${fieldData.uniqueKey}_rate`, name: fieldData.name } ] : [] break case 'BASIC_GRADE': contentList = values[fieldData.uniqueKey] || values[fieldData.uniqueKey] === 0 ? [ { content: (values[fieldData.uniqueKey] as number) * 1, uniqueKey: `${fieldData.uniqueKey}_basicGrade`, name: fieldData.name } ] : [] break case 'DATETIME': // eslint-disable-next-line no-case-declarations const tempValue = values[fieldData.uniqueKey] as BasicDateTimeValueType contentList = (Array.isArray(tempValue) && tempValue.length > 0 && tempValue.every(value => value)) || (!Array.isArray(tempValue) && tempValue) ? [ { content: tempValue, uniqueKey: `${fieldData.uniqueKey}_dateTime`, name: fieldData.name } ] : [] break case 'MULT_SELECT': // eslint-disable-next-line no-case-declarations const tempValues = values[fieldData.uniqueKey] as BasicCascaderValueType contentList = tempValues && tempValues.length ? [ { content: findLabelBySelectValue( tempValues, fieldData.componentConfig.options ), uniqueKey: `${fieldData.uniqueKey}_multSelect`, name: fieldData.name } ] : [] break case 'PICTURE': contentList = (values[fieldData.uniqueKey] as BasicPictureValueType) .length ? [ { content: ( values[fieldData.uniqueKey] as BasicPictureValueType ).join(','), uniqueKey: `${fieldData.uniqueKey}_picture`, name: fieldData.name } ] : [] break case 'FILE': contentList = (values[fieldData.uniqueKey] as BasicFileValueType).length ? [ { content: JSON.stringify( values[fieldData.uniqueKey] as BasicFileValueType ), uniqueKey: `${fieldData.uniqueKey}_file`, name: fieldData.name } ] : [] break case 'BASIC_ADDRESS': // eslint-disable-next-line no-case-declarations const types = ['basicProvince', 'basicCity', 'basicDistrict'] contentList = (values[fieldData.uniqueKey] as BasicAddressValueType) .length ? (values[fieldData.uniqueKey] as BasicAddressValueType).map( (value, index) => { return { content: value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${types[index]}` } } ) : [] break case 'RECEIVER_ADDRESS_INPUT': // eslint-disable-next-line no-case-declarations const typeLabels = ['province', 'city', 'district'] // eslint-disable-next-line no-case-declarations const receiverAddressValue = values[ fieldData.uniqueKey ] as ReceiverAddressInputValueType contentList = receiverAddressValue.detail || receiverAddressValue.address?.length ? [ ...receiverAddressValue.address.map((item, index) => { return { content: item, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_${typeLabels[index]}` } }), { content: receiverAddressValue.detail, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_address}` } ] : [] break case 'TRADE_ID_INPUT': _value = values[fieldData.uniqueKey] as string contentList = _value ? [ { content: _value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_tradeId` } ] : [] break case 'POSTING': { const addressLabels = ['province', 'city', 'district'] const identifyAddressValue = (values[ fieldData.uniqueKey ] as BasicIdentifyAddressFieldValueType) || {} const capitalizeFirstLetter = (word: string): string => { return word.replace(/^\w/, c => c.toUpperCase()) } contentList = Object.entries(identifyAddressValue).reduce< ContentListType[] >((acc, cur) => { const [key, value]: [string, string | BasicAddressValueType] = cur if (key === 'address') { acc.push( ...(value as BasicAddressValueType).map( (item: string | number, index: number) => { return { content: item, name: fieldData.name, uniqueKey: `${ fieldData.uniqueKey }_posting${capitalizeFirstLetter(addressLabels[index])}` } } ) ) return acc } acc.push({ content: value as string, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_posting${capitalizeFirstLetter( key )}` }) return acc }, []) } break case 'ENTERPRISE_PAYMENT': _value = getEnterPrisePaymentValue( values[fieldData.uniqueKey] as EnterPrisePaymentValueType, fieldData ) contentList = _value.contentList buyer = _value.buyer tid = _value.tid break case 'REISSUE_STATUS': case 'ADJUST_WORK_ORDER_STATUS': case 'CREATE_STATUS': case 'INVOICE_STATUS': case 'INVOICING_STATUS': case 'AGREE_REFUND_STATUS': case 'REJECT_REFUND_STATUS': _value = values[fieldData.uniqueKey] as StatusSelectValueType contentList = _value.status ? [ { uniqueKey: `${fieldData.uniqueKey}_${ STATUS_MAP[fieldData.workOrderComponentType].status }`, content: _value.status, name: fieldData.name }, { uniqueKey: `${fieldData.uniqueKey}_${ STATUS_MAP[fieldData.workOrderComponentType].reason }`, content: _value.reason, name: fieldData.name } ] : [] break case 'ACTUAL_PAYMENT': _value = values[fieldData.uniqueKey] as ActualPaymentValueType contentList = _value ? [ { content: _value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_actualPayment` } ] : [] break case 'ACTUAL_RECEIPT_PAYMENT': _value = values[fieldData.uniqueKey] as ActualReceiptPaymentValueType contentList = _value ? [ { content: _value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_actualReceiptPayment` } ] : [] break case 'ITEM_SELECT': case 'ITEM_ID': case 'ITEM_ENCODE': _value = values[fieldData.uniqueKey] as ItemSelectValueType[] contentList = _value.length ? [ { content: _value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_itemList` } ] : [] break case 'AFTER_SALES_ORDER_ID': _value = values[fieldData.uniqueKey] as string contentList = _value ? [ { content: _value, name: fieldData.name, uniqueKey: `${fieldData.uniqueKey}_afterSalesOrderId` } ] : [] break default: break } if (contentList.length) { workOrderComponents.push({ uniqueKey: fieldData.uniqueKey, workOrderComponentType: fieldData.workOrderComponentType, contentList }) } }) console.log('submitData: ', workOrderComponents) console.groupEnd() const res: { tid?: string workOrderComponents: SubmitValueType[] buyerNick?: string | undefined buyerOpenUid?: string | undefined } = buyer.buyerNick || buyer.buyerOpenUid ? { ...buyer, workOrderComponents } : { workOrderComponents } if (tid) res.tid = tid return res }