diff --git a/apps/admin-web/src/components/CityDistrictMultiSelect.tsx b/apps/admin-web/src/components/CityDistrictMultiSelect.tsx new file mode 100644 index 0000000..779671c --- /dev/null +++ b/apps/admin-web/src/components/CityDistrictMultiSelect.tsx @@ -0,0 +1,42 @@ +import { useMemo } from 'react'; +import { Select } from 'antd'; +import { getDistrictOptionsByCityCode } from '../lib/china-region'; + +type Props = { + cityCode?: string | null; + value?: string[]; + onChange?: (value: string[]) => void; + placeholder?: string; + disabled?: boolean; +}; + +/** 已选开城城市后,仅多选该市下区县(不再选省/市) */ +export default function CityDistrictMultiSelect({ + cityCode, + value, + onChange, + placeholder, + disabled, +}: Props) { + const options = useMemo(() => getDistrictOptionsByCityCode(cityCode), [cityCode]); + const ready = Boolean(cityCode) && options.length > 0; + + return ( + setEditScopeType(v)} /> {editScopeType === CityPartnerScopeType.DISTRICT && ( - - + + )} @@ -319,30 +343,35 @@ export default function CityPartnersPanel({ cityId, maxPartnerCommissionRate = 0 setCreateOpen(false)} onOk={async () => { - const v = await createForm.validateFields(); - const err = commissionSumError( - Number(v.orderCommissionRate ?? 0), - Number(v.redeemCommissionRate ?? 3), - maxPartnerCommissionRate, - ); - if (err) { - message.error(err); - return; + try { + const v = await createForm.validateFields(); + const err = commissionSumError( + Number(v.orderCommissionRate ?? 0), + Number(v.redeemCommissionRate ?? 3), + maxPartnerCommissionRate, + ); + if (err) { + message.error(err); + return; + } + await request('/admin/partners', { + method: 'POST', + body: JSON.stringify({ + ...v, + cityId, + orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, + redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, + districtCodes: createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, + }), + }); + message.success('已创建'); + setCreateOpen(false); + void loadPartners(); + onChanged?.(); + } catch (e) { + const msg = formatApiError(e); + if (msg) message.error(msg); } - await request('/admin/partners', { - method: 'POST', - body: JSON.stringify({ - ...v, - cityId, - orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, - redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, - districtCodes: createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, - }), - }); - message.success('已创建'); - setCreateOpen(false); - void loadPartners(); - onChanged?.(); }}>
@@ -353,8 +382,13 @@ export default function CityPartnersPanel({ cityId, maxPartnerCommissionRate = 0 setEditScopeType(v)} /> {editScopeType === CityPartnerScopeType.DISTRICT && ( - - + + )} @@ -505,29 +532,34 @@ export default function CityPartnersPage() { width={560} onCancel={() => setCreateOpen(false)} onOk={async () => { - const v = await createForm.validateFields(); - const err = commissionSumError( - Number(v.orderCommissionRate ?? 0), - Number(v.redeemCommissionRate ?? 3), - createMaxRate, - ); - if (err) { - message.error(err); - return; + try { + const v = await createForm.validateFields(); + const err = commissionSumError( + Number(v.orderCommissionRate ?? 0), + Number(v.redeemCommissionRate ?? 3), + createMaxRate, + ); + if (err) { + message.error(err); + return; + } + await request('/admin/partners', { + method: 'POST', + body: JSON.stringify({ + ...v, + orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, + redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, + districtCodes: + createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, + }), + }); + message.success('已创建'); + setCreateOpen(false); + void reload(); + } catch (e) { + const msg = formatApiError(e); + if (msg) message.error(msg); } - await request('/admin/partners', { - method: 'POST', - body: JSON.stringify({ - ...v, - orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, - redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, - districtCodes: - createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, - }), - }); - message.success('已创建'); - setCreateOpen(false); - void reload(); }} > @@ -555,8 +587,13 @@ export default function CityPartnersPage() { setEditScopeType(v)} /> {editScopeType === CityPartnerScopeType.DISTRICT && ( - - + + )} @@ -286,27 +307,36 @@ export default function PartnersPage() { width={560} onCancel={() => setCreateOpen(false)} onOk={async () => { - const v = await createForm.validateFields(); - await request('/admin/partners', { - method: 'POST', - body: JSON.stringify({ - ...v, - orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, - redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, - districtCodes: createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, - }), - }); - message.success('已创建'); - setCreateOpen(false); - createForm.resetFields(); - void reload(); + try { + const v = await createForm.validateFields(); + await request('/admin/partners', { + method: 'POST', + body: JSON.stringify({ + ...v, + orderCommissionRate: Number(v.orderCommissionRate ?? 0) / 100, + redeemCommissionRate: Number(v.redeemCommissionRate ?? 3) / 100, + districtCodes: createScopeType === CityPartnerScopeType.DISTRICT ? flattenDistrictCodes(v.districtCodes) : undefined, + }), + }); + message.success('已创建'); + setCreateOpen(false); + createForm.resetFields(); + void reload(); + } catch (e) { + const msg = formatApiError(e); + if (msg) message.error(msg); + } }} > @@ -317,8 +347,13 @@ export default function PartnersPage() {