feat: 添加复核功能相关页面及路由配置

新增AI识别项复核、场景复核和现场完工复核页面
配置页面路由并实现各组件间的跳转逻辑
完善复核表单功能及样式
This commit is contained in:
liangbin 2026-01-26 11:30:28 +08:00
parent 2ccc63358f
commit 3fe788ec23
8 changed files with 548 additions and 10 deletions

View File

@ -22,6 +22,27 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "pages/Intelligentize/index",
"style": {
"navigationBarTitleText": "AI识别项复核",
"navigationStyle": "custom"
}
},
{
"path": "pages/SceneReview/index",
"style": {
"navigationBarTitleText": "场景复核",
"navigationStyle": "custom"
}
},
{
"path": "pages/CompleteReview/index",
"style": {
"navigationBarTitleText": "现场完工复核",
"navigationStyle": "custom"
}
},
{ {
"path": "pages/TodayExamine/index", "path": "pages/TodayExamine/index",
"style": { "style": {

View File

@ -0,0 +1,183 @@
<!-- 现场完工复核-页面 -->
<template>
<view class="PageBox">
<view class="TopBox FlexBox">
<view class="iconBox FlexBox">
<!-- 返回列表页 -->
<u-icon name="arrow-leftward" size="24" @click="goBack"></u-icon>
</view>
<view class="Title">现场完工复核</view>
<view class="informBox">
<!-- <u-icon name="bell-fill" size="24"></u-icon>
<view class="MsgTxt"></view> -->
</view>
</view>
<view class="ContentBox">
<view class="TabsBox">
<u-tabs :list="tabsList" @click="changeTab"></u-tabs>
</view>
<view class="FormItemBox" v-if="currentTab === '1'">
<view class="LabelBox">现场是否复核完工要求</view>
<view class="ValueBox">
<u-radio-group v-model="formData.inspect" @change="changeInspect" >
<u-radio label="符合" >符合</u-radio>
<u-radio label="不符合" >不符合</u-radio>
</u-radio-group>
</view>
</view>
<view class="FormItemBox" v-if="currentTab === '1'">
<view class="LabelBox">现场复核照片至少上传3张</view>
<view class="ValueBox">
<u-upload
:action="uploadUrl"
:file-list="fileList"
:max-count="1"
:auto-upload="false"
@change="handleChange"
>
</u-upload>
</view>
</view>
<view class="FormItemBox" v-if="currentTab === '2'">
<view class="LabelBox">遗留问题描述</view>
<view class="ValueBox">
<u-textarea v-model="formData.legacyProblem" placeholder="请输入遗留问题描述"></u-textarea>
</view>
</view>
<view class="FormItemBox" v-if="currentTab === '2'">
<view class="LabelBox">整改要求</view>
<view class="ValueBox">
<u-textarea v-model="formData.rectifyRequirements" placeholder="请输入整改要求"></u-textarea>
</view>
</view>
</view>
<view class="FootBox">
<u-button type="primary">提交复核结果</u-button>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
const tabsList = ref([
{
name: '整体复核',
value: '1'
},
{
name: '遗留问题',
value: '2'
}
])
const currentTab = ref('1')
//
const changeTab = (e) => {
currentTab.value = e.value
}
const formData = ref({
inspect: '合格', //
attachment: '', //
legacyProblem: '', //
rectifyRequirements: '' //
})
//
const goBack = () => {
uni.navigateBack({
delta: 1
})
}
</script>
<style lang="scss" scoped>
.FlexBox {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.TabsBox {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
}
.FormItemBox {
padding: 20rpx;
background-color: #fff;
box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.2);
border-radius: 10rpx;
margin-bottom: 20rpx;
.LabelBox {
font-size: 24rpx;
color: #333;
font-weight: bold;
margin-bottom: 20rpx;
}
.ValueBox {
font-size: 24rpx;
color: #666;
}
}
.PageBox {
// background-color: #ff9900;
height: 100vh;
overflow: hidden;
.TopBox {
height: 100rpx;
padding: 20rpx;
background-color: #fff;
.iconBox {
font-size: 32rpx;
}
.Title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.informBox {
.MsgTxt {
padding: 8rpx;
background-color: hsla(17, 100%, 50%, 0.849);
color: #fff;
position: absolute;
top: 16rpx;
right: 16rpx;
border-radius: 50%;
}
}
}
.ContentBox {
// background-color: #c5d5d6;
background-color: #fff;
height: calc(100vh - 210rpx);
overflow: hidden;
padding: 20rpx;
}
.FootBox {
display: flex;
align-items: center;
justify-content: center;
gap: 20rpx;
padding: 20rpx;
background-color: #fff;
font-weight: bold;
}
}
</style>

View File

@ -0,0 +1,156 @@
<!-- AI识别项复核-页面 -->
<template>
<view class="PageBox">
<view class="TopBox FlexBox">
<view class="iconBox FlexBox">
<!-- 返回列表页 -->
<u-icon name="arrow-leftward" size="24" @click="goBack"></u-icon>
</view>
<view class="Title">AI识别项复核</view>
<view class="informBox">
<u-icon name="bell-fill" size="24"></u-icon>
<view class="MsgTxt"></view>
</view>
</view>
<view class="ContentBox">
<view class="FormItemBox">
<view class="LabelBox">检查项名称</view>
<view class="ValueBox">作业人员未佩戴安全帽</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">识别照片</view>
<view class="imgBox">
<image
src="https://img2.baidu.com/it/u=3422224422,2822825222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500"
mode="aspectFill" style="width: 200rpx; height: 200rpx;"></image>
</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">施工单位自查意见</view>
<view class="ValueBox">单位已安排人员监督后续加强安全培训</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">复核结果</view>
<view class="ValueBox">
<u-radio-group v-model="formData.inspect" @change="change">
<u-radio label="合格">合格</u-radio>
<u-radio label="不合格">不合格</u-radio>
</u-radio-group>
</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">附件上传</view>
<view class="uploadBox">
<u-upload :action="uploadUrl" :auto-upload="false" @change="handleChange" @preview="handlePreview"
@remove="handleRemove">
</u-upload>
</view>
</view>
</view>
<view class="FootBox">
<u-button plain type="primary">取消</u-button>
<u-button type="primary">提交复核结果</u-button>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
const formData = ref({
inspect: '合格', //
attachment: '' //
})
//
const goBack = () => {
uni.navigateBack({
delta: 1
})
}
</script>
<style lang="scss" scoped>
.FlexBox {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.FormItemBox {
padding: 20rpx;
background-color: #fff;
box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.2);
border-radius: 10rpx;
margin-bottom: 20rpx;
.LabelBox {
font-size: 24rpx;
color: #333;
font-weight: bold;
margin-bottom: 20rpx;
}
.ValueBox {
font-size: 24rpx;
color: #666;
}
}
.PageBox {
// background-color: #ff9900;
height: 100vh;
overflow: hidden;
.TopBox {
height: 100rpx;
padding: 20rpx;
background-color: #fff;
.iconBox {
font-size: 32rpx;
}
.Title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.informBox {
.MsgTxt {
padding: 8rpx;
background-color: hsla(17, 100%, 50%, 0.849);
color: #fff;
position: absolute;
top: 16rpx;
right: 16rpx;
border-radius: 50%;
}
}
}
.ContentBox {
// background-color: #c5d5d6;
background-color: #fff;
height: calc(100vh - 210rpx);
overflow: hidden;
padding: 20rpx;
}
.FootBox {
display: flex;
align-items: center;
justify-content: center;
gap: 20rpx;
padding: 20rpx;
background-color: #fff;
font-weight: bold;
}
}
</style>

View File

@ -26,7 +26,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-button text="复核" type="primary" size="small"></u-button> <u-button text="复核" type="primary" size="small" @click="goReview(item.id)"></u-button>
</view> </view>
</view> </view>
</template> </template>
@ -34,7 +34,7 @@
</u-virtual-list> </u-virtual-list>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup >
import { ref } from 'vue' import { ref } from 'vue'
const dataSource = ref([ const dataSource = ref([
@ -89,6 +89,16 @@ const dataSource = ref([
status: '已复核' status: '已复核'
}, },
]) ])
//
const goReview = (id) => {
uni.navigateTo({
url: '/pages/Intelligentize/index?id=' + id
})
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.FlexBox { .FlexBox {

View File

@ -26,7 +26,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-button text="复核" type="primary" size="small"></u-button> <u-button text="复核" type="primary" size="small" disabled>已复核</u-button>
</view> </view>
</view> </view>
</template> </template>
@ -34,7 +34,7 @@
</u-virtual-list> </u-virtual-list>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup >
import { ref } from 'vue' import { ref } from 'vue'
const dataSource = ref([ const dataSource = ref([
@ -46,7 +46,7 @@ const dataSource = ref([
details: '已重新规划消防器械摆区域,并设置标识', details: '已重新规划消防器械摆区域,并设置标识',
opinion: '整改到位,符合项目要求', opinion: '整改到位,符合项目要求',
imgUrl: 'https://img95.699pic.com/photo/40225/7755.jpg_wh860.jpg', imgUrl: 'https://img95.699pic.com/photo/40225/7755.jpg_wh860.jpg',
status: '复核' status: '复核'
}, },
{ {
id: 2, id: 2,
@ -89,6 +89,8 @@ const dataSource = ref([
status: '已复核' status: '已复核'
}, },
]) ])
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.FlexBox { .FlexBox {

View File

@ -26,7 +26,7 @@
</view> </view>
</view> </view>
</view> </view>
<u-button text="复核" type="primary" size="small"></u-button> <u-button text="复核" type="primary" size="small" @click="handleReview(item)">复核</u-button>
</view> </view>
</view> </view>
</template> </template>
@ -34,7 +34,7 @@
</u-virtual-list> </u-virtual-list>
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
const dataSource = ref([ const dataSource = ref([
@ -89,6 +89,12 @@ const dataSource = ref([
status: '已复核' status: '已复核'
}, },
]) ])
//
const handleReview = (item) => {
uni.navigateTo({
url: '/pages/SceneReview/index?id=' + item.id
})
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.FlexBox { .FlexBox {

View File

@ -50,7 +50,7 @@
</view> </view>
</view> </view>
<view class="FootBox"> <view class="FootBox">
<u-button type="primary">项目完工复核</u-button> <u-button type="primary" @click="goCompleteReview">项目完工复核</u-button>
<view class="FootTxt"> <view class="FootTxt">
<view>复核进度</view> <view>复核进度</view>
<view class="yellow">监理复核中</view> <view class="yellow">监理复核中</view>
@ -67,7 +67,7 @@ import { ref } from 'vue'
const progectInfo = ref({ const progectInfo = ref({
Id: 1, Id: 1,
name: '北京CBD改造项目', name: 'AI识别项复核',
code: '20230801001', code: '20230801001',
leader: '张三', leader: '张三',
period: '2023.8.1-2023.12.31', period: '2023.8.1-2023.12.31',
@ -101,7 +101,14 @@ const click = (e) => {
// //
const goBack = () => { const goBack = () => {
uni.switchTab({ uni.switchTab({
url: '/pages/ProgectList/index' url: '/pages/ProjectList/index'
})
}
//
const goCompleteReview = () => {
uni.navigateTo({
url: '/pages/CompleteReview/index'
}) })
} }
</script> </script>

View File

@ -0,0 +1,153 @@
<!-- 现场复核-页面 -->
<template>
<view class="PageBox">
<view class="TopBox FlexBox">
<view class="iconBox FlexBox">
<!-- 返回列表页 -->
<u-icon name="arrow-leftward" size="24" @click="goBack"></u-icon>
</view>
<view class="Title">现场复核</view>
<view class="informBox">
<!-- <u-icon name="bell-fill" size="24"></u-icon>
<view class="MsgTxt"></view> -->
</view>
</view>
<view class="ContentBox">
<view class="FormItemBox">
<view class="LabelBox">复核要求</view>
<view class="ValueBox">现场核查动火作业区灭火器配置数量是否符合要求</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">复核结果</view>
<view class="ValueBox">
<u-radio-group v-model="formData.inspect" @change="changeInspect" >
<u-radio label="合格">合格</u-radio>
<u-radio label="不合格">不合格</u-radio>
</u-radio-group>
</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">现场照片/视频</view>
<view class="ValueBox">
<u-upload
:action="uploadUrl"
:file-list="fileList"
:max-count="1"
:auto-upload="false"
@change="handleChange"
>
</u-upload>
</view>
</view>
<view class="FormItemBox">
<view class="LabelBox">复核意见</view>
<view class="ValueBox">
<u-textarea v-model="formData.opinion" placeholder="请输入复核意见"></u-textarea>
</view>
</view>
</view>
<view class="FootBox">
<u-button plain type="primary">取消</u-button>
<u-button type="primary">提交复核结果</u-button>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
const formData = ref({
inspect: '合格', //
attachment: '', //
opinion: '' //
})
//
const goBack = () => {
uni.navigateBack({
delta: 1
})
}
</script>
<style lang="scss" scoped>
.FlexBox {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.FormItemBox {
padding: 20rpx;
background-color: #fff;
box-shadow: 0 0 10rpx rgba(0, 0, 0, 0.2);
border-radius: 10rpx;
margin-bottom: 20rpx;
.LabelBox {
font-size: 24rpx;
color: #333;
font-weight: bold;
margin-bottom: 20rpx;
}
.ValueBox {
font-size: 24rpx;
color: #666;
}
}
.PageBox {
// background-color: #ff9900;
height: 100vh;
overflow: hidden;
.TopBox {
height: 100rpx;
padding: 20rpx;
background-color: #fff;
.iconBox {
font-size: 32rpx;
}
.Title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.informBox {
.MsgTxt {
padding: 8rpx;
background-color: hsla(17, 100%, 50%, 0.849);
color: #fff;
position: absolute;
top: 16rpx;
right: 16rpx;
border-radius: 50%;
}
}
}
.ContentBox {
// background-color: #c5d5d6;
background-color: #fff;
height: calc(100vh - 210rpx);
overflow: hidden;
padding: 20rpx;
}
.FootBox {
display: flex;
align-items: center;
justify-content: center;
gap: 20rpx;
padding: 20rpx;
background-color: #fff;
font-weight: bold;
}
}
</style>