Commit 1938a03b0760af65e4aa3a11df72f7aa97c1bb57

Authored by 曾国涛
1 parent c8960b07

feat: 客户管理模块开发

.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 () =&gt; {
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 () =&gt; {
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 () =&gt; {
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 () =&gt; {
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 () =&gt; {
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__ */ (() =&gt; {
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__ */ (() =&gt; {
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 /**
... ...