Commit ece7198ef2ce0545c84eadc8e764a399e30a725a
1 parent
96ee8bdc
feat(carinsur): 删除旧贷款期客户保险要求菜单
Showing
5 changed files
with
0 additions
and
504 deletions
src/pages/carinsur/LoanClientConfig/api.ts deleted
1 | -import { http } from '@/typing/http'; | |
2 | -import request from '@/utils/request'; | |
3 | -import { ANGEL_Host, FVM_HOST } from "@/utils/host"; | |
4 | -import * as IF from './interface'; | |
5 | - | |
6 | -/** | |
7 | - * 查询列表 | |
8 | - */ | |
9 | -export function getPageListApi(brandId?: IF.QueryParams): http.PromisePageResp<IF.Item> { | |
10 | - return request.get(`${ANGEL_Host}/loancusinsureqconfig/page`, { params: brandId }); | |
11 | -} | |
12 | -/**查询配置授权车型 */ | |
13 | -export function getSpecListApi(additionalId?: number): http.PromiseResp<IF.Option[]> { | |
14 | - return request.get(`${FVM_HOST}/erp/subsidy/additional/auth/spec/list`, { params: { additionalId } }); | |
15 | -} | |
16 | - | |
17 | -/** | |
18 | - * 保存 | |
19 | - */ | |
20 | -export function saveApi(params: IF.SaveParams): http.PromiseResp<void> { | |
21 | - return request.post(`${ANGEL_Host}/loancusinsureqconfig/save`, params); | |
22 | -} | |
23 | - | |
24 | -// 配置删除 | |
25 | -export function deleteApi(id: number): http.PromiseResp<null> { | |
26 | - return request.post(`${ANGEL_Host}/loancusinsureqconfig/delete`, {id}); | |
27 | -} |
src/pages/carinsur/LoanClientConfig/components/EditModal.tsx deleted
1 | -import React, { useState, useEffect } from "react"; | |
2 | -import { message, Modal, Select, Form, DatePicker, InputNumber, Spin, Space, Radio } from "antd"; | |
3 | -import { saveApi } from "../api"; | |
4 | -import moment from "moment"; | |
5 | -import { getSeriesApi } from "@/common/api"; | |
6 | -import * as IF from "../interface"; | |
7 | - | |
8 | -const RangePicker = DatePicker.RangePicker; | |
9 | -interface Props { | |
10 | - visible: boolean; | |
11 | - onCancel: Function; | |
12 | - item: IF.Item; | |
13 | - fetchList: () => any; | |
14 | - brandList: CommonApi.OptionVO[]; | |
15 | -} | |
16 | - | |
17 | -const formItemLayout = { | |
18 | - labelCol: { | |
19 | - xs: { span: 24 }, | |
20 | - sm: { span: 6 }, | |
21 | - md: { span: 6 }, | |
22 | - }, | |
23 | - wrapperCol: { | |
24 | - xs: { span: 24 }, | |
25 | - sm: { span: 15 }, | |
26 | - md: { span: 15 }, | |
27 | - }, | |
28 | -}; | |
29 | - | |
30 | -const Item = Form.Item; | |
31 | - | |
32 | -function SaveModal(props: Props) { | |
33 | - const { item, onCancel, fetchList, visible, brandList } = props; | |
34 | - const [loading, setLoading] = useState(false); | |
35 | - const [initLoading, setInitLoading] = useState(false); | |
36 | - const [form] = Form.useForm(); | |
37 | - const [seriesList, setSeriesList] = useState<CommonApi.OptionVO[]>([]); | |
38 | - // const [seriesId, setSeriesId] = useState<number>(); | |
39 | - // const [specData, setSpecData] = useState<IF.Option[]>([]); | |
40 | - | |
41 | - useEffect(() => { | |
42 | - if (visible && item.id) { | |
43 | - form.setFieldsValue({ | |
44 | - startDate: [item.startDate && moment(item.startDate), item.endDate && moment(item.endDate)], | |
45 | - brandId: { value: item.brandId, label: item.brandName, key: item.brandId }, | |
46 | - seriesId: item.series?.map((item) => ({ value: item.seriesId, label: item.seriesName, key: item.seriesId })), | |
47 | - subsidyType: item.subsidyType, | |
48 | - needBuyTci: item.needBuyTci, | |
49 | - needBuyVci: item.needBuyVci, | |
50 | - vciReqAmount: item.vciReqAmount && item.vciReqAmount, | |
51 | - }); | |
52 | - | |
53 | - item.brandId && getSeries(item.brandId); | |
54 | - // setInitLoading(true); | |
55 | - } else { | |
56 | - // setSpecData([]); | |
57 | - // setSeriesId(undefined); | |
58 | - setSeriesList([]); | |
59 | - } | |
60 | - }, [visible]); | |
61 | - | |
62 | - function getSeries(brandId: number) { | |
63 | - getSeriesApi(brandId) | |
64 | - .then((res) => { | |
65 | - setSeriesList(res.data || []); | |
66 | - }) | |
67 | - .catch((err) => { | |
68 | - message.error(err.message); | |
69 | - }); | |
70 | - } | |
71 | - | |
72 | - function submit() { | |
73 | - form.validateFields().then((fields) => { | |
74 | - // 车系 | |
75 | - const series = fields.seriesId.map((item:any) => ({ seriesId: item.key, seriesName: item.label })); | |
76 | - const params: IF.SaveParams = { | |
77 | - id: item && item.id, | |
78 | - ...fields, | |
79 | - brandId: fields.brandId.value, | |
80 | - brandName: fields.brandId.label, | |
81 | - series, | |
82 | - startDate: fields.startDate[0].valueOf(), | |
83 | - endDate: fields.startDate[1].valueOf(), | |
84 | - }; | |
85 | - setLoading(true); | |
86 | - saveApi(params) | |
87 | - .then(() => { | |
88 | - message.success("保存成功"); | |
89 | - fetchList(); | |
90 | - onCancel(); | |
91 | - setLoading(false); | |
92 | - }) | |
93 | - .catch((e) => { | |
94 | - setLoading(false); | |
95 | - message.error(e.message); | |
96 | - }); | |
97 | - }); | |
98 | - } | |
99 | - | |
100 | - return ( | |
101 | - <Modal title={item.id ? "编辑" : "新增"} width={700} visible={visible} maskClosable={false} afterClose={() => form.resetFields()} onCancel={() => onCancel()} onOk={() => form.submit()} confirmLoading={loading}> | |
102 | - <Spin spinning={initLoading}> | |
103 | - <Form form={form} {...formItemLayout} onFinish={submit}> | |
104 | - <Item label="有效期" name="startDate" rules={[{ required: true, message: "请选择生效时间" }]}> | |
105 | - <RangePicker disabledDate={(current) => !!current && current < moment().startOf("day")} style={{ width: "100%" }} format="YYYY-MM-DD" /> | |
106 | - </Item> | |
107 | - <Item label="适用品牌" name="brandId" rules={[{ required: true, message: "请选择品牌" }]}> | |
108 | - <Select | |
109 | - optionFilterProp="children" | |
110 | - placeholder="请选择品牌" | |
111 | - labelInValue | |
112 | - showSearch | |
113 | - onChange={(v: any) => { | |
114 | - getSeries(v.value); | |
115 | - form.setFieldsValue({ seriesId: undefined, specList: undefined }); | |
116 | - }} | |
117 | - > | |
118 | - {brandList.map((i) => ( | |
119 | - <Select.Option value={i.id} key={i.id}> | |
120 | - {i.name} | |
121 | - </Select.Option> | |
122 | - ))} | |
123 | - </Select> | |
124 | - </Item> | |
125 | - | |
126 | - <Item label="适用车系" name="seriesId" rules={[{ required: true, message: "请选择车系" }]}> | |
127 | - <Select | |
128 | - mode="multiple" | |
129 | - optionFilterProp="children" | |
130 | - placeholder="请选择车系" | |
131 | - notFoundContent="暂无数据" | |
132 | - labelInValue | |
133 | - showSearch | |
134 | - onChange={(v: any) => { | |
135 | - // setSeriesId(v.value); | |
136 | - // form.setFieldsValue({ specList: undefined }); | |
137 | - }} | |
138 | - > | |
139 | - {seriesList.map((i) => ( | |
140 | - <Select.Option value={i.id} key={i.id}> | |
141 | - {i.name} | |
142 | - </Select.Option> | |
143 | - ))} | |
144 | - </Select> | |
145 | - </Item> | |
146 | - {/* 交强险 */} | |
147 | - <Item name="needBuyTci" label="要求购买交强险" rules={[{ required: true, message: "请选择是否要求购买交强险" }]}> | |
148 | - <Radio.Group | |
149 | - options={[ | |
150 | - { label: "是", value: true }, | |
151 | - { label: "否", value: false }, | |
152 | - ]} | |
153 | - /> | |
154 | - </Item> | |
155 | - {/* 商业险 */} | |
156 | - <Item name="needBuyVci" label="要求购买商业险" rules={[{ required: true, message: "请选择是否要求购买交强险" }]}> | |
157 | - <Radio.Group | |
158 | - options={[ | |
159 | - { label: "是", value: true }, | |
160 | - { label: "否", value: false }, | |
161 | - ]} | |
162 | - /> | |
163 | - </Item> | |
164 | - | |
165 | - <Item noStyle shouldUpdate={(prevValues, curValues) => prevValues.needBuyVci !== curValues.needBuyVci}> | |
166 | - {({ getFieldValue }) => { | |
167 | - const type = getFieldValue("needBuyVci"); | |
168 | - return type ? ( | |
169 | - <Form.Item label="商业险要求金额(>=)"> | |
170 | - <Space> | |
171 | - <Item | |
172 | - name="vciReqAmount" | |
173 | - noStyle | |
174 | - rules={[ | |
175 | - { required: true, message: "请输入" }, | |
176 | - { pattern: /^(?!(0[0-9]{0,}$))[0-9]{1,}[.]{0,}[0-9]{0,}$/, message: "请输入正数" }, | |
177 | - ]} | |
178 | - > | |
179 | - <InputNumber style={{ width: "100%" }} placeholder="请输入" precision={2} /> | |
180 | - </Item> | |
181 | - <span>元</span> | |
182 | - </Space> | |
183 | - </Form.Item> | |
184 | - ) : null; | |
185 | - }} | |
186 | - </Item> | |
187 | - </Form> | |
188 | - </Spin> | |
189 | - </Modal> | |
190 | - ); | |
191 | -} | |
192 | - | |
193 | -export default SaveModal; |
src/pages/carinsur/LoanClientConfig/components/SpecModal.tsx deleted
1 | -import React, { useState, useEffect } from "react"; | |
2 | -import "@ant-design/compatible/assets/index.css"; | |
3 | -import { Modal, Button, Table } from "antd"; | |
4 | - | |
5 | -import * as IF from "../interface"; | |
6 | - | |
7 | -interface Props { | |
8 | - visible: boolean; | |
9 | - onCancel: () => any; | |
10 | - item: IF.Item; | |
11 | -} | |
12 | - | |
13 | -function SpecModal(props: Props) { | |
14 | - const { visible, onCancel, item } = props; | |
15 | - const [tableList, setTableList] = useState<IF.SeriesItem[]>([]); | |
16 | - useEffect(() => { | |
17 | - let list = []; | |
18 | - if (item.series) { | |
19 | - for (let i = 0; i < item.series.length; i++) { | |
20 | - let obj = { ...item.series[i] }; | |
21 | - obj.brandName = item.brandName; | |
22 | - list.push(obj); | |
23 | - } | |
24 | - setTableList([...tableList, ...list]); | |
25 | - } else { | |
26 | - setTableList([]); | |
27 | - } | |
28 | - }, [item.id]); | |
29 | - const columns = [ | |
30 | - { | |
31 | - title: "品牌", | |
32 | - dataIndex: "brandName", | |
33 | - }, | |
34 | - { | |
35 | - title: "适用车系", | |
36 | - dataIndex: "seriesName", | |
37 | - }, | |
38 | - ]; | |
39 | - | |
40 | - return ( | |
41 | - <Modal | |
42 | - title="车辆信息" | |
43 | - style={{ width: 400 }} | |
44 | - maskClosable={false} | |
45 | - visible={visible} | |
46 | - onCancel={() => onCancel()} | |
47 | - footer={ | |
48 | - <Button type="default" onClick={() => onCancel()}> | |
49 | - 取消 | |
50 | - </Button> | |
51 | - } | |
52 | - > | |
53 | - <Table columns={columns} dataSource={tableList} rowKey={record => record.seriesId} /> | |
54 | - </Modal> | |
55 | - ); | |
56 | -} | |
57 | - | |
58 | -export default React.memo(SpecModal); |
src/pages/carinsur/LoanClientConfig/index.tsx deleted
1 | -import React, { useState } from "react"; | |
2 | -import { PlusOutlined } from "@ant-design/icons"; | |
3 | -import { Button, Card, Divider, message, Popconfirm, Table, Select } from "antd"; | |
4 | -import { PageHeaderWrapper } from "@ant-design/pro-layout"; | |
5 | -import usePagination from "@/hooks/usePagination"; | |
6 | -import SaveModal from "./components/EditModal"; | |
7 | -import SpecModal from "./components/SpecModal"; | |
8 | -import { deleteApi, getPageListApi } from "./api"; | |
9 | -import * as IF from "./interface"; | |
10 | -import useInitial from "@/hooks/useInitail"; | |
11 | -import { getBrandFilterApi } from "@/common/api"; | |
12 | -import moment from "moment"; | |
13 | - | |
14 | -const Column = Table.Column; | |
15 | - | |
16 | -export default function StorageList() { | |
17 | - const { list, paginationConfig, loading, setLoading, setParams, innerParams } = usePagination<StorageMaintain.Item>(getPageListApi, {}); | |
18 | - const [specVisible, setSpecVisible] = useState(false); | |
19 | - const { data: brandList } = useInitial<CommonApi.OptionVO[], {}>(getBrandFilterApi, [], {}); | |
20 | - const [visible, setVisible] = useState(false); | |
21 | - const [item, setItem] = useState<IF.Item>({}); | |
22 | - | |
23 | - /**删除 */ | |
24 | - function handleDelete(item: IF.Item) { | |
25 | - item.id && | |
26 | - deleteApi(item.id) | |
27 | - .then((res) => { | |
28 | - setLoading(true); | |
29 | - message.success("操作成功"); | |
30 | - }) | |
31 | - .catch((e) => { | |
32 | - message.error(e.message); | |
33 | - }); | |
34 | - } | |
35 | - | |
36 | - return ( | |
37 | - <PageHeaderWrapper title="贷款客户保险要求配置"> | |
38 | - <Card> | |
39 | - <div style={{ display: "flex", flexDirection: "row", justifyContent: "space-between", marginBottom: 20 }}> | |
40 | - <div style={{ display: "flex", flexDirection: "row" }}> | |
41 | - <Select style={{ width: 250 }} placeholder="请选择品牌" value={innerParams.brandId} onChange={(v) => setParams({ ...innerParams, brandId: v }, true)} allowClear> | |
42 | - {brandList.map((item) => ( | |
43 | - <Select.Option value={item.id} key={item.id}> | |
44 | - {item.name} | |
45 | - </Select.Option> | |
46 | - ))} | |
47 | - </Select> | |
48 | - </div> | |
49 | - <Button | |
50 | - type="primary" | |
51 | - icon={<PlusOutlined />} | |
52 | - onClick={() => { | |
53 | - setVisible(true); | |
54 | - setItem({}); | |
55 | - }} | |
56 | - > | |
57 | - 新增 | |
58 | - </Button> | |
59 | - </div> | |
60 | - <Table size="small" loading={loading} pagination={paginationConfig} rowKey={(item) => String(item.id)} dataSource={list} onChange={(_pagination) => setParams({ ..._pagination }, true)}> | |
61 | - <Column title="品牌" width="10%" align="center" dataIndex="brandName" /> | |
62 | - <Column | |
63 | - title="适用车系" | |
64 | - width="10%" | |
65 | - align="center" | |
66 | - render={(text, record: IF.Item) => ( | |
67 | - <Button | |
68 | - type="link" | |
69 | - onClick={() => { | |
70 | - setSpecVisible(true); | |
71 | - setItem(record); | |
72 | - }} | |
73 | - > | |
74 | - 查看 | |
75 | - </Button> | |
76 | - )} | |
77 | - /> | |
78 | - <Column | |
79 | - title="有效期" | |
80 | - width="16%" | |
81 | - align="center" | |
82 | - render={(text, record: IF.Item) => <span>{`${(record.startDate && moment(record.startDate).format("YYYY-MM-DD")) || "——"}~${(record.endDate && moment(record.endDate).format("YYYY-MM-DD")) || "——"}`}</span>} | |
83 | - /> | |
84 | - <Column title="要求购买交强险" dataIndex="needBuyTci" width="10%" align="center" render={(text) => (text ? <span>是</span> : <span>否</span>)} /> | |
85 | - <Column title="要求购买商业险" dataIndex="needBuyVci" width="10%" align="center" render={(text) => (text ? <span>是</span> : <span>否</span>)} /> | |
86 | - <Column | |
87 | - title="商业险要求金额(>=)" | |
88 | - dataIndex="vciReqAmount" | |
89 | - width="10%" | |
90 | - align="center" | |
91 | - render={(text: number) => { | |
92 | - return text > 0? <span>{`${text || 0}元`}</span> :"--"; | |
93 | - }} | |
94 | - /> | |
95 | - | |
96 | - <Column | |
97 | - title="操作" | |
98 | - align="center" | |
99 | - width="15%" | |
100 | - render={(text, record: IF.Item) => ( | |
101 | - <> | |
102 | - <Button | |
103 | - type="link" | |
104 | - style={{ padding: 0 }} | |
105 | - onClick={() => { | |
106 | - setVisible(true); | |
107 | - setItem(record); | |
108 | - }} | |
109 | - > | |
110 | - 编辑 | |
111 | - </Button> | |
112 | - <Divider type="vertical" /> | |
113 | - <Popconfirm placement="top" title="确认删除?" onConfirm={() => handleDelete(record)}> | |
114 | - <Button type="link" style={{ padding: 0 }}> | |
115 | - 删除 | |
116 | - </Button> | |
117 | - </Popconfirm> | |
118 | - </> | |
119 | - )} | |
120 | - /> | |
121 | - </Table> | |
122 | - </Card> | |
123 | - <SaveModal | |
124 | - visible={visible} | |
125 | - brandList={brandList} | |
126 | - item={item} | |
127 | - fetchList={() => setLoading(true)} | |
128 | - onCancel={() => { | |
129 | - setVisible(false); | |
130 | - setItem({}); | |
131 | - }} | |
132 | - /> | |
133 | - {/* {specModal} */} | |
134 | - | |
135 | - <SpecModal | |
136 | - visible={specVisible} | |
137 | - item={item} | |
138 | - onCancel={() => { | |
139 | - setSpecVisible(false); | |
140 | - setItem({}); | |
141 | - }} | |
142 | - /> | |
143 | - </PageHeaderWrapper> | |
144 | - ); | |
145 | -} |
src/pages/carinsur/LoanClientConfig/interface.d.ts deleted
1 | -/** | |
2 | - * 查询参数 | |
3 | - */ | |
4 | -export interface QueryParams { | |
5 | - brandId?: number, | |
6 | - current?: number, | |
7 | - pageSize?: number, | |
8 | -} | |
9 | - | |
10 | -// export interface QueryParams { | |
11 | -// brandId?: number; | |
12 | -// } | |
13 | -/** | |
14 | - * 列表项 | |
15 | - */ | |
16 | -export interface Item { | |
17 | - id?: number; | |
18 | - brandId?: number; | |
19 | - brandName?: string; | |
20 | - seriesName?: string; | |
21 | - startDate?: number; | |
22 | - endDate?: number; | |
23 | - subsidyAmount?: number; | |
24 | - subsidyType?: number; | |
25 | - needBuyTci?: boolean; //是否要求买交强险 | |
26 | - needBuyVci?: boolean; // 是否要求买商业险 | |
27 | - series?: { seriesId: number; seriesName: string; brandName?: string }[]; | |
28 | - vciReqAmount?: number; | |
29 | - name?:string; | |
30 | -} | |
31 | - | |
32 | -export interface SaveParams { | |
33 | - id?: number; | |
34 | - brandId?: number; | |
35 | - brandName?: string; | |
36 | - series?: { seriesId: number; seriesName: string }[]; | |
37 | - startDate?: number; | |
38 | - endDate?: number; | |
39 | - needBuyTci?: boolean; | |
40 | - needBuyVci?: boolean; | |
41 | - vciReqAmount?: number; //商业险补贴金额 | |
42 | - subsidyType?: number; //补贴类型 1增购补贴、2大客户购车补贴、3置换补贴、4最美职业补贴 | |
43 | - subsidyAmount?: number; //补贴金额 | |
44 | -} | |
45 | - | |
46 | -interface SeriesItem { | |
47 | - seriesId: number; | |
48 | - seriesName: string; | |
49 | - brandName?: string; | |
50 | -} | |
51 | - | |
52 | -interface SimilarItem { | |
53 | - brandId: number, | |
54 | - brandName: string, | |
55 | -} | |
56 | -/** | |
57 | - * 授权参数 | |
58 | - */ | |
59 | -export interface ShopItem { | |
60 | - shopId?: number, // 所属门店 | |
61 | - shopName?: string | |
62 | -} | |
63 | - | |
64 | -export interface SelecSpecParams { | |
65 | - seriesId: number, //车系id | |
66 | - startTime: number, // 开始时间 | |
67 | - endTime: number, //结束时间 | |
68 | - additionalId?: number, //配置id(编辑使用) | |
69 | -} | |
70 | -/** | |
71 | - * 选项 | |
72 | - */ | |
73 | -export interface CustomerOption { | |
74 | - customerType: number, | |
75 | - typeName?: string | |
76 | -} | |
77 | - | |
78 | -export interface Option { | |
79 | - specId?: number, | |
80 | - specName?: string | |
81 | -} | |
82 | 0 | \ No newline at end of file |