diff --git a/weapp/src/app.config.js b/weapp/src/app.config.js
index a846996f..e70f0d41 100644
--- a/weapp/src/app.config.js
+++ b/weapp/src/app.config.js
@@ -12,6 +12,10 @@ export default {
'changePassword/index',
'changePassword/success/index',
'video/index',
+ 'maintenanceSpotCheck/index',
+ 'maintenanceSpotCheck/startSpotCheck/index',
+ 'maintenanceSpotCheck/spotCheckRoadDetail/index',
+ 'maintenanceSpotCheck/spotChange/index',
]
}],
permission: {
diff --git a/weapp/src/packages/maintenanceSpotCheck/index.config.js b/weapp/src/packages/maintenanceSpotCheck/index.config.js
new file mode 100644
index 00000000..690c0e41
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/index.config.js
@@ -0,0 +1,3 @@
+export default {
+ navigationBarTitleText: '养护抽查'
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/index.jsx b/weapp/src/packages/maintenanceSpotCheck/index.jsx
new file mode 100644
index 00000000..cac10c08
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/index.jsx
@@ -0,0 +1,112 @@
+import React, { useEffect, useState } from 'react'
+import Taro, { useDidShow } from '@tarojs/taro'
+import { View, Input, Picker, ScrollView } from '@tarojs/components'
+import { AtButton, AtIcon } from 'taro-ui'
+import { NoData } from '@/components/index'
+import moment from 'moment'
+import request from '@/services/request'
+import { getRoadSpotList } from '@/services/api'
+import './index.scss'
+
+function Index() {
+ // const pageSize = 10
+ // const count = 0
+ // const [page, setPage] = useState(1)
+ const [startTime, setStartTime] = useState('')
+ const [endTime, setEndTime] = useState('')
+ const [roadSpotList, setRoadSpotList] = useState([])
+
+ useDidShow(() => {
+ getSpotList()
+ })
+
+ const getSpotList = () => {
+ request.get(`${getRoadSpotList()}?startTime=${startTime}&endTime=${endTime}`)
+ .then(res => {
+ if (res.statusCode === 200) {
+ setRoadSpotList(res.data)
+ }
+ })
+ }
+
+ const resetTime = () => {
+ setStartTime('')
+ setEndTime('')
+ }
+
+ const navigateTo = (url) => {
+ Taro.navigateTo({ url })
+ }
+
+ const onScrollToLower = (e) => {
+ console.log(e)
+ }
+
+ return (
+
+
+ setStartTime(e.detail.value)}
+ >
+
+
+
+
+
+ setEndTime(e.detail.value)}
+ >
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+ {roadSpotList.length ? roadSpotList.map(item => navigateTo(`/packages/maintenanceSpotCheck/spotCheckRoadDetail/index?item=${encodeURIComponent(JSON.stringify(item))}`
+ )}
+ >
+ 抽查县道比例(%):{item.countyPercentage}
+ 抽查县道(条):{item.spotCountyRoadCount}
+ 抽查乡道(条):{item.spotTownRoadCount}
+ 抽查村道(条):{item.spotVillageRoadCount}
+ 抽查日期:{moment(item.date).format('YYYY-MM-DD')}
+ ) : }
+
+ navigateTo('/packages/maintenanceSpotCheck/startSpotCheck/index')}
+ >发起抽查
+
+ )
+}
+
+export default Index
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/index.scss b/weapp/src/packages/maintenanceSpotCheck/index.scss
new file mode 100644
index 00000000..0aebec0e
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/index.scss
@@ -0,0 +1,44 @@
+.page {
+ height: 100vh;
+ background-color: #fff;
+ font-size: 28px;
+
+ .spot-check-filter-box {
+ box-sizing: border-box;
+ width: 100%;
+ padding: 15px 20px;
+
+ .input {
+ margin-left: 10px;
+ }
+
+ .reset-bth {
+ margin-left: 20px;
+ }
+ }
+
+ .scrollview {
+ height: calc(100vh - 280px);
+ margin-bottom: 40px;
+
+ .card {
+ padding: 20px;
+ border: gainsboro 1px solid;
+ border-radius: 10px;
+ background-color: #fff;
+ box-shadow: 10px 10px 5px rgb(219, 218, 218);
+ margin: 0 0 20px 20px;
+ width: calc(100% - 40px);
+ box-sizing: border-box;
+
+ .item {
+ padding: 10px 0;
+ }
+ }
+ }
+
+ .to-start-btn {
+ width: 70%;
+ margin: 0 auto;
+ }
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotChange/index.config.js b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.config.js
new file mode 100644
index 00000000..0b049910
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.config.js
@@ -0,0 +1,3 @@
+export default {
+ navigationBarTitleText: '调整'
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotChange/index.jsx b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.jsx
new file mode 100644
index 00000000..e272ddf6
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.jsx
@@ -0,0 +1,224 @@
+import React, { useEffect, useState } from 'react'
+import Taro, { useRouter } from '@tarojs/taro'
+import { View, Text, Picker, } from '@tarojs/components'
+import { AtButton, AtIcon, } from 'taro-ui'
+import request from '@/services/request'
+import { roadSpotChange, roadUrl } from '@/services/api'
+import './index.scss'
+
+function Index() {
+ const { spot, detail } = useRouter().params
+ const spotItem = spot ? JSON.parse(decodeURIComponent(spot)) : null
+ const detailItem = detail ? JSON.parse(decodeURIComponent(detail)) : null
+
+ const [road, setRoad] = useState([])
+ const [roadLevel, setRoadLevel] = useState('')
+
+ const [nameList, setNameList] = useState([]);
+ const [codeList, setCodeList] = useState([]);
+ const [noList, setNoList] = useState([]);
+ const [checked, setChecked] = useState({
+ routeName: '',
+ routeCode: '',
+ sectionNo: '',
+ startingPlaceName: '',
+ stopPlaceName: '',
+ })
+
+ useEffect(() => {
+ getRoad()
+ }, [])
+
+ const getRoad = () => {
+ if (!detailItem) return
+
+ const level = detailItem.road?.level
+ setRoadLevel(level)
+
+ const alterIdArr = level == '县' ? spotItem.countyRoadId
+ : level == '乡' ? spotItem.townshipRoadId
+ : level == '村' ? spotItem.villageRoadId : []
+ let query = `?level=${level}`
+ for (let i = 0; i < alterIdArr.length; i++) {
+ query += `&alterId=${alterIdArr[i]}`
+ }
+ request.get(`${roadUrl()}${query}`).then(res => {
+ if (res.statusCode === 200) {
+ let name = []
+ let code = []
+ let no = []
+ res.data?.forEach(v => {
+ if (v.routeName && !name.includes(v.routeName)) {
+ name.push(v.routeName)
+ }
+ if (v.routeCode && !code.includes(v.routeCode)) {
+ code.push(v.routeCode)
+ }
+ if (v.sectionNo && !no.includes(v.sectionNo)) {
+ no.push(v.sectionNo)
+ }
+ });
+ setRoad(res.data)
+ setNameList(name)
+ setCodeList(code)
+ setNoList(no)
+
+ } else {
+ Taro.showToast({ title: '获取路线失败', icon: 'error' })
+ }
+ })
+ }
+
+ const handleCheckChange = (value, key) => {
+ let nextValue = {
+ ...checked,
+ [key]: value
+ }
+
+ let name = []
+ let code = []
+ let no = []
+ let data = road?.filter(d => (nextValue?.routeName ? nextValue?.routeName == d?.routeName : true)
+ && (nextValue?.routeCode ? nextValue?.routeCode == d?.routeCode : true)
+ && (nextValue?.sectionNo ? nextValue?.sectionNo == d?.sectionNo : true))
+
+ data.forEach(v => {
+ if (v.routeName && !name.includes(v.routeName)) {
+ name.push(v.routeName)
+ }
+ if (v.routeCode && !code.includes(v.routeCode)) {
+ code.push(v.routeCode)
+ }
+ if (v.sectionNo && !no.includes(v.sectionNo)) {
+ no.push(v.sectionNo)
+ }
+ });
+ setNameList(name)
+ setCodeList(code)
+ setNoList(no)
+
+ if (nextValue.routeName && nextValue.routeCode && nextValue.sectionNo) {
+ nextValue.startingPlaceName = data[0]?.startingPlaceName
+ nextValue.stopPlaceName = data[0]?.stopPlaceName
+ } else {
+ nextValue.startingPlaceName = ''
+ nextValue.stopPlaceName = ''
+ }
+ setChecked(nextValue)
+ }
+
+ const handleSubmit = () => {
+ if (!checked.routeName || !checked.routeCode || !checked.sectionNo) {
+ Taro.showToast({ title: '请选择路线', icon: 'error' })
+ return
+ }
+ let data = road.find(d => checked.routeName == d?.routeName
+ && checked.routeCode == d.routeCode
+ && checked.sectionNo == d.sectionNo
+ )
+ Taro.showLoading({ title: '调整中...' })
+ request.post(`${roadSpotChange()}`, {
+ previewId: spotItem.id,
+ originRoadId: detailItem.road?.id,
+ changeRoadId: data.id,
+ }).then(res => {
+ Taro.hideLoading()
+ if (res.statusCode === 204) {
+ Taro.showToast({ title: '调整成功', icon: 'success' })
+ setTimeout(() => {
+ Taro.navigateBack()
+ }, 1500)
+ } else {
+ Taro.showToast({ title: '调整失败', icon: 'error' })
+ }
+ })
+ }
+
+ return (
+
+
+ 道路类型
+ {roadLevel}
+
+
+ *路线名称
+
+ handleCheckChange(nameList[e.detail.value], 'routeName')}
+ >
+
+ {checked.routeName || '请选择'}
+
+
+
+ handleCheckChange('', 'routeName')}
+ />
+
+
+
+ *路线代码
+
+ handleCheckChange(codeList[e.detail.value], 'routeCode')}
+ >
+
+ {checked.routeCode || '请选择'}
+
+
+
+ handleCheckChange('', 'routeCode')}
+ />
+
+
+
+ *路段序号
+
+ handleCheckChange(noList[e.detail.value], 'sectionNo')}
+ >
+
+ {checked.sectionNo || '请选择'}
+
+
+
+ handleCheckChange('', 'sectionNo')}
+ />
+
+
+
+ 起点地名
+ {checked.startingPlaceName}
+
+
+ 止点地名
+ {checked.stopPlaceName}
+
+
+ 确定
+
+ )
+}
+
+export default Index
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotChange/index.scss b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.scss
new file mode 100644
index 00000000..c10777ff
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotChange/index.scss
@@ -0,0 +1,54 @@
+.page {
+ height: 100vh;
+ background-color: #fff;
+ // font-size: 28px;
+
+ .cell {
+ padding: 24px 0px;
+ margin: 0 32px;
+ display: flex;
+ justify-content: space-between;
+ border-bottom: rgb(223, 237, 243) 1px solid;
+
+ .title {
+ display: inline-block;
+ width: 192px;
+ margin-right: 16px;
+
+ .star {
+ color: #ff0000;
+ margin-right: 8px;
+ }
+ }
+
+ .content {
+ width: calc(100% - 192px - 16px);
+ display: flex;
+ justify-content: flex-end;
+
+ .picker {
+ width: 400px;
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+
+ .arrow {
+ margin: 0 32px;
+ }
+ }
+ }
+ }
+
+ .list-item {
+ width: calc(100% - 60px);
+ }
+
+ .list-clear {
+ margin-right: 20px;
+ }
+
+ .btn {
+ width: 70%;
+ margin: 100px auto 0;
+ }
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.config.js b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.config.js
new file mode 100644
index 00000000..07643f0c
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.config.js
@@ -0,0 +1,3 @@
+export default {
+ navigationBarTitleText: '抽查详情'
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.jsx b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.jsx
new file mode 100644
index 00000000..71e050ab
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.jsx
@@ -0,0 +1,73 @@
+import React, { useEffect, useState } from 'react'
+import Taro, { useRouter, useDidShow } from '@tarojs/taro'
+import { View } from '@tarojs/components'
+import { AtButton, AtSearchBar } from 'taro-ui'
+import { NoData } from '@/components/index'
+import moment from 'moment'
+import request from '@/services/request'
+import { getRoadSpotDetail } from '@/services/api'
+import './index.scss'
+
+function Index() {
+ const { item } = useRouter().params
+ const spotItem = item ? JSON.parse(decodeURIComponent(item)) : null
+
+ const [keyword, setKeyword] = useState('')
+ const [roadDetailList, setRoadDetailList] = useState([])
+
+ useDidShow(() => {
+ getDetail()
+ })
+
+ const getDetail = () => {
+ if (spotItem) {
+ Taro.showLoading({ title: '加载中' })
+ request.get(`${getRoadSpotDetail()}?previewId=${spotItem.id}&keyword=${keyword}`).then(res => {
+ Taro.hideLoading()
+ if (res.statusCode === 200) {
+ setRoadDetailList(res.data)
+ } else {
+ Taro.showToast({ title: '获取详情失败', icon: 'error' })
+ }
+ })
+ }
+ }
+
+ return (
+ setKeyword(v)}
+ onActionClick={getDetail}
+ />
+ 抽查日期:{moment(spotItem.date).format('YYYY-MM-DD')}
+
+ {roadDetailList.length ? roadDetailList.map(item =>
+ 道路类型:{item.road?.level ? (item.road?.level + '道') : '--'}
+ 路线名称:{item.road?.routeName || '--'}
+
+ 路线代码:{item.road?.routeCode || '--'}
+ 路段序号:{item.road?.sectionNo || '--'}
+
+
+ 起点地名:{item.road?.startingPlaceName || '--'}
+ 止点地名:{item.road?.stopPlaceName || '--'}
+
+ 里程:{item.road?.chainageMileage || '--'}
+
+ 养护次数(次):{item.maintenanceCount}
+
+ Taro.navigateTo({ url: `/packages/maintenanceSpotCheck/spotChange/index?detail=${encodeURIComponent(JSON.stringify(item))}&spot=${encodeURIComponent(JSON.stringify(spotItem))}` })}
+ >调整
+
+
+ ) : }
+ )
+}
+
+export default Index
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.scss b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.scss
new file mode 100644
index 00000000..0583420e
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/spotCheckRoadDetail/index.scss
@@ -0,0 +1,29 @@
+.page {
+ background-color: #fff;
+ height: 100vh;
+ font-size: 28px;
+ padding-bottom: 40px;
+
+ .top {
+ height: 90px;
+ }
+
+ .card {
+ padding: 20px;
+ border: gainsboro 1px solid;
+ border-radius: 10px;
+ background-color: #fff;
+ box-shadow: 10px 10px 5px rgb(219, 218, 218);
+ margin: 0 0 20px 20px;
+ width: calc(100% - 40px);
+ box-sizing: border-box;
+
+ .item {
+ padding: 10px 0;
+
+ .edit-btn {
+ width: 100px;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.config.js b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.config.js
new file mode 100644
index 00000000..9715ac34
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.config.js
@@ -0,0 +1,3 @@
+export default {
+ navigationBarTitleText: '开始抽查'
+}
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.jsx b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.jsx
new file mode 100644
index 00000000..939b4f85
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.jsx
@@ -0,0 +1,85 @@
+import React, { useState } from 'react'
+import Taro from '@tarojs/taro'
+import { View, Picker } from '@tarojs/components'
+import { AtButton, AtIcon, } from 'taro-ui'
+import request from '@/services/request'
+import { roadSpotPrepare, roadSpotConfirm } from '@/services/api'
+import './index.scss'
+
+function Index() {
+ const rateArr = ['50%', '75%'];
+ const [rate, setRate] = useState('50%')
+ const [prepare, setPrepare] = useState({
+ previewId: null,
+ spotCountyRoadCount: null,
+ spotTownRoadCount: null,
+ spotVillageRoadCount: null,
+ })
+
+ const startSpotCheck = () => {
+ request.post(roadSpotPrepare(), { countyPercentage: rate === '50%' ? 50 : 75 }).then(res => {
+ if (res.statusCode === 200 || res.statusCode === 204) {
+ Taro.showToast({ title: '抽取成功', icon: 'success' })
+ setPrepare(res.data)
+ } else {
+ Taro.showToast({ title: '抽取失败', icon: 'error' })
+ console.log(res.errMsg)
+ }
+ })
+ }
+
+ const onSubmit = () => {
+ if (!prepare.previewId) {
+ Taro.showToast({ title: '请先抽取道路' })
+ return
+ }
+ request.post(roadSpotConfirm(), { previewId: prepare.previewId }).then(res => {
+ if (res.statusCode === 204) {
+ Taro.showToast({ title: '提交成功', icon: 'success' })
+ setTimeout(() => {
+ Taro.navigateBack()
+ }, 1500)
+ } else {
+ Taro.showToast({ title: '提交失败', icon: 'error' })
+ console.log(res.errMsg)
+ }
+ })
+ }
+
+ return (
+
+
+ 默认抽查乡道比例为25%,村道比例为10%
+
+ 抽查县道比例(%):
+ setRate(rateArr[e.detail.value])}
+ >
+
+ {rate || '请选择'}
+
+
+
+
+ 开始抽取
+
+ 抽查县道(条):
+ {prepare.spotCountyRoadCount}
+
+
+ 抽查乡道(条):
+ {prepare.spotTownRoadCount}
+
+
+ 抽查村道(条):
+ {prepare.spotVillageRoadCount}
+
+ 提交
+
+
+ )
+}
+export default Index
\ No newline at end of file
diff --git a/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.scss b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.scss
new file mode 100644
index 00000000..1f0760f8
--- /dev/null
+++ b/weapp/src/packages/maintenanceSpotCheck/startSpotCheck/index.scss
@@ -0,0 +1,43 @@
+.page {
+ background-color: #fff;
+ height: 100vh;
+ padding: 60px;
+ box-sizing: border-box;
+
+ .content {
+ margin: 0 auto;
+ width: 100%;
+ min-height: 60%;
+
+ .item {
+ margin-top: 30px;
+
+
+ .title {}
+
+ .input {
+ margin-top: 10px;
+ border: 1px solid #ccc;
+ border-radius: 10px;
+ padding: 10px 20px;
+ display: flex;
+ justify-content: space-between;
+ height: 42px;
+ }
+
+ .disabled {
+ background-color: #eee;
+ }
+ }
+
+ .start-btn {
+ width: 150px;
+ margin: 30px auto;
+ }
+
+ .submit-btn {
+ width: 70%;
+ margin: 100px auto 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/weapp/src/pages/home/index.jsx b/weapp/src/pages/home/index.jsx
index 20d012ad..0065fc3b 100644
--- a/weapp/src/pages/home/index.jsx
+++ b/weapp/src/pages/home/index.jsx
@@ -26,6 +26,10 @@ const Index = () => {
}
}, [])
+ const navigateTo = (url) => {
+ Taro.navigateTo({ url })
+ }
+
function toPatrol(kind) {
Taro.navigateTo({
url: `/packages/patrol/index?type=edit&kind=${kind}`
@@ -107,7 +111,18 @@ const Index = () => {
待 办 事 项
toPatrolView('wait')
+ () => toPatrolView('wait')
+ }>
+ 查看
+
+ : ''
+ }
+ {
+ judgeRight('MAINTENANCESPOTCHECK') ?
+
+ 养护抽查
+ navigateTo('/packages/maintenanceSpotCheck/index')
}>
查看
diff --git a/weapp/src/services/api.js b/weapp/src/services/api.js
index bc56d782..bc97e84e 100644
--- a/weapp/src/services/api.js
+++ b/weapp/src/services/api.js
@@ -67,13 +67,32 @@ export const postHandle = reportId => {
return `/report/${reportId}/handle`;
};
+// 道路抽查列表
+export const getRoadSpotList = () => {
+ return `/road/spot/list`;
+};
+// 道路抽查详情
+export const getRoadSpotDetail = () => {
+ return `/road/spot/detail`;
+};
+// 获取道路
+export const roadUrl = () => {
+ return `/road`;
+};
+// 调整已抽查的道路
+export const roadSpotChange = () => {
+ return `/road/spot/change`;
+};
+// 开始抽取
+export const roadSpotPrepare = () => {
+ return `/road/spot/prepare`;
+};
-
-
-
-
-
+// 提交抽查
+export const roadSpotConfirm = () => {
+ return `/road/spot/confirm`;
+};
\ No newline at end of file