Commit 40fd6227 authored by XieZhiXiong's avatar XieZhiXiong

chore: 处理编辑地址逻辑

parent 40f76a60
...@@ -2,15 +2,17 @@ ...@@ -2,15 +2,17 @@
* @Author: XieZhiXiong * @Author: XieZhiXiong
* @Date: 2021-08-05 10:28:06 * @Date: 2021-08-05 10:28:06
* @LastEditors: XieZhiXiong * @LastEditors: XieZhiXiong
* @LastEditTime: 2021-08-06 14:54:48 * @LastEditTime: 2021-08-09 11:53:43
* @Description: 地址选择 FormItem * @Description: 地址选择 FormItem
*/ */
import React, { useState, useEffect, useMemo } from 'react'; import React, { useState, useEffect, useMemo, useRef } from 'react';
import { Select, Button, Drawer, Divider } from 'antd'; import { Select, Button, Drawer, Divider, message } from 'antd';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import { GetLogisticsShipperAddressGetResponse, GetLogisticsReceiverAddressGetResponse } from '@/services/LogisticsApi';
import { import {
createFormActions, createFormActions,
FormEffectHooks, FormEffectHooks,
FormPath,
} from '@formily/antd'; } from '@formily/antd';
import { IRequestSuccess } from '@/index'; import { IRequestSuccess } from '@/index';
import { useLinkEnumEffect } from '@/components/NiceForm/linkages/linkEnum'; import { useLinkEnumEffect } from '@/components/NiceForm/linkages/linkEnum';
...@@ -25,7 +27,6 @@ import styles from './index.less'; ...@@ -25,7 +27,6 @@ import styles from './index.less';
const formActions = createFormActions(); const formActions = createFormActions();
const { const {
onFormInit$, onFormInit$,
onFormMount$,
} = FormEffectHooks; } = FormEffectHooks;
interface IProps { interface IProps {
...@@ -111,6 +112,9 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -111,6 +112,9 @@ const AddressSelect: React.FC<IProps> = (props) => {
const [visibleDrawer, setVisibleDrawer] = useState(false); const [visibleDrawer, setVisibleDrawer] = useState(false);
const [submitLoading, setSubmitLoading] = useState(false); const [submitLoading, setSubmitLoading] = useState(false);
// 记录当前编辑的地址id
const editAddressId = useRef<number | null>(null);
const triggerChange = (value: AddressValueType) => { const triggerChange = (value: AddressValueType) => {
if (onChange) { if (onChange) {
onChange(value); onChange(value);
...@@ -172,6 +176,12 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -172,6 +176,12 @@ const AddressSelect: React.FC<IProps> = (props) => {
}; };
useEffect(() => { useEffect(() => {
if ('value' in props) {
setInternalValue(value);
}
}, [value]);
useEffect(() => {
getAddressList(); getAddressList();
}, []); }, []);
...@@ -180,7 +190,6 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -180,7 +190,6 @@ const AddressSelect: React.FC<IProps> = (props) => {
}; };
const handleSelectChange = (value: number) => { const handleSelectChange = (value: number) => {
console.log('value', value)
const current = list.find((item) => item.id === value); const current = list.find((item) => item.id === value);
if (!('value' in props)) { if (!('value' in props)) {
...@@ -196,17 +205,20 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -196,17 +205,20 @@ const AddressSelect: React.FC<IProps> = (props) => {
console.log('values', values) console.log('values', values)
let next = values.address; let next = values.address;
// 新增地址 const originData = formActions.getFieldState('provinceCode', (fieldState) => {
if (values.name) { return fieldState.originData;
const provinceName = formActions.getFieldState('provinceCode', ({ values }) => {
return values[1].title;
});
const cityName = formActions.getFieldState('cityCode', ({ values }) => {
return values[1].title;
});
const districtName = formActions.getFieldState('districtCode', ({ values }) => {
return values[1].title;
}); });
if (!originData) {
message.warn('未找到地区信息');
return;
}
const currentProvince = originData.find((item) => item.code === values.provinceCode);
const currentCity = currentProvince?.areaResponses?.find((item) => item.code === values.cityCode);
const currentDistrict = currentCity?.areaResponses?.find((item) => item.code === values.districtCode);
const provinceName = currentProvince?.name;
const cityName = currentCity?.name;
const districtName = currentDistrict?.name;
const { name, detailed, isDefault, ...rest } = values; const { name, detailed, isDefault, ...rest } = values;
const commonPayload = { const commonPayload = {
...rest, ...rest,
...@@ -217,6 +229,9 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -217,6 +229,9 @@ const AddressSelect: React.FC<IProps> = (props) => {
address: detailed, address: detailed,
isDefault: isDefault ? 1 : 0, isDefault: isDefault ? 1 : 0,
}; };
// 新增地址
if (values.name && !editAddressId.current) {
try { try {
setSubmitLoading(true); setSubmitLoading(true);
const addRes = addressType === 2 const addRes = addressType === 2
...@@ -245,6 +260,41 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -245,6 +260,41 @@ const AddressSelect: React.FC<IProps> = (props) => {
console.warn(error) console.warn(error)
} }
} }
// 编辑地址
if (values.name && editAddressId.current) {
try {
setSubmitLoading(true);
const addRes = addressType === 2
? await PublicApi.postLogisticsShipperAddressUpdate({
...commonPayload,
id: editAddressId.current,
shipperName: name,
})
: await PublicApi.postLogisticsReceiverAddressUpdate({
...commonPayload,
id: editAddressId.current,
receiverName: name,
});
if (addRes.code === 1000) {
next = {
fullAddress: `${provinceName}${cityName}${districtName}`,
id: editAddressId.current,
isDefault: values.isDefault ? 1 : 0,
name: values.name,
phone: values.tel,
};
// 重新获取列表,打新添加的内容加载出来
getAddressList();
editAddressId.current = null;
formActions.reset({ selector: 'ADDRESS_NEW.*' });
}
setSubmitLoading(false);
} catch (error) {
console.warn(error)
}
}
if (!('value' in props)) { if (!('value' in props)) {
setInternalValue(next); setInternalValue(next);
} }
...@@ -266,9 +316,33 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -266,9 +316,33 @@ const AddressSelect: React.FC<IProps> = (props) => {
} }
} }
const handleAddAddress = () => { const handleAddAddress = async () => {
formActions.reset({ selector: 'ADDRESS_NEW.*' });
formActions.setFieldState('ADDRESS_NEW', state => { formActions.setFieldState('ADDRESS_NEW', state => {
state.visible = !state.visible; state.visible = true;
});
// 先获取地区信息
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'props.x-props.hasFeedback', true);
FormPath.setIn(targetState, 'loading', true);
});
const areaRes = await PublicApi.getManageAreaAll();
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'loading', false);
});
if (areaRes.code !== 1000) {
message.warn('获取地区信息失败');
return;
}
const { data } = areaRes;
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'originData', data);
FormPath.setIn(targetState, 'props.enum', data.map(v => ({
label: v.name,
value: v.code,
})));
}); });
}; };
...@@ -281,6 +355,56 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -281,6 +355,56 @@ const AddressSelect: React.FC<IProps> = (props) => {
); );
}, []); }, []);
const handleEditAddress = async (id: number) => {
try {
// 先获取地区信息
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'props.x-props.hasFeedback', true);
FormPath.setIn(targetState, 'loading', true);
});
const areaRes = await PublicApi.getManageAreaAll();
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'loading', false);
});
if (areaRes.code !== 1000) {
message.warn('获取地区信息失败');
return;
}
const { data } = areaRes;
formActions.setFieldState('provinceCode', targetState => {
FormPath.setIn(targetState, 'originData', data);
FormPath.setIn(targetState, 'props.enum', data.map(v => ({
label: v.name,
value: v.code,
})));
});
const res = addressType === 2 ? await PublicApi.getLogisticsShipperAddressGet({ id: `${id}`}) : await PublicApi.getLogisticsReceiverAddressGet({ id: `${id}`});
if (res.code === 1000) {
formActions.setFieldValue('name', addressType === 2 ? (res.data as GetLogisticsShipperAddressGetResponse).shipperName : (res.data as GetLogisticsReceiverAddressGetResponse).receiverName);
formActions.setFieldValue('provinceCode', res.data.provinceCode);
formActions.setFieldValue('cityCode', res.data.cityCode);
formActions.setFieldValue('districtCode', res.data.districtCode);
formActions.setFieldValue('detailed', res.data.address);
formActions.setFieldValue('postalCode', res.data.postalCode);
formActions.setFieldValue('areaCode', res.data.areaCode);
formActions.setFieldValue('phone', res.data.phone);
formActions.setFieldValue('tel', res.data.tel);
formActions.setFieldValue('isDefault', res.data.isDefault);
formActions.setFieldState('ADDRESS_NEW', state => {
state.visible = true;
});
editAddressId.current = id;
} else {
message.warn('获取地址信息失败');
}
} catch (error) {
console.warn(error);
}
};
const options = useMemo(() => { const options = useMemo(() => {
return list.map((item) => ({ return list.map((item) => ({
value: item.id, value: item.id,
...@@ -341,10 +465,11 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -341,10 +465,11 @@ const AddressSelect: React.FC<IProps> = (props) => {
AddButton, AddButton,
}} }}
expressionScope={{ expressionScope={{
handleEditAddress,
...createRichTextUtils(), ...createRichTextUtils(),
}} }}
initialValues={{ initialValues={{
address: value, address: internalValue,
}} }}
fields={useFields()} fields={useFields()}
effects={($, { setFieldState }) => { effects={($, { setFieldState }) => {
...@@ -358,20 +483,6 @@ const AddressSelect: React.FC<IProps> = (props) => { ...@@ -358,20 +483,6 @@ const AddressSelect: React.FC<IProps> = (props) => {
}); });
}); });
onFormMount$().subscribe(async () => {
const areaRes = await PublicApi.getManageAreaAll();
if (areaRes.code === 1000) {
const { data } = areaRes;
formActions.setFieldState('provinceCode', targetState => {
targetState.originData = data;
targetState.props.enum = data.map(v => ({
label: v.name,
value: v.code,
}));
});
}
});
useLinkEnumEffect('areaResponses', result => useLinkEnumEffect('areaResponses', result =>
result.map(v => ({ result.map(v => ({
label: v.name, label: v.name,
......
...@@ -32,7 +32,9 @@ export const createSchema = (addressType = 2): ISchema => { ...@@ -32,7 +32,9 @@ export const createSchema = (addressType = 2): ISchema => {
address: { address: {
type: 'string', type: 'string',
'x-component': 'AddressRadioGroup', 'x-component': 'AddressRadioGroup',
'x-component-props': {}, 'x-component-props': {
onClickEdit: '{{ handleEditAddress }}',
},
'x-rules': [ 'x-rules': [
{ {
required: true, required: true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment