Commit 1938a03b0760af65e4aa3a11df72f7aa97c1bb57
1 parent
c8960b07
feat: 客户管理模块开发
Showing
7 changed files
with
1308 additions
and
149 deletions
.umirc.ts
... | ... | @@ -86,13 +86,13 @@ export default defineConfig({ |
86 | 86 | icon: 'BookOutlined', |
87 | 87 | access: 'canReadAdmin', |
88 | 88 | }, |
89 | - /*{ | |
89 | + { | |
90 | 90 | name: '客户管理', |
91 | 91 | path: '/client', |
92 | 92 | component: './Client', |
93 | 93 | icon: 'BookOutlined', |
94 | 94 | access: 'canReadAdmin', |
95 | - },*/ | |
95 | + }, | |
96 | 96 | { |
97 | 97 | name: '打印', |
98 | 98 | path: '/print', | ... | ... |
src/pages/Client/Components/ClientDrawer.tsx
1 | +import { RESPONSE_CODE } from '@/constants/enum'; | |
1 | 2 | import { |
3 | + postAdminClientAddAdminClient, | |
4 | + postDistrictSelectByLevel, | |
5 | + postDistrictSelectByNameAndLevel, | |
6 | + postDistrictSelOrderProvince, | |
2 | 7 | postServiceConstClientLevels, |
3 | 8 | postServiceConstTradeStatus, |
4 | 9 | } from '@/services'; |
... | ... | @@ -9,14 +14,18 @@ import { |
9 | 14 | ProFormSelect, |
10 | 15 | ProFormText, |
11 | 16 | } from '@ant-design/pro-components'; |
12 | -import { Form, message } from 'antd'; | |
17 | +import { Button, Form, message } from 'antd'; | |
18 | +import { useState } from 'react'; | |
13 | 19 | |
14 | -export default () => { | |
20 | +export default ({ record }) => { | |
15 | 21 | const [form] = Form.useForm<{ name: string; company: string }>(); |
16 | - | |
22 | + //省市区 | |
23 | + const [province, setProvince] = useState(''); | |
24 | + const [city, setCity] = useState(''); | |
25 | + const [setDistrict] = useState(''); | |
17 | 26 | return ( |
18 | 27 | <DrawerForm |
19 | - title="新建表单" | |
28 | + title={record ? '详情' : '编辑'} | |
20 | 29 | resize={{ |
21 | 30 | onResize() { |
22 | 31 | console.log('resize!'); |
... | ... | @@ -24,35 +33,226 @@ export default () => { |
24 | 33 | maxWidth: window.innerWidth * 0.8, |
25 | 34 | minWidth: 300, |
26 | 35 | }} |
36 | + initialValues={record} | |
27 | 37 | form={form} |
28 | - trigger={<a type="primary">新增客户</a>} | |
38 | + trigger={ | |
39 | + record ? ( | |
40 | + <a type="primary">详情</a> | |
41 | + ) : ( | |
42 | + <Button type="primary">新增</Button> | |
43 | + ) | |
44 | + } | |
29 | 45 | autoFocusFirstInput |
30 | 46 | drawerProps={{ |
31 | 47 | destroyOnClose: true, |
32 | 48 | }} |
33 | 49 | submitTimeout={2000} |
50 | + width={500} | |
51 | + readonly={!!record} | |
34 | 52 | onFinish={async (values) => { |
35 | - console.log(values); | |
36 | - message.success('提交成功'); | |
37 | - // 不返回不会关闭弹框 | |
38 | - return true; | |
53 | + const res = await postAdminClientAddAdminClient({ | |
54 | + data: values, | |
55 | + }); | |
56 | + if (res.result === RESPONSE_CODE.SUCCESS) { | |
57 | + message.success('新增成功'); | |
58 | + // 不返回不会关闭弹框 | |
59 | + return true; | |
60 | + } | |
39 | 61 | }} |
40 | 62 | > |
41 | - <ProFormText name="name" label="客户名称" placeholder="请输入名称" /> | |
63 | + <ProFormText | |
64 | + name="name" | |
65 | + label="客户名称" | |
66 | + placeholder="请输入名称" | |
67 | + rules={[ | |
68 | + { | |
69 | + required: true, | |
70 | + message: '请输入客户名称', | |
71 | + }, | |
72 | + ]} | |
73 | + /> | |
42 | 74 | <ProFormText |
43 | 75 | name="companyName" |
44 | 76 | label="单位名称" |
45 | 77 | placeholder="请输入单位名称" |
78 | + rules={[ | |
79 | + { | |
80 | + required: true, | |
81 | + message: '请输入单位名称', | |
82 | + }, | |
83 | + ]} | |
46 | 84 | /> |
85 | + <div | |
86 | + style={{ | |
87 | + display: 'flex', | |
88 | + justifyContent: 'space-between', | |
89 | + width: 340, | |
90 | + }} | |
91 | + > | |
92 | + <ProFormSelect | |
93 | + name="province" | |
94 | + key="province" | |
95 | + width={100} | |
96 | + label="省" | |
97 | + allowClear={false} | |
98 | + onChange={(value) => { | |
99 | + console.log(value); | |
100 | + | |
101 | + if (value !== undefined || value !== null) { | |
102 | + console.log('setProvince'); | |
103 | + | |
104 | + setProvince(value); | |
105 | + } | |
106 | + }} | |
107 | + placeholder="请选择" | |
108 | + rules={[ | |
109 | + { | |
110 | + required: true, | |
111 | + message: '请选择!', | |
112 | + }, | |
113 | + ]} | |
114 | + request={async () => { | |
115 | + let province = []; | |
116 | + let res = await postDistrictSelectByLevel({ data: 1 }); | |
117 | + if (res) { | |
118 | + res.data.forEach((item) => { | |
119 | + province.push({ value: item.district, label: item.district }); | |
120 | + }); | |
121 | + } | |
122 | + return province; | |
123 | + }} | |
124 | + /> | |
125 | + <ProFormSelect | |
126 | + key={province} | |
127 | + name="city" | |
128 | + width={100} | |
129 | + label="市" | |
130 | + allowClear={false} | |
131 | + disabled={province === ''} | |
132 | + placeholder="请选择" | |
133 | + onChange={(value) => { | |
134 | + if (value !== undefined || value !== null) { | |
135 | + setCity(value); | |
136 | + } | |
137 | + }} | |
138 | + rules={[ | |
139 | + { | |
140 | + required: true, | |
141 | + message: '请选择!', | |
142 | + }, | |
143 | + ]} | |
144 | + request={async () => { | |
145 | + let cityOptions = []; | |
146 | + console.log(form.getFieldValue('id')); | |
147 | + if (form.getFieldValue('id')) { | |
148 | + const resp = await postDistrictSelOrderProvince({ | |
149 | + data: form.getFieldValue('id'), | |
150 | + }); | |
151 | + if ( | |
152 | + resp.data.province !== null && | |
153 | + resp.data.province !== undefined | |
154 | + ) { | |
155 | + console.log('province is ok'); | |
156 | + let res = await postDistrictSelectByNameAndLevel({ | |
157 | + data: { district: resp.data.province, level: 1 }, | |
158 | + }); | |
159 | + if (res && res.data) { | |
160 | + cityOptions = res.data.map((item) => ({ | |
161 | + value: item.district, | |
162 | + label: item.district, | |
163 | + })); | |
164 | + } | |
165 | + } | |
166 | + } | |
167 | + if (province !== '') { | |
168 | + console.log(province); | |
169 | + console.log('province is okk'); | |
170 | + let res = await postDistrictSelectByNameAndLevel({ | |
171 | + data: { district: province, level: 1 }, | |
172 | + }); | |
173 | + if (res && res.data) { | |
174 | + cityOptions = res.data.map((item) => ({ | |
175 | + value: item.district, | |
176 | + label: item.district, | |
177 | + })); | |
178 | + } | |
179 | + } | |
180 | + return cityOptions; | |
181 | + }} | |
182 | + /> | |
183 | + <ProFormSelect | |
184 | + key={city ? city.toString() : 'district'} | |
185 | + name="district" | |
186 | + width={100} | |
187 | + label="区" | |
188 | + allowClear={false} | |
189 | + onChange={(value) => { | |
190 | + if (value !== undefined || value !== null) { | |
191 | + setDistrict(value); | |
192 | + } | |
193 | + }} | |
194 | + disabled={city === ''} | |
195 | + placeholder="请选择" | |
196 | + rules={[ | |
197 | + { | |
198 | + required: true, | |
199 | + message: '请选择!', | |
200 | + }, | |
201 | + ]} | |
202 | + request={async () => { | |
203 | + let districtOptions = []; | |
204 | + if (form.getFieldValue('id')) { | |
205 | + const resp = await postDistrictSelOrderProvince({ | |
206 | + data: form.getFieldValue('id'), | |
207 | + }); | |
208 | + if (resp.data.city !== null && resp.data.city !== undefined) { | |
209 | + let res = await postDistrictSelectByNameAndLevel({ | |
210 | + data: { district: resp.data.city, level: 2 }, | |
211 | + }); | |
212 | + if (res && res.data) { | |
213 | + districtOptions = res.data.map((item) => ({ | |
214 | + value: item.district, | |
215 | + label: item.district, | |
216 | + })); | |
217 | + } | |
218 | + } | |
219 | + } | |
220 | + if (city !== '') { | |
221 | + let res = await postDistrictSelectByNameAndLevel({ | |
222 | + data: { district: city, level: 2 }, | |
223 | + }); | |
224 | + if (res && res.data) { | |
225 | + districtOptions = res.data.map((item) => ({ | |
226 | + value: item.district, | |
227 | + label: item.district, | |
228 | + })); | |
229 | + } | |
230 | + } | |
231 | + return districtOptions; | |
232 | + }} | |
233 | + /> | |
234 | + </div> | |
47 | 235 | <ProFormText |
48 | 236 | name="companyAddress" |
49 | - label="单位地址" | |
237 | + label="详细地址" | |
50 | 238 | placeholder="请输入单位地址" |
239 | + rules={[ | |
240 | + { | |
241 | + required: true, | |
242 | + message: '请输入单位地址', | |
243 | + }, | |
244 | + ]} | |
51 | 245 | /> |
52 | 246 | <ProFormText |
53 | 247 | name="phoneNumber" |
54 | 248 | label="联系电话" |
55 | 249 | placeholder="请输入联系电话" |
250 | + rules={[ | |
251 | + { | |
252 | + required: true, | |
253 | + message: '请输入联系电话', | |
254 | + }, | |
255 | + ]} | |
56 | 256 | /> |
57 | 257 | <ProFormText |
58 | 258 | name="source" |
... | ... | @@ -63,6 +263,12 @@ export default () => { |
63 | 263 | name="requirements" |
64 | 264 | label="客户需求" |
65 | 265 | placeholder="请输入客户需求" |
266 | + rules={[ | |
267 | + { | |
268 | + required: true, | |
269 | + message: '请输入客户需求', | |
270 | + }, | |
271 | + ]} | |
66 | 272 | /> |
67 | 273 | <ProFormText name="referrers" label="推荐人" placeholder="请输入推荐人" /> |
68 | 274 | <ProFormSelect |
... | ... | @@ -79,6 +285,12 @@ export default () => { |
79 | 285 | value: false, |
80 | 286 | }, |
81 | 287 | ]} |
288 | + rules={[ | |
289 | + { | |
290 | + required: true, | |
291 | + message: '请选择是否已报方案', | |
292 | + }, | |
293 | + ]} | |
82 | 294 | /> |
83 | 295 | <ProFormDateTimePicker |
84 | 296 | name="quoteDatetime" |
... | ... | @@ -89,6 +301,12 @@ export default () => { |
89 | 301 | name="level" |
90 | 302 | label="客户等级" |
91 | 303 | placeholder="请输入客户等级" |
304 | + rules={[ | |
305 | + { | |
306 | + required: true, | |
307 | + message: '请输入客户等级', | |
308 | + }, | |
309 | + ]} | |
92 | 310 | request={async () => { |
93 | 311 | const res = await postServiceConstClientLevels(); |
94 | 312 | return enumToSelect(res.data); |
... | ... | @@ -98,6 +316,12 @@ export default () => { |
98 | 316 | name="tradeStatus" |
99 | 317 | label="跟进状态" |
100 | 318 | placeholder="请输入跟进状态" |
319 | + rules={[ | |
320 | + { | |
321 | + required: true, | |
322 | + message: '请输入跟进状态', | |
323 | + }, | |
324 | + ]} | |
101 | 325 | request={async () => { |
102 | 326 | const res = await postServiceConstTradeStatus(); |
103 | 327 | return enumToSelect(res.data); | ... | ... |
src/pages/Client/Components/ClientImportModal.tsx
0 → 100644
1 | +import { RESPONSE_CODE } from '@/constants/enum'; | |
2 | +import { orderExport } from '@/services/order'; | |
3 | +import { blobToJson } from '@/utils'; | |
4 | +import { ModalForm, ProFormUploadDragger } from '@ant-design/pro-components'; | |
5 | +import { Button, Form, message } from 'antd'; | |
6 | +import { RcFile } from 'antd/es/upload'; | |
7 | +import axios from 'axios'; | |
8 | + | |
9 | +export default () => { | |
10 | + const [form] = Form.useForm(); | |
11 | + const [messageApi, contextHolder] = message.useMessage(); | |
12 | + const downloadImportTemplate = () => { | |
13 | + messageApi.open({ | |
14 | + type: 'loading', | |
15 | + content: '正在导入...', | |
16 | + duration: 0, | |
17 | + }); | |
18 | + orderExport( | |
19 | + '/api/admin/client/downloadImportTemplate', | |
20 | + '客户导入模板.xlsx', | |
21 | + 'post', | |
22 | + {}, | |
23 | + () => { | |
24 | + messageApi.destroy(); | |
25 | + }, | |
26 | + ); | |
27 | + }; | |
28 | + | |
29 | + return ( | |
30 | + <ModalForm | |
31 | + title="导入客户信息" | |
32 | + trigger={<Button type="primary">导入客户信息</Button>} | |
33 | + form={form} | |
34 | + autoFocusFirstInput | |
35 | + modalProps={{ | |
36 | + destroyOnClose: true, | |
37 | + onCancel: () => console.log('run'), | |
38 | + }} | |
39 | + submitTimeout={2000} | |
40 | + onFinish={async (values) => { | |
41 | + const formData = new FormData(); | |
42 | + values.file.forEach((file) => { | |
43 | + formData.append('file', file.originFileObj as RcFile); | |
44 | + }); | |
45 | + axios({ | |
46 | + url: '/api/admin/client/importClient', | |
47 | + method: 'post', | |
48 | + responseType: 'blob', | |
49 | + headers: { | |
50 | + Authorization: localStorage.getItem('token'), | |
51 | + 'Content-Type': | |
52 | + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq', | |
53 | + }, | |
54 | + data: formData, | |
55 | + }) | |
56 | + .then((response) => { | |
57 | + let data = response.data; | |
58 | + if (data.type === 'application/json') { | |
59 | + blobToJson(data).then((dataJson) => { | |
60 | + if (dataJson?.result === RESPONSE_CODE.SUCCESS) { | |
61 | + message.success(dataJson?.message); | |
62 | + } else { | |
63 | + message.error(dataJson?.message); | |
64 | + } | |
65 | + }); | |
66 | + } else { | |
67 | + message.error('上传失败,已下载错误信息表格'); | |
68 | + // 创建一个新的 Blob 对象,它包含了服务器响应的数据(即你的 Excel 文件) | |
69 | + const blob = new Blob([response.data]); // Excel 的 MIME 类型 | |
70 | + const downloadUrl = window.URL.createObjectURL(blob); | |
71 | + const a = document.createElement('a'); | |
72 | + a.href = downloadUrl; | |
73 | + a.download = '银行流水导入模板.xlsx'; // 你可以为文件命名 | |
74 | + document.body.appendChild(a); | |
75 | + a.click(); // 模拟点击操作来下载文件 | |
76 | + URL.revokeObjectURL(downloadUrl); // 释放掉 blob 对象所占用的内存 | |
77 | + document.body.removeChild(a); | |
78 | + } | |
79 | + }) | |
80 | + .catch((error) => { | |
81 | + // 处理错误 | |
82 | + message.error('系统出现异常了,请联系管理员', error); | |
83 | + }) | |
84 | + .finally(() => {}); | |
85 | + return true; | |
86 | + }} | |
87 | + > | |
88 | + <ProFormUploadDragger max={1} label="上传" name="file" /> | |
89 | + <Button type="link" onClick={downloadImportTemplate}> | |
90 | + 下载导入模板 | |
91 | + </Button> | |
92 | + {contextHolder} | |
93 | + </ModalForm> | |
94 | + ); | |
95 | +}; | ... | ... |
src/pages/Client/Components/CommunicationHistoryModal.tsx
0 → 100644
1 | +import { RESPONSE_CODE } from '@/constants/enum'; | |
2 | +import { | |
3 | + postAdminClientAddOrModifyClientComunicationInfo, | |
4 | + postAdminClientQueryClientComunicationInfo, | |
5 | + postAdminClientRemoveClientComunicationInfo, | |
6 | +} from '@/services'; | |
7 | +import { | |
8 | + ActionType, | |
9 | + EditableProTable, | |
10 | + ModalForm, | |
11 | + ProFormInstance, | |
12 | +} from '@ant-design/pro-components'; | |
13 | +import { Popconfirm, message } from 'antd'; | |
14 | +import { useEffect, useRef, useState } from 'react'; | |
15 | +export default ({ clientId }) => { | |
16 | + const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]); | |
17 | + const [dataSource, setDataSource] = useState(); | |
18 | + const ref = useRef<ProFormInstance>(); | |
19 | + const actionRef = useRef<ActionType>(); | |
20 | + const columns = [ | |
21 | + { | |
22 | + title: '跟进时间', | |
23 | + dataIndex: 'datetime', | |
24 | + width: 50, | |
25 | + valueType: 'dateTime', | |
26 | + rules: [{ required: true, message: '请选择时间' }], | |
27 | + }, | |
28 | + { | |
29 | + title: '方式', | |
30 | + width: 50, | |
31 | + dataIndex: 'way', | |
32 | + rules: [{ required: true, message: '请选择方式' }], | |
33 | + }, | |
34 | + { | |
35 | + title: '内容', | |
36 | + width: 50, | |
37 | + rules: [{ required: true, message: '请输入内容' }], | |
38 | + dataIndex: 'content', | |
39 | + }, | |
40 | + { | |
41 | + title: '操作', | |
42 | + valueType: 'option', | |
43 | + width: 50, | |
44 | + render: (text, record, _, action) => [ | |
45 | + <a | |
46 | + key="editable" | |
47 | + onClick={() => { | |
48 | + action?.startEditable?.(record.tid); | |
49 | + }} | |
50 | + > | |
51 | + 编辑 | |
52 | + </a>, | |
53 | + <Popconfirm | |
54 | + key={'delete'} | |
55 | + title="删除记录" | |
56 | + description="确认删除记录?" | |
57 | + onConfirm={async () => { | |
58 | + setDataSource(dataSource.filter((item) => item.tid !== record.tid)); | |
59 | + const res = await postAdminClientRemoveClientComunicationInfo({ | |
60 | + query: { | |
61 | + id: record.id, | |
62 | + }, | |
63 | + }); | |
64 | + if (res.result === RESPONSE_CODE.SUCCESS) { | |
65 | + message.success(res.message); | |
66 | + action?.reload(); | |
67 | + } else { | |
68 | + message.error('删除失败'); | |
69 | + } | |
70 | + }} | |
71 | + okText="是" | |
72 | + cancelText="否" | |
73 | + > | |
74 | + <a type={'danger'}>删除</a> | |
75 | + </Popconfirm>, | |
76 | + ], | |
77 | + }, | |
78 | + ]; | |
79 | + | |
80 | + useEffect(() => { | |
81 | + console.log('clientId', clientId); | |
82 | + }, []); | |
83 | + return ( | |
84 | + <ModalForm | |
85 | + title="跟进记录" | |
86 | + trigger={<a type="primary">跟进记录</a>} | |
87 | + modalProps={{ | |
88 | + destroyOnClose: true, | |
89 | + }} | |
90 | + > | |
91 | + <EditableProTable | |
92 | + rowKey="tid" | |
93 | + formRef={ref} | |
94 | + actionRef={actionRef} | |
95 | + recordCreatorProps={{ | |
96 | + record: () => ({ tid: (Math.random() * 1000000).toFixed(0) }), | |
97 | + }} | |
98 | + loading={false} | |
99 | + columns={columns} | |
100 | + request={async () => { | |
101 | + const res = await postAdminClientQueryClientComunicationInfo({ | |
102 | + data: { | |
103 | + clientId: clientId, | |
104 | + }, | |
105 | + }); | |
106 | + if (res.result === RESPONSE_CODE.SUCCESS) { | |
107 | + console.log(JSON.stringify(res.data)); | |
108 | + return { | |
109 | + ...res.data, | |
110 | + data: res.data.data.map((item) => { | |
111 | + return { | |
112 | + ...item, | |
113 | + tid: (Math.random() * 1000000).toFixed(0), | |
114 | + }; | |
115 | + }), | |
116 | + }; | |
117 | + } else { | |
118 | + message.error('获取失败'); | |
119 | + } | |
120 | + }} | |
121 | + value={dataSource} | |
122 | + onChange={setDataSource} | |
123 | + editable={{ | |
124 | + type: 'multiple', | |
125 | + editableKeys, | |
126 | + onSave: async (rowKey, data, row) => { | |
127 | + console.log(rowKey, data, row); | |
128 | + const res = await postAdminClientAddOrModifyClientComunicationInfo({ | |
129 | + data: { | |
130 | + ...data, | |
131 | + clientId: clientId, | |
132 | + }, | |
133 | + }); | |
134 | + if (res.result === RESPONSE_CODE.SUCCESS) { | |
135 | + message.success(res.message); | |
136 | + } else { | |
137 | + message.error('修改失败'); | |
138 | + } | |
139 | + actionRef.current?.reload(); | |
140 | + }, | |
141 | + onChange: setEditableRowKeys, | |
142 | + }} | |
143 | + /> | |
144 | + {/*<ProCard title="表格数据" headerBordered collapsible defaultCollapsed> | |
145 | + <ProFormField | |
146 | + ignoreFormItem | |
147 | + fieldProps={{ | |
148 | + style: { | |
149 | + width: '100%', | |
150 | + }, | |
151 | + }} | |
152 | + mode="read" | |
153 | + valueType="jsonCode" | |
154 | + text={JSON.stringify(dataSource)} | |
155 | + /> | |
156 | + </ProCard>*/} | |
157 | + </ModalForm> | |
158 | + ); | |
159 | +}; | ... | ... |
src/pages/Client/index.tsx
1 | 1 | import ClientDrawer from '@/pages/Client/Components/ClientDrawer'; |
2 | -import { postAdminClientQueryClientPage } from '@/services'; | |
3 | -import { EllipsisOutlined } from '@ant-design/icons'; | |
2 | +import ClientImportModal from '@/pages/Client/Components/ClientImportModal'; | |
3 | +import CommunicationHistoryModal from '@/pages/Client/Components/CommunicationHistoryModal'; | |
4 | +import { | |
5 | + postAdminClientQueryClientPage, | |
6 | + postServiceConstClientLevels, | |
7 | + postServiceConstTradeStatus, | |
8 | +} from '@/services'; | |
9 | +import { orderExport } from '@/services/order'; | |
10 | +import { enumToSelect } from '@/utils'; | |
4 | 11 | import type { ActionType } from '@ant-design/pro-components'; |
5 | 12 | import { ProTable } from '@ant-design/pro-components'; |
6 | -import { Button, Dropdown } from 'antd'; | |
13 | +import { Button, message } from 'antd'; | |
7 | 14 | import { useRef } from 'react'; |
8 | 15 | |
9 | -export const waitTimePromise = async (time: number = 100) => { | |
10 | - return new Promise((resolve) => { | |
11 | - setTimeout(() => { | |
12 | - resolve(true); | |
13 | - }, time); | |
14 | - }); | |
15 | -}; | |
16 | - | |
17 | -export const waitTime = async (time: number = 100) => { | |
18 | - await waitTimePromise(time); | |
19 | -}; | |
20 | - | |
21 | 16 | const columns = [ |
22 | 17 | { |
23 | 18 | dataIndex: 'index', |
... | ... | @@ -27,163 +22,250 @@ const columns = [ |
27 | 22 | { |
28 | 23 | title: '客户名称', |
29 | 24 | dataIndex: 'name', |
25 | + hideInSearch: true, | |
30 | 26 | }, |
31 | 27 | { |
32 | 28 | title: '单位名称', |
33 | 29 | dataIndex: 'companyName', |
30 | + hideInSearch: true, | |
34 | 31 | }, |
35 | 32 | { |
36 | 33 | title: '单位地址', |
37 | 34 | dataIndex: 'companyName', |
35 | + hideInSearch: true, | |
38 | 36 | }, |
39 | 37 | { |
40 | 38 | title: '联系电话', |
41 | 39 | dataIndex: 'phoneNumber', |
40 | + hideInSearch: true, | |
42 | 41 | }, |
43 | 42 | { |
44 | 43 | title: '客户来源', |
45 | - dataIndex: 'sourceText', | |
44 | + dataIndex: 'source', | |
45 | + hideInSearch: true, | |
46 | 46 | }, |
47 | 47 | { |
48 | 48 | title: '推荐人', |
49 | 49 | dataIndex: 'referrers', |
50 | + hideInSearch: true, | |
50 | 51 | }, |
51 | 52 | { |
52 | 53 | title: '客户需求', |
53 | 54 | dataIndex: 'requirements', |
55 | + hideInSearch: true, | |
54 | 56 | }, |
55 | 57 | { |
56 | 58 | title: '是否已报方案', |
57 | 59 | dataIndex: 'hasSchemeText', |
60 | + hideInSearch: true, | |
58 | 61 | }, |
59 | 62 | { |
60 | 63 | title: '报价时间', |
61 | 64 | key: 'since', |
62 | 65 | dataIndex: 'quoteDatetime', |
63 | 66 | valueType: 'dateTime', |
67 | + hideInSearch: true, | |
64 | 68 | }, |
65 | 69 | { |
66 | 70 | title: '跟进状态', |
67 | 71 | dataIndex: 'tradeStatusText', |
72 | + hideInSearch: true, | |
68 | 73 | }, |
69 | 74 | { |
70 | 75 | title: '客户等级', |
71 | 76 | dataIndex: 'levelText', |
77 | + hideInSearch: true, | |
72 | 78 | }, |
73 | 79 | { |
74 | 80 | title: '创建时间', |
75 | 81 | key: 'since', |
76 | 82 | dataIndex: 'createTime', |
77 | 83 | valueType: 'dateTime', |
84 | + hideInSearch: true, | |
78 | 85 | }, |
79 | 86 | { |
80 | 87 | title: '最新跟进时间', |
81 | 88 | key: 'since', |
82 | 89 | dataIndex: 'latestCommunicationTime', |
83 | 90 | valueType: 'dateTime', |
91 | + hideInSearch: true, | |
92 | + }, | |
93 | + { | |
94 | + title: '客户名称', | |
95 | + dataIndex: 'nameLike', | |
96 | + valueType: 'Text', | |
97 | + hideInTable: true, | |
98 | + }, | |
99 | + { | |
100 | + title: '单位名称', | |
101 | + dataIndex: 'companyNameLike', | |
102 | + valueType: 'Text', | |
103 | + hideInTable: true, | |
104 | + }, | |
105 | + { | |
106 | + title: '联系电话', | |
107 | + dataIndex: 'phoneNumberLike', | |
108 | + valueType: 'Text', | |
109 | + hideInTable: true, | |
110 | + }, | |
111 | + { | |
112 | + title: '是否已报方案', | |
113 | + dataIndex: 'hasScheme', | |
114 | + valueType: 'select', | |
115 | + valueEnum: { | |
116 | + true: { | |
117 | + text: '是', | |
118 | + value: true, | |
119 | + }, | |
120 | + false: { | |
121 | + text: '否', | |
122 | + value: false, | |
123 | + }, | |
124 | + }, | |
125 | + hideInTable: true, | |
126 | + }, | |
127 | + { | |
128 | + title: '客户等级', | |
129 | + dataIndex: 'level', | |
130 | + valueType: 'select', | |
131 | + hideInTable: true, | |
132 | + request: async () => { | |
133 | + const res = await postServiceConstClientLevels(); | |
134 | + return enumToSelect(res.data); | |
135 | + }, | |
136 | + }, | |
137 | + { | |
138 | + title: '跟进状态', | |
139 | + dataIndex: 'tradeStatus', | |
140 | + valueType: 'select', | |
141 | + hideInTable: true, | |
142 | + request: async () => { | |
143 | + const res = await postServiceConstTradeStatus(); | |
144 | + return enumToSelect(res.data); | |
145 | + }, | |
146 | + }, | |
147 | + { | |
148 | + title: '创建时间', | |
149 | + valueType: 'dateRange', | |
150 | + width: 200, | |
151 | + hideInTable: true, | |
152 | + search: { | |
153 | + transform: (value) => { | |
154 | + if (value) { | |
155 | + return { | |
156 | + createTimeGe: value[0], | |
157 | + createTimeLe: value[1], | |
158 | + }; | |
159 | + } | |
160 | + }, | |
161 | + }, | |
84 | 162 | }, |
85 | 163 | { |
86 | 164 | title: '操作', |
87 | 165 | valueType: 'option', |
88 | 166 | key: 'option', |
89 | - render: (text, record, _, action) => [ | |
90 | - <a | |
91 | - key="editable" | |
92 | - onClick={() => { | |
93 | - action?.startEditable?.(record.id); | |
94 | - }} | |
95 | - > | |
96 | - 查询详情 | |
97 | - </a>, | |
98 | - <a href={record.url} target="_blank" rel="noopener noreferrer" key="view"> | |
99 | - 跟进记录 | |
100 | - </a>, | |
101 | - ], | |
167 | + render: (text, record) => { | |
168 | + console.log(JSON.stringify(record)); | |
169 | + return [ | |
170 | + <CommunicationHistoryModal | |
171 | + key={'communicationHistory'} | |
172 | + clientId={record.id} | |
173 | + />, | |
174 | + <ClientDrawer key={'detail'} record={record}></ClientDrawer>, | |
175 | + ]; | |
176 | + }, | |
102 | 177 | }, |
103 | 178 | ]; |
104 | 179 | |
105 | 180 | export default () => { |
181 | + const [messageApi, contextHolder] = message.useMessage(); | |
106 | 182 | const actionRef = useRef<ActionType>(); |
107 | 183 | return ( |
108 | - <ProTable | |
109 | - columns={columns} | |
110 | - actionRef={actionRef} | |
111 | - cardBordered | |
112 | - request={async (params) => { | |
113 | - const res = await postAdminClientQueryClientPage({ | |
114 | - data: { | |
115 | - ...params, | |
184 | + <> | |
185 | + <ProTable | |
186 | + columns={columns} | |
187 | + actionRef={actionRef} | |
188 | + cardBordered | |
189 | + request={async (params) => { | |
190 | + const res = await postAdminClientQueryClientPage({ | |
191 | + data: { | |
192 | + ...params, | |
193 | + }, | |
194 | + }); | |
195 | + const data = res.data; | |
196 | + return data; | |
197 | + }} | |
198 | + search={{ | |
199 | + defaultCollapsed: false, | |
200 | + optionRender: (searchConfig, formProps, dom) => [ | |
201 | + ...dom.reverse(), | |
202 | + <Button | |
203 | + key="out" | |
204 | + onClick={() => { | |
205 | + const values = searchConfig?.form?.getFieldsValue(); | |
206 | + messageApi.open({ | |
207 | + type: 'loading', | |
208 | + content: '导出中...', | |
209 | + duration: 0, | |
210 | + }); | |
211 | + orderExport( | |
212 | + '/api/admin/client/exportClients', | |
213 | + '客户信息.xlsx', | |
214 | + 'POST', | |
215 | + values, | |
216 | + () => { | |
217 | + messageApi.destroy(); | |
218 | + }, | |
219 | + ); | |
220 | + }} | |
221 | + > | |
222 | + 导出 | |
223 | + </Button>, | |
224 | + ], | |
225 | + }} | |
226 | + editable={{ | |
227 | + type: 'multiple', | |
228 | + }} | |
229 | + columnsState={{ | |
230 | + persistenceKey: 'pro-table-singe-demos', | |
231 | + persistenceType: 'localStorage', | |
232 | + defaultValue: { | |
233 | + option: { fixed: 'right', disable: true }, | |
234 | + }, | |
235 | + onChange(value) { | |
236 | + console.log('value: ', value); | |
237 | + }, | |
238 | + }} | |
239 | + rowKey="id" | |
240 | + options={{ | |
241 | + setting: { | |
242 | + listsHeight: 400, | |
116 | 243 | }, |
117 | - }); | |
118 | - const data = res.data.data; | |
119 | - return data; | |
120 | - }} | |
121 | - editable={{ | |
122 | - type: 'multiple', | |
123 | - }} | |
124 | - columnsState={{ | |
125 | - persistenceKey: 'pro-table-singe-demos', | |
126 | - persistenceType: 'localStorage', | |
127 | - defaultValue: { | |
128 | - option: { fixed: 'right', disable: true }, | |
129 | - }, | |
130 | - onChange(value) { | |
131 | - console.log('value: ', value); | |
132 | - }, | |
133 | - }} | |
134 | - rowKey="id" | |
135 | - search={{ | |
136 | - labelWidth: 'auto', | |
137 | - }} | |
138 | - options={{ | |
139 | - setting: { | |
140 | - listsHeight: 400, | |
141 | - }, | |
142 | - }} | |
143 | - form={{ | |
144 | - // 由于配置了 transform,提交的参与与定义的不同这里需要转化一下 | |
145 | - syncToUrl: (values, type) => { | |
146 | - if (type === 'get') { | |
147 | - return { | |
148 | - ...values, | |
149 | - created_at: [values.startTime, values.endTime], | |
150 | - }; | |
151 | - } | |
152 | - return values; | |
153 | - }, | |
154 | - }} | |
155 | - pagination={{ | |
156 | - pageSize: 5, | |
157 | - onChange: (page) => console.log(page), | |
158 | - }} | |
159 | - dateFormatter="string" | |
160 | - headerTitle="高级表格" | |
161 | - toolBarRender={() => [ | |
162 | - <ClientDrawer key="button" />, | |
163 | - <Dropdown | |
164 | - key="menu" | |
165 | - menu={{ | |
166 | - items: [ | |
167 | - { | |
168 | - label: '1st item', | |
169 | - key: '1', | |
170 | - }, | |
171 | - { | |
172 | - label: '2nd item', | |
173 | - key: '1', | |
174 | - }, | |
175 | - { | |
176 | - label: '3rd item', | |
177 | - key: '1', | |
178 | - }, | |
179 | - ], | |
180 | - }} | |
181 | - > | |
182 | - <Button> | |
183 | - <EllipsisOutlined /> | |
184 | - </Button> | |
185 | - </Dropdown>, | |
186 | - ]} | |
187 | - /> | |
244 | + }} | |
245 | + form={{ | |
246 | + // 由于配置了 transform,提交的参与与定义的不同这里需要转化一下 | |
247 | + syncToUrl: (values, type) => { | |
248 | + if (type === 'get') { | |
249 | + return { | |
250 | + ...values, | |
251 | + created_at: [values.startTime, values.endTime], | |
252 | + }; | |
253 | + } | |
254 | + return values; | |
255 | + }, | |
256 | + }} | |
257 | + pagination={{ | |
258 | + pageSize: 5, | |
259 | + onChange: (page) => console.log(page), | |
260 | + }} | |
261 | + dateFormatter="string" | |
262 | + headerTitle="高级表格" | |
263 | + toolBarRender={() => [ | |
264 | + <ClientDrawer key="button"></ClientDrawer>, | |
265 | + <ClientImportModal key="import" />, | |
266 | + ]} | |
267 | + /> | |
268 | + {contextHolder} | |
269 | + </> | |
188 | 270 | ); |
189 | 271 | }; | ... | ... |
src/services/definition.ts
... | ... | @@ -86,27 +86,36 @@ export interface AdminAuthUserVO { |
86 | 86 | export interface AdminClientDto { |
87 | 87 | /** |
88 | 88 | * @description |
89 | - * 公司地址 | |
89 | + * 市 | |
90 | + */ | |
91 | + city?: string; | |
92 | + /** | |
93 | + * @description | |
94 | + * 单位地址 | |
90 | 95 | */ |
91 | 96 | companyAddress?: string; |
92 | 97 | companyId?: string; |
93 | 98 | /** |
94 | 99 | * @description |
95 | - * 公司名称 | |
100 | + * 单位名称 | |
96 | 101 | */ |
97 | 102 | companyName?: string; |
98 | 103 | contacts?: string; |
99 | 104 | createBy?: string; |
100 | 105 | /** @format date-time */ |
101 | 106 | createTime?: string; |
107 | + /** | |
108 | + * @description | |
109 | + * 区 | |
110 | + */ | |
111 | + district?: string; | |
102 | 112 | /** @format int32 */ |
103 | 113 | enableFlag?: number; |
104 | 114 | /** |
105 | 115 | * @description |
106 | 116 | * 是否已报方案 |
107 | - * @format int32 | |
108 | 117 | */ |
109 | - hasScheme?: number; | |
118 | + hasScheme?: boolean; | |
110 | 119 | hasSchemeText?: string; |
111 | 120 | /** @format date-time */ |
112 | 121 | latestCommunicationTime?: string; |
... | ... | @@ -140,6 +149,11 @@ export interface AdminClientDto { |
140 | 149 | phoneNumber?: string; |
141 | 150 | /** |
142 | 151 | * @description |
152 | + * 省 | |
153 | + */ | |
154 | + province?: string; | |
155 | + /** | |
156 | + * @description | |
143 | 157 | * 报价时间 |
144 | 158 | * @format date-time |
145 | 159 | */ |
... | ... | @@ -161,11 +175,6 @@ export interface AdminClientDto { |
161 | 175 | source?: string; |
162 | 176 | /** |
163 | 177 | * @description |
164 | - * 来源 | |
165 | - */ | |
166 | - sourceText?: string; | |
167 | - /** | |
168 | - * @description | |
169 | 178 | * 跟进状态 |
170 | 179 | */ |
171 | 180 | tradeStatus?: string; |
... | ... | @@ -1917,7 +1926,7 @@ export interface QueryClientDto { |
1917 | 1926 | current?: number; |
1918 | 1927 | /** @format int32 */ |
1919 | 1928 | end?: number; |
1920 | - hasScheme?: string; | |
1929 | + hasScheme?: boolean; | |
1921 | 1930 | level?: string; |
1922 | 1931 | namelike?: string; |
1923 | 1932 | /** @format int32 */ |
... | ... | @@ -1930,6 +1939,25 @@ export interface QueryClientDto { |
1930 | 1939 | tradeStatus?: string; |
1931 | 1940 | } |
1932 | 1941 | |
1942 | +export interface QueryCommunicationInfoDto { | |
1943 | + clientId?: string; | |
1944 | + content?: string; | |
1945 | + /** @format int32 */ | |
1946 | + current?: number; | |
1947 | + /** @format date-time */ | |
1948 | + datetime?: string; | |
1949 | + /** @format int32 */ | |
1950 | + end?: number; | |
1951 | + id?: string; | |
1952 | + /** @format int32 */ | |
1953 | + pageSize?: number; | |
1954 | + /** @format int32 */ | |
1955 | + start?: number; | |
1956 | + /** @format int32 */ | |
1957 | + total?: number; | |
1958 | + way?: string; | |
1959 | +} | |
1960 | + | |
1933 | 1961 | export interface QueryCustomerInformationDto { |
1934 | 1962 | /** |
1935 | 1963 | * @description |
... | ... | @@ -2699,6 +2727,34 @@ export interface ApiOrderConfirmReceiveRequest { |
2699 | 2727 | subOrderIds?: Array<number>; |
2700 | 2728 | } |
2701 | 2729 | |
2730 | +export interface ClientCommunicationInfo { | |
2731 | + clientId?: string; | |
2732 | + /** | |
2733 | + * @description | |
2734 | + * 内容 | |
2735 | + */ | |
2736 | + content?: string; | |
2737 | + createByName?: string; | |
2738 | + /** @format date-time */ | |
2739 | + createTime?: string; | |
2740 | + /** | |
2741 | + * @description | |
2742 | + * 跟进时间 | |
2743 | + * @format date-time | |
2744 | + */ | |
2745 | + datetime?: string; | |
2746 | + id?: string; | |
2747 | + logicDelete?: boolean; | |
2748 | + updateByName?: string; | |
2749 | + /** @format date-time */ | |
2750 | + updateTime?: string; | |
2751 | + /** | |
2752 | + * @description | |
2753 | + * 方式 | |
2754 | + */ | |
2755 | + way?: string; | |
2756 | +} | |
2757 | + | |
2702 | 2758 | export interface TsgFile { |
2703 | 2759 | absolute?: boolean; |
2704 | 2760 | absoluteFile?: TsgFile; |
... | ... | @@ -2963,10 +3019,6 @@ export interface SalesRechargePrepaymentUpdateRequest { |
2963 | 3019 | salesCode?: string; |
2964 | 3020 | } |
2965 | 3021 | |
2966 | -export type ServerResultSimplePageUtilsAdminClientDto = ServerResult< | |
2967 | - SimplePageUtils<AdminClientDto> | |
2968 | ->; | |
2969 | -export type SimplePageUtilsAdminClientDto = SimplePageUtils<AdminClientDto>; | |
2970 | 3022 | /** |
2971 | 3023 | * @description |
2972 | 3024 | * 开票添加对象 |
... | ... | @@ -3143,14 +3195,3 @@ export interface Dto { |
3143 | 3195 | */ |
3144 | 3196 | subOrderIds?: Array<string>; |
3145 | 3197 | } |
3146 | - | |
3147 | -export interface SimplePageUtils<AdminClientDto = any> { | |
3148 | - /** @format int64 */ | |
3149 | - count?: number; | |
3150 | - data?: Array<AdminClientDto>; | |
3151 | - /** @format int64 */ | |
3152 | - pageSize?: number; | |
3153 | - specialPath?: Array<string>; | |
3154 | - /** @format int64 */ | |
3155 | - total?: number; | |
3156 | -} | ... | ... |
src/services/request.ts
... | ... | @@ -35,6 +35,7 @@ import type { |
35 | 35 | CancelInvoiceAndBankStatementDto, |
36 | 36 | CancelSendOrderDto, |
37 | 37 | CaptchaMessageVO, |
38 | + ClientCommunicationInfo, | |
38 | 39 | CommonAuditRequest, |
39 | 40 | CustomFieldRes, |
40 | 41 | CustomerCustomerListReq, |
... | ... | @@ -81,6 +82,7 @@ import type { |
81 | 82 | QueryAnnexDto, |
82 | 83 | QueryBankStatementDto, |
83 | 84 | QueryClientDto, |
85 | + QueryCommunicationInfoDto, | |
84 | 86 | QueryCustomerInformationDto, |
85 | 87 | QueryHistoryRecordDto, |
86 | 88 | QueryInvoiceDetailDto, |
... | ... | @@ -107,7 +109,6 @@ import type { |
107 | 109 | SaveReply, |
108 | 110 | ServerResult, |
109 | 111 | ShippingWarehouseChangeDto, |
110 | - SimplePageUtils, | |
111 | 112 | StoreOrderInvoiceRequest, |
112 | 113 | SysLogQueryVO, |
113 | 114 | SystemCustomFieldReq, |
... | ... | @@ -173,7 +174,7 @@ export type PostAdminClientAddAdminClientResponseSuccess = |
173 | 174 | PostAdminClientAddAdminClientResponse[200]; |
174 | 175 | /** |
175 | 176 | * @description |
176 | - * 客户管理 | |
177 | + * 添加客户 | |
177 | 178 | * @tags 客户管理 |
178 | 179 | * @produces * |
179 | 180 | * @consumes application/json |
... | ... | @@ -197,6 +198,489 @@ export const postAdminClientAddAdminClient = /* #__PURE__ */ (() => { |
197 | 198 | return request; |
198 | 199 | })(); |
199 | 200 | |
201 | +/** @description request parameter type for postAdminClientAddClientComunicationInfo */ | |
202 | +export interface PostAdminClientAddClientComunicationInfoOption { | |
203 | + /** | |
204 | + * @description | |
205 | + * dto | |
206 | + */ | |
207 | + body: { | |
208 | + /** | |
209 | + @description | |
210 | + dto */ | |
211 | + dto: QueryCommunicationInfoDto; | |
212 | + }; | |
213 | +} | |
214 | + | |
215 | +/** @description response type for postAdminClientAddClientComunicationInfo */ | |
216 | +export interface PostAdminClientAddClientComunicationInfoResponse { | |
217 | + /** | |
218 | + * @description | |
219 | + * OK | |
220 | + */ | |
221 | + 200: ServerResult; | |
222 | + /** | |
223 | + * @description | |
224 | + * Created | |
225 | + */ | |
226 | + 201: any; | |
227 | + /** | |
228 | + * @description | |
229 | + * Unauthorized | |
230 | + */ | |
231 | + 401: any; | |
232 | + /** | |
233 | + * @description | |
234 | + * Forbidden | |
235 | + */ | |
236 | + 403: any; | |
237 | + /** | |
238 | + * @description | |
239 | + * Not Found | |
240 | + */ | |
241 | + 404: any; | |
242 | +} | |
243 | + | |
244 | +export type PostAdminClientAddClientComunicationInfoResponseSuccess = | |
245 | + PostAdminClientAddClientComunicationInfoResponse[200]; | |
246 | +/** | |
247 | + * @description | |
248 | + * 添加跟进信息 | |
249 | + * @tags 客户管理 | |
250 | + * @produces * | |
251 | + * @consumes application/json | |
252 | + */ | |
253 | +export const postAdminClientAddClientComunicationInfo = /* #__PURE__ */ (() => { | |
254 | + const method = 'post'; | |
255 | + const url = '/admin/client/addClientComunicationInfo'; | |
256 | + function request( | |
257 | + option: PostAdminClientAddClientComunicationInfoOption, | |
258 | + ): Promise<PostAdminClientAddClientComunicationInfoResponseSuccess> { | |
259 | + return requester(request.url, { | |
260 | + method: request.method, | |
261 | + ...option, | |
262 | + }) as unknown as Promise<PostAdminClientAddClientComunicationInfoResponseSuccess>; | |
263 | + } | |
264 | + | |
265 | + /** http method */ | |
266 | + request.method = method; | |
267 | + /** request url */ | |
268 | + request.url = url; | |
269 | + return request; | |
270 | +})(); | |
271 | + | |
272 | +/** @description request parameter type for postAdminClientAddOrModifyClientComunicationInfo */ | |
273 | +export interface PostAdminClientAddOrModifyClientComunicationInfoOption { | |
274 | + /** | |
275 | + * @description | |
276 | + * dto | |
277 | + */ | |
278 | + body: { | |
279 | + /** | |
280 | + @description | |
281 | + dto */ | |
282 | + dto: ClientCommunicationInfo; | |
283 | + }; | |
284 | +} | |
285 | + | |
286 | +/** @description response type for postAdminClientAddOrModifyClientComunicationInfo */ | |
287 | +export interface PostAdminClientAddOrModifyClientComunicationInfoResponse { | |
288 | + /** | |
289 | + * @description | |
290 | + * OK | |
291 | + */ | |
292 | + 200: ServerResult; | |
293 | + /** | |
294 | + * @description | |
295 | + * Created | |
296 | + */ | |
297 | + 201: any; | |
298 | + /** | |
299 | + * @description | |
300 | + * Unauthorized | |
301 | + */ | |
302 | + 401: any; | |
303 | + /** | |
304 | + * @description | |
305 | + * Forbidden | |
306 | + */ | |
307 | + 403: any; | |
308 | + /** | |
309 | + * @description | |
310 | + * Not Found | |
311 | + */ | |
312 | + 404: any; | |
313 | +} | |
314 | + | |
315 | +export type PostAdminClientAddOrModifyClientComunicationInfoResponseSuccess = | |
316 | + PostAdminClientAddOrModifyClientComunicationInfoResponse[200]; | |
317 | +/** | |
318 | + * @description | |
319 | + * 修改跟进信息 | |
320 | + * @tags 客户管理 | |
321 | + * @produces * | |
322 | + * @consumes application/json | |
323 | + */ | |
324 | +export const postAdminClientAddOrModifyClientComunicationInfo = | |
325 | + /* #__PURE__ */ (() => { | |
326 | + const method = 'post'; | |
327 | + const url = '/admin/client/addOrModifyClientComunicationInfo'; | |
328 | + function request( | |
329 | + option: PostAdminClientAddOrModifyClientComunicationInfoOption, | |
330 | + ): Promise<PostAdminClientAddOrModifyClientComunicationInfoResponseSuccess> { | |
331 | + return requester(request.url, { | |
332 | + method: request.method, | |
333 | + ...option, | |
334 | + }) as unknown as Promise<PostAdminClientAddOrModifyClientComunicationInfoResponseSuccess>; | |
335 | + } | |
336 | + | |
337 | + /** http method */ | |
338 | + request.method = method; | |
339 | + /** request url */ | |
340 | + request.url = url; | |
341 | + return request; | |
342 | + })(); | |
343 | + | |
344 | +/** @description response type for postAdminClientDownloadImportTemplate */ | |
345 | +export interface PostAdminClientDownloadImportTemplateResponse { | |
346 | + /** | |
347 | + * @description | |
348 | + * OK | |
349 | + */ | |
350 | + 200: any; | |
351 | + /** | |
352 | + * @description | |
353 | + * Created | |
354 | + */ | |
355 | + 201: any; | |
356 | + /** | |
357 | + * @description | |
358 | + * Unauthorized | |
359 | + */ | |
360 | + 401: any; | |
361 | + /** | |
362 | + * @description | |
363 | + * Forbidden | |
364 | + */ | |
365 | + 403: any; | |
366 | + /** | |
367 | + * @description | |
368 | + * Not Found | |
369 | + */ | |
370 | + 404: any; | |
371 | +} | |
372 | + | |
373 | +export type PostAdminClientDownloadImportTemplateResponseSuccess = | |
374 | + PostAdminClientDownloadImportTemplateResponse[200]; | |
375 | +/** | |
376 | + * @description | |
377 | + * 下载导入模板 | |
378 | + * @tags 客户管理 | |
379 | + * @produces * | |
380 | + * @consumes application/json | |
381 | + */ | |
382 | +export const postAdminClientDownloadImportTemplate = /* #__PURE__ */ (() => { | |
383 | + const method = 'post'; | |
384 | + const url = '/admin/client/downloadImportTemplate'; | |
385 | + function request(): Promise<PostAdminClientDownloadImportTemplateResponseSuccess> { | |
386 | + return requester(request.url, { | |
387 | + method: request.method, | |
388 | + }) as unknown as Promise<PostAdminClientDownloadImportTemplateResponseSuccess>; | |
389 | + } | |
390 | + | |
391 | + /** http method */ | |
392 | + request.method = method; | |
393 | + /** request url */ | |
394 | + request.url = url; | |
395 | + return request; | |
396 | +})(); | |
397 | + | |
398 | +/** @description request parameter type for postAdminClientExportClients */ | |
399 | +export interface PostAdminClientExportClientsOption { | |
400 | + /** | |
401 | + * @description | |
402 | + * dto | |
403 | + */ | |
404 | + body: { | |
405 | + /** | |
406 | + @description | |
407 | + dto */ | |
408 | + dto: QueryClientDto; | |
409 | + }; | |
410 | +} | |
411 | + | |
412 | +/** @description response type for postAdminClientExportClients */ | |
413 | +export interface PostAdminClientExportClientsResponse { | |
414 | + /** | |
415 | + * @description | |
416 | + * OK | |
417 | + */ | |
418 | + 200: any; | |
419 | + /** | |
420 | + * @description | |
421 | + * Created | |
422 | + */ | |
423 | + 201: any; | |
424 | + /** | |
425 | + * @description | |
426 | + * Unauthorized | |
427 | + */ | |
428 | + 401: any; | |
429 | + /** | |
430 | + * @description | |
431 | + * Forbidden | |
432 | + */ | |
433 | + 403: any; | |
434 | + /** | |
435 | + * @description | |
436 | + * Not Found | |
437 | + */ | |
438 | + 404: any; | |
439 | +} | |
440 | + | |
441 | +export type PostAdminClientExportClientsResponseSuccess = | |
442 | + PostAdminClientExportClientsResponse[200]; | |
443 | +/** | |
444 | + * @description | |
445 | + * 导出客户信息 | |
446 | + * @tags 客户管理 | |
447 | + * @produces * | |
448 | + * @consumes application/json | |
449 | + */ | |
450 | +export const postAdminClientExportClients = /* #__PURE__ */ (() => { | |
451 | + const method = 'post'; | |
452 | + const url = '/admin/client/exportClients'; | |
453 | + function request( | |
454 | + option: PostAdminClientExportClientsOption, | |
455 | + ): Promise<PostAdminClientExportClientsResponseSuccess> { | |
456 | + return requester(request.url, { | |
457 | + method: request.method, | |
458 | + ...option, | |
459 | + }) as unknown as Promise<PostAdminClientExportClientsResponseSuccess>; | |
460 | + } | |
461 | + | |
462 | + /** http method */ | |
463 | + request.method = method; | |
464 | + /** request url */ | |
465 | + request.url = url; | |
466 | + return request; | |
467 | +})(); | |
468 | + | |
469 | +/** @description request parameter type for postAdminClientImportClient */ | |
470 | +export interface PostAdminClientImportClientOption { | |
471 | + /** | |
472 | + * @description | |
473 | + * file | |
474 | + */ | |
475 | + formData: { | |
476 | + /** | |
477 | + @description | |
478 | + file */ | |
479 | + file: File; | |
480 | + }; | |
481 | +} | |
482 | + | |
483 | +/** @description response type for postAdminClientImportClient */ | |
484 | +export interface PostAdminClientImportClientResponse { | |
485 | + /** | |
486 | + * @description | |
487 | + * OK | |
488 | + */ | |
489 | + 200: ServerResult; | |
490 | + /** | |
491 | + * @description | |
492 | + * Created | |
493 | + */ | |
494 | + 201: any; | |
495 | + /** | |
496 | + * @description | |
497 | + * Unauthorized | |
498 | + */ | |
499 | + 401: any; | |
500 | + /** | |
501 | + * @description | |
502 | + * Forbidden | |
503 | + */ | |
504 | + 403: any; | |
505 | + /** | |
506 | + * @description | |
507 | + * Not Found | |
508 | + */ | |
509 | + 404: any; | |
510 | +} | |
511 | + | |
512 | +export type PostAdminClientImportClientResponseSuccess = | |
513 | + PostAdminClientImportClientResponse[200]; | |
514 | +/** | |
515 | + * @description | |
516 | + * 导入客户 | |
517 | + * @tags 客户管理 | |
518 | + * @produces * | |
519 | + * @consumes multipart/form-data | |
520 | + */ | |
521 | +export const postAdminClientImportClient = /* #__PURE__ */ (() => { | |
522 | + const method = 'post'; | |
523 | + const url = '/admin/client/importClient'; | |
524 | + function request( | |
525 | + option: PostAdminClientImportClientOption, | |
526 | + ): Promise<PostAdminClientImportClientResponseSuccess> { | |
527 | + return requester(request.url, { | |
528 | + method: request.method, | |
529 | + ...option, | |
530 | + }) as unknown as Promise<PostAdminClientImportClientResponseSuccess>; | |
531 | + } | |
532 | + | |
533 | + /** http method */ | |
534 | + request.method = method; | |
535 | + /** request url */ | |
536 | + request.url = url; | |
537 | + return request; | |
538 | +})(); | |
539 | + | |
540 | +/** @description request parameter type for postAdminClientModifyClientComunicationInfo */ | |
541 | +export interface PostAdminClientModifyClientComunicationInfoOption { | |
542 | + /** | |
543 | + * @description | |
544 | + * dto | |
545 | + */ | |
546 | + body: { | |
547 | + /** | |
548 | + @description | |
549 | + dto */ | |
550 | + dto: QueryCommunicationInfoDto; | |
551 | + }; | |
552 | +} | |
553 | + | |
554 | +/** @description response type for postAdminClientModifyClientComunicationInfo */ | |
555 | +export interface PostAdminClientModifyClientComunicationInfoResponse { | |
556 | + /** | |
557 | + * @description | |
558 | + * OK | |
559 | + */ | |
560 | + 200: ServerResult; | |
561 | + /** | |
562 | + * @description | |
563 | + * Created | |
564 | + */ | |
565 | + 201: any; | |
566 | + /** | |
567 | + * @description | |
568 | + * Unauthorized | |
569 | + */ | |
570 | + 401: any; | |
571 | + /** | |
572 | + * @description | |
573 | + * Forbidden | |
574 | + */ | |
575 | + 403: any; | |
576 | + /** | |
577 | + * @description | |
578 | + * Not Found | |
579 | + */ | |
580 | + 404: any; | |
581 | +} | |
582 | + | |
583 | +export type PostAdminClientModifyClientComunicationInfoResponseSuccess = | |
584 | + PostAdminClientModifyClientComunicationInfoResponse[200]; | |
585 | +/** | |
586 | + * @description | |
587 | + * 修改跟进信息 | |
588 | + * @tags 客户管理 | |
589 | + * @produces * | |
590 | + * @consumes application/json | |
591 | + */ | |
592 | +export const postAdminClientModifyClientComunicationInfo = | |
593 | + /* #__PURE__ */ (() => { | |
594 | + const method = 'post'; | |
595 | + const url = '/admin/client/modifyClientComunicationInfo'; | |
596 | + function request( | |
597 | + option: PostAdminClientModifyClientComunicationInfoOption, | |
598 | + ): Promise<PostAdminClientModifyClientComunicationInfoResponseSuccess> { | |
599 | + return requester(request.url, { | |
600 | + method: request.method, | |
601 | + ...option, | |
602 | + }) as unknown as Promise<PostAdminClientModifyClientComunicationInfoResponseSuccess>; | |
603 | + } | |
604 | + | |
605 | + /** http method */ | |
606 | + request.method = method; | |
607 | + /** request url */ | |
608 | + request.url = url; | |
609 | + return request; | |
610 | + })(); | |
611 | + | |
612 | +/** @description request parameter type for postAdminClientQueryClientComunicationInfo */ | |
613 | +export interface PostAdminClientQueryClientComunicationInfoOption { | |
614 | + /** | |
615 | + * @description | |
616 | + * dto | |
617 | + */ | |
618 | + body: { | |
619 | + /** | |
620 | + @description | |
621 | + dto */ | |
622 | + dto: QueryCommunicationInfoDto; | |
623 | + }; | |
624 | +} | |
625 | + | |
626 | +/** @description response type for postAdminClientQueryClientComunicationInfo */ | |
627 | +export interface PostAdminClientQueryClientComunicationInfoResponse { | |
628 | + /** | |
629 | + * @description | |
630 | + * OK | |
631 | + */ | |
632 | + 200: ServerResult; | |
633 | + /** | |
634 | + * @description | |
635 | + * Created | |
636 | + */ | |
637 | + 201: any; | |
638 | + /** | |
639 | + * @description | |
640 | + * Unauthorized | |
641 | + */ | |
642 | + 401: any; | |
643 | + /** | |
644 | + * @description | |
645 | + * Forbidden | |
646 | + */ | |
647 | + 403: any; | |
648 | + /** | |
649 | + * @description | |
650 | + * Not Found | |
651 | + */ | |
652 | + 404: any; | |
653 | +} | |
654 | + | |
655 | +export type PostAdminClientQueryClientComunicationInfoResponseSuccess = | |
656 | + PostAdminClientQueryClientComunicationInfoResponse[200]; | |
657 | +/** | |
658 | + * @description | |
659 | + * 获取跟进信息 | |
660 | + * @tags 客户管理 | |
661 | + * @produces * | |
662 | + * @consumes application/json | |
663 | + */ | |
664 | +export const postAdminClientQueryClientComunicationInfo = | |
665 | + /* #__PURE__ */ (() => { | |
666 | + const method = 'post'; | |
667 | + const url = '/admin/client/queryClientComunicationInfo'; | |
668 | + function request( | |
669 | + option: PostAdminClientQueryClientComunicationInfoOption, | |
670 | + ): Promise<PostAdminClientQueryClientComunicationInfoResponseSuccess> { | |
671 | + return requester(request.url, { | |
672 | + method: request.method, | |
673 | + ...option, | |
674 | + }) as unknown as Promise<PostAdminClientQueryClientComunicationInfoResponseSuccess>; | |
675 | + } | |
676 | + | |
677 | + /** http method */ | |
678 | + request.method = method; | |
679 | + /** request url */ | |
680 | + request.url = url; | |
681 | + return request; | |
682 | + })(); | |
683 | + | |
200 | 684 | /** @description request parameter type for postAdminClientQueryClientPage */ |
201 | 685 | export interface PostAdminClientQueryClientPageOption { |
202 | 686 | /** |
... | ... | @@ -217,7 +701,7 @@ export interface PostAdminClientQueryClientPageResponse { |
217 | 701 | * @description |
218 | 702 | * OK |
219 | 703 | */ |
220 | - 200: ServerResult<SimplePageUtils<AdminClientDto>>; | |
704 | + 200: ServerResult; | |
221 | 705 | /** |
222 | 706 | * @description |
223 | 707 | * Created |
... | ... | @@ -268,6 +752,80 @@ export const postAdminClientQueryClientPage = /* #__PURE__ */ (() => { |
268 | 752 | return request; |
269 | 753 | })(); |
270 | 754 | |
755 | +/** @description request parameter type for postAdminClientRemoveClientComunicationInfo */ | |
756 | +export interface PostAdminClientRemoveClientComunicationInfoOption { | |
757 | + /** | |
758 | + * @description | |
759 | + * id | |
760 | + * @format int64 | |
761 | + */ | |
762 | + query?: { | |
763 | + /** | |
764 | + @description | |
765 | + id | |
766 | + @format int64 */ | |
767 | + id?: number; | |
768 | + }; | |
769 | +} | |
770 | + | |
771 | +/** @description response type for postAdminClientRemoveClientComunicationInfo */ | |
772 | +export interface PostAdminClientRemoveClientComunicationInfoResponse { | |
773 | + /** | |
774 | + * @description | |
775 | + * OK | |
776 | + */ | |
777 | + 200: ServerResult; | |
778 | + /** | |
779 | + * @description | |
780 | + * Created | |
781 | + */ | |
782 | + 201: any; | |
783 | + /** | |
784 | + * @description | |
785 | + * Unauthorized | |
786 | + */ | |
787 | + 401: any; | |
788 | + /** | |
789 | + * @description | |
790 | + * Forbidden | |
791 | + */ | |
792 | + 403: any; | |
793 | + /** | |
794 | + * @description | |
795 | + * Not Found | |
796 | + */ | |
797 | + 404: any; | |
798 | +} | |
799 | + | |
800 | +export type PostAdminClientRemoveClientComunicationInfoResponseSuccess = | |
801 | + PostAdminClientRemoveClientComunicationInfoResponse[200]; | |
802 | +/** | |
803 | + * @description | |
804 | + * 删除跟进信息 | |
805 | + * @tags 客户管理 | |
806 | + * @produces * | |
807 | + * @consumes application/json | |
808 | + */ | |
809 | +export const postAdminClientRemoveClientComunicationInfo = | |
810 | + /* #__PURE__ */ (() => { | |
811 | + const method = 'post'; | |
812 | + const url = '/admin/client/removeClientComunicationInfo'; | |
813 | + function request( | |
814 | + option?: PostAdminClientRemoveClientComunicationInfoOption, | |
815 | + ): Promise<PostAdminClientRemoveClientComunicationInfoResponseSuccess> { | |
816 | + return requester(request.url, { | |
817 | + method: request.method, | |
818 | + ...option, | |
819 | + }) as unknown as Promise<PostAdminClientRemoveClientComunicationInfoResponseSuccess>; | |
820 | + } | |
821 | + | |
822 | + /** http method */ | |
823 | + request.method = method; | |
824 | + /** request url */ | |
825 | + request.url = url; | |
826 | + return request; | |
827 | + })(); | |
828 | + | |
271 | 829 | /** @description request parameter type for postApiLocalStorageUpload */ |
272 | 830 | export interface PostApiLocalStorageUploadOption { |
273 | 831 | /** | ... | ... |