|
|
@@ -1,55 +1,112 @@
|
|
|
-import React from 'react'
|
|
|
-import { Tabs, List, Row, Col } from 'antd'
|
|
|
-import { dayjsFormat } from '@/utils/utils'
|
|
|
-import { servicelogEnum } from '@/pages/Customer/Client/components/ClientDetail/LowerList'
|
|
|
+import React, { useMemo, useRef } from 'react'
|
|
|
+import { Tabs } from 'antd'
|
|
|
+import { ServiceLogType } from '@/pages/Customer/Client/components/ClientDetail/LowerList'
|
|
|
+import ServiceLogItem from '@/components/TimeLineList/ServiceLogItem'
|
|
|
+import { useInfiniteScroll } from 'ahooks'
|
|
|
+import { getLoadMoreList } from '@/components/TimeLineList/shared'
|
|
|
+import { queryClientService } from '@/services/customer'
|
|
|
+import { VList } from 'virtuallist-antd'
|
|
|
+import ProTable from '@ant-design/pro-table'
|
|
|
+import type { ProColumns } from '@ant-design/pro-table'
|
|
|
+
|
|
|
+const { TabPane } = Tabs
|
|
|
+type PersonalLowerListProps = {
|
|
|
+ clientId: string
|
|
|
+ logList: {
|
|
|
+ log: any[]
|
|
|
+ }
|
|
|
+ serviceLog: {
|
|
|
+ list: API.ServiceLogItem[]
|
|
|
+ total: number
|
|
|
+ }
|
|
|
+ updatePayload?: { main: string; target: string }
|
|
|
+}
|
|
|
+
|
|
|
+const PAGE_SIZE = 20
|
|
|
+const PersonalLowerList: React.FC<PersonalLowerListProps> = ({
|
|
|
+ clientId,
|
|
|
+ logList: { log: logs = [] },
|
|
|
+ serviceLog: { list: services = [], total: servicesTotal = 0 },
|
|
|
+ updatePayload
|
|
|
+}) => {
|
|
|
+ const ref = useRef<HTMLDivElement>(null)
|
|
|
+ const { data, loadingMore, noMore } = useInfiniteScroll(
|
|
|
+ async d => {
|
|
|
+ const current = d ? Math.ceil(d.list.length / PAGE_SIZE) + 1 : 1
|
|
|
+ const data = current === 1 ? { list: services, total: servicesTotal } : d
|
|
|
+ return await getLoadMoreList(data, { clientId, current, pageSize: PAGE_SIZE }, queryClientService)
|
|
|
+ },
|
|
|
+ {
|
|
|
+ reloadDeps: [services],
|
|
|
+ target: ref,
|
|
|
+ isNoMore: d => d?.list.length === d?.total
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ const columns: ProColumns<API.LogItem>[] = [
|
|
|
+ {
|
|
|
+ title: '日期',
|
|
|
+ dataIndex: 'createTime',
|
|
|
+ key: 'createTime',
|
|
|
+ width: 160
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作人',
|
|
|
+ dataIndex: 'operatorName',
|
|
|
+ key: 'operatorName',
|
|
|
+ ellipsis: true,
|
|
|
+ width: 115
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ dataIndex: 'operationType',
|
|
|
+ key: 'operationType',
|
|
|
+ ellipsis: true,
|
|
|
+ width: 120
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作内容',
|
|
|
+ dataIndex: 'content',
|
|
|
+ key: 'content',
|
|
|
+ ellipsis: true
|
|
|
+ }
|
|
|
+ ]
|
|
|
+
|
|
|
+ const tableHeight = (document.body.clientHeight - 124 - 78) / 2
|
|
|
+ const vList = useMemo(() => {
|
|
|
+ return VList({
|
|
|
+ height: tableHeight,
|
|
|
+ vid: 'personal_log_list'
|
|
|
+ })
|
|
|
+ }, [])
|
|
|
|
|
|
-const PersonalLowerList = props => {
|
|
|
- const {
|
|
|
- log: { log = [] },
|
|
|
- serviceLog
|
|
|
- } = props
|
|
|
- const { TabPane } = Tabs
|
|
|
return (
|
|
|
<div>
|
|
|
<div className="pl-4">
|
|
|
<Tabs>
|
|
|
<TabPane tab="服务记录" key="服务记录">
|
|
|
- <div className="sheet-panel-record">
|
|
|
- <Row>
|
|
|
- <Col span="8">类型/时间</Col>
|
|
|
- <Col span="16">服务内容</Col>
|
|
|
- </Row>
|
|
|
- <List
|
|
|
- dataSource={serviceLog}
|
|
|
- split={false}
|
|
|
- renderItem={item => (
|
|
|
- <List.Item>
|
|
|
- <Row className="w-full">
|
|
|
- <Col span="8">
|
|
|
- <a className="mr-1">@{item.staffName}</a>
|
|
|
- {servicelogEnum[item.status]}
|
|
|
- <List.Item.Meta description={dayjsFormat(item.date, 'YYYY-MM-DD')} />
|
|
|
- </Col>
|
|
|
- <Col span="16" className="whitespace-pre-line">
|
|
|
- {item.mark}
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </List.Item>
|
|
|
- )}
|
|
|
- />
|
|
|
+ <div className="sheet-panel-record" ref={ref}>
|
|
|
+ {data?.list.map(item => (
|
|
|
+ <div key={item.id}>
|
|
|
+ <ServiceLogItem item={item} logType={ServiceLogType.CLIENT} updatePayload={updatePayload} />
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ {loadingMore ? <div className="text-center my-2">正在加载.....</div> : null}
|
|
|
+ {noMore ? <div className="text-gray text-center my-2">暂无更多数据</div> : null}
|
|
|
</div>
|
|
|
</TabPane>
|
|
|
<TabPane tab="日志" key="日志">
|
|
|
<div className="sheet-panel-record">
|
|
|
- <List
|
|
|
- dataSource={log}
|
|
|
- split={false}
|
|
|
- renderItem={item => (
|
|
|
- <List.Item>
|
|
|
- <a>@{item.operatorName}</a> {item.content}
|
|
|
- <List.Item.Meta description={dayjsFormat(item.create_time)} />
|
|
|
- </List.Item>
|
|
|
- )}
|
|
|
+ <ProTable<API.LogItem>
|
|
|
+ search={false}
|
|
|
+ toolBarRender={false}
|
|
|
+ rowKey="id"
|
|
|
+ size="small"
|
|
|
+ columns={columns}
|
|
|
+ dataSource={logs}
|
|
|
+ pagination={false}
|
|
|
+ scroll={{ y: tableHeight }}
|
|
|
+ components={vList}
|
|
|
/>
|
|
|
</div>
|
|
|
</TabPane>
|