Commit ece7198ef2ce0545c84eadc8e764a399e30a725a

Authored by 徐欣
1 parent 96ee8bdc

feat(carinsur): 删除旧贷款期客户保险要求菜单

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