李志伟 3 年之前
父節點
當前提交
4c9b126d67

+ 3
- 3
config/proxy.js 查看文件

@@ -11,11 +11,11 @@ export default {
11 11
     // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
12 12
     '/api/': {
13 13
       // 要代理的地址
14
-      target: 'http://192.168.89.147:9000',
14
+      target: 'http://192.168.89.147:9001',
15 15
       changeOrigin: true,
16 16
       headers: {
17
-        origin: 'http://192.168.89.147:9000',
18
-        referer: 'http://192.168.89.147:9000',
17
+        origin: 'http://192.168.89.147:9001',
18
+        referer: 'http://192.168.89.147:9001',
19 19
       },
20 20
 
21 21
       // target: 'http://resumework-service.njyunzhi.com',

+ 6
- 0
config/routes.js 查看文件

@@ -18,6 +18,12 @@ export default [
18 18
       },
19 19
     ],
20 20
   },
21
+  {
22
+    path: '/dashboard',
23
+    name: '工作台',
24
+    icon: 'DashboardOutlined',
25
+    component: './dashboard',
26
+  },
21 27
   {
22 28
     path: '/',
23 29
     name: '工作台',

二進制
public/wordLogo.png 查看文件


+ 55
- 0
src/components/OrgSearch/index.jsx 查看文件

@@ -0,0 +1,55 @@
1
+import { useEffect, useState } from 'react';
2
+import { Select } from 'antd'
3
+import { getDetail } from '@/services/org'
4
+import { getList } from '@/services/org'
5
+
6
+const Option = Select.Option;
7
+export default (props) => {
8
+  const { value, onChange, ...otherProps } = props;
9
+
10
+  const showType = 0; // 不显示报错
11
+
12
+  const [list, setList] = useState([])
13
+
14
+  const searchData = (val) => { 
15
+    getList({ pageSize: 999,orgName:val }, showType).then(res => {
16
+      setList(res.records || [])
17
+    })    
18
+  }
19
+
20
+  const handleSearch = (text) => {
21
+    if (text) {
22
+      searchData(text)
23
+    }
24
+  }
25
+
26
+  useEffect(() => {
27
+    if (value) {
28
+      getDetail(value).then((res) => {
29
+        setList([res])
30
+      })
31
+    }
32
+  }, [value])
33
+
34
+  return (
35
+    <Select
36
+      showSearch
37
+      value={value}
38
+      defaultActiveFirstOption={false}
39
+      showArrow={false}
40
+      filterOption={false}
41
+      onSearch={handleSearch}
42
+      onChange={onChange}
43
+      notFoundContent={null}
44
+      {...otherProps}
45
+    >
46
+      {
47
+        list.map((item) => {
48
+          return (
49
+            <Option key={item.orgId} value={item.orgId}>{item.orgName}</Option>
50
+          )
51
+        })
52
+      }
53
+    </Select>
54
+  )
55
+}

+ 131
- 0
src/pages/dashboard/components/OrgScollList/index.jsx 查看文件

@@ -0,0 +1,131 @@
1
+import { Card, Row, Col, List } from 'antd'
2
+import { useEffect, useState, useRef } from 'react';
3
+import moment from 'moment';
4
+
5
+import './style.less'
6
+
7
+export default (props) => {
8
+  const { list } = props
9
+  let scrollTimeout = null;
10
+  const [listHeight, setListHeight] = useState(0);
11
+  const [hoverState, setHoverState] = useState(false);
12
+  const scrollRef = useRef();
13
+  const formatterTime = (val) => {
14
+    return val ? moment(val).format('YYYY-MM-DD HH:mm') : '';
15
+  };
16
+  const computeHeight = () => {
17
+    scrollTimeout = setTimeout(() => {
18
+      setListHeight(scrollRef.current && scrollRef.current.offsetHeight || 0)
19
+    }, 0)
20
+  };
21
+  useEffect(() => {
22
+    if (list != []) {
23
+      computeHeight()
24
+    }
25
+  }, [list])
26
+
27
+  return (
28
+    <>
29
+      <Row>
30
+        <Col span={8} align='center'>
31
+          <span className='tableHead'>企业名称</span>
32
+        </Col>
33
+        <Col span={8} align='center'>
34
+          <span className='tableHead'>创建时间</span>
35
+        </Col>
36
+        <Col span={8} align='center'>
37
+          <span className='tableHead'>历史最多人次</span>
38
+        </Col>
39
+      </Row>
40
+      {
41
+        list?.length > 12 ?
42
+          <div
43
+            className={listHeight > 200 ? 'scroll' : ''}
44
+            style={{ marginLeft: '10px', marginTop: '20px' }}
45
+            onMouseEnter={() => setHoverState(true)}
46
+            onMouseLeave={() => setHoverState(false)}
47
+          >
48
+            <div className={`scroll-list ${hoverState ? 'hover' : ''}`}
49
+              style={{ animationDuration: `${list.length}s` }}
50
+              ref={scrollRef}>
51
+              <List
52
+                id="scrollList"
53
+                dataSource={list}
54
+                renderItem={(item, index) => (
55
+                  <List.Item>
56
+                    <Row style={{ width: '100%' }}>
57
+                      <Col span={8}>
58
+                        {item.orgName}
59
+                      </Col>
60
+                      <Col span={8} align='center'>
61
+                        {formatterTime(item.createDate)}
62
+                      </Col>
63
+                      <Col span={8} align='center'>
64
+                        {item.totalReportNum || <span style={{ color: 'red' }} >0</span>}
65
+                      </Col>
66
+                    </Row>
67
+                  </List.Item>
68
+                )}
69
+              />
70
+            </div>
71
+            {
72
+              list.length > 2 &&
73
+              <div
74
+                className={`scroll-list ${hoverState ? 'hover' : ''}`}
75
+                style={{ animationDuration: `${list.length}s` }}
76
+                ref={scrollRef}>
77
+                <List
78
+                  dataSource={list}
79
+                  renderItem={(item, index) => (
80
+                    <List.Item>
81
+                      <Row style={{ width: '100%' }}>
82
+                        <Col span={8}>
83
+                          {item.orgName}
84
+                        </Col>
85
+                        <Col span={8} align='center'>
86
+                          {formatterTime(item.createDate)}
87
+                        </Col>
88
+                        <Col span={8} align='center'>
89
+                          {item.totalReportNum || <span style={{ color: 'red' }} >0</span>}
90
+                        </Col>
91
+                      </Row>
92
+                    </List.Item>
93
+                  )}
94
+                />
95
+              </div>
96
+            }
97
+          </div>
98
+          : list?.length > 0 &&
99
+          <div
100
+            style={{ marginLeft: '10px', marginTop: '20px' }}
101
+            onMouseEnter={() => setHoverState(true)}
102
+            onMouseLeave={() => setHoverState(false)}
103
+          >
104
+            <div className={`scroll-list`}
105
+              style={{ animationDuration: `${list.length}s` }}
106
+              ref={scrollRef}>
107
+              <List
108
+                id="scrollList"
109
+                dataSource={list}
110
+                renderItem={(item, index) => (
111
+                  <List.Item>
112
+                    <Row style={{ width: '100%' }}>
113
+                      <Col span={8}>
114
+                        {item.orgName}
115
+                      </Col>
116
+                      <Col span={8} align='center'>
117
+                        {formatterTime(item.createDate)}
118
+                      </Col>
119
+                      <Col span={8} align='center'>
120
+                        {item.totalReportNum || <span style={{ color: 'red' }} >0</span>}
121
+                      </Col>
122
+                    </Row>
123
+                  </List.Item>
124
+                )}
125
+              />
126
+            </div>
127
+          </div>
128
+      }
129
+    </>
130
+  )
131
+}

+ 26
- 0
src/pages/dashboard/components/OrgScollList/style.less 查看文件

@@ -0,0 +1,26 @@
1
+.scroll {
2
+  height: 600px;  
3
+  overflow: hidden;  
4
+  .scroll-list {  
5
+    animation: moveup 7s linear infinite normal;
6
+
7
+    // 动画名称 执行时间 动画方式: 匀速 动画次数:无限次infinite 动画方向
8
+
9
+    &.hover {  
10
+      animation-play-state: paused;  
11
+    }  
12
+  }  
13
+}  
14
+
15
+@keyframes moveup {  
16
+  0% {  
17
+    transform: translateY(0);  
18
+  }  
19
+  100% {  
20
+    transform: translateY(-100%);  
21
+  }  
22
+}
23
+
24
+.tableHead{
25
+  color: rgb(40, 165, 255);
26
+}

+ 131
- 0
src/pages/dashboard/components/ResumeWorkScollList/index.jsx 查看文件

@@ -0,0 +1,131 @@
1
+import { Row, Col, List } from 'antd'
2
+import { useEffect, useState, useRef } from 'react';
3
+import moment from 'moment';
4
+
5
+import './style.less'
6
+
7
+export default (props) => {
8
+  const { list } = props
9
+  let scrollTimeout = null;
10
+  const [listHeight, setListHeight] = useState(0);
11
+  const [hoverState, setHoverState] = useState(false);
12
+  const scrollRef = useRef();
13
+  const formatterTime = (val) => {
14
+    return val ? moment(val).format('YYYY-MM-DD HH:mm') : '';
15
+  };
16
+  const computeHeight = () => {
17
+    scrollTimeout = setTimeout(() => {
18
+      setListHeight(scrollRef.current && scrollRef.current.offsetHeight || 0)
19
+    }, 0)
20
+  };
21
+  useEffect(() => {
22
+    if (list != []) {
23
+      computeHeight()
24
+    }
25
+  }, [list])
26
+
27
+  return (
28
+    <>
29
+      <Row>
30
+        <Col span={8} align='center'>
31
+          <span className='tableHead'>企业名称</span>
32
+        </Col>
33
+        <Col span={8} align='center'>
34
+          <span className='tableHead'>姓名</span>
35
+        </Col>
36
+        <Col span={8} align='center'>
37
+          <span className='tableHead'>申请时间</span>
38
+        </Col>
39
+      </Row>
40
+      {list?.length > 12 ?
41
+        <div
42
+          className={listHeight > 200 ? 'scroll' : ''}
43
+          style={{ marginLeft: '10px', marginTop: '20px' }}
44
+          onMouseEnter={() => setHoverState(true)}
45
+          onMouseLeave={() => setHoverState(false)}
46
+        >
47
+          <div className={`scroll-list ${hoverState ? 'hover' : ''}`}
48
+            style={{ animationDuration: `${list.length}s` }}
49
+            ref={scrollRef}>
50
+            <List
51
+              id="scrollList"
52
+              dataSource={list}
53
+              renderItem={(item, index) => (
54
+                <List.Item>
55
+                  <Row style={{ width: '100%' }}>
56
+                    <Col span={8}>
57
+                      {item.orgName}
58
+                    </Col>
59
+                    <Col span={8} align='center'>
60
+                      {item.userName}
61
+                    </Col>
62
+                    <Col span={8} align='center'>
63
+                      {formatterTime(item.createDate)}
64
+                    </Col>
65
+                  </Row>
66
+                </List.Item>
67
+              )}
68
+            />
69
+          </div>
70
+          {
71
+            list.length > 2 &&
72
+            <div
73
+              className={`scroll-list ${hoverState ? 'hover' : ''}`}
74
+              style={{ animationDuration: `${list.length}s` }}
75
+              ref={scrollRef}>
76
+              <List
77
+                dataSource={list}
78
+                renderItem={(item, index) => (
79
+                  <List.Item>
80
+                    <Row style={{ width: '100%' }}>
81
+                      <Col span={8}>
82
+                        {item.orgName}
83
+                      </Col>
84
+                      <Col span={8} align='center'>
85
+                        {item.userName}
86
+                      </Col>
87
+                      <Col span={8} align='center'>
88
+                        {formatterTime(item.createDate)}
89
+                      </Col>
90
+                    </Row>
91
+                  </List.Item>
92
+                )}
93
+              />
94
+            </div>
95
+          }
96
+        </div>
97
+        : list?.length > 0 &&
98
+        <div
99
+          style={{ marginLeft: '10px', marginTop: '20px' }}
100
+          onMouseEnter={() => setHoverState(true)}
101
+          onMouseLeave={() => setHoverState(false)}
102
+        >
103
+          <div className={`scroll-list`}
104
+            style={{ animationDuration: `${list.length}s` }}
105
+            ref={scrollRef}>
106
+            <List
107
+              id="scrollList"
108
+              dataSource={list}
109
+              renderItem={(item, index) => (
110
+                <List.Item>
111
+                  <Row style={{ width: '100%' }}>
112
+                    <Col span={8}>
113
+                      {item.orgName}
114
+                    </Col>
115
+                    <Col span={8} align='center'>
116
+                      {item.userName}
117
+                    </Col>
118
+                    <Col span={8} align='center'>
119
+                      {formatterTime(item.createDate)}
120
+                    </Col>
121
+                  </Row>
122
+                </List.Item>
123
+              )}
124
+            />
125
+          </div>
126
+        </div>
127
+
128
+      }
129
+    </>
130
+  )
131
+}

+ 26
- 0
src/pages/dashboard/components/ResumeWorkScollList/style.less 查看文件

@@ -0,0 +1,26 @@
1
+.scroll {
2
+  height: 600px;  
3
+  overflow: hidden;  
4
+  .scroll-list {  
5
+    animation: moveup 7s linear infinite normal;
6
+
7
+    // 动画名称 执行时间 动画方式: 匀速 动画次数:无限次infinite 动画方向
8
+
9
+    &.hover {  
10
+      animation-play-state: paused;  
11
+    }  
12
+  }  
13
+}  
14
+
15
+@keyframes moveup {  
16
+  0% {  
17
+    transform: translateY(0);  
18
+  }  
19
+  100% {  
20
+    transform: translateY(-100%);  
21
+  }  
22
+}
23
+
24
+.tableHead{
25
+  color: rgb(40, 165, 255);
26
+}

+ 136
- 0
src/pages/dashboard/index.jsx 查看文件

@@ -0,0 +1,136 @@
1
+import { useEffect, useState } from 'react';
2
+import { PageHeaderWrapper } from '@ant-design/pro-layout';
3
+import moment from 'moment';
4
+import { Card, Row, Col, Empty } from 'antd'
5
+import { getList as getOrgList } from '@/services/org'
6
+import { getList as getResumeWorkList } from '@/services/work'
7
+import { getcomm } from '@/services/comm';
8
+import ResumeWorkScollList from './components/ResumeWorkScollList';
9
+import OrgScollList from './components/OrgScollList';
10
+import './style.less'
11
+
12
+export default (props) => {
13
+  const [cardData, setCardData] = useState()
14
+  const [orgList, setOrgList] = useState([])
15
+  const [resumeWorkList, setResumeWorkList] = useState([])
16
+  const nowDate = () => {
17
+    var strArray = moment(Date.now()).format('YYYY/MM/DD').split("/");
18
+    strArray = strArray.map(function (val) {
19
+      if (val[0] == "0") {
20
+        return val.slice(1);
21
+      } else {
22
+        return val;
23
+      }
24
+    });
25
+    return strArray.join("/");
26
+  }
27
+  const header = (
28
+    <Row justify='space-between' align='middle' >
29
+      <Col span={2}>
30
+        <img src="./wordLogo.png" />
31
+      </Col>
32
+      <Col style={{ fontSize: '24px', fontWeight: 'bold' }}>ubpa-疫情防控管理平台</Col>
33
+      <Col span={2} style={{ textAlign: 'right' }}>{nowDate()}</Col>
34
+    </Row>
35
+  )
36
+
37
+  useEffect(() => {
38
+    getcomm().then((res) => {
39
+      setCardData(res);
40
+    })
41
+    getOrgList({ pageSize: 500 }).then((res) => {
42
+      setOrgList(res.records)
43
+    })
44
+    getResumeWorkList(
45
+      {
46
+        pageSize: 500,
47
+        start: moment(Date.now()).format('YYYY-MM-DD'),
48
+        end: moment(Date.now()).format('YYYY-MM-DD'),
49
+        isAll: true
50
+      }).then(res => {
51
+        setResumeWorkList(res.records)
52
+      })
53
+  }, [])
54
+  return (
55
+    <PageHeaderWrapper content={header} className='dashboardPage'>
56
+      <Row justify='space-around' >
57
+        <Col span={4}>
58
+          <Card className='dashboardCard'>
59
+            <div>
60
+              企业总数
61
+            </div>
62
+            <div className='amount'>
63
+              {cardData?.orgTotalNum || 0}
64
+            </div>
65
+          </Card>
66
+          <Card className='dashboardCard' style={{ marginTop: '24px' }}>
67
+            <div>
68
+              无数据企业
69
+            </div>
70
+            <div className='amount'>
71
+              {cardData?.noDataOrgNum || 0}/{cardData?.orgTotalNum || 0}
72
+            </div>
73
+          </Card>
74
+        </Col>
75
+        <Col span={4}>
76
+          <Card className='dashboardCard'>
77
+            <div>
78
+              今日提交总人数
79
+            </div>
80
+            <div className='amount'>
81
+              {cardData?.todayReportNum || 0}
82
+            </div>
83
+          </Card>
84
+          <Card className='dashboardCard' style={{ marginTop: '24px' }}>
85
+            <div>
86
+              昨日提交总人数
87
+            </div>
88
+            <div className='amount'>
89
+              {cardData?.yestodayReportNum || 0}
90
+            </div>
91
+          </Card>
92
+        </Col>
93
+        <Col span={4}>
94
+          <Card className='dashboardCard'>
95
+            <div>
96
+              今日正常人数
97
+            </div>
98
+            <div className='amount' style={{ color: 'green' }}>
99
+              {cardData?.todayNormalNum || 0}
100
+            </div>
101
+          </Card>
102
+          <Card className='dashboardCard' style={{ marginTop: '24px' }}>
103
+            <div>
104
+              今日异常人数
105
+            </div>
106
+            <div className='amount' style={{ color: 'red' }}>
107
+              {(cardData?.todayReportNum || 0) - (cardData?.todayNormalNum || 0)}
108
+            </div>
109
+          </Card>
110
+        </Col>
111
+      </Row>
112
+      <Row>
113
+        <Col span={12}>
114
+          <Card style={{ marginTop: '16px', height: '736px' }} title='企业数据总览'>            
115
+            {orgList != [] ?
116
+              <OrgScollList list={orgList} /> :
117
+              <div style={{ height: '624px', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
118
+                <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
119
+              </div>
120
+            }
121
+          </Card>
122
+        </Col>
123
+        <Col span={12}>
124
+          <Card style={{ marginTop: '16px', height: '736px' }} title='今日数据提交记录'>
125
+            {resumeWorkList != [] ?
126
+              <ResumeWorkScollList list={resumeWorkList} /> :
127
+              <div style={{ height: '624px', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
128
+                <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
129
+              </div>
130
+            }
131
+          </Card>
132
+        </Col>
133
+      </Row>
134
+    </PageHeaderWrapper>
135
+  )
136
+}

+ 7
- 0
src/pages/dashboard/style.less 查看文件

@@ -0,0 +1,7 @@
1
+.dashboardPage{
2
+  .dashboardCard{
3
+    text-align: center;
4
+    font-size: 20px;
5
+    .amount{margin-top: 16px;}
6
+  }
7
+}

+ 8
- 0
src/pages/org/org/Edit.jsx 查看文件

@@ -15,6 +15,7 @@ export default (props) => {
15 15
   useEffect(() => {
16 16
     if (id) {
17 17
       getDetail(id).then(res => {
18
+
18 19
         setFormData(res);
19 20
         form.setFieldsValue(res);
20 21
       })
@@ -65,6 +66,13 @@ export default (props) => {
65 66
             >
66 67
               <Input />
67 68
             </Form.Item>
69
+            <Form.Item
70
+              label="权重"
71
+              name="weight"
72
+              rules={[{ required: true, message: '请填写企业名称!' }]}
73
+            >
74
+              <Input type='number' min='0' />
75
+            </Form.Item>
68 76
             <Form.Item wrapperCol={{ offset: 8, span: 16 }}>
69 77
               <Button type="primary" htmlType="submit" loading={loading}>
70 78
                 保存

+ 11
- 9
src/pages/resumework/form/index.jsx 查看文件

@@ -6,6 +6,7 @@ import { PageHeaderWrapper } from '@ant-design/pro-layout';
6 6
 import { getList, exportList } from '@/services/work'
7 7
 import PageTable from '@/components/PageTable'
8 8
 import useOrgList from '@/utils/hooks/useOrgList';
9
+import OrgSearch from '@/components/OrgSearch';
9 10
 
10 11
 const { RangePicker } = DatePicker;
11 12
 const { Option } = Select;
@@ -18,7 +19,7 @@ const formatterTime = (val) => {
18 19
 export default (props) => {
19 20
   const initDate = useRef(moment())
20 21
   const actionRef = useRef();
21
-  const { orgList } = useOrgList()
22
+  // const { orgList } = useOrgList()
22 23
 
23 24
   const handleBeforSearch = (params) => {
24 25
     const { createDate, ...others } = params;
@@ -42,15 +43,16 @@ export default (props) => {
42 43
       dataIndex: 'orgId',
43 44
       key: 'orgId',
44 45
       search: true,
45
-      render: t => orgList.filter(x => x.orgId === t)[0]?.orgName,
46
+      // render: t => orgList.filter(x => x.orgId === t)[0]?.orgName,
46 47
       renderFormItem: () => (
47
-        <Select>
48
-          {orgList.map((item) => (
49
-            <Option value={item.orgId} key={item.orgId}>
50
-              {item.orgName}
51
-            </Option>
52
-          ))}
53
-        </Select>
48
+        // <Select>
49
+        //   {orgList.map((item) => (
50
+        //     <Option value={item.orgId} key={item.orgId}>
51
+        //       {item.orgName}
52
+        //     </Option>
53
+        //   ))}
54
+        // </Select>
55
+        <OrgSearch />
54 56
       ),
55 57
       formItemProps: {
56 58
         rules: [

+ 4
- 0
src/services/comm.js 查看文件

@@ -0,0 +1,4 @@
1
+import request from '@/utils/request';
2
+
3
+// 获取首页卡片信息
4
+export const getcomm = (params) => request('/statis/comm', { params });