From 77aecf970dea88d0b6197e3e3fffd9c475ab7e12 Mon Sep 17 00:00:00 2001 From: LUCAS Date: Tue, 26 Jul 2022 19:54:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A1=E6=9F=A5/=E5=85=BB=E6=8A=A4=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/report/index.js | 2 +- .../src/sections/fillion/actions/index.js | 4 +- .../src/sections/fillion/actions/patrol.js | 38 ++ .../fillion/components/gis/patrolGis.js | 12 + .../fillion/components/maintenanceTable.js | 349 ++++++++++++------ .../fillion/components/patrolTable.js | 298 +++++++++++---- .../fillion/containers/maintenance.js | 9 +- .../src/sections/fillion/containers/patrol.js | 7 +- web/client/src/utils/webapi.js | 4 + 9 files changed, 523 insertions(+), 200 deletions(-) create mode 100644 web/client/src/sections/fillion/actions/patrol.js create mode 100644 web/client/src/sections/fillion/components/gis/patrolGis.js diff --git a/api/app/lib/controllers/report/index.js b/api/app/lib/controllers/report/index.js index f780b547..b635fb5a 100644 --- a/api/app/lib/controllers/report/index.js +++ b/api/app/lib/controllers/report/index.js @@ -9,7 +9,7 @@ async function reportList (ctx) { where: { }, - attributes: ['id', 'road', 'time', 'projectType', 'roadSectionStart', 'roadSectionEnd', 'reportType'], + attributes: ['id', 'road', 'time', 'projectType', 'roadSectionStart', 'roadSectionEnd', 'reportType', 'content'], include: [{ model: models.User, attributes: ['name'] diff --git a/web/client/src/sections/fillion/actions/index.js b/web/client/src/sections/fillion/actions/index.js index 0a9ea5a1..2b041438 100644 --- a/web/client/src/sections/fillion/actions/index.js +++ b/web/client/src/sections/fillion/actions/index.js @@ -1,6 +1,8 @@ 'use strict'; import * as infor from './infor' -export default { +import * as patrol from './patrol' +export default { ...infor, + ...patrol, } \ No newline at end of file diff --git a/web/client/src/sections/fillion/actions/patrol.js b/web/client/src/sections/fillion/actions/patrol.js new file mode 100644 index 00000000..63507bd9 --- /dev/null +++ b/web/client/src/sections/fillion/actions/patrol.js @@ -0,0 +1,38 @@ +import { basicAction } from '@peace/utils' +import { ApiTable } from '$utils' + + +export function getReportList(query) { + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + actionType: 'GET_REPORT_LIST', + url: ApiTable.getReportList, + query, + msg: { error: '获取巡查数据失败' }, + reducer: { name: 'reportList' } + }); +} + +export function getReportDetail(reportId) { + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + actionType: 'GET_REPORT_DETAIL_LIST', + url: ApiTable.getReportDetail.replace("{reportId}", reportId), + msg: { error: '获取巡查数据失败' }, + reducer: { name: 'reportDetail' } + }); +} + +export function getUserList(query) { + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + actionType: 'GET_USER_LIST', + url: ApiTable.getUsers, + query, + msg: { error: '获取用户数据失败' }, + reducer: { name: 'userList' } + }); +} diff --git a/web/client/src/sections/fillion/components/gis/patrolGis.js b/web/client/src/sections/fillion/components/gis/patrolGis.js new file mode 100644 index 00000000..a01611df --- /dev/null +++ b/web/client/src/sections/fillion/components/gis/patrolGis.js @@ -0,0 +1,12 @@ +import React from 'react' +import PropTypes from 'prop-types' + +function PatrolGis(props) { + return ( +
PatrolGis
+ ) +} + +PatrolGis.propTypes = {} + +export default PatrolGis diff --git a/web/client/src/sections/fillion/components/maintenanceTable.js b/web/client/src/sections/fillion/components/maintenanceTable.js index 83fafa72..36b1cc03 100644 --- a/web/client/src/sections/fillion/components/maintenanceTable.js +++ b/web/client/src/sections/fillion/components/maintenanceTable.js @@ -1,79 +1,176 @@ import { connect } from 'react-redux'; import './protable.less' -import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd'; +import { Card, Button, DatePicker, Input, Modal, Spin, Image, message, Popover } from 'antd'; import ProTable from '@ant-design/pro-table'; -// import { Badge, Button } from 'antd'; +import { getReportList, getReportDetail } from '../actions/patrol'; import React, { useEffect, useState } from 'react'; +import { httpDel } from '@peace/utils' +import { PinyinHelper } from '@peace/utils'; // @ts-ignore import styles from './protable.less'; +import moment from 'moment'; + +const DetailForm = (props) => { + const { visible, data, handleClose, loading } = props; + const keyList = [ + { key: '问题编号', name: 'id' }, + { key: '所在路段', name: 'road' }, + { key: '具体位置', name: 'address' }, + { key: '巡查内容', name: 'content' }, + { key: '病害照片', name: 'scenePic' }, + { key: '养护前', name: 'conserveBeforePic' }, + { key: '养护中', name: 'conserveUnderwayPic' }, + { key: '养护后', name: 'conserveAfterPic' }, + ]; + + const renderContent = (data) => { + if (data) { + return keyList.map(obj => { + return
+ {obj.key} + { + obj.name != 'scenePic' && obj.name.indexOf('conserve') == -1 ? + + : +
+ { + data[obj.name] && data[obj.name] instanceof Array ? data[obj.name].map(imgSrc => { + return
+ +
+ }) : '暂无图片' + } +
+ + } +
+ }) + } else { + return '暂无数据' + } + } + + return ( + + + {renderContent(data)} + + + ) +} + const DetailList = (props) => { - const { patrolName } = props; - const [tableListDataSource, setTableListDataSource] = useState([]); + const { reportList, loading, dispatch, handleOpen, handelRefresh } = props; + const [visible, setVisible] = useState(false) + const [selectRecord, setSelectRecord] = useState(); + const checkDetail = (record) => { + dispatch(getReportDetail(record.id)) + } + + const handleRemove = (record) => { + let url = 'report/{reportId}'; + const actionType = "DEL_REPORT_RECORD"; + const msg = {} + if (record) { + url = url.replace('{reportId}', record.id) + httpDel(dispatch, { url, actionType, msg }).then(res => { + if (res.success) { + message.success("记录删除成功") + handelRefresh(); + } else { + message.error("记录删除失败") + } + }) + } + } const columns = [ { title: '问题编号', - key: 'num', - dataIndex: 'num', - align:'center' + key: 'id', + dataIndex: 'id', + align: 'center', + render: (text, record) => { + return moment(record.time).format("YYYYMMDD") * 10000 + record.id; + } }, { title: '所属道路', key: 'road', dataIndex: 'road', - align:'center' + align: 'center' }, { title: '所在路段', key: 'address', dataIndex: 'address', - align:'center' - }, { + align: 'center', + render: (text, record) => { + return `${record.roadSectionStart || ''}-${record.roadSectionEnd || ''}` + } + }, + { title: '缺陷名称', - key: 'name', - dataIndex: 'name', - align:'center' - }, { + key: 'content', + dataIndex: 'content', + align: 'center' + }, + { title: '巡查人', - width:100, - key: 'patrolName', - dataIndex: 'patrolName', - align:'center' + width: 100, + key: 'userName', + dataIndex: 'userName', + align: 'center', + render: (text, record) => { + return record.user.name + } }, { title: '上报时间', - key: 'createdAt', - dataIndex: 'createdAt', + key: 'time', + dataIndex: 'time', valueType: 'dateTime', - align:'center' + align: 'center' }, { title: '操作', - width:200, + width: 200, key: 'option', valueType: 'option', - align:'center', - render: () => [,] + align: 'center', + render: (text, record) => { + return [ + , + + + + + ]} + visible={selectRecord == record.id && visible} + trigger="click" + onClick={() => setSelectRecord(record.id)} + title="是否删除该记录?" + onVisibleChange={(newVisible) => setVisible(newVisible)} + > + + + ] + } }, ]; - useEffect(() => { - const source = []; - for (let i = 0; i < 25; i += 1) { - source.push({ - num: `${i + 1}`, - road: `成华大道${i + 2}`, - address: `二仙桥${i + 3}`, - name: `缺失内容${i + 4}`, - patrolName: patrolName, - createdAt: Date.now() - Math.floor(Math.random() * 10000), - key: i, - }); - } - setTableListDataSource(source); - }, [patrolName]); return ( { - - - - -const patrolNameListDataSource = []; - -for (let i = 0; i < 10; i += 1) { - patrolNameListDataSource.push({ - patrolName: `老大爷${i}`, - }); -} - - - const PatrolNameList = (props) => { - const { onChange, patrolName } = props; - + const [users, setUsers] = useState([]); + const { onChange, record, userList, loading } = props; + const { name } = record || { name: '' } const columns = [ { title: '巡更人员', - key: 'patrolName', - dataIndex: 'patrolName', - align:'center' + key: 'name', + dataIndex: 'name', + align: 'center' }, ]; + + useEffect(() => { + if (userList && userList instanceof Array) { + let users = userList.filter(user => user.remark != 'sp'); + setUsers(users); + } + }, [userList]) + + var timer = null; + const doUserNameSearch = (e) => { + const name = e.target.value; + if (timer) { + clearTimeout(timer) + } else { + setTimeout(() => { + let users = userList.filter(user => PinyinHelper.isSearchMatched(user.name, name) && user.remark != 'sp'); + setUsers(users); + }, 500); + } + } + return (
{ - // 表单搜索项会从 params 传入,传递给后端接口。 - console.log(params, sorter, filter); - return Promise.resolve({ - data: patrolNameListDataSource, - success: true, - }); - }} - rowKey="patrolName" + dataSource={users} + loading={loading} + rowKey="name" rowClassName={(record) => { - return record.patrolName === patrolName ? styles['split-row-select-active'] : ''; + return record.patrolName === name ? styles['split-row-select-active'] : ''; }} - // toolbar={{ - // search: { - // onSearch: (value) => { - // alert(value); - // }, - // }, - // }} - toolBarRender={()=>[ - + toolBarRender={() => [ + ]} options={false} pagination={false} @@ -143,8 +235,9 @@ const PatrolNameList = (props) => { onRow={(record) => { return { onClick: () => { - if (record.patrolName) { - onChange(record.patrolName); + if (record) { + console.log('record:', record) + onChange(record); } }, }; @@ -156,45 +249,64 @@ const PatrolNameList = (props) => { -const MaintenanceTable = () => { - const [patrolName, setPatrolName] = useState('老大爷0'); +const MaintenanceTable = (props) => { + const { userList, reportList, dispatch, reportListLoading, reportDetail, reportDetailLoading, userLoading } = props; + const [record, setRecord] = useState(); + const [dateRange, setDateRange] = useState(); + const [detailVisible, setDetailVisible] = useState(false) + const { RangePicker } = DatePicker; - const tabList = [ - { - key: 'tab1', - tab: '养护', - }, - ]; - const contentList = { - tab1: [
- - - -
] - }; - const [activeTabKey1, setActiveTabKey1] = useState('tab1'); - const onTab1Change = (key) => { - setActiveTabKey1(key); - }; + + useEffect(() => { + if (userList && userList instanceof Array) { + let users = userList.filter(user => user.remark != 'sp'); + + setRecord(users[0]); + } + }, [userList]) + + useEffect(() => { + if (record) { + let query = { userId: record.id, reportType: 'conserve' } + if ((dateRange && dateRange instanceof Array)) { + query.startTime = moment(dateRange[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss') + query.endTime = moment(dateRange[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss') + } + dispatch(getReportList(query)); + } + }, [record, dateRange]) + + const handleClose = () => { + setDetailVisible(false) + } + const handleOpen = () => { + setDetailVisible(true) + } + + const handelRefresh = () => { + let query = { userId: record.id, reportType: 'patrol' } + dispatch(getReportList(query)); + } + return (
- setPatrolName(searchPatrolName)} patrolName={patrolName} /> + setRecord(record)} record={record} userList={userList} loading={userLoading} handelRefresh={handelRefresh} /> - { - onTab1Change(key); - }} - > -
- - - + +
+ { setDateRange(dateString) }} /> + +
- {contentList[activeTabKey1]} + + + +
@@ -202,13 +314,12 @@ const MaintenanceTable = () => { }; function mapStateToProps(state) { - const { auth, depMessage } = state; + const { auth, depMessage, userList, reportList, reportDetail } = state; const pakData = (dep) => { return dep.map((d) => { return { title: d.name, value: d.id, - // children: d.type >= 2 ? [] : pakData(d.subordinate) children: pakData(d.subordinate) } }) @@ -219,6 +330,12 @@ function mapStateToProps(state) { depMessage: depMessage.data || [], depLoading: depMessage.isRequesting, depData, + userList: userList.data || [], + userLoading: userList.isRequesting, + reportList: reportList.data, + reportListLoading: reportList.isRequesting, + reportDetail: reportDetail.data, + reportDetailLoading: reportDetail.isRequesting, }; } export default connect(mapStateToProps)(MaintenanceTable); \ No newline at end of file diff --git a/web/client/src/sections/fillion/components/patrolTable.js b/web/client/src/sections/fillion/components/patrolTable.js index e215ea16..2e9125a4 100644 --- a/web/client/src/sections/fillion/components/patrolTable.js +++ b/web/client/src/sections/fillion/components/patrolTable.js @@ -1,21 +1,104 @@ import { connect } from 'react-redux'; import './protable.less' -import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd'; +import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input, Modal, Spin, Image, message, Popover } from 'antd'; import ProTable from '@ant-design/pro-table'; -// import { Badge, Button } from 'antd'; +import { getReportList, getReportDetail } from '../actions/patrol'; import React, { useEffect, useState } from 'react'; +import { httpDel } from '@peace/utils' +import { PinyinHelper } from '@peace/utils'; +import PatrolGis from './gis/patrolGis'; // @ts-ignore import styles from './protable.less'; +import moment from 'moment'; + +const DetailForm = (props) => { + const { visible, data, handleClose, loading } = props; + const keyList = [ + { key: '问题编号', name: 'id' }, + { key: '所在路段', name: 'road' }, + { key: '具体位置', name: 'address' }, + { key: '巡查内容', name: 'content' }, + { key: '病害照片', name: 'scenePic' }, + ]; + + const renderContent = (data) => { + if (data) { + // Object.keys(data).map(key => { + + // }) + return keyList.map(obj => { + return
+ {obj.key} + { + obj.name != 'scenePic' ? + + : +
+ { + data.scenePic && data.scenePic instanceof Array ? data.scenePic.map(imgSrc => { + return
+ +
+ }) : '暂无图片' + } +
+ + } +
+ }) + } else { + return '暂无数据' + } + } + + return ( + + + {renderContent(data)} + + + ) +} + const DetailList = (props) => { - const { patrolName } = props; - const [tableListDataSource, setTableListDataSource] = useState([]); + const { reportList, loading, dispatch, handleOpen, handelRefresh } = props; + const [visible, setVisible] = useState(false) + const [selectRecord, setSelectRecord] = useState(); + const checkDetail = (record) => { + dispatch(getReportDetail(record.id)) + } + + const handleRemove = (record) => { + let url = 'report/{reportId}'; + const actionType = "DEL_REPORT_RECORD"; + const msg = {} + if (record) { + url = url.replace('{reportId}', record.id) + httpDel(dispatch, { url, actionType, msg }).then(res => { + if (res.success) { + message.success("记录删除成功"); + handelRefresh() + } else { + message.error("记录删除失败") + } + }) + } + } const columns = [ { title: '问题编号', - key: 'num', - dataIndex: 'num', - align: 'center' + key: 'id', + dataIndex: 'id', + align: 'center', + render: (text, record) => { + return moment(record.time).format("YYYYMMDD") * 10000 + record.id; + } }, { title: '所属道路', key: 'road', @@ -25,22 +108,30 @@ const DetailList = (props) => { title: '所在路段', key: 'address', dataIndex: 'address', - align: 'center' - }, { + align: 'center', + render: (text, record) => { + return `${record.roadSectionStart || ''}-${record.roadSectionEnd || ''}` + } + }, + { title: '缺陷名称', - key: 'name', - dataIndex: 'name', + key: 'content', + dataIndex: 'content', align: 'center' - }, { + }, + { title: '巡查人', width: 100, - key: 'patrolName', - dataIndex: 'patrolName', - align: 'center' + key: 'userName', + dataIndex: 'userName', + align: 'center', + render: (text, record) => { + return record.user.name + } }, { title: '上报时间', - key: 'createdAt', - dataIndex: 'createdAt', + key: 'time', + dataIndex: 'time', valueType: 'dateTime', align: 'center' }, { @@ -49,28 +140,35 @@ const DetailList = (props) => { key: 'option', valueType: 'option', align: 'center', - render: () => [, ] + render: (text, record) => { + return [ + , + + + +
+ ]} + visible={selectRecord == record.id && visible} + trigger="click" + onClick={() => setSelectRecord(record.id)} + title="是否删除该记录?" + onVisibleChange={(newVisible) => setVisible(newVisible)} + > + + + ] + } }, ]; - useEffect(() => { - const source = []; - for (let i = 0; i < 25; i += 1) { - source.push({ - num: `${i + 1}`, - road: `成华大道${i + 2}`, - address: `二仙桥${i + 3}`, - name: `缺失内容${i + 4}`, - patrolName: patrolName, - createdAt: Date.now() - Math.floor(Math.random() * 10000), - key: i, - }); - } - setTableListDataSource(source); - }, [patrolName]); return ( { - - - - -const patrolNameListDataSource = []; - -for (let i = 0; i < 10; i += 1) { - patrolNameListDataSource.push({ - patrolName: `老大爷${i}`, - }); -} - - - const PatrolNameList = (props) => { - const { onChange, patrolName } = props; - + const [users, setUsers] = useState([]); + const { onChange, record, userList, loading } = props; + const { name } = record || { name: '' } const columns = [ { title: '巡更人员', - key: 'patrolName', - dataIndex: 'patrolName', + key: 'name', + dataIndex: 'name', align: 'center' }, ]; + + useEffect(() => { + if (userList) { + setUsers(userList) + } + }, [userList]) + + var timer = null; + const doUserNameSearch = (e) => { + const name = e.target.value; + if (timer) { + clearTimeout(timer) + } else { + setTimeout(() => { + let users = userList.filter(user => PinyinHelper.isSearchMatched(user.name, name)); + setUsers(users); + }, 500); + } + } + return (
{ - // 表单搜索项会从 params 传入,传递给后端接口。 - console.log(params, sorter, filter); - return Promise.resolve({ - data: patrolNameListDataSource, - success: true, - }); - }} - rowKey="patrolName" + dataSource={users} + loading={loading} + rowKey="name" rowClassName={(record) => { - return record.patrolName === patrolName ? styles['split-row-select-active'] : ''; + return record.patrolName === name ? styles['split-row-select-active'] : ''; }} - // toolbar={{ - // search: { - // onSearch: (value) => { - // alert(value); - // }, - // }, - // }} toolBarRender={() => [ - + ]} options={false} pagination={false} @@ -143,8 +235,9 @@ const PatrolNameList = (props) => { onRow={(record) => { return { onClick: () => { - if (record.patrolName) { - onChange(record.patrolName); + if (record) { + console.log('record:', record) + onChange(record); } }, }; @@ -156,9 +249,43 @@ const PatrolNameList = (props) => { -const PatrolTable = () => { - const [patrolName, setPatrolName] = useState('老大爷0'); +const PatrolTable = (props) => { + const { userList, reportList, dispatch, reportListLoading, reportDetail, reportDetailLoading, userLoading } = props; + const [record, setRecord] = useState(); + const [dateRange, setDateRange] = useState(); + const [detailVisible, setDetailVisible] = useState(false) + const { RangePicker } = DatePicker; + + useEffect(() => { + if (userList && userList instanceof Array) { + setRecord(userList[0]); + } + }, [userList]) + + useEffect(() => { + if (record) { + let query = { userId: record.id, reportType: 'patrol' } + if ((dateRange && dateRange instanceof Array)) { + query.startTime = moment(dateRange[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss') + query.endTime = moment(dateRange[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss') + } + dispatch(getReportList(query)); + } + }, [record, dateRange]) + + const handelRefresh = () => { + let query = { userId: record.id, reportType: 'patrol' } + dispatch(getReportList(query)); + } + + const handleClose = () => { + setDetailVisible(false) + } + const handleOpen = () => { + setDetailVisible(true) + } + const tabList = [ { key: 'tab1', @@ -171,9 +298,10 @@ const PatrolTable = () => { const contentList = { tab1: [
- + -
] +
], + tab2: }; const [activeTabKey1, setActiveTabKey1] = useState('tab1'); const onTab1Change = (key) => { @@ -182,7 +310,7 @@ const PatrolTable = () => { return (
- setPatrolName(searchPatrolName)} patrolName={patrolName} /> + setRecord(record)} record={record} userList={userList} loading={userLoading} /> { > { activeTabKey1 == 'tab1' ?
- + { setDateRange(dateString) }} />
: '' } {contentList[activeTabKey1]} +
@@ -207,13 +340,12 @@ const PatrolTable = () => { }; function mapStateToProps(state) { - const { auth, depMessage } = state; + const { auth, depMessage, userList, reportList, reportDetail } = state; const pakData = (dep) => { return dep.map((d) => { return { title: d.name, value: d.id, - // children: d.type >= 2 ? [] : pakData(d.subordinate) children: pakData(d.subordinate) } }) @@ -224,6 +356,12 @@ function mapStateToProps(state) { depMessage: depMessage.data || [], depLoading: depMessage.isRequesting, depData, + userList: userList.data || [], + userLoading: userList.isRequesting, + reportList: reportList.data, + reportListLoading: reportList.isRequesting, + reportDetail: reportDetail.data, + reportDetailLoading: reportDetail.isRequesting, }; } export default connect(mapStateToProps)(PatrolTable); \ No newline at end of file diff --git a/web/client/src/sections/fillion/containers/maintenance.js b/web/client/src/sections/fillion/containers/maintenance.js index 1554927e..6c36021e 100644 --- a/web/client/src/sections/fillion/containers/maintenance.js +++ b/web/client/src/sections/fillion/containers/maintenance.js @@ -3,15 +3,22 @@ import { connect } from 'react-redux'; import '../style.less'; import { getDepMessage, getReportStatistic } from "../actions/infor" import MaintenanceTable from '../components/maintenanceTable'; +import { getUserList } from '../actions/patrol'; const superagent = require('superagent'); + const Maintenance = (props) => { const { dispatch, user } = props const [data, setData] = useState() useEffect(() => { // dispatch(getDepMessage()) - + setData(props) }, []); + + useEffect(() => { + dispatch(getUserList()) + }, [true]) + //批量导出 const exports = (ids, counts) => { // console.log(user); diff --git a/web/client/src/sections/fillion/containers/patrol.js b/web/client/src/sections/fillion/containers/patrol.js index bd57775b..3372ad0a 100644 --- a/web/client/src/sections/fillion/containers/patrol.js +++ b/web/client/src/sections/fillion/containers/patrol.js @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; import '../style.less'; import { getDepMessage, getReportStatistic } from "../actions/infor" +import { getUserList } from '../actions/patrol'; import PatrolTable from '../components/patrolTable'; const superagent = require('superagent'); const patrol = (props) => { @@ -9,9 +10,13 @@ const patrol = (props) => { const [data, setData] = useState() useEffect(() => { // dispatch(getDepMessage()) - + setData(props) }, []); + + useEffect(() => { + dispatch(getUserList()) + }, [true]) //批量导出 const exports = (ids, counts) => { // console.log(user); diff --git a/web/client/src/utils/webapi.js b/web/client/src/utils/webapi.js index 7d55a301..6ea0e16f 100644 --- a/web/client/src/utils/webapi.js +++ b/web/client/src/utils/webapi.js @@ -39,6 +39,10 @@ export const ApiTable = { getReportRectify: 'report/rectify', getReportRectifyDetail: 'report/rectify/detail', compileReportRectifyDetail: 'report/rectify/detail', + getReportList: 'report/list', + getReportDetail: 'report/{reportId}/detail', + getUsers: 'user', + //运政管理 getOperaTional: 'vehicle',