Yansen 2 anni fa
parent
commit
5e17275ebf

+ 12
- 3672
package-lock.json
File diff suppressed because it is too large
Vedi File


+ 1
- 1
package.json Vedi File

13
     "@ant-design/pro-components": "^2.3.51",
13
     "@ant-design/pro-components": "^2.3.51",
14
     "@wangeditor/editor": "^5.1.23",
14
     "@wangeditor/editor": "^5.1.23",
15
     "@wangeditor/editor-for-react": "^1.0.6",
15
     "@wangeditor/editor-for-react": "^1.0.6",
16
-    "@zjxpcyc/react-tiny-store": "^2.0.1",
16
+    "@zjxpcyc/react-tiny-store": "^2.0.3",
17
     "antd": "^5.1.2",
17
     "antd": "^5.1.2",
18
     "axios": "^1.2.0",
18
     "axios": "^1.2.0",
19
     "classnames": "^2.3.2",
19
     "classnames": "^2.3.2",

+ 1
- 1
src/layouts/AuthLayout/components/Header/index.jsx Vedi File

18
 
18
 
19
   return (
19
   return (
20
     <Header className={className}>
20
     <Header className={className}>
21
-      <Logo />
21
+      <Logo user={user} />
22
       <Space>
22
       <Space>
23
         <User user={user} />
23
         <User user={user} />
24
         <Exit />
24
         <Exit />

+ 5
- 1
src/layouts/AuthLayout/components/Logo.jsx Vedi File

2
 import { Typography } from 'antd';
2
 import { Typography } from 'antd';
3
 import { NavLink } from "react-router-dom";
3
 import { NavLink } from "react-router-dom";
4
 import { useModel } from '@/store';
4
 import { useModel } from '@/store';
5
+import useOrgResponsible from '@/utils/hooks/useOrgResponsible';
5
 
6
 
6
 export default (props) => {
7
 export default (props) => {
7
   const { app } = useModel('system');
8
   const { app } = useModel('system');
8
 
9
 
10
+  const [isResponsible] = useOrgResponsible();
11
+  const url = isResponsible ? '/issue' : '/';
12
+
9
   return (
13
   return (
10
-    <NavLink className='logo'  to="/">
14
+    <NavLink className='logo' to={url}>
11
       <img src="./logo.png" alt="" />
15
       <img src="./logo.png" alt="" />
12
       <h3>{app.shorName}</h3>
16
       <h3>{app.shorName}</h3>
13
     </NavLink>
17
     </NavLink>

+ 6
- 1
src/layouts/AuthLayout/index.jsx Vedi File

1
 import React, { useEffect } from 'react';
1
 import React, { useEffect } from 'react';
2
 import { Layout, Spin } from 'antd';
2
 import { Layout, Spin } from 'antd';
3
-import { useLocation, Outlet } from "react-router-dom";
3
+import { useLocation, Outlet, Navigate } from "react-router-dom";
4
 import { useModel } from '@/store';
4
 import { useModel } from '@/store';
5
 import useRoute from '@/utils/hooks/useRoute';
5
 import useRoute from '@/utils/hooks/useRoute';
6
 import RequireLogin from './components/RequireLogin';
6
 import RequireLogin from './components/RequireLogin';
18
   const { meta } = useRoute() || {};
18
   const { meta } = useRoute() || {};
19
   const { noLayout = false, noSiderBar = false, noFooter = false } = meta || {};
19
   const { noLayout = false, noSiderBar = false, noFooter = false } = meta || {};
20
 
20
 
21
+  const { org } = user || {};
22
+  if (location.pathname == '/' && org?.isResponsible) {
23
+    return <Navigate to="/issue" replace />
24
+  }
25
+
21
   return (
26
   return (
22
     <Spin spinning={!user} size="large">
27
     <Spin spinning={!user} size="large">
23
       <HtmlTitle />
28
       <HtmlTitle />

+ 1
- 1
src/pages/home/index.jsx Vedi File

1
 import React from 'react'
1
 import React from 'react'
2
 import { Row, Col } from 'antd';
2
 import { Row, Col } from 'antd';
3
+import Page from '@/components/Page';
3
 import Banner from './components/Banner';
4
 import Banner from './components/Banner';
4
 import EscalationCharts from './components/EscalationCharts';
5
 import EscalationCharts from './components/EscalationCharts';
5
 import AssignedCharts from './components/AssignedCharts';
6
 import AssignedCharts from './components/AssignedCharts';
6
 import ProblemCharts from './components/ProblemCharts';
7
 import ProblemCharts from './components/ProblemCharts';
7
 import SpotCharts from './components/SpotCharts';
8
 import SpotCharts from './components/SpotCharts';
8
-import Page from '@/components/Page';
9
 
9
 
10
 export default (props) => {
10
 export default (props) => {
11
 
11
 

+ 19
- 6
src/pages/issue/index.jsx Vedi File

2
 import { Button, Badge } from 'antd';
2
 import { Button, Badge } from 'antd';
3
 import { useNavigate } from 'react-router-dom';
3
 import { useNavigate } from 'react-router-dom';
4
 import List from '@/components/Page/List';
4
 import List from '@/components/Page/List';
5
-import { getTaIssue } from '@/service/taissue';
5
+import { getTaIssue, getTaOrgIssue, exportTaIssue, exportTaOrgIssue } from '@/service/taissue';
6
 import { getTdLocType } from '@/service/tdloctype';
6
 import { getTdLocType } from '@/service/tdloctype';
7
 import { getSysOrg } from '@/service/sysorg';
7
 import { getSysOrg } from '@/service/sysorg';
8
 import { queryDict } from '@/utils/request';
8
 import { queryDict } from '@/utils/request';
9
 import { processEnum, processStatus } from '@/utils/biz';
9
 import { processEnum, processStatus } from '@/utils/biz';
10
-import { exportTaIssue } from '@/service/taissue';
11
 import useBool from '@/utils/hooks/useBool';
10
 import useBool from '@/utils/hooks/useBool';
11
+import useOrgResponsible from '@/utils/hooks/useOrgResponsible';
12
 
12
 
13
 const queryOrg = queryDict(getSysOrg, { labelKey: 'name', valueKey: 'orgId' });
13
 const queryOrg = queryDict(getSysOrg, { labelKey: 'name', valueKey: 'orgId' });
14
 const queryLocType = queryDict(getTdLocType, { labelKey: 'name', valueKey: 'typeId' });
14
 const queryLocType = queryDict(getTdLocType, { labelKey: 'name', valueKey: 'typeId' });
16
 const today = (new Date()).toJSON().substring(0, 10);
16
 const today = (new Date()).toJSON().substring(0, 10);
17
 
17
 
18
 export default (props) => {
18
 export default (props) => {
19
-
20
   const [loading, startLoading, stopLoading] = useBool();
19
   const [loading, startLoading, stopLoading] = useBool();
21
   const navigate = useNavigate();
20
   const navigate = useNavigate();
22
   const paramsRef = React.useRef();
21
   const paramsRef = React.useRef();
23
 
22
 
23
+  const [isResponsible, org] = useOrgResponsible();
24
+  const [request, params, exportFn] = React.useMemo(() => {
25
+    return [
26
+      isResponsible ? getTaOrgIssue : getTaIssue,
27
+      isResponsible ? { orgId: org?.orgId } : { all: true },
28
+      isResponsible ? exportTaOrgIssue : exportTaIssue,
29
+    ]
30
+  }, [isResponsible, org]);
31
+
24
   const columns = [
32
   const columns = [
33
+    {
34
+      title: "问题单号",
35
+      dataIndex: "issueId",
36
+    },
25
     {
37
     {
26
       title: "上报日期",
38
       title: "上报日期",
27
       dataIndex: "createDate",
39
       dataIndex: "createDate",
50
       dataIndex: "orgId",
62
       dataIndex: "orgId",
51
       valueType: 'select',
63
       valueType: 'select',
52
       request: queryOrg,
64
       request: queryOrg,
65
+      hideInSearch: isResponsible,
53
     },
66
     },
54
     {
67
     {
55
       title: "流程状态",
68
       title: "流程状态",
74
 
87
 
75
   const onExport = () => {
88
   const onExport = () => {
76
     startLoading();
89
     startLoading();
77
-    exportTaIssue(paramsRef.current).then(() => {
90
+    exportFn(paramsRef.current).then(() => {
78
       stopLoading();
91
       stopLoading();
79
     }).catch(() => {
92
     }).catch(() => {
80
       stopLoading();
93
       stopLoading();
92
   return (
105
   return (
93
     <List
106
     <List
94
       rowKey="issueId"
107
       rowKey="issueId"
95
-      request={getTaIssue}
108
+      request={request}
96
       columns={columns}
109
       columns={columns}
97
-      params={{ all: true }}
110
+      params={params}
98
       beforeSearchSubmit={beforeSearchSubmit}
111
       beforeSearchSubmit={beforeSearchSubmit}
99
       optionRender={(_, row) => [
112
       optionRender={(_, row) => [
100
         <Button key="detail" type="link" onClick={() => navigate(`/issue/detail?id=${row.issueId}`)}>详情</Button>
113
         <Button key="detail" type="link" onClick={() => navigate(`/issue/detail?id=${row.issueId}`)}>详情</Button>

+ 13
- 2
src/pages/org/components/Form.jsx Vedi File

1
 import React from 'react';
1
 import React from 'react';
2
-import { Button, Card, Form, Input, Select } from 'antd';
2
+import { Button, Radio, Form, Input, Select } from 'antd';
3
 import useBool from '@/utils/hooks/useBool';
3
 import useBool from '@/utils/hooks/useBool';
4
 import { postSysOrg, putSysOrg, getSysOrgById } from "@/service/sysorg";
4
 import { postSysOrg, putSysOrg, getSysOrgById } from "@/service/sysorg";
5
 import { formItemLayout, tailFormItemLayout } from '@/utils/form';
5
 import { formItemLayout, tailFormItemLayout } from '@/utils/form';
32
   }
32
   }
33
 
33
 
34
   React.useEffect(() => {
34
   React.useEffect(() => {
35
+    form.resetFields();
35
     if (org) {
36
     if (org) {
36
       form.setFieldsValue(org);
37
       form.setFieldsValue(org);
37
     } else {
38
     } else {
38
-      form.resetFields();
39
       form.setFieldValue('orgPId', parentId);
39
       form.setFieldValue('orgPId', parentId);
40
+      form.setFieldValue('isResponsible', true);
40
     }
41
     }
41
 
42
 
42
     console.log(org, parentId);
43
     console.log(org, parentId);
68
         </Select>
69
         </Select>
69
       </Form.Item>
70
       </Form.Item>
70
 
71
 
72
+      <Form.Item
73
+        name="isResponsible"
74
+        label="责任单位"
75
+      >
76
+        <Radio.Group>
77
+          <Radio value={true}>是</Radio>
78
+          <Radio value={false}>否</Radio>
79
+        </Radio.Group>
80
+      </Form.Item>
81
+
71
       <Form.Item
82
       <Form.Item
72
         name="sortNo"
83
         name="sortNo"
73
         label="排序"
84
         label="排序"

+ 7
- 2
src/routes/routes.jsx Vedi File

121
         meta: {
121
         meta: {
122
           title: "答题记录",
122
           title: "答题记录",
123
           icon: <FileTextOutlined />,
123
           icon: <FileTextOutlined />,
124
+          permission: "check.answer",
124
         },
125
         },
125
         children: [
126
         children: [
126
           {
127
           {
129
             meta: {
130
             meta: {
130
               title: "实地测评",
131
               title: "实地测评",
131
               icon: <HddOutlined />,
132
               icon: <HddOutlined />,
133
+              permission: "check.answer.loc",
132
             },
134
             },
133
           },
135
           },
134
           {
136
           {
136
             element: <CheckLocAnswerDetail />,
138
             element: <CheckLocAnswerDetail />,
137
             meta: {
139
             meta: {
138
               title: "实地答题明细",
140
               title: "实地答题明细",
139
-              hideInMenu: true
141
+              hideInMenu: true,
142
+              permission: "check.answer.loc.detail",
140
             },
143
             },
141
           },
144
           },
142
           {
145
           {
145
             meta: {
148
             meta: {
146
               title: "问卷调查",
149
               title: "问卷调查",
147
               icon: <HddOutlined />,
150
               icon: <HddOutlined />,
151
+              permission: "check.answer.survery",
148
             },
152
             },
149
           },
153
           },
150
           {
154
           {
152
             element: <CheckSurveyAnswerDetail />,
156
             element: <CheckSurveyAnswerDetail />,
153
             meta: {
157
             meta: {
154
               title: "问卷答题明细",
158
               title: "问卷答题明细",
155
-              hideInMenu: true
159
+              hideInMenu: true,
160
+              permission: "check.answer.survery.detail",
156
             },
161
             },
157
           },
162
           },
158
         ],
163
         ],

+ 6
- 0
src/service/taissue.js Vedi File

15
  */
15
  */
16
 export const getTaIssueById = (id) => request(`/api/taIssue/${id}`);
16
 export const getTaIssueById = (id) => request(`/api/taIssue/${id}`);
17
 
17
 
18
+/*
19
+ * 分页查询
20
+ */
21
+export const getTaOrgIssue = (params) => request('/api/taOrgIssue', { params });
22
+
18
 /*
23
 /*
19
  * 通过ID查询单条数据
24
  * 通过ID查询单条数据
20
  */
25
  */
34
  * 导出
39
  * 导出
35
  */
40
  */
36
 export const exportTaIssue = (params) => request(`/api/taIssue/export`, { params, method: 'post', download: true });
41
 export const exportTaIssue = (params) => request(`/api/taIssue/export`, { params, method: 'post', download: true });
42
+export const exportTaOrgIssue = (params) => request(`/api/taOrgIssue/export`, { params, method: 'post', download: true });

+ 1
- 2
src/store/index.js Vedi File

9
 
9
 
10
 export default store
10
 export default store
11
 export const useModel = store.useModel
11
 export const useModel = store.useModel
12
-export const addModel = store.addModel
13
-export const removeModel = store.removeModel
12
+export const getState = store.getState
14
 export const Provider = store.Provider
13
 export const Provider = store.Provider

+ 16
- 0
src/utils/hooks/useOrgResponsible.js Vedi File

1
+import React from 'react';
2
+import { useModel } from "@/store";
3
+
4
+export default function useOrgResponsible() {
5
+  const { user } = useModel('user');
6
+
7
+  const isResponsible = React.useMemo(() => {
8
+    const { org } = user || {};
9
+    return org?.isResponsible || false;
10
+  }, [user]);
11
+
12
+  return [
13
+    isResponsible,
14
+    user?.org,
15
+  ]
16
+}

+ 0
- 29
vite.config.js.timestamp-1670921280997.mjs Vedi File

1
-// vite.config.js
2
-import { defineConfig } from "file:///E:/work/civilized_city/pc-admin/node_modules/.pnpm/registry.npmmirror.com+vite@3.2.5_less@4.1.3/node_modules/vite/dist/node/index.js";
3
-import path from "path";
4
-import react from "file:///E:/work/civilized_city/pc-admin/node_modules/.pnpm/registry.npmmirror.com+@vitejs+plugin-react@2.2.0_vite@3.2.5/node_modules/@vitejs/plugin-react/dist/index.mjs";
5
-var __vite_injected_original_dirname = "E:\\work\\civilized_city\\pc-admin";
6
-var vite_config_default = defineConfig({
7
-  server: {
8
-    port: 3e3
9
-  },
10
-  plugins: [
11
-    react()
12
-  ],
13
-  resolve: {
14
-    alias: [
15
-      { find: "@", replacement: path.resolve(__vite_injected_original_dirname, "src") }
16
-    ]
17
-  },
18
-  css: {
19
-    preprocessorOptions: {
20
-      less: {
21
-        javascriptEnabled: true
22
-      }
23
-    }
24
-  }
25
-});
26
-export {
27
-  vite_config_default as default
28
-};
29
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFx3b3JrXFxcXGNpdmlsaXplZF9jaXR5XFxcXHBjLWFkbWluXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFx3b3JrXFxcXGNpdmlsaXplZF9jaXR5XFxcXHBjLWFkbWluXFxcXHZpdGUuY29uZmlnLmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi93b3JrL2NpdmlsaXplZF9jaXR5L3BjLWFkbWluL3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCByZWFjdCBmcm9tICdAdml0ZWpzL3BsdWdpbi1yZWFjdCdcblxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHNlcnZlcjoge1xuICAgIHBvcnQ6IDMwMDBcbiAgfSxcbiAgcGx1Z2luczogW1xuICAgIHJlYWN0KCksXG4gIF0sXG4gIHJlc29sdmU6IHtcbiAgICBhbGlhczogW1xuICAgICAgeyBmaW5kOiAnQCcsIHJlcGxhY2VtZW50OiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc3JjJykgfSxcbiAgICBdLFxuICB9LFxuICBjc3M6IHtcbiAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XG4gICAgICBsZXNzOiB7XG4gICAgICAgIC8vIG1vZGlmeVZhcnM6IHsgJ3ByaW1hcnktY29sb3InOiAnIzEzYzJjMicgfSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUF1UixTQUFTLG9CQUFvQjtBQUNwVCxPQUFPLFVBQVU7QUFDakIsT0FBTyxXQUFXO0FBRmxCLElBQU0sbUNBQW1DO0FBS3pDLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLFFBQVE7QUFBQSxJQUNOLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxNQUFNO0FBQUEsRUFDUjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsT0FBTztBQUFBLE1BQ0wsRUFBRSxNQUFNLEtBQUssYUFBYSxLQUFLLFFBQVEsa0NBQVcsS0FBSyxFQUFFO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFDSCxxQkFBcUI7QUFBQSxNQUNuQixNQUFNO0FBQUEsUUFFSixtQkFBbUI7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K