|
@@ -12,19 +12,32 @@ import {
|
|
OrderStatus,
|
|
OrderStatus,
|
|
OrderType,
|
|
OrderType,
|
|
} from '@/pages/TaskManage/constent';
|
|
} from '@/pages/TaskManage/constent';
|
|
-import { connect, useLocation } from '@umijs/max';
|
|
|
|
|
|
+import { connect, useLocation, useRequest } from '@umijs/max';
|
|
|
|
|
|
import TopFilter from '@/pages/TaskManage/components/TopFilter';
|
|
import TopFilter from '@/pages/TaskManage/components/TopFilter';
|
|
import { IMandateType } from '@/pages/TaskManage/index.types';
|
|
import { IMandateType } from '@/pages/TaskManage/index.types';
|
|
import { useNavigate } from '@@/exports';
|
|
import { useNavigate } from '@@/exports';
|
|
-import { Col, Collapse, CollapseProps, Divider, List, Row, Spin } from 'antd';
|
|
|
|
-import React, { useEffect, useState } from 'react';
|
|
|
|
|
|
+import { DownOutlined } from '@ant-design/icons';
|
|
|
|
+import {
|
|
|
|
+ Button,
|
|
|
|
+ Col,
|
|
|
|
+ Collapse,
|
|
|
|
+ CollapseProps,
|
|
|
|
+ Divider,
|
|
|
|
+ List,
|
|
|
|
+ Row,
|
|
|
|
+ Spin,
|
|
|
|
+} from 'antd';
|
|
|
|
+
|
|
|
|
+import { getMandateList } from '@/services/TaskManage';
|
|
|
|
+import moment from 'moment';
|
|
|
|
+import { useEffect, useState } from 'react';
|
|
import styles from './taskList.less';
|
|
import styles from './taskList.less';
|
|
|
|
|
|
const TaskList: React.FC<IPropsType> = (props) => {
|
|
const TaskList: React.FC<IPropsType> = (props) => {
|
|
- const { userList, mandateList, loading, dispatch } = props;
|
|
|
|
- // const md5 = require('md5');
|
|
|
|
|
|
+ const { userList, loading, dispatch } = props;
|
|
const location = useLocation();
|
|
const location = useLocation();
|
|
|
|
+
|
|
const queryParams = new URLSearchParams(location.search);
|
|
const queryParams = new URLSearchParams(location.search);
|
|
const project_id = Number(queryParams.get('project_id'));
|
|
const project_id = Number(queryParams.get('project_id'));
|
|
const mandateType = Number(queryParams.get('mandateType'));
|
|
const mandateType = Number(queryParams.get('mandateType'));
|
|
@@ -32,36 +45,42 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
const navigate = useNavigate();
|
|
const navigate = useNavigate();
|
|
|
|
|
|
// 用于展示的任务列表
|
|
// 用于展示的任务列表
|
|
- const [mandateListShow, setMandateListShow] = useState<IMandateType[]>([
|
|
|
|
- ...mandateList.filter((item) => item.MandateType === mandateType),
|
|
|
|
- ]);
|
|
|
|
|
|
+ const [mandateListShow, setMandateListShow] = useState<IMandateType[]>([]);
|
|
// 顶部选择器配置
|
|
// 顶部选择器配置
|
|
- const [topFilters, setTopFilters] = useState<ITopFilter[]>([]);
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 处理选择器变化
|
|
|
|
- * @param value 选择的值,当清空时等于null
|
|
|
|
- */
|
|
|
|
- const onTopFilterChange = (value: any) => {
|
|
|
|
- if (topFilters.length === 0) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- let tempList = mandateList.filter(
|
|
|
|
- (item) => item.MandateType === mandateType,
|
|
|
|
- );
|
|
|
|
|
|
+ const [topFiltersConfig, setTopFiltersConfig] = useState<ITopFilter[]>([]);
|
|
|
|
+ const [mandateList, setMandateList] = useState<IMandateType[]>([]);
|
|
|
|
+ const [mandatePage, setMandatePage] = useState({
|
|
|
|
+ pageSize: 20,
|
|
|
|
+ total: 0,
|
|
|
|
+ current: 1,
|
|
|
|
+ });
|
|
|
|
+ const [currentParams, setCurrentParams] = useState({
|
|
|
|
+ project_id,
|
|
|
|
+ mandate_type: mandateType,
|
|
|
|
+ pageSize: 20,
|
|
|
|
+ currentPage: 2,
|
|
|
|
+ });
|
|
|
|
|
|
- for (let i = 0; i < value.length; i++) {
|
|
|
|
- if (value[i] !== null) {
|
|
|
|
- tempList = tempList.filter(
|
|
|
|
- // @ts-ignore
|
|
|
|
- (item) => item[topFilters[i].key] === value[i],
|
|
|
|
- );
|
|
|
|
- console.log(tempList.length);
|
|
|
|
|
|
+ const { run: getList, loading: loadData } = useRequest(getMandateList, {
|
|
|
|
+ defaultParams: [
|
|
|
|
+ {
|
|
|
|
+ project_id,
|
|
|
|
+ mandate_type: mandateType,
|
|
|
|
+ pageSize: mandatePage.pageSize,
|
|
|
|
+ currentPage: mandatePage.current,
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ formatResult: (result) => {
|
|
|
|
+ if (result.data.pagination.current === 1) {
|
|
|
|
+ setMandateList(result.data.list);
|
|
|
|
+ } else {
|
|
|
|
+ setMandateList([...mandateList, ...result.data.list]);
|
|
}
|
|
}
|
|
- }
|
|
|
|
-
|
|
|
|
- setMandateListShow(tempList);
|
|
|
|
- };
|
|
|
|
|
|
+ const pageInfo = result.data.pagination;
|
|
|
|
+ pageInfo.current += 1;
|
|
|
|
+ setMandatePage(pageInfo);
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
|
|
// 获取用户
|
|
// 获取用户
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
@@ -71,26 +90,19 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
payload: { project_id },
|
|
payload: { project_id },
|
|
});
|
|
});
|
|
}
|
|
}
|
|
- if (mandateList.length === 0) {
|
|
|
|
- dispatch({
|
|
|
|
- type: 'mandate/fetchMandateList',
|
|
|
|
- payload: { project_id, mandate_type: mandateType, pageSize: 9999 },
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
- // 获取列表
|
|
|
|
|
|
+ // 首次获取任务数据
|
|
|
|
+
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
- setMandateListShow(
|
|
|
|
- mandateList.filter((item) => item.MandateType === mandateType),
|
|
|
|
- );
|
|
|
|
|
|
+ setMandateListShow(mandateList);
|
|
}, [mandateList]);
|
|
}, [mandateList]);
|
|
|
|
|
|
- // 顶部下拉过滤器
|
|
|
|
|
|
+ // 顶部下拉过滤器配置
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
const filters: ITopFilter[] = [];
|
|
const filters: ITopFilter[] = [];
|
|
filters.push({
|
|
filters.push({
|
|
- key: 'MandateClass',
|
|
|
|
|
|
+ key: 'mandate_class',
|
|
placeholder: '任务类别',
|
|
placeholder: '任务类别',
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
options: MandateClass.map((item) => {
|
|
options: MandateClass.map((item) => {
|
|
@@ -106,7 +118,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
});
|
|
});
|
|
|
|
|
|
filters.push({
|
|
filters.push({
|
|
- key: 'Status',
|
|
|
|
|
|
+ key: 'status',
|
|
placeholder: '任务状态',
|
|
placeholder: '任务状态',
|
|
options: MandateStatus.map((item) => {
|
|
options: MandateStatus.map((item) => {
|
|
return {
|
|
return {
|
|
@@ -114,12 +126,57 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
};
|
|
};
|
|
}),
|
|
}),
|
|
});
|
|
});
|
|
- setTopFilters(filters);
|
|
|
|
- setMandateListShow(
|
|
|
|
- mandateList.filter((item) => item.MandateType === mandateType),
|
|
|
|
- );
|
|
|
|
|
|
+ setTopFiltersConfig(filters);
|
|
|
|
+ // setMandateListShow(
|
|
|
|
+ // mandateList.filter((item) => item.MandateType === mandateType),
|
|
|
|
+ // );
|
|
}, [mandateType]);
|
|
}, [mandateType]);
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 处理选择器变化
|
|
|
|
+ * @param value 选择的值,当清空时等于null
|
|
|
|
+ */
|
|
|
|
+ const onTopFilterChange = (value: any) => {
|
|
|
|
+ if (topFiltersConfig.length === 0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ const params: any = {
|
|
|
|
+ project_id,
|
|
|
|
+ mandate_type: mandateType,
|
|
|
|
+ pageSize: mandatePage.pageSize,
|
|
|
|
+ currentPage: 1,
|
|
|
|
+ };
|
|
|
|
+ for (let i = 0; i < value.length; i++) {
|
|
|
|
+ if (value[i] !== null && topFiltersConfig[i] !== undefined) {
|
|
|
|
+ params[topFiltersConfig[i].key] = value[i];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ getList(params);
|
|
|
|
+ params.currentPage += 1;
|
|
|
|
+ setCurrentParams(params);
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const loadMoreMandate =
|
|
|
|
+ !loadData && mandateListShow.length > mandatePage.total ? (
|
|
|
|
+ <div
|
|
|
|
+ style={{
|
|
|
|
+ textAlign: 'center',
|
|
|
|
+ marginTop: 12,
|
|
|
|
+ height: 32,
|
|
|
|
+ lineHeight: '32px',
|
|
|
|
+ fontSize: '28px',
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ <Button
|
|
|
|
+ type="text"
|
|
|
|
+ size="large"
|
|
|
|
+ style={{ fontSize: '28px', height: '56px', width: '160px' }}
|
|
|
|
+ >
|
|
|
|
+ 加载更多
|
|
|
|
+ </Button>
|
|
|
|
+ </div>
|
|
|
|
+ ) : null;
|
|
|
|
+
|
|
const goTaskDetail = (mandate: IMandateType) => {
|
|
const goTaskDetail = (mandate: IMandateType) => {
|
|
navigate(
|
|
navigate(
|
|
`/task-manage/list/detail?project_id=${project_id}&mandate_id=${mandate.Id}`,
|
|
`/task-manage/list/detail?project_id=${project_id}&mandate_id=${mandate.Id}`,
|
|
@@ -146,6 +203,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
ResponsiblePeople: userList.find(
|
|
ResponsiblePeople: userList.find(
|
|
(user) => user.ID === item.ResponsiblePeople,
|
|
(user) => user.ID === item.ResponsiblePeople,
|
|
),
|
|
),
|
|
|
|
+ CreateTime: moment(item.CreateTime).format('YYYY-MM-DD HH:mm'),
|
|
};
|
|
};
|
|
|
|
|
|
const workOrder = item.Records.map((record) => {
|
|
const workOrder = item.Records.map((record) => {
|
|
@@ -155,6 +213,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
Status: OrderStatus.find((status) => status.value === record.Status),
|
|
Status: OrderStatus.find((status) => status.value === record.Status),
|
|
RecordType: OrderType.find((type) => type.value === record.RecordType),
|
|
RecordType: OrderType.find((type) => type.value === record.RecordType),
|
|
Responsible: userList.find((user) => user.ID === record.Responsible),
|
|
Responsible: userList.find((user) => user.ID === record.Responsible),
|
|
|
|
+ CreateTime: moment(record.CreateTime).format('YYYY-MM-DD HH:mm'),
|
|
};
|
|
};
|
|
});
|
|
});
|
|
|
|
|
|
@@ -170,7 +229,7 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
<div className={styles.leftInfo}>
|
|
<div className={styles.leftInfo}>
|
|
<Row style={{ marginBottom: '15px' }}>
|
|
<Row style={{ marginBottom: '15px' }}>
|
|
<Col className={styles.fontS24} span={12}>
|
|
<Col className={styles.fontS24} span={12}>
|
|
- 工单编号:{order.Id}
|
|
|
|
|
|
+ 工单类型:{order.RecordType?.label || '-'}
|
|
</Col>
|
|
</Col>
|
|
<Col className={styles.fontS24} span={12}>
|
|
<Col className={styles.fontS24} span={12}>
|
|
时间:{order.CreateTime}
|
|
时间:{order.CreateTime}
|
|
@@ -208,17 +267,20 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
<List.Item>
|
|
<List.Item>
|
|
<div className={`${styles.cardContainer} card-box`}>
|
|
<div className={`${styles.cardContainer} card-box`}>
|
|
<Row justify="space-between" style={{ marginBottom: '20px' }}>
|
|
<Row justify="space-between" style={{ marginBottom: '20px' }}>
|
|
- <Col className={styles.fontS24}>时间:{formatItem.CreateTime}</Col>
|
|
|
|
|
|
+ <Col className={styles.fontS24}>时间:{formatItem.CreateTime}</Col>
|
|
<Col className={styles.fontS24}>
|
|
<Col className={styles.fontS24}>
|
|
- 任务类别:{formatItem.MandateClass?.label}
|
|
|
|
|
|
+ 任务类别:{formatItem.MandateClass?.label}
|
|
</Col>
|
|
</Col>
|
|
<Col className={styles.fontS24}>
|
|
<Col className={styles.fontS24}>
|
|
- 任务负责人:{formatItem.ResponsiblePeople?.CName || '-'}
|
|
|
|
|
|
+ 任务负责人:{formatItem.ResponsiblePeople?.CName || '-'}
|
|
</Col>
|
|
</Col>
|
|
</Row>
|
|
</Row>
|
|
<Row
|
|
<Row
|
|
justify="space-between"
|
|
justify="space-between"
|
|
- style={{ paddingBottom: '10px', borderBottom: '1px solid gray' }}
|
|
|
|
|
|
+ style={{
|
|
|
|
+ paddingBottom: '10px',
|
|
|
|
+ borderBottom: '1px solid #D5D5D5',
|
|
|
|
+ }}
|
|
>
|
|
>
|
|
<Col className={styles.fontS24}>
|
|
<Col className={styles.fontS24}>
|
|
任务状态:{formatItem.Status?.label || '-'}
|
|
任务状态:{formatItem.Status?.label || '-'}
|
|
@@ -247,6 +309,12 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
<Collapse
|
|
<Collapse
|
|
className={styles.collapseLabel}
|
|
className={styles.collapseLabel}
|
|
ghost
|
|
ghost
|
|
|
|
+ expandIcon={({ isActive }) => (
|
|
|
|
+ <DownOutlined
|
|
|
|
+ style={{ color: '#5697e4' }}
|
|
|
|
+ rotate={isActive ? 180 : 0}
|
|
|
|
+ />
|
|
|
|
+ )}
|
|
items={collapseData}
|
|
items={collapseData}
|
|
/>
|
|
/>
|
|
</Row>
|
|
</Row>
|
|
@@ -256,22 +324,22 @@ const TaskList: React.FC<IPropsType> = (props) => {
|
|
};
|
|
};
|
|
|
|
|
|
return (
|
|
return (
|
|
- <PageContent>
|
|
|
|
|
|
+ <PageContent closeable={false}>
|
|
<PageTitle returnable>
|
|
<PageTitle returnable>
|
|
{MandateType.find((item) => item.value === mandateType)?.label}
|
|
{MandateType.find((item) => item.value === mandateType)?.label}
|
|
</PageTitle>
|
|
</PageTitle>
|
|
- <TopFilter filters={topFilters} onChange={onTopFilterChange} />
|
|
|
|
- <Spin spinning={loading}>
|
|
|
|
|
|
+ <TopFilter filters={topFiltersConfig} onChange={onTopFilterChange} />
|
|
|
|
+ <Spin spinning={loading || loadData}>
|
|
<List
|
|
<List
|
|
itemLayout="horizontal"
|
|
itemLayout="horizontal"
|
|
dataSource={mandateListShow}
|
|
dataSource={mandateListShow}
|
|
renderItem={buildTaskList}
|
|
renderItem={buildTaskList}
|
|
|
|
+ loadMore={loadMoreMandate}
|
|
/>
|
|
/>
|
|
</Spin>
|
|
</Spin>
|
|
</PageContent>
|
|
</PageContent>
|
|
);
|
|
);
|
|
};
|
|
};
|
|
-
|
|
|
|
export default connect(
|
|
export default connect(
|
|
({
|
|
({
|
|
taskUser,
|
|
taskUser,
|
|
@@ -279,13 +347,11 @@ export default connect(
|
|
loading,
|
|
loading,
|
|
}: any): {
|
|
}: any): {
|
|
userList: IUserType[];
|
|
userList: IUserType[];
|
|
- mandateList: IMandateType[];
|
|
|
|
loading: boolean;
|
|
loading: boolean;
|
|
} => {
|
|
} => {
|
|
return {
|
|
return {
|
|
userList: taskUser.userList,
|
|
userList: taskUser.userList,
|
|
- mandateList: mandate.mandateList,
|
|
|
|
- loading: loading.models['taskUser'] || loading.models['mandate'],
|
|
|
|
|
|
+ loading: loading.models['taskUser'],
|
|
};
|
|
};
|
|
},
|
|
},
|
|
)(TaskList);
|
|
)(TaskList);
|