Commit 335fc7a125e99d2ebd74ce42ef3767aa1511d11c

Authored by 莫红玲
2 parents 896723fb 5b3bd588

Merge remote-tracking branch 'origin/bug_fix'

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 </>
... ...