Commit 335fc7a125e99d2ebd74ce42ef3767aa1511d11c
Merge remote-tracking branch 'origin/bug_fix'
Showing
1 changed file
with
88 additions
and
37 deletions
src/pages/coupon/CouponConfig/components/WareLimitType/VehicleLimit.tsx
1 | -import React, { useEffect, useState } from 'react'; | |
1 | +import React, { Children, useEffect, useMemo, useState } from 'react'; | |
2 | 2 | import { Button, Popconfirm, Card, Table, Modal, Form, Select, Space, message, Radio, Tag } from 'antd'; |
3 | 3 | import * as api from '../../api'; |
4 | +import { ExclamationCircleOutlined } from '@ant-design/icons'; | |
4 | 5 | import TextWithMore from '@/components/TextWithMore'; |
5 | 6 | import SelectorWithFull from '@/components/SelectorWithFull'; |
6 | 7 | interface Props { |
... | ... | @@ -26,7 +27,7 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
26 | 27 | //存储表格当前编辑项数据 |
27 | 28 | const [currentItem, setCurrentItem] = useState<any>({}); |
28 | 29 | //存储Modal中可选的车系 |
29 | - const [series, setSeries] = useState<any>([]); | |
30 | + const [seriesList, setSeriesList] = useState<any>([]); | |
30 | 31 | //存储接口返回的车型 |
31 | 32 | const [specList, setSpecList] = useState<any>([]); |
32 | 33 | //存储Modal选择的品牌和车系作为表格的数据源 |
... | ... | @@ -40,6 +41,12 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
40 | 41 | } |
41 | 42 | }, [value]); |
42 | 43 | |
44 | + const errTips = useMemo(() => { | |
45 | + if (value && value.length) { | |
46 | + return value.some((item) => item.spec && !item.spec.length && !item.authType); | |
47 | + } | |
48 | + }, [value]); | |
49 | + | |
43 | 50 | const [carList, setCarList] = useState<any[]>([]); |
44 | 51 | |
45 | 52 | useEffect(() => { |
... | ... | @@ -60,6 +67,25 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
60 | 67 | .validateFields() |
61 | 68 | .then((fileds) => { |
62 | 69 | const { brand, series, spec, type } = fileds; |
70 | + /**编辑车系 */ | |
71 | + if (!spec) { | |
72 | + const params = series.map((i) => { | |
73 | + const authType = Number(seriesList.filter((item: any) => item.value == i.value)[0].all); | |
74 | + return { | |
75 | + brandId: brand.value, | |
76 | + brandName: brand.label, | |
77 | + seriesId: i.value, | |
78 | + seriesName: i.label, | |
79 | + spec: [], | |
80 | + authType, | |
81 | + }; | |
82 | + }); | |
83 | + const newData = savaData.concat(params); | |
84 | + setSavadata([...newData]); | |
85 | + onChange && onChange(newData); | |
86 | + setVisible(false); | |
87 | + return; | |
88 | + } | |
63 | 89 | const _specs = |
64 | 90 | spec && |
65 | 91 | spec.map((item: Item) => ({ |
... | ... | @@ -69,13 +95,13 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
69 | 95 | const params = { |
70 | 96 | brandId: brand.value, |
71 | 97 | brandName: brand.label, |
72 | - seriesId: series.value, | |
73 | - seriesName: series.label, | |
98 | + seriesId: series[0].value, | |
99 | + seriesName: series[0].label, | |
74 | 100 | spec: _specs, |
75 | 101 | authType: type, |
76 | 102 | }; |
77 | 103 | // 编辑 |
78 | - if (savaData.some((i) => i.seriesId === series.value)) { | |
104 | + if (savaData.some((i) => i.seriesId === series[0].value)) { | |
79 | 105 | const tempData = savaData.map((item: any) => (item.seriesId === currentItem.seriesId ? params : item)); |
80 | 106 | setSavadata([...tempData]); |
81 | 107 | onChange && onChange(tempData); |
... | ... | @@ -101,7 +127,7 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
101 | 127 | form.setFieldsValue({ |
102 | 128 | ...record, |
103 | 129 | brand: { value: record.brandId, label: record.brandName }, |
104 | - series: { value: record.seriesId, label: record.seriesName }, | |
130 | + series: record.seriesId ? [{ value: record.seriesId, label: record.seriesName }] : undefined, | |
105 | 131 | spec: record.spec && record.spec.map((i) => ({ value: i.specId, label: i.specName })), |
106 | 132 | type: Number(!!record.authType), |
107 | 133 | }); |
... | ... | @@ -153,8 +179,10 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
153 | 179 | render={(_, record: any) => |
154 | 180 | record.spec && record.spec.length ? ( |
155 | 181 | <TextWithMore title="车型" dataIndex="specName" list={record.spec} /> |
156 | - ) : ( | |
182 | + ) : record.authType ? ( | |
157 | 183 | <Tag>全部车型</Tag> |
184 | + ) : ( | |
185 | + <Tag color="red">部分车型</Tag> | |
158 | 186 | ) |
159 | 187 | } |
160 | 188 | /> |
... | ... | @@ -177,6 +205,12 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
177 | 205 | /> |
178 | 206 | )} |
179 | 207 | </Table> |
208 | + {errTips ? ( | |
209 | + <> | |
210 | + <ExclamationCircleOutlined rev={undefined} color="#999" /> | |
211 | + <span style={{ color: 'red', paddingLeft: 5 }}>存在部分车型,请添加限制车型范围数据</span> | |
212 | + </> | |
213 | + ) : null} | |
180 | 214 | </Card> |
181 | 215 | |
182 | 216 | {/* 选择品牌和车系 */} |
... | ... | @@ -203,7 +237,7 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
203 | 237 | form.resetFields(['series']); |
204 | 238 | const selectedSeries = savaData.map((item: { seriesId: number }) => item.seriesId); |
205 | 239 | const tempData = carList?.filter((item) => item.value === v.value); |
206 | - setSeries(tempData.length ? tempData[0].children.filter((i: any) => !selectedSeries.includes(i.value)) : []); | |
240 | + setSeriesList(tempData.length ? tempData[0].children.filter((i: any) => !selectedSeries.includes(i.value)) : []); | |
207 | 241 | }} |
208 | 242 | > |
209 | 243 | {carList.map((item) => ( |
... | ... | @@ -214,11 +248,12 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
214 | 248 | </Select> |
215 | 249 | </Form.Item> |
216 | 250 | <Form.Item label="车系" name="series" rules={[{ required: true, message: '请选择车系' }]}> |
217 | - <Select | |
251 | + {/* <Select | |
218 | 252 | labelInValue |
219 | 253 | disabled={!!currentItem.brandId} |
220 | 254 | placeholder="请选择车系" |
221 | 255 | allowClear |
256 | + mode="multiple" | |
222 | 257 | onChange={(v) => { |
223 | 258 | form.resetFields(['spec']); |
224 | 259 | const tempData = series?.filter((item: { value: number }) => item.value === v.value); |
... | ... | @@ -228,39 +263,55 @@ export default function Index({ onChange, value, readonly, carSelectApi }: Props |
228 | 263 | setAuthType(tempData[0].all != null ? !!tempData[0].all : true); |
229 | 264 | }} |
230 | 265 | > |
231 | - {series.map((item: any) => ( | |
266 | + {seriesList.map((item: any) => ( | |
232 | 267 | <Option value={item.value} key={item.value}> |
233 | 268 | {item.label} |
234 | 269 | </Option> |
235 | 270 | ))} |
236 | - </Select> | |
237 | - </Form.Item> | |
238 | - <Form.Item label="车型范围" name="type" rules={[{ required: true, message: '请选择' }]}> | |
239 | - <Radio.Group disabled={readonly || !authType}> | |
240 | - <Radio value={1}>全部</Radio> | |
241 | - <Radio value={0}>部分</Radio> | |
242 | - </Radio.Group> | |
243 | - </Form.Item> | |
244 | - <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.type != currentValues.type}> | |
245 | - {({ getFieldValue }): any => { | |
246 | - const type = getFieldValue('type'); | |
247 | - if (!type) { | |
248 | - return ( | |
249 | - <Form.Item label="车型" name="spec" rules={[{ required: true, message: '请选择车型' }]}> | |
250 | - <SelectorWithFull | |
251 | - data={specList} | |
252 | - allowClear | |
253 | - labelInValue | |
254 | - multiple | |
255 | - showSearch | |
256 | - fieldKeyNames={{ keyName: 'value', valueName: 'value', labelName: 'label' }} | |
257 | - treeNodeFilterProp="label" | |
258 | - /> | |
259 | - </Form.Item> | |
260 | - ); | |
261 | - } | |
262 | - }} | |
271 | + </Select> */} | |
272 | + | |
273 | + <SelectorWithFull | |
274 | + data={seriesList && seriesList.map((item: any) => ({ ...item, children: undefined }))} | |
275 | + allowClear | |
276 | + labelInValue | |
277 | + multiple | |
278 | + showSearch | |
279 | + disabled={!!currentItem.brandId} | |
280 | + placeholder="请选择车系" | |
281 | + fieldKeyNames={{ keyName: 'value', valueName: 'value', labelName: 'label' }} | |
282 | + treeNodeFilterProp="label" | |
283 | + /> | |
263 | 284 | </Form.Item> |
285 | + {currentItem.brandId ? ( | |
286 | + <> | |
287 | + <Form.Item label="车型范围" name="type" rules={[{ required: true, message: '请选择' }]}> | |
288 | + <Radio.Group disabled={readonly || !authType}> | |
289 | + <Radio value={1}>全部</Radio> | |
290 | + <Radio value={0}>部分</Radio> | |
291 | + </Radio.Group> | |
292 | + </Form.Item> | |
293 | + <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.type != currentValues.type}> | |
294 | + {({ getFieldValue }): any => { | |
295 | + const type = getFieldValue('type'); | |
296 | + if (!type) { | |
297 | + return ( | |
298 | + <Form.Item label="车型" name="spec" rules={[{ required: true, message: '请选择车型' }]}> | |
299 | + <SelectorWithFull | |
300 | + data={specList} | |
301 | + allowClear | |
302 | + labelInValue | |
303 | + multiple | |
304 | + showSearch | |
305 | + fieldKeyNames={{ keyName: 'value', valueName: 'value', labelName: 'label' }} | |
306 | + treeNodeFilterProp="label" | |
307 | + /> | |
308 | + </Form.Item> | |
309 | + ); | |
310 | + } | |
311 | + }} | |
312 | + </Form.Item> | |
313 | + </> | |
314 | + ) : null} | |
264 | 315 | </Form> |
265 | 316 | </Modal> |
266 | 317 | </> | ... | ... |